diff -Nru ukui-biometric-auth-4.10.0.0/COPYING ukui-biometric-auth-4.20.0.0/COPYING --- ukui-biometric-auth-4.10.0.0/COPYING 2023-11-14 16:23:44.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/COPYING 1970-01-01 08:00:00.000000000 +0800 @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - <one line to give the program's name and a brief idea of what it does.> - Copyright (C) <year> <name of author> - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see <http://www.gnu.org/licenses/>. - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - <program> Copyright (C) <year> <name of author> - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -<http://www.gnu.org/licenses/>. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -<http://www.gnu.org/philosophy/why-not-lgpl.html>. diff -Nru ukui-biometric-auth-4.10.0.0/LICENSE ukui-biometric-auth-4.20.0.0/LICENSE --- ukui-biometric-auth-4.10.0.0/LICENSE 1970-01-01 08:00:00.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/LICENSE 2024-09-23 19:22:29.000000000 +0800 @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + <one line to give the program's name and a brief idea of what it does.> + Copyright (C) <year> <name of author> + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + <program> Copyright (C) <year> <name of author> + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +<http://www.gnu.org/licenses/>. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +<http://www.gnu.org/philosophy/why-not-lgpl.html>. diff -Nru ukui-biometric-auth-4.10.0.0/bioauth/i18n_ts/bo.ts ukui-biometric-auth-4.20.0.0/bioauth/i18n_ts/bo.ts --- ukui-biometric-auth-4.10.0.0/bioauth/i18n_ts/bo.ts 2023-11-14 16:23:44.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/bioauth/i18n_ts/bo.ts 2024-09-23 19:22:29.000000000 +0800 @@ -34,52 +34,57 @@ <context> <name>BioDevices</name> <message> - <location filename="../src/biodevices.cpp" line="64"/> + <location filename="../src/biodevices.cpp" line="78"/> <source>Unplugging of %1 device detected</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/biodevices.cpp" line="74"/> + <location filename="../src/biodevices.cpp" line="88"/> <source>%1 device insertion detected</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/biodevices.cpp" line="83"/> - <source>ukui-biometric-manager</source> + <location filename="../src/biodevices.cpp" line="97"/> + <source>Biometric Manager</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/biodevices.cpp" line="86"/> + <location filename="../src/biodevices.cpp" line="100"/> <source>biometric</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/biodevices.cpp" line="457"/> + <location filename="../src/biodevices.cpp" line="700"/> <source>FingerPrint</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/biodevices.cpp" line="459"/> + <location filename="../src/biodevices.cpp" line="702"/> <source>FingerVein</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/biodevices.cpp" line="461"/> + <location filename="../src/biodevices.cpp" line="704"/> <source>Iris</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/biodevices.cpp" line="463"/> + <location filename="../src/biodevices.cpp" line="706"/> <source>Face</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/biodevices.cpp" line="465"/> + <location filename="../src/biodevices.cpp" line="708"/> <source>VoicePrint</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/biodevices.cpp" line="467"/> + <location filename="../src/biodevices.cpp" line="710"/> + <source>Ukey</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/biodevices.cpp" line="712"/> <source>QRCode</source> <translation type="unfinished"></translation> </message> @@ -95,9 +100,14 @@ <context> <name>LoginOptionsWidget</name> <message> - <location filename="../src/loginoptionswidget.cpp" line="59"/> + <location filename="../src/loginoptionswidget.cpp" line="79"/> <source>Login Options</source> <translation type="unfinished"></translation> </message> + <message> + <location filename="../src/loginoptionswidget.cpp" line="320"/> + <source>Password</source> + <translation type="unfinished"></translation> + </message> </context> </TS> diff -Nru ukui-biometric-auth-4.10.0.0/bioauth/i18n_ts/bo_CN.ts ukui-biometric-auth-4.20.0.0/bioauth/i18n_ts/bo_CN.ts --- ukui-biometric-auth-4.10.0.0/bioauth/i18n_ts/bo_CN.ts 2023-11-14 16:23:44.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/bioauth/i18n_ts/bo_CN.ts 2024-09-23 19:22:29.000000000 +0800 @@ -75,7 +75,7 @@ <translation>མཛུབ་མོའི་སྡོད་རྩ།</translation> </message> <message> - <source>ukui-biometric-manager</source> + <source>Biometric Manager</source> <translation>སྐྱེ་དངོས་ཁྱབ་རྟགས་དོ་དམ་ལག་ཆ།</translation> </message> <message> @@ -83,8 +83,8 @@ <translation>ཨང་ཀི་ཕྱག་པ།</translation> </message> <message> - <source>ukey</source> - <translation type="unfinished"></translation> + <source>Ukey</source> + <translation>བདེ་འཇགས་གསང་ལྡེ་</translation> </message> </context> <context> diff -Nru ukui-biometric-auth-4.10.0.0/bioauth/i18n_ts/es.ts ukui-biometric-auth-4.20.0.0/bioauth/i18n_ts/es.ts --- ukui-biometric-auth-4.10.0.0/bioauth/i18n_ts/es.ts 2023-11-14 16:23:44.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/bioauth/i18n_ts/es.ts 2024-09-23 19:22:29.000000000 +0800 @@ -71,11 +71,15 @@ <translation type="unfinished"></translation> </message> <message> - <source>ukui-biometric-manager</source> + <source>QRCode</source> <translation type="unfinished"></translation> </message> <message> - <source>QRCode</source> + <source>Biometric Manager</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Ukey</source> <translation type="unfinished"></translation> </message> </context> @@ -104,5 +108,9 @@ <source>Login Options</source> <translation type="unfinished"></translation> </message> + <message> + <source>Password</source> + <translation type="unfinished">Contraseña</translation> + </message> </context> </TS> diff -Nru ukui-biometric-auth-4.10.0.0/bioauth/i18n_ts/fr.ts ukui-biometric-auth-4.20.0.0/bioauth/i18n_ts/fr.ts --- ukui-biometric-auth-4.10.0.0/bioauth/i18n_ts/fr.ts 2023-11-14 16:23:44.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/bioauth/i18n_ts/fr.ts 2024-09-23 19:22:29.000000000 +0800 @@ -71,11 +71,15 @@ <translation type="unfinished"></translation> </message> <message> - <source>ukui-biometric-manager</source> + <source>QRCode</source> <translation type="unfinished"></translation> </message> <message> - <source>QRCode</source> + <source>Biometric Manager</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Ukey</source> <translation type="unfinished"></translation> </message> </context> @@ -104,5 +108,9 @@ <source>Login Options</source> <translation type="unfinished"></translation> </message> + <message> + <source>Password</source> + <translation type="unfinished">Mot de passe</translation> + </message> </context> </TS> diff -Nru ukui-biometric-auth-4.10.0.0/bioauth/i18n_ts/kk.ts ukui-biometric-auth-4.20.0.0/bioauth/i18n_ts/kk.ts --- ukui-biometric-auth-4.10.0.0/bioauth/i18n_ts/kk.ts 1970-01-01 08:00:00.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/bioauth/i18n_ts/kk.ts 2024-09-23 19:22:29.000000000 +0800 @@ -0,0 +1,184 @@ +<?xml version="1.0" encoding="utf-8"?> +<!DOCTYPE TS> +<TS version="2.1" language="kk"> +<context> + <name>BioAuthWidget</name> + <message> + <location filename="../src/bioauthwidget.ui" line="14"/> + <source>Form</source> + <translation>كەستە</translation> + </message> + <message> + <source>More</source> + <translation type="vanished">更多</translation> + </message> + <message> + <location filename="../src/bioauthwidget.ui" line="146"/> + <location filename="../src/bioauthwidget.cpp" line="41"/> + <source>Retry</source> + <translation>قاتە قاتە سىناۋ</translation> + </message> + <message> + <source>Too many unsuccessful attempts,please enter password.</source> + <translation type="vanished">验证失败达最大次数,请使用密码解锁</translation> + </message> + <message> + <source>Bioauth authentication failed, you still have %1 verification opportunities</source> + <translation type="vanished">生物认证失败,您还有%1次尝试机会</translation> + </message> + <message> + <source>Password</source> + <translation type="vanished">密码</translation> + </message> + <message> + <source>Current Device: </source> + <translation type="vanished">当前设备:</translation> + </message> + <message> + <location filename="../src/bioauthwidget.cpp" line="96"/> + <location filename="../src/bioauthwidget.cpp" line="212"/> + <source>%1 too many unsuccessful attempts,please enter password.</source> + <translation>جەڭىلىپ بولۋ رەت سانى اسقىن كوپ بولىپ كەتتى، قۇپيا نۇمىردى كىرگىزىڭىز</translation> + </message> + <message> + <location filename="../src/bioauthwidget.cpp" line="102"/> + <source>%1 authentication failure,there are still %2 remaining opportunities</source> + <translation>سالاۋاتىن دالەلدەۋ جەڭىلىپ قالدى، جانە ەكٸ رەت ورايڭىز قالدى</translation> + </message> + <message> + <location filename="../src/bioauthwidget.cpp" line="226"/> + <source>Please use wechat to scan the code</source> + <translation>ئۈندىداردا كەسكىندەۋىش</translation> + </message> +</context> +<context> + <name>BioDevices</name> + <message> + <location filename="../src/biodevices.cpp" line="78"/> + <source>Unplugging of %1 device detected</source> + <translation>تەكسەرٸپ بايقاعان 1 اسبابٸن تارتىپ شىعارماق</translation> + </message> + <message> + <location filename="../src/biodevices.cpp" line="88"/> + <source>%1 device insertion detected</source> + <translation>1 اسبابٸتٸڭ كىرگىزىلگەنىن تەكسەرٸپ شىقپاق</translation> + </message> + <message> + <location filename="../src/biodevices.cpp" line="97"/> + <source>Biometric Manager</source> + <translation>بىيولوگىيەلىك ەرەكشەلىكتى باسقارۋ قۇرالى</translation> + </message> + <message> + <location filename="../src/biodevices.cpp" line="100"/> + <source>biometric</source> + <translation>بىيولوگىيەلىك ەرەكشەلىك</translation> + </message> + <message> + <location filename="../src/biodevices.cpp" line="700"/> + <source>FingerPrint</source> + <translation>بارماقشى ٴٸزٸ</translation> + </message> + <message> + <location filename="../src/biodevices.cpp" line="702"/> + <source>FingerVein</source> + <translation>بارماقشى ۋېنا تومۇرى</translation> + </message> + <message> + <location filename="../src/biodevices.cpp" line="704"/> + <source>Iris</source> + <translation>كوز ئالمىسى تۇستى پەردىسى</translation> + </message> + <message> + <location filename="../src/biodevices.cpp" line="706"/> + <source>Face</source> + <translation>جۇز</translation> + </message> + <message> + <location filename="../src/biodevices.cpp" line="708"/> + <source>VoicePrint</source> + <translation>حاۋىپسىزدىك شىڧىرلىق يٸندەكٸسٸ</translation> + </message> + <message> + <location filename="../src/biodevices.cpp" line="710"/> + <source>Ukey</source> + <translation>ساندىق كۋالىك</translation> + </message> + <message> + <location filename="../src/biodevices.cpp" line="712"/> + <source>QRCode</source> + <translation>ەكٸلٸك رازمەر</translation> + </message> + <message> + <source>Wechat</source> + <translation type="vanished">微信</translation> + </message> +</context> +<context> + <name>BioDevicesWidget</name> + <message> + <location filename="../src/biodeviceswidget.ui" line="14"/> + <source>Form</source> + <translation>كەستە</translation> + </message> + <message> + <source>Device types:</source> + <translation type="vanished">设备类型:</translation> + </message> + <message> + <source>Back</source> + <translation type="vanished">返回</translation> + </message> + <message> + <source>OK</source> + <translation type="vanished">确定</translation> + </message> + <message> + <source>FingerPrint</source> + <translation type="vanished">指纹</translation> + </message> +</context> +<context> + <name>LoginOptionsWidget</name> + <message> + <location filename="../src/loginoptionswidget.cpp" line="79"/> + <source>Login Options</source> + <translation>كىرۋ تالدانبالارٸ</translation> + </message> + <message> + <location filename="../src/loginoptionswidget.cpp" line="320"/> + <source>Password</source> + <translation>قۇپيا كىلت</translation> + </message> + <message> + <source>Wechat</source> + <translation type="vanished">微信</translation> + </message> + <message> + <source>Biometric</source> + <translation type="vanished">生物识别</translation> + </message> +</context> +<context> + <name>QObject</name> + <message> + <source>FingerPrint</source> + <translation type="vanished">指纹</translation> + </message> + <message> + <source>FingerVein</source> + <translation type="vanished">指静脉</translation> + </message> + <message> + <source>Iris</source> + <translation type="vanished">虹膜</translation> + </message> + <message> + <source>Face</source> + <translation type="vanished">人脸</translation> + </message> + <message> + <source>VoicePrint</source> + <translation type="vanished">声纹</translation> + </message> +</context> +</TS> diff -Nru ukui-biometric-auth-4.10.0.0/bioauth/i18n_ts/ky.ts ukui-biometric-auth-4.20.0.0/bioauth/i18n_ts/ky.ts --- ukui-biometric-auth-4.10.0.0/bioauth/i18n_ts/ky.ts 1970-01-01 08:00:00.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/bioauth/i18n_ts/ky.ts 2024-09-23 19:22:29.000000000 +0800 @@ -0,0 +1,184 @@ +<?xml version="1.0" encoding="utf-8"?> +<!DOCTYPE TS> +<TS version="2.1" language="ky"> +<context> + <name>BioAuthWidget</name> + <message> + <location filename="../src/bioauthwidget.ui" line="14"/> + <source>Form</source> + <translation>جادىبال</translation> + </message> + <message> + <source>More</source> + <translation type="vanished">更多</translation> + </message> + <message> + <location filename="../src/bioauthwidget.ui" line="146"/> + <location filename="../src/bioauthwidget.cpp" line="41"/> + <source>Retry</source> + <translation>قايرا قايرا سىنوو</translation> + </message> + <message> + <source>Too many unsuccessful attempts,please enter password.</source> + <translation type="vanished">验证失败达最大次数,请使用密码解锁</translation> + </message> + <message> + <source>Bioauth authentication failed, you still have %1 verification opportunities</source> + <translation type="vanished">生物认证失败,您还有%1次尝试机会</translation> + </message> + <message> + <source>Password</source> + <translation type="vanished">密码</translation> + </message> + <message> + <source>Current Device: </source> + <translation type="vanished">当前设备:</translation> + </message> + <message> + <location filename="../src/bioauthwidget.cpp" line="96"/> + <location filename="../src/bioauthwidget.cpp" line="212"/> + <source>%1 too many unsuccessful attempts,please enter password.</source> + <translation>جەڭىلۉۉ بولۇش ىرەت سانى ارتىقچا كۅپ بولۇپ كەتتى، جاشىرۇۇن نومۇردۇ كىرگىزىڭ</translation> + </message> + <message> + <location filename="../src/bioauthwidget.cpp" line="102"/> + <source>%1 authentication failure,there are still %2 remaining opportunities</source> + <translation>تولۇمدۇۇلۇق دالىلدۅ جەڭىلۉۉ بولدۇ ، داعى ەكى ىرەت وڭۇتۇڭۇز قالدى</translation> + </message> + <message> + <location filename="../src/bioauthwidget.cpp" line="226"/> + <source>Please use wechat to scan the code</source> + <translation>ئۈندىداردا ىسكاننىردوو</translation> + </message> +</context> +<context> + <name>BioDevices</name> + <message> + <location filename="../src/biodevices.cpp" line="78"/> + <source>Unplugging of %1 device detected</source> + <translation>تەكشەرىپ بايقاعان 1 اسپاپتى تارتىپ چىعارۇۇ</translation> + </message> + <message> + <location filename="../src/biodevices.cpp" line="88"/> + <source>%1 device insertion detected</source> + <translation>1 جابدۇۇسۇنۇن كىرگىزىلگەندىگىن تەكشەرىپ چىعىش</translation> + </message> + <message> + <location filename="../src/biodevices.cpp" line="97"/> + <source>Biometric Manager</source> + <translation>بىيولوگىيەلىك ۅزگۅچۅلۉگۉ باشقارىش قۇرالى</translation> + </message> + <message> + <location filename="../src/biodevices.cpp" line="100"/> + <source>biometric</source> + <translation>بىيولوگىيەلىك ۅزگۅچۅلۉك</translation> + </message> + <message> + <location filename="../src/biodevices.cpp" line="700"/> + <source>FingerPrint</source> + <translation>بارماق ئزى</translation> + </message> + <message> + <location filename="../src/biodevices.cpp" line="702"/> + <source>FingerVein</source> + <translation>بارماق ۋېنا تومۇرى</translation> + </message> + <message> + <location filename="../src/biodevices.cpp" line="704"/> + <source>Iris</source> + <translation>كۅز ئالمىسى رەڭدار پەردىسى</translation> + </message> + <message> + <location filename="../src/biodevices.cpp" line="706"/> + <source>Face</source> + <translation>جۉز</translation> + </message> + <message> + <location filename="../src/biodevices.cpp" line="708"/> + <source>VoicePrint</source> + <translation>قووپسۇزدۇق شىڧىرلىق اچقىچى</translation> + </message> + <message> + <location filename="../src/biodevices.cpp" line="710"/> + <source>Ukey</source> + <translation>ەسەپتىك كۉبۅلۉك</translation> + </message> + <message> + <location filename="../src/biodevices.cpp" line="712"/> + <source>QRCode</source> + <translation>ەكىلىك قۇپۇيا نومۇر</translation> + </message> + <message> + <source>Wechat</source> + <translation type="vanished">微信</translation> + </message> +</context> +<context> + <name>BioDevicesWidget</name> + <message> + <location filename="../src/biodeviceswidget.ui" line="14"/> + <source>Form</source> + <translation>جادىبال</translation> + </message> + <message> + <source>Device types:</source> + <translation type="vanished">设备类型:</translation> + </message> + <message> + <source>Back</source> + <translation type="vanished">返回</translation> + </message> + <message> + <source>OK</source> + <translation type="vanished">确定</translation> + </message> + <message> + <source>FingerPrint</source> + <translation type="vanished">指纹</translation> + </message> +</context> +<context> + <name>LoginOptionsWidget</name> + <message> + <location filename="../src/loginoptionswidget.cpp" line="79"/> + <source>Login Options</source> + <translation>كىرۉۉ تاندالمالارى</translation> + </message> + <message> + <location filename="../src/loginoptionswidget.cpp" line="320"/> + <source>Password</source> + <translation>جاشىرۇۇن اچقىچ</translation> + </message> + <message> + <source>Wechat</source> + <translation type="vanished">微信</translation> + </message> + <message> + <source>Biometric</source> + <translation type="vanished">生物识别</translation> + </message> +</context> +<context> + <name>QObject</name> + <message> + <source>FingerPrint</source> + <translation type="vanished">指纹</translation> + </message> + <message> + <source>FingerVein</source> + <translation type="vanished">指静脉</translation> + </message> + <message> + <source>Iris</source> + <translation type="vanished">虹膜</translation> + </message> + <message> + <source>Face</source> + <translation type="vanished">人脸</translation> + </message> + <message> + <source>VoicePrint</source> + <translation type="vanished">声纹</translation> + </message> +</context> +</TS> diff -Nru ukui-biometric-auth-4.10.0.0/bioauth/i18n_ts/mn.ts ukui-biometric-auth-4.20.0.0/bioauth/i18n_ts/mn.ts --- ukui-biometric-auth-4.10.0.0/bioauth/i18n_ts/mn.ts 1970-01-01 08:00:00.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/bioauth/i18n_ts/mn.ts 2024-09-23 19:22:29.000000000 +0800 @@ -0,0 +1,188 @@ +<?xml version="1.0" encoding="utf-8"?> +<!DOCTYPE TS> +<TS version="2.1" language="mn"> +<context> + <name>BioAuthWidget</name> + <message> + <location filename="../src/bioauthwidget.ui" line="14"/> + <source>Form</source> + <translation></translation> + </message> + <message> + <source>More</source> + <translation type="vanished">更多</translation> + </message> + <message> + <location filename="../src/bioauthwidget.ui" line="146"/> + <location filename="../src/bioauthwidget.cpp" line="41"/> + <source>Retry</source> + <translation>ᠳᠠᠬᠢᠨ ᠲᠤᠷᠰᠢᠬᠤ</translation> + </message> + <message> + <source>Too many unsuccessful attempts,please enter password.</source> + <translation type="vanished">验证失败达最大次数,请使用密码解锁</translation> + </message> + <message> + <source>Bioauth authentication failed, you still have %1 verification opportunities</source> + <translation type="vanished">生物认证失败,您还有%1次尝试机会</translation> + </message> + <message> + <source>Password</source> + <translation>ᠨᠢᠭᠤᠴᠠ ᠺᠣᠳ᠋</translation> + </message> + <message> + <source>Current Device: </source> + <translation type="vanished">当前设备:</translation> + </message> + <message> + <location filename="../src/bioauthwidget.cpp" line="96"/> + <location filename="../src/bioauthwidget.cpp" line="212"/> + <source>%1 too many unsuccessful attempts,please enter password.</source> + <translation>%1 ᠢᠯᠠᠭᠳᠠᠭᠰᠠᠨ ᠲᠤᠷᠰᠢᠬᠤ ᠤᠳᠠᠭᠠ ᠲᠣᠭᠠ ᠬᠡᠳᠦ ᠣᠯᠠᠨ ᠂ ᠨᠢᠭᠤᠴᠠ ᠺᠣᠳ᠋ ᠣᠷᠣᠭᠤᠯᠤᠭᠠᠷᠠᠢ ᠃</translation> + </message> + <message> + <location filename="../src/bioauthwidget.cpp" line="102"/> + <source>%1 authentication failure,there are still %2 remaining opportunities</source> + <translation>%1 ᠪᠡᠶᠡᠶ᠋ᠢᠨ ᠬᠢᠷᠢᠶ᠋ᠢᠨ ᠰᠢᠯᠭᠠᠨ ᠪᠠᠲᠤᠯᠠᠯᠲᠠ ᠢᠯᠠᠭᠳᠠᠪᠠ ᠂ ᠮᠥᠨ %2 ᠦᠯᠡᠳᠡᠬᠦ ᠲᠣᠬᠢᠶᠠᠯ ᠪᠣᠢ</translation> + </message> + <message> + <location filename="../src/bioauthwidget.cpp" line="226"/> + <source>Please use wechat to scan the code</source> + <translation>ᠸᠢᠴᠠᠲᠢ᠋ᠶ᠋ᠠᠷ ᠦᠰᠦᠭ ᠰᠢᠷᠪᠢᠬᠦ ᠪᠣᠯᠪᠠᠤ</translation> + </message> +</context> +<context> + <name>BioDevices</name> + <message> + <location filename="../src/biodevices.cpp" line="78"/> + <source>Unplugging of %1 device detected</source> + <translation>%1 ᠲᠥᠬᠥᠭᠡᠷᠦᠮᠵᠢᠶ᠋ᠢ ᠰᠤᠭᠤᠯᠵᠤ ᠭᠠᠷᠭᠠᠨ ᠠ</translation> + </message> + <message> + <location filename="../src/biodevices.cpp" line="88"/> + <source>%1 device insertion detected</source> + <translation>%1 ᠲᠥᠬᠥᠭᠡᠷᠦᠮᠵᠢ ᠬᠠᠪᠴᠢᠭᠤᠯᠤᠭᠰᠠᠨᠢ᠋ ᠪᠠᠢᠴᠠᠭᠠᠨ ᠣᠯᠪᠠ</translation> + </message> + <message> + <location filename="../src/biodevices.cpp" line="97"/> + <source>Biometric Manager</source> + <translation>ᠠᠮᠢᠳᠤ ᠪᠣᠳᠠᠰᠤ᠋ᠨ ᠣᠨᠴᠠᠯᠢᠭ ᠬᠠᠮᠢᠶᠠᠷᠤᠯᠲᠠᠶ᠋ᠢᠨ ᠪᠠᠭᠠᠵᠢ</translation> + </message> + <message> + <location filename="../src/biodevices.cpp" line="100"/> + <source>biometric</source> + <translation>ᠠᠮᠢᠳᠤ ᠪᠣᠳᠠᠰᠤ᠋ᠨ ᠣᠨᠴᠠᠯᠢᠭ</translation> + </message> + <message> + <location filename="../src/biodevices.cpp" line="700"/> + <source>FingerPrint</source> + <translation>ᠬᠤᠷᠤᠭᠤᠨ ᠬᠡ</translation> + </message> + <message> + <location filename="../src/biodevices.cpp" line="702"/> + <source>FingerVein</source> + <translation>ᠬᠤᠷᠤᠭᠤᠨ ᠨᠠᠮᠵᠢᠭᠤᠨ ᠰᠤᠳᠠᠰᠤ</translation> + </message> + <message> + <location filename="../src/biodevices.cpp" line="704"/> + <source>Iris</source> + <translation>ᠰᠣᠯᠣᠩᠭᠠ ᠪᠦᠷᠬᠦᠭᠦᠯ</translation> + </message> + <message> + <location filename="../src/biodevices.cpp" line="706"/> + <source>Face</source> + <translation>ᠬᠥᠮᠦᠨᠦ᠌ ᠨᠢᠭᠤᠷ ᠲᠠᠨᠢᠬᠤ</translation> + </message> + <message> + <location filename="../src/biodevices.cpp" line="708"/> + <source>VoicePrint</source> + <translation>ᠳᠠᠭᠤᠨ ᠡᠷᠢᠶᠡᠨ</translation> + </message> + <message> + <location filename="../src/biodevices.cpp" line="710"/> + <source>Ukey</source> + <translation>ᠠᠶᠤᠯᠭᠦᠢ ᠨᠢᠭᠤᠴᠠ ᠲᠦᠯᠬᠢᠭᠦᠷ</translation> + </message> + <message> + <source>ukey</source> + <translation type="vanished">ᠠᠶᠤᠯᠭᠦᠢ ᠨᠢᠭᠤᠴᠠ ᠲᠦᠯᠬᠢᠭᠦᠷ</translation> + </message> + <message> + <location filename="../src/biodevices.cpp" line="712"/> + <source>QRCode</source> + <translation>ᠬᠣᠶᠠᠷ ᠬᠡᠮᠵᠢᠯᠲᠦ ᠺᠣᠳ᠋</translation> + </message> + <message> + <source>Wechat</source> + <translation type="vanished">微信</translation> + </message> +</context> +<context> + <name>BioDevicesWidget</name> + <message> + <location filename="../src/biodeviceswidget.ui" line="14"/> + <source>Form</source> + <translation></translation> + </message> + <message> + <source>Device types:</source> + <translation type="vanished">设备类型:</translation> + </message> + <message> + <source>Back</source> + <translation type="vanished">返回</translation> + </message> + <message> + <source>OK</source> + <translation type="vanished">确定</translation> + </message> + <message> + <source>FingerPrint</source> + <translation type="vanished">指纹</translation> + </message> +</context> +<context> + <name>LoginOptionsWidget</name> + <message> + <location filename="../src/loginoptionswidget.cpp" line="79"/> + <source>Login Options</source> + <translation>ᠲᠡᠮᠳᠡᠭᠯᠡᠬᠦ ᠰᠤᠩᠭᠤᠭᠳᠠᠬᠤᠨ</translation> + </message> + <message> + <location filename="../src/loginoptionswidget.cpp" line="320"/> + <source>Password</source> + <translation>ᠨᠢᠭᠤᠴᠠ ᠺᠣᠳ᠋</translation> + </message> + <message> + <source>Wechat</source> + <translation type="vanished">微信</translation> + </message> + <message> + <source>Biometric</source> + <translation type="vanished">生物识别</translation> + </message> +</context> +<context> + <name>QObject</name> + <message> + <source>FingerPrint</source> + <translation type="vanished">指纹</translation> + </message> + <message> + <source>FingerVein</source> + <translation type="vanished">指静脉</translation> + </message> + <message> + <source>Iris</source> + <translation type="vanished">虹膜</translation> + </message> + <message> + <source>Face</source> + <translation type="vanished">人脸</translation> + </message> + <message> + <source>VoicePrint</source> + <translation type="vanished">声纹</translation> + </message> +</context> +</TS> diff -Nru ukui-biometric-auth-4.10.0.0/bioauth/i18n_ts/pt.ts ukui-biometric-auth-4.20.0.0/bioauth/i18n_ts/pt.ts --- ukui-biometric-auth-4.10.0.0/bioauth/i18n_ts/pt.ts 2023-11-14 16:23:44.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/bioauth/i18n_ts/pt.ts 2024-09-23 19:22:29.000000000 +0800 @@ -71,11 +71,15 @@ <translation type="unfinished"></translation> </message> <message> - <source>ukui-biometric-manager</source> + <source>QRCode</source> <translation type="unfinished"></translation> </message> <message> - <source>QRCode</source> + <source>Biometric Manager</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Ukey</source> <translation type="unfinished"></translation> </message> </context> @@ -104,5 +108,9 @@ <source>Login Options</source> <translation type="unfinished"></translation> </message> + <message> + <source>Password</source> + <translation type="unfinished">Senha</translation> + </message> </context> </TS> diff -Nru ukui-biometric-auth-4.10.0.0/bioauth/i18n_ts/ru.ts ukui-biometric-auth-4.20.0.0/bioauth/i18n_ts/ru.ts --- ukui-biometric-auth-4.10.0.0/bioauth/i18n_ts/ru.ts 2023-11-14 16:23:44.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/bioauth/i18n_ts/ru.ts 2024-09-23 19:22:29.000000000 +0800 @@ -71,11 +71,15 @@ <translation type="unfinished"></translation> </message> <message> - <source>ukui-biometric-manager</source> + <source>QRCode</source> <translation type="unfinished"></translation> </message> <message> - <source>QRCode</source> + <source>Biometric Manager</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Ukey</source> <translation type="unfinished"></translation> </message> </context> @@ -104,5 +108,9 @@ <source>Login Options</source> <translation type="unfinished"></translation> </message> + <message> + <source>Password</source> + <translation type="unfinished">пароль</translation> + </message> </context> </TS> diff -Nru ukui-biometric-auth-4.10.0.0/bioauth/i18n_ts/tr.ts ukui-biometric-auth-4.20.0.0/bioauth/i18n_ts/tr.ts --- ukui-biometric-auth-4.10.0.0/bioauth/i18n_ts/tr.ts 2023-11-14 16:23:44.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/bioauth/i18n_ts/tr.ts 2024-09-23 19:22:29.000000000 +0800 @@ -46,52 +46,57 @@ <context> <name>BioDevices</name> <message> - <location filename="../src/biodevices.cpp" line="64"/> + <location filename="../src/biodevices.cpp" line="78"/> <source>Unplugging of %1 device detected</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/biodevices.cpp" line="74"/> + <location filename="../src/biodevices.cpp" line="88"/> <source>%1 device insertion detected</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/biodevices.cpp" line="83"/> - <source>ukui-biometric-manager</source> + <location filename="../src/biodevices.cpp" line="97"/> + <source>Biometric Manager</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/biodevices.cpp" line="86"/> + <location filename="../src/biodevices.cpp" line="100"/> <source>biometric</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/biodevices.cpp" line="457"/> + <location filename="../src/biodevices.cpp" line="700"/> <source>FingerPrint</source> <translation>Parmak İzi</translation> </message> <message> - <location filename="../src/biodevices.cpp" line="459"/> + <location filename="../src/biodevices.cpp" line="702"/> <source>FingerVein</source> <translation>Damar İzi</translation> </message> <message> - <location filename="../src/biodevices.cpp" line="461"/> + <location filename="../src/biodevices.cpp" line="704"/> <source>Iris</source> <translation>Göz</translation> </message> <message> - <location filename="../src/biodevices.cpp" line="463"/> + <location filename="../src/biodevices.cpp" line="706"/> <source>Face</source> <translation>Yüz</translation> </message> <message> - <location filename="../src/biodevices.cpp" line="465"/> + <location filename="../src/biodevices.cpp" line="708"/> <source>VoicePrint</source> <translation>Ses İzi</translation> </message> <message> - <location filename="../src/biodevices.cpp" line="467"/> + <location filename="../src/biodevices.cpp" line="710"/> + <source>Ukey</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/biodevices.cpp" line="712"/> <source>QRCode</source> <translation type="unfinished"></translation> </message> @@ -123,10 +128,15 @@ <context> <name>LoginOptionsWidget</name> <message> - <location filename="../src/loginoptionswidget.cpp" line="59"/> + <location filename="../src/loginoptionswidget.cpp" line="79"/> <source>Login Options</source> <translation type="unfinished"></translation> </message> + <message> + <location filename="../src/loginoptionswidget.cpp" line="320"/> + <source>Password</source> + <translation type="unfinished">Parola</translation> + </message> </context> <context> <name>QObject</name> diff -Nru ukui-biometric-auth-4.10.0.0/bioauth/i18n_ts/ug.ts ukui-biometric-auth-4.20.0.0/bioauth/i18n_ts/ug.ts --- ukui-biometric-auth-4.10.0.0/bioauth/i18n_ts/ug.ts 1970-01-01 08:00:00.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/bioauth/i18n_ts/ug.ts 2024-09-23 19:22:29.000000000 +0800 @@ -0,0 +1,184 @@ +<?xml version="1.0" encoding="utf-8"?> +<!DOCTYPE TS> +<TS version="2.1" language="ug"> +<context> + <name>BioAuthWidget</name> + <message> + <location filename="../src/bioauthwidget.ui" line="14"/> + <source>Form</source> + <translation>جەدۋەل</translation> + </message> + <message> + <source>More</source> + <translation type="vanished">更多</translation> + </message> + <message> + <location filename="../src/bioauthwidget.ui" line="146"/> + <location filename="../src/bioauthwidget.cpp" line="41"/> + <source>Retry</source> + <translation>قايتا قايتا تىرشىش</translation> + </message> + <message> + <source>Too many unsuccessful attempts,please enter password.</source> + <translation type="vanished">验证失败达最大次数,请使用密码解锁</translation> + </message> + <message> + <source>Bioauth authentication failed, you still have %1 verification opportunities</source> + <translation type="vanished">生物认证失败,您还有%1次尝试机会</translation> + </message> + <message> + <source>Password</source> + <translation type="vanished">密码</translation> + </message> + <message> + <source>Current Device: </source> + <translation type="vanished">当前设备:</translation> + </message> + <message> + <location filename="../src/bioauthwidget.cpp" line="96"/> + <location filename="../src/bioauthwidget.cpp" line="212"/> + <source>%1 too many unsuccessful attempts,please enter password.</source> + <translation>مەغلۇپ بولۇش قېتىم سانى زىيادە كۆپ بولۇپ كەتتى، مەخپىي نومۇرنى كىرگۈزۈڭ</translation> + </message> + <message> + <location filename="../src/bioauthwidget.cpp" line="102"/> + <source>%1 authentication failure,there are still %2 remaining opportunities</source> + <translation>سالاھىيىتىنى دەلىللەش مەغلۇپ بولدى، يەنە ئىككى قېتىم پۇرسىتىڭىز قالدى</translation> + </message> + <message> + <location filename="../src/bioauthwidget.cpp" line="226"/> + <source>Please use wechat to scan the code</source> + <translation>ئۈندىداردا سىكانىرلاڭ</translation> + </message> +</context> +<context> + <name>BioDevices</name> + <message> + <location filename="../src/biodevices.cpp" line="78"/> + <source>Unplugging of %1 device detected</source> + <translation>تەكشۈرۈپ بايقىغان 1 ئۈسكۈنىنى تارتىپ چىقارماق</translation> + </message> + <message> + <location filename="../src/biodevices.cpp" line="88"/> + <source>%1 device insertion detected</source> + <translation>1 ئۈسكۈنىنىڭ كىرگۈزۈلگەنلىكىنى تەكشۈرۈپ چىقماق</translation> + </message> + <message> + <location filename="../src/biodevices.cpp" line="97"/> + <source>Biometric Manager</source> + <translation>بىئولەگىيەلىك ئالاھىدىلىكنى باشقۇرۇش قورالى</translation> + </message> + <message> + <location filename="../src/biodevices.cpp" line="100"/> + <source>biometric</source> + <translation>بىئولوگىيەلىك ئالاھىدىلىك</translation> + </message> + <message> + <location filename="../src/biodevices.cpp" line="700"/> + <source>FingerPrint</source> + <translation>بارماق ئىزى</translation> + </message> + <message> + <location filename="../src/biodevices.cpp" line="702"/> + <source>FingerVein</source> + <translation>بارماقVein</translation> + </message> + <message> + <location filename="../src/biodevices.cpp" line="704"/> + <source>Iris</source> + <translation>ئېرسى</translation> + </message> + <message> + <location filename="../src/biodevices.cpp" line="706"/> + <source>Face</source> + <translation>يۈز</translation> + </message> + <message> + <location filename="../src/biodevices.cpp" line="708"/> + <source>VoicePrint</source> + <translation>بىخەتەرلىك شىڧىرلىق ئاچقۇچى</translation> + </message> + <message> + <location filename="../src/biodevices.cpp" line="710"/> + <source>Ukey</source> + <translation>رەقەملىك گۇۋاھنامە</translation> + </message> + <message> + <location filename="../src/biodevices.cpp" line="712"/> + <source>QRCode</source> + <translation>ئىككىلىك كود</translation> + </message> + <message> + <source>Wechat</source> + <translation type="vanished">微信</translation> + </message> +</context> +<context> + <name>BioDevicesWidget</name> + <message> + <location filename="../src/biodeviceswidget.ui" line="14"/> + <source>Form</source> + <translation>جەدۋەل</translation> + </message> + <message> + <source>Device types:</source> + <translation type="vanished">设备类型:</translation> + </message> + <message> + <source>Back</source> + <translation type="vanished">返回</translation> + </message> + <message> + <source>OK</source> + <translation type="vanished">确定</translation> + </message> + <message> + <source>FingerPrint</source> + <translation type="vanished">指纹</translation> + </message> +</context> +<context> + <name>LoginOptionsWidget</name> + <message> + <location filename="../src/loginoptionswidget.cpp" line="79"/> + <source>Login Options</source> + <translation>كىرىش تاللانمىلىرى</translation> + </message> + <message> + <location filename="../src/loginoptionswidget.cpp" line="320"/> + <source>Password</source> + <translation>مەخپىي ئاچقۇچ</translation> + </message> + <message> + <source>Wechat</source> + <translation type="vanished">微信</translation> + </message> + <message> + <source>Biometric</source> + <translation type="vanished">生物识别</translation> + </message> +</context> +<context> + <name>QObject</name> + <message> + <source>FingerPrint</source> + <translation type="vanished">指纹</translation> + </message> + <message> + <source>FingerVein</source> + <translation type="vanished">指静脉</translation> + </message> + <message> + <source>Iris</source> + <translation type="vanished">虹膜</translation> + </message> + <message> + <source>Face</source> + <translation type="vanished">人脸</translation> + </message> + <message> + <source>VoicePrint</source> + <translation type="vanished">声纹</translation> + </message> +</context> +</TS> diff -Nru ukui-biometric-auth-4.10.0.0/bioauth/i18n_ts/zh_CN.ts ukui-biometric-auth-4.20.0.0/bioauth/i18n_ts/zh_CN.ts --- ukui-biometric-auth-4.10.0.0/bioauth/i18n_ts/zh_CN.ts 2023-11-14 16:23:44.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/bioauth/i18n_ts/zh_CN.ts 2024-09-23 19:22:29.000000000 +0800 @@ -28,7 +28,7 @@ </message> <message> <source>Password</source> - <translation>密码</translation> + <translation type="vanished">密码</translation> </message> <message> <source>Current Device: </source> @@ -54,57 +54,57 @@ <context> <name>BioDevices</name> <message> - <location filename="../src/biodevices.cpp" line="64"/> + <location filename="../src/biodevices.cpp" line="78"/> <source>Unplugging of %1 device detected</source> <translation>检测到%1设备拔出</translation> </message> <message> - <location filename="../src/biodevices.cpp" line="74"/> + <location filename="../src/biodevices.cpp" line="88"/> <source>%1 device insertion detected</source> <translation>检测到%1设备插入</translation> </message> <message> - <location filename="../src/biodevices.cpp" line="83"/> - <source>ukui-biometric-manager</source> + <location filename="../src/biodevices.cpp" line="97"/> + <source>Biometric Manager</source> <translation>生物特征管理工具</translation> </message> <message> - <location filename="../src/biodevices.cpp" line="86"/> + <location filename="../src/biodevices.cpp" line="100"/> <source>biometric</source> <translation>生物特征</translation> </message> <message> - <location filename="../src/biodevices.cpp" line="457"/> + <location filename="../src/biodevices.cpp" line="700"/> <source>FingerPrint</source> <translation>指纹</translation> </message> <message> - <location filename="../src/biodevices.cpp" line="459"/> + <location filename="../src/biodevices.cpp" line="702"/> <source>FingerVein</source> <translation>指静脉</translation> </message> <message> - <location filename="../src/biodevices.cpp" line="461"/> + <location filename="../src/biodevices.cpp" line="704"/> <source>Iris</source> <translation>虹膜</translation> </message> <message> - <location filename="../src/biodevices.cpp" line="463"/> + <location filename="../src/biodevices.cpp" line="706"/> <source>Face</source> <translation>人脸识别</translation> </message> <message> - <location filename="../src/biodevices.cpp" line="465"/> + <location filename="../src/biodevices.cpp" line="708"/> <source>VoicePrint</source> <translation>声纹</translation> </message> <message> - <location filename="../src/biodevices.cpp" line="657"/> - <source>ukey</source> - <translation type="unfinished"></translation> + <location filename="../src/biodevices.cpp" line="710"/> + <source>Ukey</source> + <translation>安全密钥</translation> </message> <message> - <location filename="../src/biodevices.cpp" line="659"/> + <location filename="../src/biodevices.cpp" line="712"/> <source>QRCode</source> <translation>二维码</translation> </message> @@ -140,12 +140,12 @@ <context> <name>LoginOptionsWidget</name> <message> - <location filename="../src/loginoptionswidget.cpp" line="59"/> + <location filename="../src/loginoptionswidget.cpp" line="79"/> <source>Login Options</source> <translation>登录选项</translation> </message> <message> - <location filename="../src/loginoptionswidget.cpp" line="294"/> + <location filename="../src/loginoptionswidget.cpp" line="320"/> <source>Password</source> <translation>密码</translation> </message> diff -Nru ukui-biometric-auth-4.10.0.0/bioauth/i18n_ts/zh_HK.ts ukui-biometric-auth-4.20.0.0/bioauth/i18n_ts/zh_HK.ts --- ukui-biometric-auth-4.10.0.0/bioauth/i18n_ts/zh_HK.ts 1970-01-01 08:00:00.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/bioauth/i18n_ts/zh_HK.ts 2024-09-23 19:22:29.000000000 +0800 @@ -0,0 +1,188 @@ +<?xml version="1.0" encoding="utf-8"?> +<!DOCTYPE TS> +<TS version="2.1" language="zh_Hant"> +<context> + <name>BioAuthWidget</name> + <message> + <location filename="../src/bioauthwidget.ui" line="14"/> + <source>Form</source> + <translation></translation> + </message> + <message> + <source>More</source> + <translation type="vanished">更多</translation> + </message> + <message> + <location filename="../src/bioauthwidget.ui" line="146"/> + <location filename="../src/bioauthwidget.cpp" line="41"/> + <source>Retry</source> + <translation>重試</translation> + </message> + <message> + <source>Too many unsuccessful attempts,please enter password.</source> + <translation type="vanished">验证失败达最大次数,请使用密码解锁</translation> + </message> + <message> + <source>Bioauth authentication failed, you still have %1 verification opportunities</source> + <translation type="vanished">生物认证失败,您还有%1次尝试机会</translation> + </message> + <message> + <source>Password</source> + <translation>密碼</translation> + </message> + <message> + <source>Current Device: </source> + <translation type="vanished">当前设备:</translation> + </message> + <message> + <location filename="../src/bioauthwidget.cpp" line="96"/> + <location filename="../src/bioauthwidget.cpp" line="212"/> + <source>%1 too many unsuccessful attempts,please enter password.</source> + <translation>%1失敗的嘗試次數太多,請輸入密碼</translation> + </message> + <message> + <location filename="../src/bioauthwidget.cpp" line="102"/> + <source>%1 authentication failure,there are still %2 remaining opportunities</source> + <translation>%1 身份驗證失敗,仍有 %2 個剩餘機會</translation> + </message> + <message> + <location filename="../src/bioauthwidget.cpp" line="226"/> + <source>Please use wechat to scan the code</source> + <translation>請使用微信掃碼</translation> + </message> +</context> +<context> + <name>BioDevices</name> + <message> + <location filename="../src/biodevices.cpp" line="78"/> + <source>Unplugging of %1 device detected</source> + <translation>檢測到 %1 設備的拔出</translation> + </message> + <message> + <location filename="../src/biodevices.cpp" line="88"/> + <source>%1 device insertion detected</source> + <translation>檢測到 %1 個設備插入</translation> + </message> + <message> + <location filename="../src/biodevices.cpp" line="97"/> + <source>Biometric Manager</source> + <translation>生物特徵管理工具</translation> + </message> + <message> + <location filename="../src/biodevices.cpp" line="100"/> + <source>biometric</source> + <translation>生物特徵管理工具</translation> + </message> + <message> + <location filename="../src/biodevices.cpp" line="700"/> + <source>FingerPrint</source> + <translation>指紋</translation> + </message> + <message> + <location filename="../src/biodevices.cpp" line="702"/> + <source>FingerVein</source> + <translation>指靜脈</translation> + </message> + <message> + <location filename="../src/biodevices.cpp" line="704"/> + <source>Iris</source> + <translation>虹膜</translation> + </message> + <message> + <location filename="../src/biodevices.cpp" line="706"/> + <source>Face</source> + <translation>人臉</translation> + </message> + <message> + <location filename="../src/biodevices.cpp" line="708"/> + <source>VoicePrint</source> + <translation>聲紋</translation> + </message> + <message> + <location filename="../src/biodevices.cpp" line="710"/> + <source>Ukey</source> + <translation>安全金鑰</translation> + </message> + <message> + <source>ukey</source> + <translation type="vanished">安全金鑰</translation> + </message> + <message> + <location filename="../src/biodevices.cpp" line="712"/> + <source>QRCode</source> + <translation>微信掃碼</translation> + </message> + <message> + <source>Wechat</source> + <translation type="vanished">微信</translation> + </message> +</context> +<context> + <name>BioDevicesWidget</name> + <message> + <location filename="../src/biodeviceswidget.ui" line="14"/> + <source>Form</source> + <translation></translation> + </message> + <message> + <source>Device types:</source> + <translation type="vanished">设备类型:</translation> + </message> + <message> + <source>Back</source> + <translation type="vanished">返回</translation> + </message> + <message> + <source>OK</source> + <translation type="vanished">确定</translation> + </message> + <message> + <source>FingerPrint</source> + <translation type="vanished">指纹</translation> + </message> +</context> +<context> + <name>LoginOptionsWidget</name> + <message> + <location filename="../src/loginoptionswidget.cpp" line="79"/> + <source>Login Options</source> + <translation>登錄選項</translation> + </message> + <message> + <location filename="../src/loginoptionswidget.cpp" line="320"/> + <source>Password</source> + <translation>密碼</translation> + </message> + <message> + <source>Wechat</source> + <translation type="vanished">微信</translation> + </message> + <message> + <source>Biometric</source> + <translation type="vanished">生物识别</translation> + </message> +</context> +<context> + <name>QObject</name> + <message> + <source>FingerPrint</source> + <translation type="vanished">指纹</translation> + </message> + <message> + <source>FingerVein</source> + <translation type="vanished">指静脉</translation> + </message> + <message> + <source>Iris</source> + <translation type="vanished">虹膜</translation> + </message> + <message> + <source>Face</source> + <translation type="vanished">人脸</translation> + </message> + <message> + <source>VoicePrint</source> + <translation type="vanished">声纹</translation> + </message> +</context> +</TS> diff -Nru ukui-biometric-auth-4.10.0.0/bioauth/include/bioauth.h ukui-biometric-auth-4.20.0.0/bioauth/include/bioauth.h --- ukui-biometric-auth-4.10.0.0/bioauth/include/bioauth.h 2023-11-14 16:23:44.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/bioauth/include/bioauth.h 2024-09-23 19:22:29.000000000 +0800 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018 Tianjin KYLIN Information Technology Co., Ltd. + * Copyright (C) 2023 KylinSoftCo., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -62,6 +62,7 @@ signals: void authComplete(int uid, bool result, int retErrNo); + void authFinished(); void notify(const QString &message); void notifyDetail(int deviceId, const QString &message); void frameWritten(int deviceId); diff -Nru ukui-biometric-auth-4.10.0.0/bioauth/include/bioauthwidget.h ukui-biometric-auth-4.20.0.0/bioauth/include/bioauthwidget.h --- ukui-biometric-auth-4.10.0.0/bioauth/include/bioauthwidget.h 2023-11-14 16:23:44.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/bioauth/include/bioauthwidget.h 2024-09-23 19:22:29.000000000 +0800 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018 Tianjin KYLIN Information Technology Co., Ltd. + * Copyright (C) 2023 KylinSoftCo., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff -Nru ukui-biometric-auth-4.10.0.0/bioauth/include/biodevices.h ukui-biometric-auth-4.20.0.0/bioauth/include/biodevices.h --- ukui-biometric-auth-4.10.0.0/bioauth/include/biodevices.h 2023-11-14 16:23:44.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/bioauth/include/biodevices.h 2024-09-23 19:22:29.000000000 +0800 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018 Tianjin KYLIN Information Technology Co., Ltd. + * Copyright (C) 2023 KylinSoftCo., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -57,6 +57,7 @@ void setIsShowHotPlug(bool isShow); int GetUserDevFeatureCount(int uid,int drvid); int GetUserDevCount(int uid); + FeatureMap GetUserFeatures(int uid); bool getUseFirstDevice(); int getFailedTimes(); bool GetHiddenSwitchButton(); @@ -71,6 +72,8 @@ */ StatusReslut UpdateStatus(int drvid); bool GetBioAuthEnable(uid_t uid); + bool GetDirveIsIdle(int drvid); + void recordAuthDrive(QString appName,int drvid,bool insert); private: void connectToService(); diff -Nru ukui-biometric-auth-4.10.0.0/bioauth/include/biodeviceswidget.h ukui-biometric-auth-4.20.0.0/bioauth/include/biodeviceswidget.h --- ukui-biometric-auth-4.10.0.0/bioauth/include/biodeviceswidget.h 2023-11-14 16:23:44.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/bioauth/include/biodeviceswidget.h 2024-09-23 19:22:29.000000000 +0800 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018 Tianjin KYLIN Information Technology Co., Ltd. + * Copyright (C) 2023 KylinSoftCo., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff -Nru ukui-biometric-auth-4.10.0.0/bioauth/include/biometric.h ukui-biometric-auth-4.20.0.0/bioauth/include/biometric.h --- ukui-biometric-auth-4.10.0.0/bioauth/include/biometric.h 2023-11-14 16:23:44.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/bioauth/include/biometric.h 2024-09-23 19:22:29.000000000 +0800 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018 Tianjin KYLIN Information Technology Co., Ltd. + * Copyright (C) 2023 KylinSoftCo., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff -Nru ukui-biometric-auth-4.10.0.0/bioauth/include/biotypes.h ukui-biometric-auth-4.20.0.0/bioauth/include/biotypes.h --- ukui-biometric-auth-4.10.0.0/bioauth/include/biotypes.h 2023-11-14 16:23:44.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/bioauth/include/biotypes.h 2024-09-23 19:22:29.000000000 +0800 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018 Tianjin KYLIN Information Technology Co., Ltd. + * Copyright (C) 2023 KylinSoftCo., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -225,6 +225,9 @@ typedef std::shared_ptr<DeviceInfo> DeviceInfoPtr; typedef QList<DeviceInfoPtr> DeviceList; typedef QMap<int, DeviceList> DeviceMap; +typedef std::shared_ptr<FeatureInfo> FeatureInfoPtr; +typedef QList<FeatureInfoPtr> FeatureList; +typedef QMap<QString, FeatureList> FeatureMap; QDBusArgument &operator<<(QDBusArgument &argument, const DeviceInfo &deviceInfo); const QDBusArgument &operator>>(const QDBusArgument &argument, DeviceInfo &deviceInfo); diff -Nru ukui-biometric-auth-4.10.0.0/bioauth/include/giodbus.h ukui-biometric-auth-4.20.0.0/bioauth/include/giodbus.h --- ukui-biometric-auth-4.10.0.0/bioauth/include/giodbus.h 2023-11-14 16:23:44.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/bioauth/include/giodbus.h 2024-09-23 19:22:29.000000000 +0800 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023 Tianjin KYLIN Information Technology Co., Ltd. + * Copyright (C) 2023 KylinSoftCo., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff -Nru ukui-biometric-auth-4.10.0.0/bioauth/include/loginoptionswidget.h ukui-biometric-auth-4.20.0.0/bioauth/include/loginoptionswidget.h --- ukui-biometric-auth-4.10.0.0/bioauth/include/loginoptionswidget.h 2023-11-14 16:23:44.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/bioauth/include/loginoptionswidget.h 2024-09-23 19:22:29.000000000 +0800 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023 Tianjin KYLIN Information Technology Co., Ltd. + * Copyright (C) 2023 KylinSoftCo., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -100,6 +100,7 @@ public slots: void readDevicesInfo(); void onIdentifyComplete(int uid, bool ret, int retErrNo); + void onAuthFinished(); void onStatusChanged(int drvid, const QString &message); void onFrameWritten(int drvid); void onUSBDeviceCountChange(int newNum); diff -Nru ukui-biometric-auth-4.10.0.0/bioauth/include/uniauthservice.h ukui-biometric-auth-4.20.0.0/bioauth/include/uniauthservice.h --- ukui-biometric-auth-4.10.0.0/bioauth/include/uniauthservice.h 2023-11-14 16:23:44.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/bioauth/include/uniauthservice.h 2024-09-23 19:22:29.000000000 +0800 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2022 Tianjin KYLIN Information Technology Co., Ltd. + * Copyright (C) 2023 KylinSoftCo., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -61,9 +61,13 @@ bool getUseFirstDevice(); // 获取是否隐藏切换按钮 bool getHiddenSwitchButton(); - + // 获取正在认证的应用 + QStringList getAuthingApp(); + // 获取应用认证的驱动 + int getAuthingAppDrivd(QString appName); public: bool isActivatable(); + void recordAuthDrive(QString appName,int drvid,bool insert); Q_SIGNALS: //默认设备改变 diff -Nru ukui-biometric-auth-4.10.0.0/bioauth/src/bioauth.cpp ukui-biometric-auth-4.20.0.0/bioauth/src/bioauth.cpp --- ukui-biometric-auth-4.10.0.0/bioauth/src/bioauth.cpp 2023-11-14 16:23:44.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/bioauth/src/bioauth.cpp 2024-09-23 19:22:29.000000000 +0800 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018 Tianjin KYLIN Information Technology Co., Ltd. + * Copyright (C) 2023 KylinSoftCo., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -17,6 +17,7 @@ **/ #include "bioauth.h" #include <QList> +#include <unistd.h> BioAuth::BioAuth(qint32 uid, const DeviceInfoPtr deviceInfo, QObject *parent) : QObject(parent), @@ -110,6 +111,11 @@ QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(call, this); connect(watcher, &QDBusPendingCallWatcher::finished, this, &BioAuth::onIdentityComplete); }else{ + //使用sudo等命令时,不停止设备,当存在其他可认证设备时,使用其他可认证设备,否则使用密码 + if(qAppName() != "bioauth"){ + //stopops在identify之前使用时,不要调用getFeaturelist,否则会出现identify被停止的现象,应该时框架的bug。 + serviceInterface->call("StopOps", QVariant(deviceInfo->device_id), QVariant(3000)); + } QDBusPendingCall call = serviceInterface->asyncCallWithArgumentList("Identify", args); QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(call, this); connect(watcher, &QDBusPendingCallWatcher::finished, this, &BioAuth::onIdentityComplete); @@ -175,6 +181,7 @@ QDBusReply<int> reply = serviceInterface->call("StopOps", QVariant(deviceInfo->device_id), QVariant(3000)); + emit authFinished(); if(!reply.isValid()) qWarning() << "StopOps error: " << reply.error(); @@ -188,6 +195,7 @@ void BioAuth::onIdentityComplete(QDBusPendingCallWatcher *watcher) { + emit authFinished(); QDBusPendingReply<qint32, qint32> reply = *watcher; if(reply.isError()){ isInAuthentication = false; @@ -227,6 +235,11 @@ LOG() << msg.errorMessage(); return; } + + if(deviceInfo && deviceInfo->device_id != deviceId){ + return ; + } + QString message = msg.arguments().at(0).toString(); LOG() << message; Q_EMIT notify(message); diff -Nru ukui-biometric-auth-4.10.0.0/bioauth/src/bioauthwidget.cpp ukui-biometric-auth-4.20.0.0/bioauth/src/bioauthwidget.cpp --- ukui-biometric-auth-4.10.0.0/bioauth/src/bioauthwidget.cpp 2023-11-14 16:23:44.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/bioauth/src/bioauthwidget.cpp 2024-09-23 19:22:29.000000000 +0800 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018 Tianjin KYLIN Information Technology Co., Ltd. + * Copyright (C) 2023 KylinSoftCo., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff -Nru ukui-biometric-auth-4.10.0.0/bioauth/src/biodevices.cpp ukui-biometric-auth-4.20.0.0/bioauth/src/biodevices.cpp --- ukui-biometric-auth-4.10.0.0/bioauth/src/biodevices.cpp 2023-11-14 16:23:44.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/bioauth/src/biodevices.cpp 2024-09-23 19:22:29.000000000 +0800 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018 Tianjin KYLIN Information Technology Co., Ltd. + * Copyright (C) 2023 KylinSoftCo., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -94,7 +94,7 @@ "org.freedesktop.Notifications", QDBusConnection::sessionBus()); QList<QVariant> args; - args<<(tr("ukui-biometric-manager")) + args<<(tr("Biometric Manager")) <<((unsigned int) 0) <<"biometric-manager" <<tr("biometric") @@ -200,10 +200,32 @@ } +FeatureMap BioDevices::GetUserFeatures(int uid) +{ + FeatureMap featureMap; + QList<QDBusVariant> qlist; + int listsize; + QDBusMessage result = serviceInterface->call(QStringLiteral("GetAllFeatureList"), uid, 0, -1); + if(result.type() == QDBusMessage::ErrorMessage) + { + qWarning() << "GetDevList error:" << result.errorMessage(); + return featureMap; + } + + QList<QVariant> variantList = result.arguments(); + listsize = variantList[0].value<int>(); + variantList[1].value<QDBusArgument>() >> qlist; + for (int i = 0; i < listsize; i++) { + FeatureInfoPtr pFeatureInfo = std::make_shared<FeatureInfo>(); + qlist[i].variant().value<QDBusArgument>() >> *pFeatureInfo; + featureMap[pFeatureInfo->device_shortname].append(pFeatureInfo); + } + + return featureMap; +} + int BioDevices::GetUserDevFeatureCount(int uid,int drvid) { - // stop last option - serviceInterface->call("StopOps", QVariant(drvid), QVariant(3000)); QDBusMessage FeatureResult = serviceInterface->call(QStringLiteral("GetFeatureList"),drvid,uid,0,-1); if(FeatureResult.type() == QDBusMessage::ErrorMessage) { @@ -218,7 +240,6 @@ int res = 0; for(int i = 0; i < deviceInfos.count(); i++) { DeviceInfoPtr deviceInfo = deviceInfos.at(i); - QDBusReply<int> reply = serviceInterface->call("StopOps", QVariant(deviceInfo->device_id), QVariant(3000)); QDBusMessage featurecount = serviceInterface->call("GetFeatureList",deviceInfo->device_id,uid,indexStart,indexEnd); if(featurecount.type() == QDBusMessage::ErrorMessage) { @@ -237,6 +258,10 @@ for(auto deviceInfo : deviceInfos) { if (deviceInfo->biotype == REMOTE_QRCODE_TYPE) // 终端不使用扫码 continue; + + if(!GetDirveIsIdle(deviceInfo->device_id)) + continue; + devices[deviceInfo->biotype].push_back(*deviceInfo); } @@ -406,6 +431,7 @@ if(deviceInfos.size() <= 0) return nullptr; + FeatureMap mapFeatures = GetUserFeatures(uid); if (m_uniAuthService && m_uniAuthService->isActivatable()) { QString defaultDeviceName = ""; struct passwd *pwdInfo = getpwuid(uid); @@ -416,7 +442,8 @@ if(!strDeviceName.isEmpty()) { ptrDevInfo = findDevice(strDeviceName); if (ptrDevInfo) { - if (GetUserDevFeatureCount(uid,ptrDevInfo->device_id) > 0) { + int isIdle = GetDirveIsIdle(ptrDevInfo->device_id); + if(isIdle && mapFeatures.contains(ptrDevInfo->device_shortname)){ defaultDeviceName = strDeviceName; } } @@ -454,9 +481,11 @@ bool defValid = false; DeviceInfoPtr ptrDevInfo = findDevice(defaultDeviceName); if (ptrDevInfo) { - if (GetUserDevFeatureCount(uid,ptrDevInfo->device_id) > 0) { + int isIdle = GetDirveIsIdle(ptrDevInfo->device_id); + if(isIdle && mapFeatures.contains(ptrDevInfo->device_shortname)){ defValid = true; } + } if (!defValid) { @@ -467,11 +496,34 @@ } } +void BioDevices::recordAuthDrive(QString appName, int drvid, bool insert) +{ + if(m_uniAuthService && m_uniAuthService->isActivatable()){ + m_uniAuthService->recordAuthDrive(appName,drvid,insert); + } +} + +bool BioDevices::GetDirveIsIdle(int drvid) +{ + if(m_uniAuthService && m_uniAuthService->isActivatable()){ + QStringList appList = m_uniAuthService->getAuthingApp(); + for(QString appName : appList){ + int id = m_uniAuthService->getAuthingAppDrivd(appName); + if(id == drvid){ + return false; + } + } + } + + return true; +} + DeviceInfoPtr BioDevices::getDefaultDevice(uid_t uid) { if(deviceInfos.size() <= 0) return nullptr; + FeatureMap mapFeatures = GetUserFeatures(uid); if (m_uniAuthService && m_uniAuthService->isActivatable()) { QString defaultDeviceName = ""; struct passwd *pwdInfo = getpwuid(uid); @@ -483,7 +535,8 @@ if(!strDeviceName.isEmpty()) { ptrDevInfo = findDevice(strDeviceName); if (ptrDevInfo) { - if (GetUserDevFeatureCount(uid,ptrDevInfo->device_id) > 0) { + int isIdle = GetDirveIsIdle(ptrDevInfo->device_id); + if(isIdle && mapFeatures.contains(ptrDevInfo->device_shortname)){ defaultDeviceName = strDeviceName; break; } @@ -525,7 +578,7 @@ bool defValid = false; DeviceInfoPtr ptrDevInfo = findDevice(defaultDeviceName); if (ptrDevInfo) { - if (GetUserDevFeatureCount(uid,ptrDevInfo->device_id) > 0) { + if (mapFeatures.contains(ptrDevInfo->device_shortname)) { defValid = true; } } @@ -654,7 +707,7 @@ case BIOTYPE_VOICEPRINT: return tr("VoicePrint"); case LOGINOPT_TYPE_GENERAL_UKEY: - return tr("ukey"); + return tr("Ukey"); case REMOTE_QRCODE_TYPE: return tr("QRCode"); } diff -Nru ukui-biometric-auth-4.10.0.0/bioauth/src/biodeviceswidget.cpp ukui-biometric-auth-4.20.0.0/bioauth/src/biodeviceswidget.cpp --- ukui-biometric-auth-4.10.0.0/bioauth/src/biodeviceswidget.cpp 2023-11-14 16:23:44.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/bioauth/src/biodeviceswidget.cpp 2024-09-23 19:22:29.000000000 +0800 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018 Tianjin KYLIN Information Technology Co., Ltd. + * Copyright (C) 2023 KylinSoftCo., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff -Nru ukui-biometric-auth-4.10.0.0/bioauth/src/biotypes.cpp ukui-biometric-auth-4.20.0.0/bioauth/src/biotypes.cpp --- ukui-biometric-auth-4.10.0.0/bioauth/src/biotypes.cpp 2023-11-14 16:23:44.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/bioauth/src/biotypes.cpp 2024-09-23 19:22:29.000000000 +0800 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018 Tianjin KYLIN Information Technology Co., Ltd. + * Copyright (C) 2023 KylinSoftCo., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff -Nru ukui-biometric-auth-4.10.0.0/bioauth/src/giodbus.cpp ukui-biometric-auth-4.20.0.0/bioauth/src/giodbus.cpp --- ukui-biometric-auth-4.10.0.0/bioauth/src/giodbus.cpp 2023-11-14 16:23:44.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/bioauth/src/giodbus.cpp 2024-09-23 19:22:29.000000000 +0800 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023 Tianjin KYLIN Information Technology Co., Ltd. + * Copyright (C) 2023 KylinSoftCo., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff -Nru ukui-biometric-auth-4.10.0.0/bioauth/src/loginoptionswidget.cpp ukui-biometric-auth-4.20.0.0/bioauth/src/loginoptionswidget.cpp --- ukui-biometric-auth-4.10.0.0/bioauth/src/loginoptionswidget.cpp 2023-11-14 16:23:44.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/bioauth/src/loginoptionswidget.cpp 2024-09-23 19:22:29.000000000 +0800 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023 Tianjin KYLIN Information Technology Co., Ltd. + * Copyright (C) 2023 KylinSoftCo., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -48,6 +48,7 @@ , m_bioDevices(new BioDevices()) , w_timer(nullptr) { + m_bioDevices->recordAuthDrive("polkit",0,false); initUI(); initConnections(); m_mapDisableDev.clear(); @@ -161,6 +162,9 @@ connect(m_biomericProxy, &BioAuth::authComplete, this, &LoginOptionsWidget::onIdentifyComplete); + + connect(m_biomericProxy, &BioAuth::authFinished, + this, &LoginOptionsWidget::onAuthFinished); } if (m_bioDevices) { connect(m_bioDevices, &BioDevices::deviceCountChanged, @@ -399,6 +403,9 @@ bool isQRCodeEnable = m_bioDevices->GetQRCodeEnable(); DeviceList deviceList = m_bioDevices->GetDevList(); QStringList listDefDevices = m_bioDevices->getAllDefDevices(); + FeatureMap mapFeatures = m_bioDevices->GetUserFeatures(m_uid); + qDebug() << m_uid <<",count:"<<mapFeatures.size(); + for(auto pDeviceInfo : deviceList) { int nDevFeatureCount = 0; @@ -407,8 +414,8 @@ } else { if (m_uid == -1) { nDevFeatureCount = 0; - } else { - nDevFeatureCount = m_bioDevices->GetUserDevFeatureCount(m_uid, pDeviceInfo->device_id); + } else if(mapFeatures.contains(pDeviceInfo->device_shortname)){ + nDevFeatureCount = mapFeatures[pDeviceInfo->device_shortname].size(); } } qDebug() << *pDeviceInfo << ",FeatureCount:"<<nDevFeatureCount; @@ -496,6 +503,7 @@ m_labelFaceLoad->show(); } w_timer->start(); + m_bioDevices->recordAuthDrive("polkit",m_curDevInfo->device_id,true); m_biomericProxy->startAuth(m_uid, m_curDevInfo); } @@ -530,6 +538,13 @@ } } +void LoginOptionsWidget::onAuthFinished() +{ + if(m_bioDevices){ + m_bioDevices->recordAuthDrive("polkit",0,false); + } +} + void LoginOptionsWidget::onIdentifyComplete(int uid, bool ret, int retErrNo) { if(m_isStopped == true) diff -Nru ukui-biometric-auth-4.10.0.0/bioauth/src/uniauthservice.cpp ukui-biometric-auth-4.20.0.0/bioauth/src/uniauthservice.cpp --- ukui-biometric-auth-4.10.0.0/bioauth/src/uniauthservice.cpp 2023-11-14 16:23:44.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/bioauth/src/uniauthservice.cpp 2024-09-23 19:22:29.000000000 +0800 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2022 Tianjin KYLIN Information Technology Co., Ltd. + * Copyright (C) 2023 KylinSoftCo., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -245,6 +245,45 @@ } } +// 获取正在认证的应用 +QStringList UniAuthService::getAuthingApp() +{ + QDBusMessage result = call(QStringLiteral("getAllAuthApp")); + if(result.type() == QDBusMessage::ErrorMessage) + { + qWarning() << "getAuthingApp error:" << result.errorMessage(); + return QStringList(); + } + QList<QVariant> varResult = result.arguments(); + if (varResult.size() > 0) { + return varResult.takeFirst().toStringList(); + } else { + return QStringList(); + } +} + +// 获取应用认证的驱动 +int UniAuthService::getAuthingAppDrivd(QString appName) +{ + QDBusMessage result = call(QStringLiteral("getAppAuthDrive"),appName); + if(result.type() == QDBusMessage::ErrorMessage) + { + qWarning() << "getAuthingAppDrivd error:" << result.errorMessage(); + return -1; + } + QList<QVariant> varResult = result.arguments(); + if (varResult.size() > 0) { + return varResult.takeFirst().toInt(); + } else { + return -1; + } +} + +void UniAuthService::recordAuthDrive(QString appName,int drvid,bool insert) +{ + call(QStringLiteral("recordAuthDrive"),appName,drvid,insert); +} + bool UniAuthService::isActivatable() { return m_isActivatable; diff -Nru ukui-biometric-auth-4.10.0.0/bioauth-bin/i18n_ts/bo.ts ukui-biometric-auth-4.20.0.0/bioauth-bin/i18n_ts/bo.ts --- ukui-biometric-auth-4.10.0.0/bioauth-bin/i18n_ts/bo.ts 2023-11-14 16:23:44.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/bioauth-bin/i18n_ts/bo.ts 2024-09-23 19:22:29.000000000 +0800 @@ -4,114 +4,134 @@ <context> <name>QObject</name> <message> - <location filename="../src/main.cpp" line="100"/> + <location filename="../src/main.cpp" line="126"/> + <source>Enter the ukey password</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/main.cpp" line="150"/> <source>Try it again</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/main.cpp" line="102"/> + <location filename="../src/main.cpp" line="152"/> <source>Use other Devices</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/main.cpp" line="103"/> + <location filename="../src/main.cpp" line="153"/> <source>Cancel</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/main.cpp" line="112"/> + <location filename="../src/main.cpp" line="162"/> <source>Choose the option</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/main.cpp" line="134"/> - <location filename="../src/main.cpp" line="169"/> - <location filename="../src/main.cpp" line="178"/> + <location filename="../src/main.cpp" line="184"/> + <location filename="../src/main.cpp" line="219"/> + <location filename="../src/main.cpp" line="228"/> <source>Invaild response "</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/main.cpp" line="134"/> - <location filename="../src/main.cpp" line="169"/> - <location filename="../src/main.cpp" line="178"/> + <location filename="../src/main.cpp" line="184"/> + <location filename="../src/main.cpp" line="219"/> + <location filename="../src/main.cpp" line="228"/> <source>authentication will be canceld</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/main.cpp" line="135"/> - <location filename="../src/main.cpp" line="170"/> - <location filename="../src/main.cpp" line="179"/> - <location filename="../src/main.cpp" line="315"/> + <location filename="../src/main.cpp" line="185"/> + <location filename="../src/main.cpp" line="220"/> + <location filename="../src/main.cpp" line="229"/> + <location filename="../src/main.cpp" line="408"/> <source>AUTHENTICATION CANCELED</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/main.cpp" line="146"/> + <location filename="../src/main.cpp" line="196"/> <source>=== BIOMETRIC DEVICES ===</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/main.cpp" line="157"/> + <location filename="../src/main.cpp" line="207"/> <source>Choose the device</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/main.cpp" line="210"/> + <location filename="../src/main.cpp" line="260"/> <source>Sevice Name</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/main.cpp" line="211"/> + <location filename="../src/main.cpp" line="261"/> <source>DISPLAY env</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/main.cpp" line="212"/> + <location filename="../src/main.cpp" line="262"/> <source>User</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/main.cpp" line="213"/> + <location filename="../src/main.cpp" line="263"/> <source>Display debug information</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/main.cpp" line="214"/> + <location filename="../src/main.cpp" line="264"/> <source>Device short name</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/main.cpp" line="249"/> + <location filename="../src/main.cpp" line="306"/> + <source>UKEY AUTHENTICATION</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/main.cpp" line="308"/> <source>BIOMETRIC AUTHENTICATION</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/main.cpp" line="251"/> + <location filename="../src/main.cpp" line="310"/> <source>Press Q or Esc to cancel</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/main.cpp" line="263"/> + <location filename="../src/main.cpp" line="330"/> + <source>BIOMETRIC AUTHENTICATION IS CLOSED</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/main.cpp" line="334"/> <source>AUTHENTICATION SUCCESS</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/main.cpp" line="267"/> + <location filename="../src/main.cpp" line="338"/> <source>AUTHENTICATION FAILED</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/main.cpp" line="277"/> + <location filename="../src/main.cpp" line="348"/> <source>Failed to verify %1, you still have %2 verification opportunities</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/main.cpp" line="279"/> + <location filename="../src/main.cpp" line="350"/> <source>Unable to verify %1, please enter password.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/main.cpp" line="302"/> + <location filename="../src/main.cpp" line="386"/> + <source>AUTHENTICATION END</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/main.cpp" line="388"/> <source>BIOMETRIC AUTHENTICATION END</source> <translation type="unfinished"></translation> </message> diff -Nru ukui-biometric-auth-4.10.0.0/bioauth-bin/i18n_ts/bo_CN.ts ukui-biometric-auth-4.20.0.0/bioauth-bin/i18n_ts/bo_CN.ts --- ukui-biometric-auth-4.10.0.0/bioauth-bin/i18n_ts/bo_CN.ts 2023-11-14 16:23:44.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/bioauth-bin/i18n_ts/bo_CN.ts 2024-09-23 19:22:29.000000000 +0800 @@ -13,7 +13,7 @@ </message> <message> <source>=== BIOMETRIC DEVICES ===</source> - <translation>=== 生物识别设备 ===</translation> + <translation>=== སྐྱེ་དངོས་ངོས་འཛིན་སྒྲིག་ཆས། ===</translation> </message> <message> <source>Display debug information</source> @@ -81,28 +81,27 @@ </message> <message> <source>Failed to verify %1, you still have %2 verification opportunities</source> - <translation type="unfinished"></translation> + <translation>ཚོད་ལྟས་ར་སྤྲོད་%1ཕམ་ཉེས་བྱུང་།ཁྱེད་རང་ད་དུང་ཡོད།%2ཚོད་ལྟ་བྱེད་པའི་གོ་སྐབས་ཤིག་རེད།</translation> </message> <message> <source>Unable to verify %1, please enter password.</source> - <translation type="unfinished"></translation> + <translation>ཚོད་ལྟས་ར་སྤྲོད་བྱེད་ཐབས་མེད%1,ཁྱོད་ཀྱིས་གསང་གྲངས་ནང་འཇུག་བྱེད་རོགས།</translation> </message> <message> <source>UKEY AUTHENTICATION</source> - <translation type="unfinished"></translation> + <translation>བདེ་འཇགས་ཀྱི་གསང་བའི་བདེན་དཔང་ར་སྤྲོད།</translation> </message> <message> <source>BIOMETRIC AUTHENTICATION IS CLOSED</source> - <translation type="unfinished"></translation> + <translation>སྐྱེ་དངོས་ཀྱི་ངོས་འཛིན་ཁས་ལེན་བྱས་པ་སྒོ་བརྒྱབ་ཟིན།</translation> </message> <message> <source>AUTHENTICATION END</source> - <translation type="unfinished"></translation> + <translation>བདེན་དཔང་ར་སྤྲོད་མཇུག་བསྒྲི</translation> </message> <message> - <source>Enter the ukey password -</source> - <translation type="unfinished"></translation> + <source>Enter the ukey password</source> + <translation>བདེ་འཇགས་ཀྱི་གསང་བའི་གསང་བའི་ཨང་གྲངས་ནང་འཇུག་བྱེད་དགོས།</translation> </message> </context> </TS> diff -Nru ukui-biometric-auth-4.10.0.0/bioauth-bin/i18n_ts/de.ts ukui-biometric-auth-4.20.0.0/bioauth-bin/i18n_ts/de.ts --- ukui-biometric-auth-4.10.0.0/bioauth-bin/i18n_ts/de.ts 1970-01-01 08:00:00.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/bioauth-bin/i18n_ts/de.ts 2024-09-23 19:22:29.000000000 +0800 @@ -0,0 +1,287 @@ +<?xml version="1.0" encoding="utf-8"?> +<!DOCTYPE TS> +<TS version="2.1" language="de"> +<context> + <name>BioAuthWidget</name> + <message> + <source>More</source> + <translation type="vanished">更多</translation> + </message> + <message> + <source>Retry</source> + <translation type="vanished">wiederholen</translation> + </message> + <message> + <source>Too many unsuccessful attempts,please enter password.</source> + <translation type="vanished">验证失败达最大次数,请使用密码解锁</translation> + </message> + <message> + <source>Bioauth authentication failed, you still have %1 verification opportunities</source> + <translation type="vanished">生物认证失败,您还有%1次尝试机会</translation> + </message> + <message> + <source>Password</source> + <translation type="vanished">Passwort</translation> + </message> + <message> + <source>Current Device: </source> + <translation type="vanished">当前设备:</translation> + </message> + <message> + <source>%1 too many unsuccessful attempts,please enter password.</source> + <translation type="vanished">%1 Es gibt zu viele fehlgeschlagene Versuche, bitte geben Sie Ihr Passwort ein.</translation> + </message> + <message> + <source>%1 authentication failure,there are still %2 remaining opportunities</source> + <translation type="vanished">%1 Authentifizierung fehlgeschlagen und es sind noch %2 verbleibende Chancen</translation> + </message> + <message> + <source>Please use wechat to scan the code</source> + <translation type="vanished">Bitte verwenden Sie WeChat, um den Code zu scannen</translation> + </message> +</context> +<context> + <name>BioDevices</name> + <message> + <source>Unplugging of %1 device detected</source> + <translation type="vanished">Das %1-Gerät wurde vom Stromnetz getrennt</translation> + </message> + <message> + <source>%1 device insertion detected</source> + <translation type="vanished">%1 angeschlossenes Gerät erkannt</translation> + </message> + <message> + <source>ukui-biometric-manager</source> + <translation type="vanished">Tools für die biometrische Verwaltung</translation> + </message> + <message> + <source>biometric</source> + <translation type="vanished">Biologische Eigenschaften</translation> + </message> + <message> + <source>FingerPrint</source> + <translation type="vanished">Fingerabdruck</translation> + </message> + <message> + <source>FingerVein</source> + <translation type="vanished">Fingervenen</translation> + </message> + <message> + <source>Iris</source> + <translation type="vanished">Iris</translation> + </message> + <message> + <source>Face</source> + <translation type="vanished">Gesichtserkennung</translation> + </message> + <message> + <source>VoicePrint</source> + <translation type="vanished">Stimmenausdruck</translation> + </message> + <message> + <source>ukey</source> + <translation type="vanished">Sicherheitsschlüssel</translation> + </message> + <message> + <source>QRCode</source> + <translation type="vanished">QR-Code</translation> + </message> + <message> + <source>Wechat</source> + <translation type="vanished">微信</translation> + </message> +</context> +<context> + <name>BioDevicesWidget</name> + <message> + <source>Device types:</source> + <translation type="vanished">设备类型:</translation> + </message> + <message> + <source>Back</source> + <translation type="vanished">返回</translation> + </message> + <message> + <source>OK</source> + <translation type="vanished">确定</translation> + </message> + <message> + <source>FingerPrint</source> + <translation type="vanished">指纹</translation> + </message> +</context> +<context> + <name>LoginOptionsWidget</name> + <message> + <source>Login Options</source> + <translation type="vanished">Anmeldeoptionen</translation> + </message> + <message> + <source>Password</source> + <translation type="vanished">Passwort</translation> + </message> + <message> + <source>Wechat</source> + <translation type="vanished">微信</translation> + </message> + <message> + <source>Biometric</source> + <translation type="vanished">生物识别</translation> + </message> +</context> +<context> + <name>QObject</name> + <message> + <source>FingerPrint</source> + <translation type="vanished">指纹</translation> + </message> + <message> + <source>FingerVein</source> + <translation type="vanished">指静脉</translation> + </message> + <message> + <source>Iris</source> + <translation type="vanished">虹膜</translation> + </message> + <message> + <source>Face</source> + <translation type="vanished">人脸</translation> + </message> + <message> + <source>VoicePrint</source> + <translation type="vanished">声纹</translation> + </message> + <message> + <location filename="../src/main.cpp" line="126"/> + <source>Enter the ukey password</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/main.cpp" line="150"/> + <source>Try it again</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/main.cpp" line="152"/> + <source>Use other Devices</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/main.cpp" line="153"/> + <source>Cancel</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/main.cpp" line="162"/> + <source>Choose the option</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/main.cpp" line="184"/> + <location filename="../src/main.cpp" line="219"/> + <location filename="../src/main.cpp" line="228"/> + <source>Invaild response "</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/main.cpp" line="184"/> + <location filename="../src/main.cpp" line="219"/> + <location filename="../src/main.cpp" line="228"/> + <source>authentication will be canceld</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/main.cpp" line="185"/> + <location filename="../src/main.cpp" line="220"/> + <location filename="../src/main.cpp" line="229"/> + <location filename="../src/main.cpp" line="408"/> + <source>AUTHENTICATION CANCELED</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/main.cpp" line="196"/> + <source>=== BIOMETRIC DEVICES ===</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/main.cpp" line="207"/> + <source>Choose the device</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/main.cpp" line="260"/> + <source>Sevice Name</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/main.cpp" line="261"/> + <source>DISPLAY env</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/main.cpp" line="262"/> + <source>User</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/main.cpp" line="263"/> + <source>Display debug information</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/main.cpp" line="264"/> + <source>Device short name</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/main.cpp" line="306"/> + <source>UKEY AUTHENTICATION</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/main.cpp" line="308"/> + <source>BIOMETRIC AUTHENTICATION</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/main.cpp" line="310"/> + <source>Press Q or Esc to cancel</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/main.cpp" line="330"/> + <source>BIOMETRIC AUTHENTICATION IS CLOSED</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/main.cpp" line="334"/> + <source>AUTHENTICATION SUCCESS</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/main.cpp" line="338"/> + <source>AUTHENTICATION FAILED</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/main.cpp" line="348"/> + <source>Failed to verify %1, you still have %2 verification opportunities</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/main.cpp" line="350"/> + <source>Unable to verify %1, please enter password.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/main.cpp" line="386"/> + <source>AUTHENTICATION END</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/main.cpp" line="388"/> + <source>BIOMETRIC AUTHENTICATION END</source> + <translation type="unfinished"></translation> + </message> +</context> +</TS> diff -Nru ukui-biometric-auth-4.10.0.0/bioauth-bin/i18n_ts/es.ts ukui-biometric-auth-4.20.0.0/bioauth-bin/i18n_ts/es.ts --- ukui-biometric-auth-4.10.0.0/bioauth-bin/i18n_ts/es.ts 2023-11-14 16:23:44.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/bioauth-bin/i18n_ts/es.ts 2024-09-23 19:22:29.000000000 +0800 @@ -2,10 +2,69 @@ <!DOCTYPE TS> <TS version="2.1" language="es"> <context> + <name>BioAuthWidget</name> + <message> + <source>Form</source> + <translation type="vanished">Forma</translation> + </message> + <message> + <source>More</source> + <translation type="vanished">更多</translation> + </message> + <message> + <source>Retry</source> + <translation type="vanished">Reintentar</translation> + </message> + <message> + <source>Too many unsuccessful attempts,please enter password.</source> + <translation type="vanished">验证失败达最大次数,请使用密码解锁</translation> + </message> + <message> + <source>Bioauth authentication failed, you still have %1 verification opportunities</source> + <translation type="vanished">生物认证失败,您还有%1次尝试机会</translation> + </message> + <message> + <source>Password</source> + <translation type="vanished">Contraseña</translation> + </message> + <message> + <source>Current Device: </source> + <translation type="vanished">当前设备:</translation> + </message> + <message> + <source>%1 too many unsuccessful attempts,please enter password.</source> + <translation type="vanished">%1 Demasiados intentos fallidos, ingrese la contraseña.</translation> + </message> + <message> + <source>%1 authentication failure,there are still %2 remaining opportunities</source> + <translation type="vanished">%1 error de autenticación, todavía quedan %2 oportunidades</translation> + </message> + <message> + <source>Please use wechat to scan the code</source> + <translation type="vanished">Utilice wechat para escanear el código</translation> + </message> +</context> +<context> <name>BioDevices</name> <message> + <source>Unplugging of %1 device detected</source> + <translation type="vanished">Se ha detectado la desconexión del dispositivo %1</translation> + </message> + <message> + <source>%1 device insertion detected</source> + <translation type="vanished">%1 inserción de dispositivo detectada</translation> + </message> + <message> + <source>ukui-biometric-manager</source> + <translation type="vanished">ukui-gestor-biométrico</translation> + </message> + <message> + <source>biometric</source> + <translation type="vanished">biométrico</translation> + </message> + <message> <source>FingerPrint</source> - <translation type="vanished">Huella dactilar</translation> + <translation type="vanished">Huellas</translation> </message> <message> <source>FingerVein</source> @@ -21,93 +80,215 @@ </message> <message> <source>VoicePrint</source> - <translation type="vanished">Impresión de voz</translation> + <translation type="vanished">Huella de voz</translation> + </message> + <message> + <source>ukey</source> + <translation type="vanished">ukey</translation> + </message> + <message> + <source>QRCode</source> + <translation type="vanished">QRCode</translation> + </message> + <message> + <source>Wechat</source> + <translation type="vanished">微信</translation> + </message> +</context> +<context> + <name>BioDevicesWidget</name> + <message> + <source>Form</source> + <translation type="vanished">Forma</translation> + </message> + <message> + <source>Device types:</source> + <translation type="vanished">设备类型:</translation> + </message> + <message> + <source>Back</source> + <translation type="vanished">返回</translation> + </message> + <message> + <source>OK</source> + <translation type="vanished">确定</translation> + </message> + <message> + <source>FingerPrint</source> + <translation type="vanished">指纹</translation> + </message> +</context> +<context> + <name>LoginOptionsWidget</name> + <message> + <source>Login Options</source> + <translation type="vanished">Opciones de inicio de sesión</translation> + </message> + <message> + <source>Password</source> + <translation type="vanished">Contraseña</translation> + </message> + <message> + <source>Wechat</source> + <translation type="vanished">微信</translation> + </message> + <message> + <source>Biometric</source> + <translation type="vanished">生物识别</translation> </message> </context> <context> <name>QObject</name> <message> + <source>FingerPrint</source> + <translation type="vanished">指纹</translation> + </message> + <message> + <source>FingerVein</source> + <translation type="vanished">指静脉</translation> + </message> + <message> + <source>Iris</source> + <translation type="vanished">虹膜</translation> + </message> + <message> + <source>Face</source> + <translation type="vanished">人脸</translation> + </message> + <message> + <source>VoicePrint</source> + <translation type="vanished">声纹</translation> + </message> + <message> + <location filename="../src/main.cpp" line="126"/> + <source>Enter the ukey password</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/main.cpp" line="150"/> <source>Try it again</source> - <translation>Pruébalo otra vez</translation> + <translation type="unfinished"></translation> </message> <message> + <location filename="../src/main.cpp" line="152"/> <source>Use other Devices</source> - <translation>Usa otros dispositivos</translation> + <translation type="unfinished"></translation> </message> <message> + <location filename="../src/main.cpp" line="153"/> <source>Cancel</source> - <translation>Cancelar</translation> + <translation type="unfinished"></translation> </message> <message> + <location filename="../src/main.cpp" line="162"/> <source>Choose the option</source> - <translation>Elige la opción</translation> + <translation type="unfinished"></translation> </message> <message> + <location filename="../src/main.cpp" line="184"/> + <location filename="../src/main.cpp" line="219"/> + <location filename="../src/main.cpp" line="228"/> <source>Invaild response "</source> - <translation>Respuesta interna</translation> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/main.cpp" line="184"/> + <location filename="../src/main.cpp" line="219"/> + <location filename="../src/main.cpp" line="228"/> + <source>authentication will be canceld</source> + <translation type="unfinished"></translation> </message> <message> + <location filename="../src/main.cpp" line="185"/> + <location filename="../src/main.cpp" line="220"/> + <location filename="../src/main.cpp" line="229"/> + <location filename="../src/main.cpp" line="408"/> <source>AUTHENTICATION CANCELED</source> - <translation>AUTENTIFICACIÓN CANCELADA</translation> + <translation type="unfinished"></translation> </message> <message> + <location filename="../src/main.cpp" line="196"/> <source>=== BIOMETRIC DEVICES ===</source> - <translation>=== DISPOSITIVOS BIOMÉTRICOS ===</translation> + <translation type="unfinished"></translation> </message> <message> + <location filename="../src/main.cpp" line="207"/> <source>Choose the device</source> - <translation>Elige el dispositivo</translation> + <translation type="unfinished"></translation> </message> <message> + <location filename="../src/main.cpp" line="260"/> <source>Sevice Name</source> - <translation>Nombre del Servicio</translation> + <translation type="unfinished"></translation> </message> <message> + <location filename="../src/main.cpp" line="261"/> <source>DISPLAY env</source> - <translation>PANTALLA env</translation> + <translation type="unfinished"></translation> </message> <message> + <location filename="../src/main.cpp" line="262"/> <source>User</source> - <translation>Usuario</translation> + <translation type="unfinished"></translation> </message> <message> + <location filename="../src/main.cpp" line="263"/> <source>Display debug information</source> - <translation>Mostrar información de depuración</translation> + <translation type="unfinished"></translation> </message> <message> + <location filename="../src/main.cpp" line="264"/> <source>Device short name</source> - <translation>Nombre corto del dispositivo</translation> + <translation type="unfinished"></translation> </message> <message> + <location filename="../src/main.cpp" line="306"/> + <source>UKEY AUTHENTICATION</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/main.cpp" line="308"/> <source>BIOMETRIC AUTHENTICATION</source> - <translation>AUTENTICACIÓN BIOMÉTRICA</translation> + <translation type="unfinished"></translation> </message> <message> + <location filename="../src/main.cpp" line="310"/> <source>Press Q or Esc to cancel</source> - <translation>Presione Q o Esc para cancelar</translation> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/main.cpp" line="330"/> + <source>BIOMETRIC AUTHENTICATION IS CLOSED</source> + <translation type="unfinished"></translation> </message> <message> + <location filename="../src/main.cpp" line="334"/> <source>AUTHENTICATION SUCCESS</source> - <translation>ÉXITO DE LA AUTENTICACIÓN</translation> + <translation type="unfinished"></translation> </message> <message> + <location filename="../src/main.cpp" line="338"/> <source>AUTHENTICATION FAILED</source> - <translation>Falla la autenticacion</translation> + <translation type="unfinished"></translation> </message> <message> - <source>BIOMETRIC AUTHENTICATION END</source> - <translation>FINALIZACIÓN BIOMÉTRICA FINAL</translation> + <location filename="../src/main.cpp" line="348"/> + <source>Failed to verify %1, you still have %2 verification opportunities</source> + <translation type="unfinished"></translation> </message> <message> - <source>authentication will be canceld</source> + <location filename="../src/main.cpp" line="350"/> + <source>Unable to verify %1, please enter password.</source> <translation type="unfinished"></translation> </message> <message> - <source>Failed to verify %1, you still have %2 verification opportunities</source> + <location filename="../src/main.cpp" line="386"/> + <source>AUTHENTICATION END</source> <translation type="unfinished"></translation> </message> <message> - <source>Unable to verify %1, please enter password.</source> + <location filename="../src/main.cpp" line="388"/> + <source>BIOMETRIC AUTHENTICATION END</source> <translation type="unfinished"></translation> </message> </context> diff -Nru ukui-biometric-auth-4.10.0.0/bioauth-bin/i18n_ts/fr.ts ukui-biometric-auth-4.20.0.0/bioauth-bin/i18n_ts/fr.ts --- ukui-biometric-auth-4.10.0.0/bioauth-bin/i18n_ts/fr.ts 2023-11-14 16:23:44.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/bioauth-bin/i18n_ts/fr.ts 2024-09-23 19:22:29.000000000 +0800 @@ -2,112 +2,293 @@ <!DOCTYPE TS> <TS version="2.1" language="fr"> <context> + <name>BioAuthWidget</name> + <message> + <source>Form</source> + <translation type="vanished">Forme</translation> + </message> + <message> + <source>More</source> + <translation type="vanished">更多</translation> + </message> + <message> + <source>Retry</source> + <translation type="vanished">réessayer</translation> + </message> + <message> + <source>Too many unsuccessful attempts,please enter password.</source> + <translation type="vanished">验证失败达最大次数,请使用密码解锁</translation> + </message> + <message> + <source>Bioauth authentication failed, you still have %1 verification opportunities</source> + <translation type="vanished">生物认证失败,您还有%1次尝试机会</translation> + </message> + <message> + <source>Password</source> + <translation type="vanished">mot de passe</translation> + </message> + <message> + <source>Current Device: </source> + <translation type="vanished">当前设备:</translation> + </message> + <message> + <source>%1 too many unsuccessful attempts,please enter password.</source> + <translation type="vanished">%1 Il y a trop de tentatives infructueuses, veuillez saisir votre mot de passe.</translation> + </message> + <message> + <source>%1 authentication failure,there are still %2 remaining opportunities</source> + <translation type="vanished">%1 authentification a échoué et il reste encore %2 chances</translation> + </message> + <message> + <source>Please use wechat to scan the code</source> + <translation type="vanished">Veuillez utiliser WeChat pour scanner le code</translation> + </message> +</context> +<context> <name>BioDevices</name> <message> + <source>Unplugging of %1 device detected</source> + <translation type="vanished">L’appareil %1 a été débranché</translation> + </message> + <message> + <source>%1 device insertion detected</source> + <translation type="vanished">%1 périphérique branché détecté</translation> + </message> + <message> + <source>ukui-biometric-manager</source> + <translation type="vanished">Outils de gestion biométrique</translation> + </message> + <message> + <source>biometric</source> + <translation type="vanished">Caractéristiques biologiques</translation> + </message> + <message> <source>FingerPrint</source> - <translation type="vanished">Empreinte digitale</translation> + <translation type="vanished">empreinte digitale</translation> </message> <message> <source>FingerVein</source> - <translation type="vanished">FingerVein</translation> + <translation type="vanished">Veines des doigts</translation> </message> <message> <source>Iris</source> - <translation type="vanished">Iris</translation> + <translation type="vanished">iris</translation> </message> <message> <source>Face</source> - <translation type="vanished">Visage</translation> + <translation type="vanished">Reconnaissance faciale</translation> </message> <message> <source>VoicePrint</source> - <translation type="vanished">VoicePrint</translation> + <translation type="vanished">Voiceprint</translation> + </message> + <message> + <source>ukey</source> + <translation type="vanished">Clés de sécurité</translation> + </message> + <message> + <source>QRCode</source> + <translation type="vanished">Code QR</translation> + </message> + <message> + <source>Wechat</source> + <translation type="vanished">微信</translation> + </message> +</context> +<context> + <name>BioDevicesWidget</name> + <message> + <source>Form</source> + <translation type="vanished">Forme</translation> + </message> + <message> + <source>Device types:</source> + <translation type="vanished">设备类型:</translation> + </message> + <message> + <source>Back</source> + <translation type="vanished">返回</translation> + </message> + <message> + <source>OK</source> + <translation type="vanished">确定</translation> + </message> + <message> + <source>FingerPrint</source> + <translation type="vanished">指纹</translation> + </message> +</context> +<context> + <name>LoginOptionsWidget</name> + <message> + <source>Login Options</source> + <translation type="vanished">Options de connexion</translation> + </message> + <message> + <source>Password</source> + <translation type="vanished">mot de passe</translation> + </message> + <message> + <source>Wechat</source> + <translation type="vanished">微信</translation> + </message> + <message> + <source>Biometric</source> + <translation type="vanished">生物识别</translation> </message> </context> <context> <name>QObject</name> <message> + <source>FingerPrint</source> + <translation type="vanished">指纹</translation> + </message> + <message> + <source>FingerVein</source> + <translation type="vanished">指静脉</translation> + </message> + <message> + <source>Iris</source> + <translation type="vanished">虹膜</translation> + </message> + <message> + <source>Face</source> + <translation type="vanished">人脸</translation> + </message> + <message> + <source>VoicePrint</source> + <translation type="vanished">声纹</translation> + </message> + <message> + <location filename="../src/main.cpp" line="126"/> + <source>Enter the ukey password</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/main.cpp" line="150"/> <source>Try it again</source> - <translation>Essayez à nouveau</translation> + <translation type="unfinished"></translation> </message> <message> + <location filename="../src/main.cpp" line="152"/> <source>Use other Devices</source> - <translation>Utiliser d'autres appareils</translation> + <translation type="unfinished"></translation> </message> <message> + <location filename="../src/main.cpp" line="153"/> <source>Cancel</source> - <translation>Annuler</translation> + <translation type="unfinished"></translation> </message> <message> + <location filename="../src/main.cpp" line="162"/> <source>Choose the option</source> - <translation>Choisissez l'option</translation> + <translation type="unfinished"></translation> </message> <message> + <location filename="../src/main.cpp" line="184"/> + <location filename="../src/main.cpp" line="219"/> + <location filename="../src/main.cpp" line="228"/> <source>Invaild response "</source> - <translation>Réponse Invaild \ "</translation> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/main.cpp" line="184"/> + <location filename="../src/main.cpp" line="219"/> + <location filename="../src/main.cpp" line="228"/> + <source>authentication will be canceld</source> + <translation type="unfinished"></translation> </message> <message> + <location filename="../src/main.cpp" line="185"/> + <location filename="../src/main.cpp" line="220"/> + <location filename="../src/main.cpp" line="229"/> + <location filename="../src/main.cpp" line="408"/> <source>AUTHENTICATION CANCELED</source> - <translation>AUTHENTIFICATION ANNULEE</translation> + <translation type="unfinished"></translation> </message> <message> + <location filename="../src/main.cpp" line="196"/> <source>=== BIOMETRIC DEVICES ===</source> - <translation>=== DISPOSITIFS BIOMETRIQUES ===</translation> + <translation type="unfinished"></translation> </message> <message> + <location filename="../src/main.cpp" line="207"/> <source>Choose the device</source> - <translation>Choisissez l'appareil</translation> + <translation type="unfinished"></translation> </message> <message> + <location filename="../src/main.cpp" line="260"/> <source>Sevice Name</source> - <translation>Nom de Sevice</translation> + <translation type="unfinished"></translation> </message> <message> + <location filename="../src/main.cpp" line="261"/> <source>DISPLAY env</source> - <translation>AFFICHER env</translation> + <translation type="unfinished"></translation> </message> <message> + <location filename="../src/main.cpp" line="262"/> <source>User</source> - <translation>Utilisateur</translation> + <translation type="unfinished"></translation> </message> <message> + <location filename="../src/main.cpp" line="263"/> <source>Display debug information</source> - <translation>Afficher les informations de débogage</translation> + <translation type="unfinished"></translation> </message> <message> + <location filename="../src/main.cpp" line="264"/> <source>Device short name</source> - <translation>Nom abrégé de l'appareil</translation> + <translation type="unfinished"></translation> </message> <message> + <location filename="../src/main.cpp" line="306"/> + <source>UKEY AUTHENTICATION</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/main.cpp" line="308"/> <source>BIOMETRIC AUTHENTICATION</source> - <translation>AUTHENTIFICATION BIOMETRIQUE</translation> + <translation type="unfinished"></translation> </message> <message> + <location filename="../src/main.cpp" line="310"/> <source>Press Q or Esc to cancel</source> - <translation>Appuyez sur Q ou Echap pour annuler</translation> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/main.cpp" line="330"/> + <source>BIOMETRIC AUTHENTICATION IS CLOSED</source> + <translation type="unfinished"></translation> </message> <message> + <location filename="../src/main.cpp" line="334"/> <source>AUTHENTICATION SUCCESS</source> - <translation>SUCCÈS D'AUTHENTIFICATION</translation> + <translation type="unfinished"></translation> </message> <message> + <location filename="../src/main.cpp" line="338"/> <source>AUTHENTICATION FAILED</source> - <translation>AUTHENTIFICATION ÉCHOUÉE</translation> + <translation type="unfinished"></translation> </message> <message> - <source>BIOMETRIC AUTHENTICATION END</source> - <translation>FIN DE L'AUTHENTIFICATION BIOMÉTRIQUE</translation> + <location filename="../src/main.cpp" line="348"/> + <source>Failed to verify %1, you still have %2 verification opportunities</source> + <translation type="unfinished"></translation> </message> <message> - <source>authentication will be canceld</source> + <location filename="../src/main.cpp" line="350"/> + <source>Unable to verify %1, please enter password.</source> <translation type="unfinished"></translation> </message> <message> - <source>Failed to verify %1, you still have %2 verification opportunities</source> + <location filename="../src/main.cpp" line="386"/> + <source>AUTHENTICATION END</source> <translation type="unfinished"></translation> </message> <message> - <source>Unable to verify %1, please enter password.</source> + <location filename="../src/main.cpp" line="388"/> + <source>BIOMETRIC AUTHENTICATION END</source> <translation type="unfinished"></translation> </message> </context> diff -Nru ukui-biometric-auth-4.10.0.0/bioauth-bin/i18n_ts/kk.ts ukui-biometric-auth-4.20.0.0/bioauth-bin/i18n_ts/kk.ts --- ukui-biometric-auth-4.10.0.0/bioauth-bin/i18n_ts/kk.ts 1970-01-01 08:00:00.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/bioauth-bin/i18n_ts/kk.ts 2024-09-23 19:22:29.000000000 +0800 @@ -0,0 +1,295 @@ +<?xml version="1.0" encoding="utf-8"?> +<!DOCTYPE TS> +<TS version="2.1" language="kk"> +<context> + <name>BioAuthWidget</name> + <message> + <source>Form</source> + <translation type="vanished">Пішін</translation> + </message> + <message> + <source>More</source> + <translation type="vanished">更多</translation> + </message> + <message> + <source>Retry</source> + <translation type="vanished">ретри</translation> + </message> + <message> + <source>Too many unsuccessful attempts,please enter password.</source> + <translation type="vanished">验证失败达最大次数,请使用密码解锁</translation> + </message> + <message> + <source>Bioauth authentication failed, you still have %1 verification opportunities</source> + <translation type="vanished">生物认证失败,您还有%1次尝试机会</translation> + </message> + <message> + <source>Password</source> + <translation type="vanished">құпиясөз</translation> + </message> + <message> + <source>Current Device: </source> + <translation type="vanished">当前设备:</translation> + </message> + <message> + <source>%1 too many unsuccessful attempts,please enter password.</source> + <translation type="vanished">% 1 Қате әрекеттер тым көп, құпия сөзіңізді енгізіңіз.</translation> + </message> + <message> + <source>%1 authentication failure,there are still %2 remaining opportunities</source> + <translation type="vanished">% 1 аутентификациясы жаңылысқан және әлі де% 2 мүмкіндігі бар</translation> + </message> + <message> + <source>Please use wechat to scan the code</source> + <translation type="vanished">Кодты сканерлеу үшін WeChat пайдалануыңызды сұраймын</translation> + </message> +</context> +<context> + <name>BioDevices</name> + <message> + <source>Unplugging of %1 device detected</source> + <translation type="vanished">% 1 құрылғы ажыратылды</translation> + </message> + <message> + <source>%1 device insertion detected</source> + <translation type="vanished">% 1 құрылғы анықталды</translation> + </message> + <message> + <source>ukui-biometric-manager</source> + <translation type="vanished">Биометриялық басқару құралдары</translation> + </message> + <message> + <source>biometric</source> + <translation type="vanished">Биологиялық сипаттамалары</translation> + </message> + <message> + <source>FingerPrint</source> + <translation type="vanished">саусақ ізі</translation> + </message> + <message> + <source>FingerVein</source> + <translation type="vanished">Саусақ көктамырлары</translation> + </message> + <message> + <source>Iris</source> + <translation type="vanished">ирис</translation> + </message> + <message> + <source>Face</source> + <translation type="vanished">Бет тану</translation> + </message> + <message> + <source>VoicePrint</source> + <translation type="vanished">Дауыстық із</translation> + </message> + <message> + <source>ukey</source> + <translation type="vanished">Қауіпсіздік кілттері</translation> + </message> + <message> + <source>QRCode</source> + <translation type="vanished">QR коды</translation> + </message> + <message> + <source>Wechat</source> + <translation type="vanished">微信</translation> + </message> +</context> +<context> + <name>BioDevicesWidget</name> + <message> + <source>Form</source> + <translation type="vanished">Пішін</translation> + </message> + <message> + <source>Device types:</source> + <translation type="vanished">设备类型:</translation> + </message> + <message> + <source>Back</source> + <translation type="vanished">返回</translation> + </message> + <message> + <source>OK</source> + <translation type="vanished">确定</translation> + </message> + <message> + <source>FingerPrint</source> + <translation type="vanished">指纹</translation> + </message> +</context> +<context> + <name>LoginOptionsWidget</name> + <message> + <source>Login Options</source> + <translation type="vanished">Кіру параметрлері</translation> + </message> + <message> + <source>Password</source> + <translation type="vanished">құпиясөз</translation> + </message> + <message> + <source>Wechat</source> + <translation type="vanished">微信</translation> + </message> + <message> + <source>Biometric</source> + <translation type="vanished">生物识别</translation> + </message> +</context> +<context> + <name>QObject</name> + <message> + <source>FingerPrint</source> + <translation type="vanished">指纹</translation> + </message> + <message> + <source>FingerVein</source> + <translation type="vanished">指静脉</translation> + </message> + <message> + <source>Iris</source> + <translation type="vanished">虹膜</translation> + </message> + <message> + <source>Face</source> + <translation type="vanished">人脸</translation> + </message> + <message> + <source>VoicePrint</source> + <translation type="vanished">声纹</translation> + </message> + <message> + <location filename="../src/main.cpp" line="126"/> + <source>Enter the ukey password</source> + <translation>ukey قۇپيا نۇمىردى كىرگىزىڭىز</translation> + </message> + <message> + <location filename="../src/main.cpp" line="150"/> + <source>Try it again</source> + <translation>قاتە سىناڭ</translation> + </message> + <message> + <location filename="../src/main.cpp" line="152"/> + <source>Use other Devices</source> + <translation>باسقا اسباب ٸستەتۋ</translation> + </message> + <message> + <location filename="../src/main.cpp" line="153"/> + <source>Cancel</source> + <translation>كۇشىنەن قالدىرۋ</translation> + </message> + <message> + <location filename="../src/main.cpp" line="162"/> + <source>Choose the option</source> + <translation>تالداۋ تۇرى</translation> + </message> + <message> + <location filename="../src/main.cpp" line="184"/> + <location filename="../src/main.cpp" line="219"/> + <location filename="../src/main.cpp" line="228"/> + <source>Invaild response "</source> + <translation>ونٸمسٸز جاۋاپ</translation> + </message> + <message> + <location filename="../src/main.cpp" line="184"/> + <location filename="../src/main.cpp" line="219"/> + <location filename="../src/main.cpp" line="228"/> + <source>authentication will be canceld</source> + <translation>ازاماتتىق تەكسەرۋ كۇشىنەن قالدىرىلدى</translation> + </message> + <message> + <location filename="../src/main.cpp" line="185"/> + <location filename="../src/main.cpp" line="220"/> + <location filename="../src/main.cpp" line="229"/> + <location filename="../src/main.cpp" line="408"/> + <source>AUTHENTICATION CANCELED</source> + <translation>ازاماتتىق تەكسەرۋ كۇشىنەن قالدىرىلدى</translation> + </message> + <message> + <location filename="../src/main.cpp" line="196"/> + <source>=== BIOMETRIC DEVICES ===</source> + <translation>= = = بىيولوگىيەلىك پارىقتاندىرۋ اسپابٸ = = =</translation> + </message> + <message> + <location filename="../src/main.cpp" line="207"/> + <source>Choose the device</source> + <translation>باسقا اسباب تالدا</translation> + </message> + <message> + <location filename="../src/main.cpp" line="260"/> + <source>Sevice Name</source> + <translation>قىزىمەت مى</translation> + </message> + <message> + <location filename="../src/main.cpp" line="261"/> + <source>DISPLAY env</source> + <translation>كورسەتۋ ورتا</translation> + </message> + <message> + <location filename="../src/main.cpp" line="262"/> + <source>User</source> + <translation>الارمان مى</translation> + </message> + <message> + <location filename="../src/main.cpp" line="263"/> + <source>Display debug information</source> + <translation>تەڭشەۋ حاباردٸ كورسەتۋ</translation> + </message> + <message> + <location filename="../src/main.cpp" line="264"/> + <source>Device short name</source> + <translation>اسبابٸتٸڭ قىسقا مى</translation> + </message> + <message> + <location filename="../src/main.cpp" line="306"/> + <source>UKEY AUTHENTICATION</source> + <translation>UKEY سالاۋاتىن دالەلدەۋ</translation> + </message> + <message> + <location filename="../src/main.cpp" line="308"/> + <source>BIOMETRIC AUTHENTICATION</source> + <translation>بىيولوگىيەلىك ەرەكشەلىك كۋالٸكتٸ</translation> + </message> + <message> + <location filename="../src/main.cpp" line="310"/> + <source>Press Q or Esc to cancel</source> + <translation>Q ياكي Esc نى باسٸپ كۇشىنەن قالدىرىڭ</translation> + </message> + <message> + <location filename="../src/main.cpp" line="330"/> + <source>BIOMETRIC AUTHENTICATION IS CLOSED</source> + <translation>بىئولوگىيەلىك ەرەكشەلىكتى دالەلدەۋ جابٸلدٸ</translation> + </message> + <message> + <location filename="../src/main.cpp" line="334"/> + <source>AUTHENTICATION SUCCESS</source> + <translation>ازاماتتىق تەكسەرۋ ناتيجەلى قالدى</translation> + </message> + <message> + <location filename="../src/main.cpp" line="338"/> + <source>AUTHENTICATION FAILED</source> + <translation>ازاماتتىق تەكسەرۋ جەڭىلىپ قالدى.</translation> + </message> + <message> + <location filename="../src/main.cpp" line="348"/> + <source>Failed to verify %1, you still have %2 verification opportunities</source> + <translation>٪1 نى دالەلدەۋ جەڭىلىپ قالدى، سىزدە جانەدە ٪2 دالەلدەۋ ورايى بار</translation> + </message> + <message> + <location filename="../src/main.cpp" line="350"/> + <source>Unable to verify %1, please enter password.</source> + <translation>%1 نى دالەلى بولمايدى، قۇپيا نۇمىردى كىرگىزىڭىز.</translation> + </message> + <message> + <location filename="../src/main.cpp" line="386"/> + <source>AUTHENTICATION END</source> + <translation>ازاماتتىق تەكسەرۋ اياقتاتادى.</translation> + </message> + <message> + <location filename="../src/main.cpp" line="388"/> + <source>BIOMETRIC AUTHENTICATION END</source> + <translation>بىئولوگىيەلىك ەرەكشەلىك دالەل بەرۋ ۇشى</translation> + </message> +</context> +</TS> diff -Nru ukui-biometric-auth-4.10.0.0/bioauth-bin/i18n_ts/ky.ts ukui-biometric-auth-4.20.0.0/bioauth-bin/i18n_ts/ky.ts --- ukui-biometric-auth-4.10.0.0/bioauth-bin/i18n_ts/ky.ts 1970-01-01 08:00:00.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/bioauth-bin/i18n_ts/ky.ts 2024-09-23 19:22:29.000000000 +0800 @@ -0,0 +1,287 @@ +<?xml version="1.0" encoding="utf-8"?> +<!DOCTYPE TS> +<TS version="2.1" language="ky"> +<context> + <name>BioAuthWidget</name> + <message> + <source>More</source> + <translation type="vanished">更多</translation> + </message> + <message> + <source>Retry</source> + <translation type="vanished">Ретри</translation> + </message> + <message> + <source>Too many unsuccessful attempts,please enter password.</source> + <translation type="vanished">验证失败达最大次数,请使用密码解锁</translation> + </message> + <message> + <source>Bioauth authentication failed, you still have %1 verification opportunities</source> + <translation type="vanished">生物认证失败,您还有%1次尝试机会</translation> + </message> + <message> + <source>Password</source> + <translation type="vanished">Сырсөз</translation> + </message> + <message> + <source>Current Device: </source> + <translation type="vanished">当前设备:</translation> + </message> + <message> + <source>%1 too many unsuccessful attempts,please enter password.</source> + <translation type="vanished">%1 өтө көп ийгиликсиз аракеттер,, сураныч, сырсөз киргизүү.</translation> + </message> + <message> + <source>%1 authentication failure,there are still %2 remaining opportunities</source> + <translation type="vanished">%1 аутентификациялык жетишсиздик,дагы эле %2 калган мүмкүнчүлүктөр бар</translation> + </message> + <message> + <source>Please use wechat to scan the code</source> + <translation type="vanished">Кодду сканерлеу үчүн вечат колдонуңуз</translation> + </message> +</context> +<context> + <name>BioDevices</name> + <message> + <source>Unplugging of %1 device detected</source> + <translation type="vanished">%1 орнотмосунун өчүрүлүшү аныкталды</translation> + </message> + <message> + <source>%1 device insertion detected</source> + <translation type="vanished">%1 түзмөк орнотмосу аныкталды</translation> + </message> + <message> + <source>ukui-biometric-manager</source> + <translation type="vanished">укуи-биометриялык-менеджери</translation> + </message> + <message> + <source>biometric</source> + <translation type="vanished">биометрия</translation> + </message> + <message> + <source>FingerPrint</source> + <translation type="vanished">Манжа изи</translation> + </message> + <message> + <source>FingerVein</source> + <translation type="vanished">Манжавейн</translation> + </message> + <message> + <source>Iris</source> + <translation type="vanished">Ирис</translation> + </message> + <message> + <source>Face</source> + <translation type="vanished">Бет</translation> + </message> + <message> + <source>VoicePrint</source> + <translation type="vanished">VoicePrint</translation> + </message> + <message> + <source>ukey</source> + <translation type="vanished">уики</translation> + </message> + <message> + <source>QRCode</source> + <translation type="vanished">QRCode</translation> + </message> + <message> + <source>Wechat</source> + <translation type="vanished">微信</translation> + </message> +</context> +<context> + <name>BioDevicesWidget</name> + <message> + <source>Device types:</source> + <translation type="vanished">设备类型:</translation> + </message> + <message> + <source>Back</source> + <translation type="vanished">返回</translation> + </message> + <message> + <source>OK</source> + <translation type="vanished">确定</translation> + </message> + <message> + <source>FingerPrint</source> + <translation type="vanished">指纹</translation> + </message> +</context> +<context> + <name>LoginOptionsWidget</name> + <message> + <source>Login Options</source> + <translation type="vanished">Кирүү параметрлери</translation> + </message> + <message> + <source>Password</source> + <translation type="vanished">Сырсөз</translation> + </message> + <message> + <source>Wechat</source> + <translation type="vanished">微信</translation> + </message> + <message> + <source>Biometric</source> + <translation type="vanished">生物识别</translation> + </message> +</context> +<context> + <name>QObject</name> + <message> + <source>FingerPrint</source> + <translation type="vanished">指纹</translation> + </message> + <message> + <source>FingerVein</source> + <translation type="vanished">指静脉</translation> + </message> + <message> + <source>Iris</source> + <translation type="vanished">虹膜</translation> + </message> + <message> + <source>Face</source> + <translation type="vanished">人脸</translation> + </message> + <message> + <source>VoicePrint</source> + <translation type="vanished">声纹</translation> + </message> + <message> + <location filename="../src/main.cpp" line="126"/> + <source>Enter the ukey password</source> + <translation>ukey جاشىرۇۇن نومۇرۇن كىرگىزىڭ</translation> + </message> + <message> + <location filename="../src/main.cpp" line="150"/> + <source>Try it again</source> + <translation>قايرا سىناڭ</translation> + </message> + <message> + <location filename="../src/main.cpp" line="152"/> + <source>Use other Devices</source> + <translation>باشقا شايمان ىشتەتىش</translation> + </message> + <message> + <location filename="../src/main.cpp" line="153"/> + <source>Cancel</source> + <translation>ارعادان قالتىرىش</translation> + </message> + <message> + <location filename="../src/main.cpp" line="162"/> + <source>Choose the option</source> + <translation>تانداش تۉرۉ</translation> + </message> + <message> + <location filename="../src/main.cpp" line="184"/> + <location filename="../src/main.cpp" line="219"/> + <location filename="../src/main.cpp" line="228"/> + <source>Invaild response "</source> + <translation>ۅنۉمسۉز ىنكاس</translation> + </message> + <message> + <location filename="../src/main.cpp" line="184"/> + <location filename="../src/main.cpp" line="219"/> + <location filename="../src/main.cpp" line="228"/> + <source>authentication will be canceld</source> + <translation>اتۇۇلدۇق تەكشەرىش ارعادان قالتىرلات</translation> + </message> + <message> + <location filename="../src/main.cpp" line="185"/> + <location filename="../src/main.cpp" line="220"/> + <location filename="../src/main.cpp" line="229"/> + <location filename="../src/main.cpp" line="408"/> + <source>AUTHENTICATION CANCELED</source> + <translation>اتۇۇلدۇق تەكشەرىش ارعادان قالتىرىلدى</translation> + </message> + <message> + <location filename="../src/main.cpp" line="196"/> + <source>=== BIOMETRIC DEVICES ===</source> + <translation>= = = بىيولوگىيەلىك ايىرمالاندىرىش جابدۇۇسۇ = = =</translation> + </message> + <message> + <location filename="../src/main.cpp" line="207"/> + <source>Choose the device</source> + <translation>باشقا شايمان تانداڭ</translation> + </message> + <message> + <location filename="../src/main.cpp" line="260"/> + <source>Sevice Name</source> + <translation>تەيلۅۅ ناامى</translation> + </message> + <message> + <location filename="../src/main.cpp" line="261"/> + <source>DISPLAY env</source> + <translation>كۅرسۅتۉۉ چۅيرۅسۉ</translation> + </message> + <message> + <location filename="../src/main.cpp" line="262"/> + <source>User</source> + <translation>كەرەكتۅۅچۉ ناامى</translation> + </message> + <message> + <location filename="../src/main.cpp" line="263"/> + <source>Display debug information</source> + <translation>تەڭشۅۅ ۇچۇردۇ كۅرسۅتۉۉ</translation> + </message> + <message> + <location filename="../src/main.cpp" line="264"/> + <source>Device short name</source> + <translation>جابدۇۇسۇنۇن قىسقا ناامى</translation> + </message> + <message> + <location filename="../src/main.cpp" line="306"/> + <source>UKEY AUTHENTICATION</source> + <translation>UKEY تولۇمدۇۇلۇق دالىلدۅ</translation> + </message> + <message> + <location filename="../src/main.cpp" line="308"/> + <source>BIOMETRIC AUTHENTICATION</source> + <translation>بىيولوگىيەلىك ۅزگۅچۅلۉك ىسپاتى</translation> + </message> + <message> + <location filename="../src/main.cpp" line="310"/> + <source>Press Q or Esc to cancel</source> + <translation>Q كۅرۉنۉشتۅرۉ Esc نى باسىپ ارعادان قالتىرىڭ</translation> + </message> + <message> + <location filename="../src/main.cpp" line="330"/> + <source>BIOMETRIC AUTHENTICATION IS CLOSED</source> + <translation>بىئولوگىيەلىك ۅزگۅچۅلۉگۉ دالىلدۅ تاقالدى</translation> + </message> + <message> + <location filename="../src/main.cpp" line="334"/> + <source>AUTHENTICATION SUCCESS</source> + <translation>اتۇۇلدۇق تەكشەرىش جەڭىشتۉۉ بولدۇ</translation> + </message> + <message> + <location filename="../src/main.cpp" line="338"/> + <source>AUTHENTICATION FAILED</source> + <translation>اتۇۇلدۇق تەكشەرىش جەڭىلۉۉ بولدۇ .</translation> + </message> + <message> + <location filename="../src/main.cpp" line="348"/> + <source>Failed to verify %1, you still have %2 verification opportunities</source> + <translation>٪1 نى دالىلدۅ جەڭىلۉۉ بولدۇ ، سىزدە داعى ەلە ٪2 دالىلدۅ مۅۅرتۉ بار</translation> + </message> + <message> + <location filename="../src/main.cpp" line="350"/> + <source>Unable to verify %1, please enter password.</source> + <translation>%1 نى دالىلدەگەلى بولبويت ، جاشىرۇۇن نومۇردۇ كىرگىزىڭ.</translation> + </message> + <message> + <location filename="../src/main.cpp" line="386"/> + <source>AUTHENTICATION END</source> + <translation>اتۇۇلدۇق تەكشەرىش سوڭۇنا چىقتى.</translation> + </message> + <message> + <location filename="../src/main.cpp" line="388"/> + <source>BIOMETRIC AUTHENTICATION END</source> + <translation>بىئولوگىيەلىك ۅزگۅچۅلۉك ىسپات بەرۉۉ ۇچۇ</translation> + </message> +</context> +</TS> diff -Nru ukui-biometric-auth-4.10.0.0/bioauth-bin/i18n_ts/mn.ts ukui-biometric-auth-4.20.0.0/bioauth-bin/i18n_ts/mn.ts --- ukui-biometric-auth-4.10.0.0/bioauth-bin/i18n_ts/mn.ts 1970-01-01 08:00:00.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/bioauth-bin/i18n_ts/mn.ts 2024-09-23 19:22:29.000000000 +0800 @@ -0,0 +1,287 @@ +<?xml version="1.0" encoding="utf-8"?> +<!DOCTYPE TS> +<TS version="2.1" language="mn"> +<context> + <name>BioAuthWidget</name> + <message> + <source>More</source> + <translation type="vanished">更多</translation> + </message> + <message> + <source>Retry</source> + <translation type="vanished">ᠳᠠᠬᠢᠨ ᠲᠤᠷᠰᠢᠬᠤ</translation> + </message> + <message> + <source>Too many unsuccessful attempts,please enter password.</source> + <translation type="vanished">验证失败达最大次数,请使用密码解锁</translation> + </message> + <message> + <source>Bioauth authentication failed, you still have %1 verification opportunities</source> + <translation type="vanished">生物认证失败,您还有%1次尝试机会</translation> + </message> + <message> + <source>Password</source> + <translation type="vanished">ᠨᠢᠭᠤᠴᠠ ᠺᠣᠳ᠋</translation> + </message> + <message> + <source>Current Device: </source> + <translation type="vanished">当前设备:</translation> + </message> + <message> + <source>%1 too many unsuccessful attempts,please enter password.</source> + <translation type="vanished">%1 ᠢᠯᠠᠭᠳᠠᠭᠰᠠᠨ ᠲᠤᠷᠰᠢᠬᠤ ᠤᠳᠠᠭᠠ ᠲᠣᠭᠠ ᠬᠡᠳᠦ ᠣᠯᠠᠨ ᠂ ᠨᠢᠭᠤᠴᠠ ᠺᠣᠳ᠋ ᠣᠷᠣᠭᠤᠯᠤᠭᠠᠷᠠᠢ ᠃</translation> + </message> + <message> + <source>%1 authentication failure,there are still %2 remaining opportunities</source> + <translation type="vanished">%1 ᠪᠡᠶᠡᠶ᠋ᠢᠨ ᠬᠢᠷᠢᠶ᠋ᠢᠨ ᠰᠢᠯᠭᠠᠨ ᠪᠠᠲᠤᠯᠠᠯᠲᠠ ᠢᠯᠠᠭᠳᠠᠪᠠ ᠂ ᠮᠥᠨ %2 ᠦᠯᠡᠳᠡᠬᠦ ᠲᠣᠬᠢᠶᠠᠯ ᠪᠣᠢ</translation> + </message> + <message> + <source>Please use wechat to scan the code</source> + <translation type="vanished">ᠸᠢᠴᠠᠲᠢ᠋ᠶ᠋ᠠᠷ ᠦᠰᠦᠭ ᠰᠢᠷᠪᠢᠬᠦ ᠪᠣᠯᠪᠠᠤ</translation> + </message> +</context> +<context> + <name>BioDevices</name> + <message> + <source>Unplugging of %1 device detected</source> + <translation type="vanished">%1 ᠲᠥᠬᠥᠭᠡᠷᠦᠮᠵᠢᠶ᠋ᠢ ᠰᠤᠭᠤᠯᠵᠤ ᠭᠠᠷᠭᠠᠨ ᠠ</translation> + </message> + <message> + <source>%1 device insertion detected</source> + <translation type="vanished">%1 ᠲᠥᠬᠥᠭᠡᠷᠦᠮᠵᠢ ᠬᠠᠪᠴᠢᠭᠤᠯᠤᠭᠰᠠᠨᠢ᠋ ᠪᠠᠢᠴᠠᠭᠠᠨ ᠣᠯᠪᠠ</translation> + </message> + <message> + <source>ukui-biometric-manager</source> + <translation type="vanished">ᠠᠮᠢᠳᠤ ᠪᠣᠳᠠᠰᠤ᠋ᠨ ᠣᠨᠴᠠᠯᠢᠭ ᠬᠠᠮᠢᠶᠠᠷᠤᠯᠲᠠᠶ᠋ᠢᠨ ᠪᠠᠭᠠᠵᠢ</translation> + </message> + <message> + <source>biometric</source> + <translation type="vanished">ᠠᠮᠢᠳᠤ ᠪᠣᠳᠠᠰᠤ᠋ᠨ ᠣᠨᠴᠠᠯᠢᠭ</translation> + </message> + <message> + <source>FingerPrint</source> + <translation type="vanished">ᠬᠤᠷᠤᠭᠤᠨ ᠬᠡ</translation> + </message> + <message> + <source>FingerVein</source> + <translation type="vanished">ᠬᠤᠷᠤᠭᠤᠨ ᠨᠠᠮᠵᠢᠭᠤᠨ ᠰᠤᠳᠠᠰᠤ</translation> + </message> + <message> + <source>Iris</source> + <translation type="vanished">ᠰᠣᠯᠣᠩᠭᠠ ᠪᠦᠷᠬᠦᠭᠦᠯ</translation> + </message> + <message> + <source>Face</source> + <translation type="vanished">ᠬᠥᠮᠦᠨᠦ᠌ ᠨᠢᠭᠤᠷ ᠲᠠᠨᠢᠬᠤ</translation> + </message> + <message> + <source>VoicePrint</source> + <translation type="vanished">ᠳᠠᠭᠤᠨ ᠡᠷᠢᠶᠡᠨ</translation> + </message> + <message> + <source>ukey</source> + <translation type="vanished">ᠠᠶᠤᠯᠭᠦᠢ ᠨᠢᠭᠤᠴᠠ ᠲᠦᠯᠬᠢᠭᠦᠷ</translation> + </message> + <message> + <source>QRCode</source> + <translation type="vanished">ᠬᠣᠶᠠᠷ ᠬᠡᠮᠵᠢᠯᠲᠦ ᠺᠣᠳ᠋</translation> + </message> + <message> + <source>Wechat</source> + <translation type="vanished">微信</translation> + </message> +</context> +<context> + <name>BioDevicesWidget</name> + <message> + <source>Device types:</source> + <translation type="vanished">设备类型:</translation> + </message> + <message> + <source>Back</source> + <translation type="vanished">返回</translation> + </message> + <message> + <source>OK</source> + <translation type="vanished">确定</translation> + </message> + <message> + <source>FingerPrint</source> + <translation type="vanished">指纹</translation> + </message> +</context> +<context> + <name>LoginOptionsWidget</name> + <message> + <source>Login Options</source> + <translation type="vanished">ᠲᠡᠮᠳᠡᠭᠯᠡᠬᠦ ᠰᠤᠩᠭᠤᠭᠳᠠᠬᠤᠨ</translation> + </message> + <message> + <source>Password</source> + <translation type="vanished">ᠨᠢᠭᠤᠴᠠ ᠺᠣᠳ᠋</translation> + </message> + <message> + <source>Wechat</source> + <translation type="vanished">微信</translation> + </message> + <message> + <source>Biometric</source> + <translation type="vanished">生物识别</translation> + </message> +</context> +<context> + <name>QObject</name> + <message> + <source>FingerPrint</source> + <translation type="vanished">指纹</translation> + </message> + <message> + <source>FingerVein</source> + <translation type="vanished">指静脉</translation> + </message> + <message> + <source>Iris</source> + <translation type="vanished">虹膜</translation> + </message> + <message> + <source>Face</source> + <translation type="vanished">人脸</translation> + </message> + <message> + <source>VoicePrint</source> + <translation type="vanished">声纹</translation> + </message> + <message> + <location filename="../src/main.cpp" line="126"/> + <source>Enter the ukey password</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/main.cpp" line="150"/> + <source>Try it again</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/main.cpp" line="152"/> + <source>Use other Devices</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/main.cpp" line="153"/> + <source>Cancel</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/main.cpp" line="162"/> + <source>Choose the option</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/main.cpp" line="184"/> + <location filename="../src/main.cpp" line="219"/> + <location filename="../src/main.cpp" line="228"/> + <source>Invaild response "</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/main.cpp" line="184"/> + <location filename="../src/main.cpp" line="219"/> + <location filename="../src/main.cpp" line="228"/> + <source>authentication will be canceld</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/main.cpp" line="185"/> + <location filename="../src/main.cpp" line="220"/> + <location filename="../src/main.cpp" line="229"/> + <location filename="../src/main.cpp" line="408"/> + <source>AUTHENTICATION CANCELED</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/main.cpp" line="196"/> + <source>=== BIOMETRIC DEVICES ===</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/main.cpp" line="207"/> + <source>Choose the device</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/main.cpp" line="260"/> + <source>Sevice Name</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/main.cpp" line="261"/> + <source>DISPLAY env</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/main.cpp" line="262"/> + <source>User</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/main.cpp" line="263"/> + <source>Display debug information</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/main.cpp" line="264"/> + <source>Device short name</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/main.cpp" line="306"/> + <source>UKEY AUTHENTICATION</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/main.cpp" line="308"/> + <source>BIOMETRIC AUTHENTICATION</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/main.cpp" line="310"/> + <source>Press Q or Esc to cancel</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/main.cpp" line="330"/> + <source>BIOMETRIC AUTHENTICATION IS CLOSED</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/main.cpp" line="334"/> + <source>AUTHENTICATION SUCCESS</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/main.cpp" line="338"/> + <source>AUTHENTICATION FAILED</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/main.cpp" line="348"/> + <source>Failed to verify %1, you still have %2 verification opportunities</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/main.cpp" line="350"/> + <source>Unable to verify %1, please enter password.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/main.cpp" line="386"/> + <source>AUTHENTICATION END</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/main.cpp" line="388"/> + <source>BIOMETRIC AUTHENTICATION END</source> + <translation type="unfinished"></translation> + </message> +</context> +</TS> diff -Nru ukui-biometric-auth-4.10.0.0/bioauth-bin/i18n_ts/pt.ts ukui-biometric-auth-4.20.0.0/bioauth-bin/i18n_ts/pt.ts --- ukui-biometric-auth-4.10.0.0/bioauth-bin/i18n_ts/pt.ts 2023-11-14 16:23:44.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/bioauth-bin/i18n_ts/pt.ts 2024-09-23 19:22:29.000000000 +0800 @@ -110,5 +110,21 @@ <source>Unable to verify %1, please enter password.</source> <translation type="unfinished"></translation> </message> + <message> + <source>Enter the ukey password</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>UKEY AUTHENTICATION</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>BIOMETRIC AUTHENTICATION IS CLOSED</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>AUTHENTICATION END</source> + <translation type="unfinished"></translation> + </message> </context> </TS> diff -Nru ukui-biometric-auth-4.10.0.0/bioauth-bin/i18n_ts/ru.ts ukui-biometric-auth-4.20.0.0/bioauth-bin/i18n_ts/ru.ts --- ukui-biometric-auth-4.10.0.0/bioauth-bin/i18n_ts/ru.ts 2023-11-14 16:23:44.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/bioauth-bin/i18n_ts/ru.ts 2024-09-23 19:22:29.000000000 +0800 @@ -110,5 +110,21 @@ <source>Unable to verify %1, please enter password.</source> <translation type="unfinished"></translation> </message> + <message> + <source>Enter the ukey password</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>UKEY AUTHENTICATION</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>BIOMETRIC AUTHENTICATION IS CLOSED</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>AUTHENTICATION END</source> + <translation type="unfinished"></translation> + </message> </context> </TS> diff -Nru ukui-biometric-auth-4.10.0.0/bioauth-bin/i18n_ts/tr.ts ukui-biometric-auth-4.20.0.0/bioauth-bin/i18n_ts/tr.ts --- ukui-biometric-auth-4.10.0.0/bioauth-bin/i18n_ts/tr.ts 2023-11-14 16:23:44.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/bioauth-bin/i18n_ts/tr.ts 2024-09-23 19:22:29.000000000 +0800 @@ -27,114 +27,134 @@ <context> <name>QObject</name> <message> - <location filename="../src/main.cpp" line="100"/> + <location filename="../src/main.cpp" line="126"/> + <source>Enter the ukey password</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/main.cpp" line="150"/> <source>Try it again</source> <translation>Yeniden Dene</translation> </message> <message> - <location filename="../src/main.cpp" line="102"/> + <location filename="../src/main.cpp" line="152"/> <source>Use other Devices</source> <translation>Diğer Cihazları Kullan</translation> </message> <message> - <location filename="../src/main.cpp" line="103"/> + <location filename="../src/main.cpp" line="153"/> <source>Cancel</source> <translation>İptal</translation> </message> <message> - <location filename="../src/main.cpp" line="112"/> + <location filename="../src/main.cpp" line="162"/> <source>Choose the option</source> <translation>Seçeneği seçin</translation> </message> <message> - <location filename="../src/main.cpp" line="134"/> - <location filename="../src/main.cpp" line="169"/> - <location filename="../src/main.cpp" line="178"/> + <location filename="../src/main.cpp" line="184"/> + <location filename="../src/main.cpp" line="219"/> + <location filename="../src/main.cpp" line="228"/> <source>Invaild response "</source> <translation>Geçersiz cevap "</translation> </message> <message> - <location filename="../src/main.cpp" line="134"/> - <location filename="../src/main.cpp" line="169"/> - <location filename="../src/main.cpp" line="178"/> + <location filename="../src/main.cpp" line="184"/> + <location filename="../src/main.cpp" line="219"/> + <location filename="../src/main.cpp" line="228"/> <source>authentication will be canceld</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/main.cpp" line="135"/> - <location filename="../src/main.cpp" line="170"/> - <location filename="../src/main.cpp" line="179"/> - <location filename="../src/main.cpp" line="315"/> + <location filename="../src/main.cpp" line="185"/> + <location filename="../src/main.cpp" line="220"/> + <location filename="../src/main.cpp" line="229"/> + <location filename="../src/main.cpp" line="408"/> <source>AUTHENTICATION CANCELED</source> <translation>KİMLİK DOĞRULAMA</translation> </message> <message> - <location filename="../src/main.cpp" line="146"/> + <location filename="../src/main.cpp" line="196"/> <source>=== BIOMETRIC DEVICES ===</source> <translation>=== BİYOMETRİK CİHAZLAR ===</translation> </message> <message> - <location filename="../src/main.cpp" line="157"/> + <location filename="../src/main.cpp" line="207"/> <source>Choose the device</source> <translation>Cihazı seçin</translation> </message> <message> - <location filename="../src/main.cpp" line="210"/> + <location filename="../src/main.cpp" line="260"/> <source>Sevice Name</source> <translation>Servis Adı</translation> </message> <message> - <location filename="../src/main.cpp" line="211"/> + <location filename="../src/main.cpp" line="261"/> <source>DISPLAY env</source> <translation>EKRAN env</translation> </message> <message> - <location filename="../src/main.cpp" line="212"/> + <location filename="../src/main.cpp" line="262"/> <source>User</source> <translation type="unfinished">Kullanıcı</translation> </message> <message> - <location filename="../src/main.cpp" line="213"/> + <location filename="../src/main.cpp" line="263"/> <source>Display debug information</source> <translation>Hata ayıklama bilgilerini görüntüle</translation> </message> <message> - <location filename="../src/main.cpp" line="214"/> + <location filename="../src/main.cpp" line="264"/> <source>Device short name</source> <translation type="unfinished">Cihaz kısa adı</translation> </message> <message> - <location filename="../src/main.cpp" line="249"/> + <location filename="../src/main.cpp" line="306"/> + <source>UKEY AUTHENTICATION</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/main.cpp" line="308"/> <source>BIOMETRIC AUTHENTICATION</source> <translation>BİYOMETRİK KİMLİK DOĞRULAMA</translation> </message> <message> - <location filename="../src/main.cpp" line="251"/> + <location filename="../src/main.cpp" line="310"/> <source>Press Q or Esc to cancel</source> <translation>İptal etmek için Q veya Esc tuşuna basın</translation> </message> <message> - <location filename="../src/main.cpp" line="263"/> + <location filename="../src/main.cpp" line="330"/> + <source>BIOMETRIC AUTHENTICATION IS CLOSED</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/main.cpp" line="334"/> <source>AUTHENTICATION SUCCESS</source> <translation>KİMLİK DOĞRULAMA</translation> </message> <message> - <location filename="../src/main.cpp" line="267"/> + <location filename="../src/main.cpp" line="338"/> <source>AUTHENTICATION FAILED</source> <translation>KİMLİK DOĞRULAMA BAŞARISIZ OLDU</translation> </message> <message> - <location filename="../src/main.cpp" line="277"/> + <location filename="../src/main.cpp" line="348"/> <source>Failed to verify %1, you still have %2 verification opportunities</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/main.cpp" line="279"/> + <location filename="../src/main.cpp" line="350"/> <source>Unable to verify %1, please enter password.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/main.cpp" line="302"/> + <location filename="../src/main.cpp" line="386"/> + <source>AUTHENTICATION END</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/main.cpp" line="388"/> <source>BIOMETRIC AUTHENTICATION END</source> <translation>BİYOMETRİK KİMLİK DOĞRULAMA SONU</translation> </message> diff -Nru ukui-biometric-auth-4.10.0.0/bioauth-bin/i18n_ts/ug.ts ukui-biometric-auth-4.20.0.0/bioauth-bin/i18n_ts/ug.ts --- ukui-biometric-auth-4.10.0.0/bioauth-bin/i18n_ts/ug.ts 1970-01-01 08:00:00.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/bioauth-bin/i18n_ts/ug.ts 2024-09-23 19:22:29.000000000 +0800 @@ -0,0 +1,287 @@ +<?xml version="1.0" encoding="utf-8"?> +<!DOCTYPE TS> +<TS version="2.1" language="ug"> +<context> + <name>BioAuthWidget</name> + <message> + <source>More</source> + <translation type="vanished">更多</translation> + </message> + <message> + <source>Retry</source> + <translation type="vanished">قايتا سىناپ بىقىڭ</translation> + </message> + <message> + <source>Too many unsuccessful attempts,please enter password.</source> + <translation type="vanished">验证失败达最大次数,请使用密码解锁</translation> + </message> + <message> + <source>Bioauth authentication failed, you still have %1 verification opportunities</source> + <translation type="vanished">生物认证失败,您还有%1次尝试机会</translation> + </message> + <message> + <source>Password</source> + <translation type="vanished">مەخپىي نومۇر</translation> + </message> + <message> + <source>Current Device: </source> + <translation type="vanished">当前设备:</translation> + </message> + <message> + <source>%1 too many unsuccessful attempts,please enter password.</source> + <translation type="vanished">1-نومۇر مەغلۇپ بولغان سىناق قېتىم سانى زىيادە كۆپ، مەخپىي نومۇرنى كىرگۈزۈڭ</translation> + </message> + <message> + <source>%1 authentication failure,there are still %2 remaining opportunities</source> + <translation type="vanished">بىر كىملىك دەلىللەش مەغلۇپ بولدى، يەنىلا ٪2 ئېشىپ قالغان پۇرسەت بار</translation> + </message> + <message> + <source>Please use wechat to scan the code</source> + <translation type="vanished">ئۈندىداردا كود سۈپۈرۈڭ</translation> + </message> +</context> +<context> + <name>BioDevices</name> + <message> + <source>Unplugging of %1 device detected</source> + <translation type="vanished">تەكشۈرۈپ بايقىغان 1 ئۈسكۈنىنى تارتىپ چىقارماق</translation> + </message> + <message> + <source>%1 device insertion detected</source> + <translation type="vanished">٪1 ئۈسكۈنىنىڭ كىرگۈزۈلگەنلىكىنى تەكشۈرۈپ چىقماق</translation> + </message> + <message> + <source>ukui-biometric-manager</source> + <translation type="vanished">بىئولوگىيەلىك ئالاھىدىلىك باشقۇرۇش قورالى</translation> + </message> + <message> + <source>biometric</source> + <translation type="vanished">بىئولوگىيەلىك ئالاھىدىلىك</translation> + </message> + <message> + <source>FingerPrint</source> + <translation type="vanished">بارماق ئىزى</translation> + </message> + <message> + <source>FingerVein</source> + <translation type="vanished">ۋېنانى كۆرسىتىدۇ</translation> + </message> + <message> + <source>Iris</source> + <translation type="vanished">رەڭدار پەردە</translation> + </message> + <message> + <source>Face</source> + <translation type="vanished">ئادەم يۈزىنى پەرقلەندۈرۈش</translation> + </message> + <message> + <source>VoicePrint</source> + <translation type="vanished">ئاۋاز سىزىقى</translation> + </message> + <message> + <source>ukey</source> + <translation type="vanished">بىخەتەر ئاچقۇچ</translation> + </message> + <message> + <source>QRCode</source> + <translation type="vanished">ئىككى ئۆلچەملىك كود</translation> + </message> + <message> + <source>Wechat</source> + <translation type="vanished">微信</translation> + </message> +</context> +<context> + <name>BioDevicesWidget</name> + <message> + <source>Device types:</source> + <translation type="vanished">设备类型:</translation> + </message> + <message> + <source>Back</source> + <translation type="vanished">返回</translation> + </message> + <message> + <source>OK</source> + <translation type="vanished">确定</translation> + </message> + <message> + <source>FingerPrint</source> + <translation type="vanished">指纹</translation> + </message> +</context> +<context> + <name>LoginOptionsWidget</name> + <message> + <source>Login Options</source> + <translation type="vanished">تاللاش تۈرىگە كىرمەك</translation> + </message> + <message> + <source>Password</source> + <translation type="vanished">مەخپىي نومۇر</translation> + </message> + <message> + <source>Wechat</source> + <translation type="vanished">微信</translation> + </message> + <message> + <source>Biometric</source> + <translation type="vanished">生物识别</translation> + </message> +</context> +<context> + <name>QObject</name> + <message> + <source>FingerPrint</source> + <translation type="vanished">指纹</translation> + </message> + <message> + <source>FingerVein</source> + <translation type="vanished">指静脉</translation> + </message> + <message> + <source>Iris</source> + <translation type="vanished">虹膜</translation> + </message> + <message> + <source>Face</source> + <translation type="vanished">人脸</translation> + </message> + <message> + <source>VoicePrint</source> + <translation type="vanished">声纹</translation> + </message> + <message> + <location filename="../src/main.cpp" line="126"/> + <source>Enter the ukey password</source> + <translation>ukey مەخپىي نومۇرىنى كىرگۈزۈڭ</translation> + </message> + <message> + <location filename="../src/main.cpp" line="150"/> + <source>Try it again</source> + <translation>قايتا سىناڭ</translation> + </message> + <message> + <location filename="../src/main.cpp" line="152"/> + <source>Use other Devices</source> + <translation>باشقا ئۈسكۈنە ئىشلىتىش</translation> + </message> + <message> + <location filename="../src/main.cpp" line="153"/> + <source>Cancel</source> + <translation>ئەمەلدىن قالدۇرۇش</translation> + </message> + <message> + <location filename="../src/main.cpp" line="162"/> + <source>Choose the option</source> + <translation>تاللاش تۈرى</translation> + </message> + <message> + <location filename="../src/main.cpp" line="184"/> + <location filename="../src/main.cpp" line="219"/> + <location filename="../src/main.cpp" line="228"/> + <source>Invaild response "</source> + <translation>ئۈنۈمسىز ئىنكاس</translation> + </message> + <message> + <location filename="../src/main.cpp" line="184"/> + <location filename="../src/main.cpp" line="219"/> + <location filename="../src/main.cpp" line="228"/> + <source>authentication will be canceld</source> + <translation>سالاھىيەت تەكشۈرۈش ئەمەلدىن قالدۇرۇلىدۇ</translation> + </message> + <message> + <location filename="../src/main.cpp" line="185"/> + <location filename="../src/main.cpp" line="220"/> + <location filename="../src/main.cpp" line="229"/> + <location filename="../src/main.cpp" line="408"/> + <source>AUTHENTICATION CANCELED</source> + <translation>سالاھىيەت تەكشۈرۈش ئەمەلدىن قالدۇرۇلدى</translation> + </message> + <message> + <location filename="../src/main.cpp" line="196"/> + <source>=== BIOMETRIC DEVICES ===</source> + <translation>= = = بىيولوگىيەلىك پەرقلەندۈرۈش ئۈسكۈنىسى = = =</translation> + </message> + <message> + <location filename="../src/main.cpp" line="207"/> + <source>Choose the device</source> + <translation>باشقا ئۈسكۈنە تاللاڭ</translation> + </message> + <message> + <location filename="../src/main.cpp" line="260"/> + <source>Sevice Name</source> + <translation>مۇلازىمەت نامى</translation> + </message> + <message> + <location filename="../src/main.cpp" line="261"/> + <source>DISPLAY env</source> + <translation>كۆرسىتىش مۇھىتى</translation> + </message> + <message> + <location filename="../src/main.cpp" line="262"/> + <source>User</source> + <translation>ئىشلەتكۈچى</translation> + </message> + <message> + <location filename="../src/main.cpp" line="263"/> + <source>Display debug information</source> + <translation>تەڭشەش ئۇچۇرىنى كۆرسىتىش</translation> + </message> + <message> + <location filename="../src/main.cpp" line="264"/> + <source>Device short name</source> + <translation>ئۈسكۈنىنىڭ قىسقا نامى</translation> + </message> + <message> + <location filename="../src/main.cpp" line="306"/> + <source>UKEY AUTHENTICATION</source> + <translation>UKEY سالاھىيىتىنى دەلىللەش</translation> + </message> + <message> + <location filename="../src/main.cpp" line="308"/> + <source>BIOMETRIC AUTHENTICATION</source> + <translation>بىيولوگىيەلىك ئالاھىدىلىك ئىسپاتى</translation> + </message> + <message> + <location filename="../src/main.cpp" line="310"/> + <source>Press Q or Esc to cancel</source> + <translation>Q ياكى Esc نى بېسىپ ئەمەلدىن قالدۇرۇڭ</translation> + </message> + <message> + <location filename="../src/main.cpp" line="330"/> + <source>BIOMETRIC AUTHENTICATION IS CLOSED</source> + <translation>بىئولوگىيەلىك ئالاھىدىلىكنى دەلىللەش تاقالدى</translation> + </message> + <message> + <location filename="../src/main.cpp" line="334"/> + <source>AUTHENTICATION SUCCESS</source> + <translation>سالاھىيەت تەكشۈرۈش مۇۋەپپەقىيەتلىك بولدى</translation> + </message> + <message> + <location filename="../src/main.cpp" line="338"/> + <source>AUTHENTICATION FAILED</source> + <translation>سالاھىيەت تەكشۈرۈش مەغلۇپ بولدى.</translation> + </message> + <message> + <location filename="../src/main.cpp" line="348"/> + <source>Failed to verify %1, you still have %2 verification opportunities</source> + <translation>٪1 دەلىللەش مەغلۇپ بولدى، سىزدە يەنە ٪2 دەلىللەش پۇرسىتى بار</translation> + </message> + <message> + <location filename="../src/main.cpp" line="350"/> + <source>Unable to verify %1, please enter password.</source> + <translation>%1 نى دەلىللىگىلى بولمايدۇ، مەخپىي نومۇرنى كىرگۈزۈڭ.</translation> + </message> + <message> + <location filename="../src/main.cpp" line="386"/> + <source>AUTHENTICATION END</source> + <translation>سالاھىيەت تەكشۈرۈش ئاخىرلاشتى.</translation> + </message> + <message> + <location filename="../src/main.cpp" line="388"/> + <source>BIOMETRIC AUTHENTICATION END</source> + <translation>بىئولوگىيەلىك ئالاھىدىلىك ئىسپات بېرىش ئۇچى</translation> + </message> +</context> +</TS> diff -Nru ukui-biometric-auth-4.10.0.0/bioauth-bin/i18n_ts/zh_CN.ts ukui-biometric-auth-4.20.0.0/bioauth-bin/i18n_ts/zh_CN.ts --- ukui-biometric-auth-4.10.0.0/bioauth-bin/i18n_ts/zh_CN.ts 2023-11-14 16:23:44.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/bioauth-bin/i18n_ts/zh_CN.ts 2024-09-23 19:22:29.000000000 +0800 @@ -4,12 +4,14 @@ <context> <name>QObject</name> <message> + <location filename="../src/main.cpp" line="126"/> <source>Enter the ukey password</source> <translation>输入ukey密码</translation> </message> <message> <location filename="../src/main.cpp" line="110"/> - <source>Enter the ukey password</source> + <source>Enter the ukey password +</source> <translation>输入ukey密码\n</translation> </message> <message> @@ -18,124 +20,124 @@ <translation>再试一次</translation> </message> <message> - <location filename="../src/main.cpp" line="102"/> + <location filename="../src/main.cpp" line="152"/> <source>Use other Devices</source> <translation>使用其他设备</translation> </message> <message> - <location filename="../src/main.cpp" line="103"/> + <location filename="../src/main.cpp" line="153"/> <source>Cancel</source> <translation>取消</translation> </message> <message> - <location filename="../src/main.cpp" line="112"/> + <location filename="../src/main.cpp" line="162"/> <source>Choose the option</source> <translation>选择选项</translation> </message> <message> - <location filename="../src/main.cpp" line="134"/> - <location filename="../src/main.cpp" line="169"/> - <location filename="../src/main.cpp" line="178"/> + <location filename="../src/main.cpp" line="184"/> + <location filename="../src/main.cpp" line="219"/> + <location filename="../src/main.cpp" line="228"/> <source>Invaild response "</source> <translation>不能识别的响应 "</translation> </message> <message> - <location filename="../src/main.cpp" line="134"/> - <location filename="../src/main.cpp" line="169"/> - <location filename="../src/main.cpp" line="178"/> + <location filename="../src/main.cpp" line="184"/> + <location filename="../src/main.cpp" line="219"/> + <location filename="../src/main.cpp" line="228"/> <source>authentication will be canceld</source> <translation>认证将要被取消</translation> </message> <message> - <location filename="../src/main.cpp" line="135"/> - <location filename="../src/main.cpp" line="170"/> - <location filename="../src/main.cpp" line="179"/> - <location filename="../src/main.cpp" line="323"/> + <location filename="../src/main.cpp" line="185"/> + <location filename="../src/main.cpp" line="220"/> + <location filename="../src/main.cpp" line="229"/> + <location filename="../src/main.cpp" line="408"/> <source>AUTHENTICATION CANCELED</source> <translation>认证被取消</translation> </message> <message> - <location filename="../src/main.cpp" line="146"/> + <location filename="../src/main.cpp" line="196"/> <source>=== BIOMETRIC DEVICES ===</source> <translation>=== 生物识别设备 ===</translation> </message> <message> - <location filename="../src/main.cpp" line="157"/> + <location filename="../src/main.cpp" line="207"/> <source>Choose the device</source> <translation>选择设备</translation> </message> <message> - <location filename="../src/main.cpp" line="210"/> + <location filename="../src/main.cpp" line="260"/> <source>Sevice Name</source> <translation></translation> </message> <message> - <location filename="../src/main.cpp" line="211"/> + <location filename="../src/main.cpp" line="261"/> <source>DISPLAY env</source> <translation></translation> </message> <message> - <location filename="../src/main.cpp" line="212"/> + <location filename="../src/main.cpp" line="262"/> <source>User</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/main.cpp" line="213"/> + <location filename="../src/main.cpp" line="263"/> <source>Display debug information</source> <translation></translation> </message> <message> - <location filename="../src/main.cpp" line="214"/> + <location filename="../src/main.cpp" line="264"/> <source>Device short name</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/main.cpp" line="282"/> + <location filename="../src/main.cpp" line="306"/> <source>UKEY AUTHENTICATION</source> <translation>ukey认证</translation> </message> <message> - <location filename="../src/main.cpp" line="284"/> + <location filename="../src/main.cpp" line="308"/> <source>BIOMETRIC AUTHENTICATION</source> <translation>生物识别认证</translation> </message> <message> - <location filename="../src/main.cpp" line="251"/> + <location filename="../src/main.cpp" line="310"/> <source>Press Q or Esc to cancel</source> <translation>按Q或者Esc取消</translation> </message> <message> - <location filename="../src/main.cpp" line="267"/> + <location filename="../src/main.cpp" line="330"/> <source>BIOMETRIC AUTHENTICATION IS CLOSED</source> <translation>生物识别认证已关闭</translation> </message> <message> - <location filename="../src/main.cpp" line="271"/> + <location filename="../src/main.cpp" line="334"/> <source>AUTHENTICATION SUCCESS</source> <translation>认证成功</translation> </message> <message> - <location filename="../src/main.cpp" line="267"/> + <location filename="../src/main.cpp" line="338"/> <source>AUTHENTICATION FAILED</source> <translation>认证失败</translation> </message> <message> - <location filename="../src/main.cpp" line="277"/> + <location filename="../src/main.cpp" line="348"/> <source>Failed to verify %1, you still have %2 verification opportunities</source> <translation>验证%1失败,您还有%2次尝试机会</translation> </message> <message> - <location filename="../src/main.cpp" line="279"/> + <location filename="../src/main.cpp" line="350"/> <source>Unable to verify %1, please enter password.</source> <translation>无法验证%1,请输入密码.</translation> </message> <message> - <location filename="../src/main.cpp" line="357"/> + <location filename="../src/main.cpp" line="386"/> <source>AUTHENTICATION END</source> <translation>认证结束</translation> </message> <message> - <location filename="../src/main.cpp" line="359"/> + <location filename="../src/main.cpp" line="388"/> <source>BIOMETRIC AUTHENTICATION END</source> <translation>生物识别认证结束</translation> </message> diff -Nru ukui-biometric-auth-4.10.0.0/bioauth-bin/i18n_ts/zh_HK.ts ukui-biometric-auth-4.20.0.0/bioauth-bin/i18n_ts/zh_HK.ts --- ukui-biometric-auth-4.10.0.0/bioauth-bin/i18n_ts/zh_HK.ts 1970-01-01 08:00:00.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/bioauth-bin/i18n_ts/zh_HK.ts 2024-09-23 19:22:29.000000000 +0800 @@ -0,0 +1,287 @@ +<?xml version="1.0" encoding="utf-8"?> +<!DOCTYPE TS> +<TS version="2.1" language="zh_Hant"> +<context> + <name>BioAuthWidget</name> + <message> + <source>More</source> + <translation type="vanished">更多</translation> + </message> + <message> + <source>Retry</source> + <translation type="vanished">重試</translation> + </message> + <message> + <source>Too many unsuccessful attempts,please enter password.</source> + <translation type="vanished">验证失败达最大次数,请使用密码解锁</translation> + </message> + <message> + <source>Bioauth authentication failed, you still have %1 verification opportunities</source> + <translation type="vanished">生物认证失败,您还有%1次尝试机会</translation> + </message> + <message> + <source>Password</source> + <translation type="vanished">密碼</translation> + </message> + <message> + <source>Current Device: </source> + <translation type="vanished">当前设备:</translation> + </message> + <message> + <source>%1 too many unsuccessful attempts,please enter password.</source> + <translation type="vanished">%1失敗的嘗試次數太多,請輸入密碼</translation> + </message> + <message> + <source>%1 authentication failure,there are still %2 remaining opportunities</source> + <translation type="vanished">%1 身份驗證失敗,仍有 %2 個剩餘機會</translation> + </message> + <message> + <source>Please use wechat to scan the code</source> + <translation type="vanished">請使用微信掃碼</translation> + </message> +</context> +<context> + <name>BioDevices</name> + <message> + <source>Unplugging of %1 device detected</source> + <translation type="vanished">檢測到 %1 設備的拔出</translation> + </message> + <message> + <source>%1 device insertion detected</source> + <translation type="vanished">檢測到 %1 個設備插入</translation> + </message> + <message> + <source>ukui-biometric-manager</source> + <translation type="vanished">生物特徵管理工具</translation> + </message> + <message> + <source>biometric</source> + <translation type="vanished">生物特徵管理工具</translation> + </message> + <message> + <source>FingerPrint</source> + <translation type="vanished">指紋</translation> + </message> + <message> + <source>FingerVein</source> + <translation type="vanished">指靜脈</translation> + </message> + <message> + <source>Iris</source> + <translation type="vanished">虹膜</translation> + </message> + <message> + <source>Face</source> + <translation type="vanished">人臉</translation> + </message> + <message> + <source>VoicePrint</source> + <translation type="vanished">聲紋</translation> + </message> + <message> + <source>ukey</source> + <translation type="vanished">安全金鑰</translation> + </message> + <message> + <source>QRCode</source> + <translation type="vanished">微信掃碼</translation> + </message> + <message> + <source>Wechat</source> + <translation type="vanished">微信</translation> + </message> +</context> +<context> + <name>BioDevicesWidget</name> + <message> + <source>Device types:</source> + <translation type="vanished">设备类型:</translation> + </message> + <message> + <source>Back</source> + <translation type="vanished">返回</translation> + </message> + <message> + <source>OK</source> + <translation type="vanished">确定</translation> + </message> + <message> + <source>FingerPrint</source> + <translation type="vanished">指纹</translation> + </message> +</context> +<context> + <name>LoginOptionsWidget</name> + <message> + <source>Login Options</source> + <translation type="vanished">登錄選項</translation> + </message> + <message> + <source>Password</source> + <translation type="vanished">密碼</translation> + </message> + <message> + <source>Wechat</source> + <translation type="vanished">微信</translation> + </message> + <message> + <source>Biometric</source> + <translation type="vanished">生物识别</translation> + </message> +</context> +<context> + <name>QObject</name> + <message> + <source>FingerPrint</source> + <translation type="vanished">指纹</translation> + </message> + <message> + <source>FingerVein</source> + <translation type="vanished">指静脉</translation> + </message> + <message> + <source>Iris</source> + <translation type="vanished">虹膜</translation> + </message> + <message> + <source>Face</source> + <translation type="vanished">人脸</translation> + </message> + <message> + <source>VoicePrint</source> + <translation type="vanished">声纹</translation> + </message> + <message> + <location filename="../src/main.cpp" line="126"/> + <source>Enter the ukey password</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/main.cpp" line="150"/> + <source>Try it again</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/main.cpp" line="152"/> + <source>Use other Devices</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/main.cpp" line="153"/> + <source>Cancel</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/main.cpp" line="162"/> + <source>Choose the option</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/main.cpp" line="184"/> + <location filename="../src/main.cpp" line="219"/> + <location filename="../src/main.cpp" line="228"/> + <source>Invaild response "</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/main.cpp" line="184"/> + <location filename="../src/main.cpp" line="219"/> + <location filename="../src/main.cpp" line="228"/> + <source>authentication will be canceld</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/main.cpp" line="185"/> + <location filename="../src/main.cpp" line="220"/> + <location filename="../src/main.cpp" line="229"/> + <location filename="../src/main.cpp" line="408"/> + <source>AUTHENTICATION CANCELED</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/main.cpp" line="196"/> + <source>=== BIOMETRIC DEVICES ===</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/main.cpp" line="207"/> + <source>Choose the device</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/main.cpp" line="260"/> + <source>Sevice Name</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/main.cpp" line="261"/> + <source>DISPLAY env</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/main.cpp" line="262"/> + <source>User</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/main.cpp" line="263"/> + <source>Display debug information</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/main.cpp" line="264"/> + <source>Device short name</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/main.cpp" line="306"/> + <source>UKEY AUTHENTICATION</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/main.cpp" line="308"/> + <source>BIOMETRIC AUTHENTICATION</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/main.cpp" line="310"/> + <source>Press Q or Esc to cancel</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/main.cpp" line="330"/> + <source>BIOMETRIC AUTHENTICATION IS CLOSED</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/main.cpp" line="334"/> + <source>AUTHENTICATION SUCCESS</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/main.cpp" line="338"/> + <source>AUTHENTICATION FAILED</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/main.cpp" line="348"/> + <source>Failed to verify %1, you still have %2 verification opportunities</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/main.cpp" line="350"/> + <source>Unable to verify %1, please enter password.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/main.cpp" line="386"/> + <source>AUTHENTICATION END</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/main.cpp" line="388"/> + <source>BIOMETRIC AUTHENTICATION END</source> + <translation type="unfinished"></translation> + </message> +</context> +</TS> diff -Nru ukui-biometric-auth-4.10.0.0/bioauth-bin/src/keywatcher.cpp ukui-biometric-auth-4.20.0.0/bioauth-bin/src/keywatcher.cpp --- ukui-biometric-auth-4.10.0.0/bioauth-bin/src/keywatcher.cpp 2023-11-14 16:23:44.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/bioauth-bin/src/keywatcher.cpp 2024-09-23 19:22:29.000000000 +0800 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018 Tianjin KYLIN Information Technology Co., Ltd. + * Copyright (C) 2023 KylinSoftCo., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -35,6 +35,7 @@ current.c_cc[VMIN] = 1; current.c_cc[VTIME] = 0; tcsetattr(0, TCSANOW, ¤t); + bool isInputEnd = false; while(!isInterruptionRequested()){ @@ -52,11 +53,18 @@ break; default: // 'q' | 'Q' or Esc - if((ch = getchar()) == 'q' || ch == 'Q' || ch == 27){ + if((ch = getchar()) == 'q' || ch == 'Q' || ch == 27 || ch == EOF){ tcsetattr(0, TCSANOW, &save); emit exit(); + if (ch == EOF) { + isInputEnd = true; + break; + } } } + if (isInputEnd) { + break; + } } tcsetattr(0, TCSANOW, &save); // 恢复原来的终端属性,以免干扰shall和之后的程序运行 diff -Nru ukui-biometric-auth-4.10.0.0/bioauth-bin/src/keywatcher.h ukui-biometric-auth-4.20.0.0/bioauth-bin/src/keywatcher.h --- ukui-biometric-auth-4.10.0.0/bioauth-bin/src/keywatcher.h 2023-11-14 16:23:44.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/bioauth-bin/src/keywatcher.h 2024-09-23 19:22:29.000000000 +0800 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018 Tianjin KYLIN Information Technology Co., Ltd. + * Copyright (C) 2023 KylinSoftCo., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff -Nru ukui-biometric-auth-4.10.0.0/bioauth-bin/src/main.cpp ukui-biometric-auth-4.20.0.0/bioauth-bin/src/main.cpp --- ukui-biometric-auth-4.10.0.0/bioauth-bin/src/main.cpp 2023-11-14 16:23:44.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/bioauth-bin/src/main.cpp 2024-09-23 19:22:29.000000000 +0800 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018 Tianjin KYLIN Information Technology Co., Ltd. + * Copyright (C) 2023 KylinSoftCo., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -93,6 +93,22 @@ fprintf(stdout, RESET_COLOR); } +static bool isQuickInput() { + fd_set readfds; + FD_ZERO(&readfds); + FD_SET(0, &readfds); // stdin + struct timeval timeout = {0, 10*1000}; + switch (select(32, &readfds, NULL, NULL, &timeout)) { + case 0: // time out + break; + case -1: // error + break; + default: + return true; + } + return false; +} + QString inputPinCode() { struct termios current; @@ -241,7 +257,7 @@ a.installTranslator(&translator_bin); QCommandLineParser parser; - QCommandLineOption serviceOption({"s", "service"}, QObject::tr("Sevice Name")); + QCommandLineOption serviceOption({"s", "service"}, QObject::tr("Sevice Name"), "service", ""); QCommandLineOption displayOption({"x", "display"}, QObject::tr("DISPLAY env"), "display", ":0"); QCommandLineOption usernameOption({"u", "user"}, QObject::tr("User"), "user", ""); QCommandLineOption debugOption({"d", "debug"}, QObject::tr("Display debug information")); @@ -258,6 +274,11 @@ logPrefix = "[pam-diaglog]:"; qInstallMessageHandler(outputMessage); + QString serverName = parser.value(serviceOption); + if (serverName == "sudo" && isQuickInput()) { + exit(BIO_ERROR); + } + QString userName = parser.value(usernameOption); if(userName.isEmpty()) exit(BIO_ERROR); @@ -298,12 +319,13 @@ }); QObject::connect(&bioAuth, &BioAuth::authComplete, &a, [&](uid_t uid_, int result, int retErrNo){ Q_UNUSED(retErrNo); + watcher.stop(); bool isBioEnable = bioDevices.GetBioAuthEnable(uid_); - bool isUkeyDevice = false; - if(deviceInfo && deviceInfo->biotype == 6){ - isUkeyDevice = true; - } + bool isUkeyDevice = false; + if(deviceInfo && deviceInfo->biotype == 6){ + isUkeyDevice = true; + } if(!isBioEnable && !isUkeyDevice){ showMessage(QObject::tr("BIOMETRIC AUTHENTICATION IS CLOSED"), RESULT); exit(BIO_IGNORE); @@ -328,11 +350,11 @@ showMessage(QObject::tr("Unable to verify %1, please enter password.").arg(bioDevices.bioTypeToString_tr(curDeviceInfo->biotype)),RESULT); exit(BIO_IGNORE); } - Option option = showOption(bioDevices.count() > 1); + Option option = showOption(bioDevices.getAllDevices().count() > 1); switch(option) { case OPTION_TRY_AGAIN: - if(deviceInfo->biotype == 6){ + if(deviceInfo->biotype == 6){ QString code = inputPinCode(); bioAuth.SetExtraInfo("pincode",code); } @@ -346,7 +368,7 @@ *deviceInfo = showDevices(bioDevices.getAllDevices()); bioAuth.setDevice(deviceInfo); - if(deviceInfo->biotype == 6){ + if(deviceInfo->biotype == 6){ QString code = inputPinCode(); bioAuth.SetExtraInfo("pincode",code); } @@ -360,12 +382,12 @@ { exit(BIO_ERROR); }else{ - if(deviceInfo->biotype == 6){ - showMessage(QObject::tr("AUTHENTICATION END"), START); + if(deviceInfo->biotype == 6){ + showMessage(QObject::tr("AUTHENTICATION END"), START); }else{ - showMessage(QObject::tr("BIOMETRIC AUTHENTICATION END"), START); - } - exit(BIO_IGNORE); + showMessage(QObject::tr("BIOMETRIC AUTHENTICATION END"), START); + } + exit(BIO_IGNORE); break; } default: @@ -375,8 +397,8 @@ }); if(deviceInfo->biotype == 6){ - QString code = inputPinCode(); - bioAuth.SetExtraInfo("pincode",code); + QString code = inputPinCode(); + bioAuth.SetExtraInfo("pincode",code); } bioAuth.startAuth(); diff -Nru ukui-biometric-auth-4.10.0.0/common/generic.cpp ukui-biometric-auth-4.20.0.0/common/generic.cpp --- ukui-biometric-auth-4.10.0.0/common/generic.cpp 2023-11-14 16:23:44.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/common/generic.cpp 2024-09-23 19:22:29.000000000 +0800 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018 Tianjin KYLIN Information Technology Co., Ltd. + * Copyright (C) 2023 KylinSoftCo., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff -Nru ukui-biometric-auth-4.10.0.0/common/generic.h ukui-biometric-auth-4.20.0.0/common/generic.h --- ukui-biometric-auth-4.10.0.0/common/generic.h 2023-11-14 16:23:44.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/common/generic.h 2024-09-23 19:22:29.000000000 +0800 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018 Tianjin KYLIN Information Technology Co., Ltd. + * Copyright (C) 2023 KylinSoftCo., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff -Nru ukui-biometric-auth-4.10.0.0/debian/changelog ukui-biometric-auth-4.20.0.0/debian/changelog --- ukui-biometric-auth-4.10.0.0/debian/changelog 2024-04-23 10:31:46.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/debian/changelog 2024-11-15 17:01:40.000000000 +0800 @@ -1,3 +1,39 @@ +ukui-biometric-auth (4.20.0.0-ok1.2) huanghe; urgency=medium + + * BUG号:#IB4M9L 修改密码等需要授权认证的操作直接失败,无法打开提权窗口 + * 需求号:无 + * 其他改动说明:无 + * 其他改动影响域:无 + + -- Yang Min <yangmin@kylinos.cn> Fri, 15 Nov 2024 17:01:40 +0800 + +ukui-biometric-auth (4.20.0.0-ok1) huanghe; urgency=medium + + * BUG号:无 + * 需求号:#18336 登录锁屏生物特征验证流程优化 + * 其他改动说明:无 + * 其他改动影响域:无 + + -- Yang Min <yangmin@kylinos.cn> Wed, 13 Nov 2024 19:56:28 +0800 + +ukui-biometric-auth (4.10.0.0-ok9) nile; urgency=medium + + * BUG号:无 + * 需求号:无 + * 其他改动说明:添加维文翻译 + * 其他改动影响域:无 + + -- Yang Min <yangmin@kylinos.cn> Tue, 27 Aug 2024 17:13:35 +0800 + +ukui-biometric-auth (4.10.0.0-ok8) nile; urgency=medium + + * BUG号:无 + * 需求号:无 + * 其他改动说明:更新desktop文件名 + * 其他改动影响域:无 + + -- Kevin Duan <duankaiwen@kylinos.cn> Tue, 23 Apr 2024 10:31:46 +0800 + ukui-biometric-auth (4.10.0.0-ok7) nile; urgency=medium * BUG号:无 diff -Nru ukui-biometric-auth-4.10.0.0/debian/control ukui-biometric-auth-4.20.0.0/debian/control --- ukui-biometric-auth-4.10.0.0/debian/control 2024-04-23 10:31:46.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/debian/control 2024-11-15 17:01:40.000000000 +0800 @@ -16,6 +16,7 @@ qttools5-dev, qttools5-dev-tools, libkysdk-sysinfo-dev, + libkysdk-qtwidgets-dev, libukui-log4qt-dev, libssl-dev, liblightdm-qt5-3-dev, diff -Nru ukui-biometric-auth-4.10.0.0/debian/patches/0001-update-change.patch ukui-biometric-auth-4.20.0.0/debian/patches/0001-update-change.patch --- ukui-biometric-auth-4.10.0.0/debian/patches/0001-update-change.patch 2024-04-23 10:31:46.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/debian/patches/0001-update-change.patch 1970-01-01 08:00:00.000000000 +0800 @@ -1,8309 +0,0 @@ -From: yangmin <winner_yangmin@163.com> -Date: Thu, 16 Nov 2023 14:49:19 +0800 -Subject: update change - ---- - bioauth-bin/i18n_ts/de.ts | 184 +++++++++ - bioauth-bin/i18n_ts/es.ts | 178 ++++++--- - bioauth-bin/i18n_ts/fr.ts | 178 ++++++--- - bioauth-bin/i18n_ts/kk.ts | 184 +++++++++ - bioauth-bin/i18n_ts/ky.ts | 184 +++++++++ - bioauth-bin/i18n_ts/mn.ts | 184 +++++++++ - bioauth-bin/i18n_ts/ug.ts | 184 +++++++++ - bioauth-bin/i18n_ts/zh_HK.ts | 184 +++++++++ - bioauth-bin/src/keywatcher.cpp | 10 +- - bioauth-bin/src/main.cpp | 52 ++- - bioauth/i18n_ts/mn.ts | 184 +++++++++ - bioauth/i18n_ts/zh_CN.ts | 4 +- - bioauth/i18n_ts/zh_HK.ts | 184 +++++++++ - bioauth/include/bioauth.h | 1 + - bioauth/include/biodevices.h | 3 + - bioauth/include/biotypes.h | 3 + - bioauth/include/loginoptionswidget.h | 1 + - bioauth/include/uniauthservice.h | 6 +- - bioauth/src/bioauth.cpp | 13 + - bioauth/src/biodevices.cpp | 71 +++- - bioauth/src/loginoptionswidget.cpp | 19 +- - bioauth/src/uniauthservice.cpp | 39 ++ - images/ukui-loginopt-finger.svg | 2 +- - ...desktop.plicykit.pkexec.bioctl-helper.policy.in | 2 + - ...freedesktop.plicykit.pkexec.biodrvctl.policy.in | 4 +- - ...reedesktop.plicykit.pkexec.biorestart.policy.in | 4 +- - pam-biometric/data/ukui-biometric.conf | 1 + - polkit-agent/CMakeLists.txt | 3 +- - polkit-agent/i18n_ts/bo_CN.ts | 62 ++- - polkit-agent/i18n_ts/de.ts | 421 ++++++++++++++++++++ - polkit-agent/i18n_ts/es.ts | 376 ++++++++++++++---- - polkit-agent/i18n_ts/fr.ts | 372 +++++++++++++---- - polkit-agent/i18n_ts/kk.ts | 421 ++++++++++++++++++++ - polkit-agent/i18n_ts/ky.ts | 421 ++++++++++++++++++++ - polkit-agent/i18n_ts/mn.ts | 441 +++++++++++++++++++++ - polkit-agent/i18n_ts/ug.ts | 421 ++++++++++++++++++++ - polkit-agent/i18n_ts/zh_HK.ts | 441 +++++++++++++++++++++ - polkit-agent/src/PolkitListener.cpp | 1 + - polkit-agent/src/mainwindow.cpp | 89 +++-- - polkit-agent/src/mainwindow.ui | 24 +- - polkit-agent/src/modeButton.cpp | 2 +- - uniauth-backend/CMakeLists.txt | 10 +- - uniauth-backend/src/CSingleton.h | 46 +++ - uniauth-backend/src/biodeviceinfo.h | 5 + - uniauth-backend/src/main.cpp | 3 + - uniauth-backend/src/personalizeddata.cpp | 345 ++++++++++++++++ - uniauth-backend/src/personalizeddata.h | 140 +++++++ - uniauth-backend/src/rsac.cpp | 199 ++++++++++ - uniauth-backend/src/rsac.h | 26 ++ - uniauth-backend/src/serviceinterface.cpp | 331 +++++++++++++++- - uniauth-backend/src/serviceinterface.h | 62 ++- - uniauth-backend/src/servicemanager.cpp | 2 + - uniauth-backend/src/servicemanager.h | 1 + - 53 files changed, 6309 insertions(+), 419 deletions(-) - create mode 100644 bioauth-bin/i18n_ts/de.ts - create mode 100644 bioauth-bin/i18n_ts/kk.ts - create mode 100644 bioauth-bin/i18n_ts/ky.ts - create mode 100644 bioauth-bin/i18n_ts/mn.ts - create mode 100644 bioauth-bin/i18n_ts/ug.ts - create mode 100644 bioauth-bin/i18n_ts/zh_HK.ts - create mode 100644 bioauth/i18n_ts/mn.ts - create mode 100644 bioauth/i18n_ts/zh_HK.ts - create mode 100644 polkit-agent/i18n_ts/de.ts - create mode 100644 polkit-agent/i18n_ts/kk.ts - create mode 100644 polkit-agent/i18n_ts/ky.ts - create mode 100644 polkit-agent/i18n_ts/mn.ts - create mode 100644 polkit-agent/i18n_ts/ug.ts - create mode 100644 polkit-agent/i18n_ts/zh_HK.ts - create mode 100644 uniauth-backend/src/CSingleton.h - create mode 100644 uniauth-backend/src/personalizeddata.cpp - create mode 100644 uniauth-backend/src/personalizeddata.h - create mode 100644 uniauth-backend/src/rsac.cpp - create mode 100644 uniauth-backend/src/rsac.h - -diff --git a/bioauth-bin/i18n_ts/de.ts b/bioauth-bin/i18n_ts/de.ts -new file mode 100644 -index 0000000..c3eb69c ---- /dev/null -+++ b/bioauth-bin/i18n_ts/de.ts -@@ -0,0 +1,184 @@ -+<?xml version="1.0" encoding="utf-8"?> -+<!DOCTYPE TS> -+<TS version="2.1" language="de"> -+<context> -+ <name>BioAuthWidget</name> -+ <message> -+ <location filename="../src/bioauthwidget.ui" line="14"/> -+ <source>Form</source> -+ <translation></translation> -+ </message> -+ <message> -+ <source>More</source> -+ <translation type="vanished">更多</translation> -+ </message> -+ <message> -+ <location filename="../src/bioauthwidget.ui" line="146"/> -+ <location filename="../src/bioauthwidget.cpp" line="41"/> -+ <source>Retry</source> -+ <translation>wiederholen</translation> -+ </message> -+ <message> -+ <source>Too many unsuccessful attempts,please enter password.</source> -+ <translation type="vanished">验证失败达最大次数,请使用密码解锁</translation> -+ </message> -+ <message> -+ <source>Bioauth authentication failed, you still have %1 verification opportunities</source> -+ <translation type="vanished">生物认证失败,您还有%1次尝试机会</translation> -+ </message> -+ <message> -+ <source>Password</source> -+ <translation>Passwort</translation> -+ </message> -+ <message> -+ <source>Current Device: </source> -+ <translation type="vanished">当前设备:</translation> -+ </message> -+ <message> -+ <location filename="../src/bioauthwidget.cpp" line="96"/> -+ <location filename="../src/bioauthwidget.cpp" line="212"/> -+ <source>%1 too many unsuccessful attempts,please enter password.</source> -+ <translation>%1 Es gibt zu viele fehlgeschlagene Versuche, bitte geben Sie Ihr Passwort ein.</translation> -+ </message> -+ <message> -+ <location filename="../src/bioauthwidget.cpp" line="102"/> -+ <source>%1 authentication failure,there are still %2 remaining opportunities</source> -+ <translation>%1 Authentifizierung fehlgeschlagen und es sind noch %2 verbleibende Chancen</translation> -+ </message> -+ <message> -+ <location filename="../src/bioauthwidget.cpp" line="226"/> -+ <source>Please use wechat to scan the code</source> -+ <translation>Bitte verwenden Sie WeChat, um den Code zu scannen</translation> -+ </message> -+</context> -+<context> -+ <name>BioDevices</name> -+ <message> -+ <location filename="../src/biodevices.cpp" line="78"/> -+ <source>Unplugging of %1 device detected</source> -+ <translation>Das %1-Gerät wurde vom Stromnetz getrennt</translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="88"/> -+ <source>%1 device insertion detected</source> -+ <translation>%1 angeschlossenes Gerät erkannt</translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="97"/> -+ <source>ukui-biometric-manager</source> -+ <translation>Tools für die biometrische Verwaltung</translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="100"/> -+ <source>biometric</source> -+ <translation>Biologische Eigenschaften</translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="647"/> -+ <source>FingerPrint</source> -+ <translation>Fingerabdruck</translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="649"/> -+ <source>FingerVein</source> -+ <translation>Fingervenen</translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="651"/> -+ <source>Iris</source> -+ <translation>Iris</translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="653"/> -+ <source>Face</source> -+ <translation>Gesichtserkennung</translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="655"/> -+ <source>VoicePrint</source> -+ <translation>Stimmenausdruck</translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="657"/> -+ <source>ukey</source> -+ <translation>Sicherheitsschlüssel</translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="659"/> -+ <source>QRCode</source> -+ <translation>QR-Code</translation> -+ </message> -+ <message> -+ <source>Wechat</source> -+ <translation type="vanished">微信</translation> -+ </message> -+</context> -+<context> -+ <name>BioDevicesWidget</name> -+ <message> -+ <location filename="../src/biodeviceswidget.ui" line="14"/> -+ <source>Form</source> -+ <translation></translation> -+ </message> -+ <message> -+ <source>Device types:</source> -+ <translation type="vanished">设备类型:</translation> -+ </message> -+ <message> -+ <source>Back</source> -+ <translation type="vanished">返回</translation> -+ </message> -+ <message> -+ <source>OK</source> -+ <translation type="vanished">确定</translation> -+ </message> -+ <message> -+ <source>FingerPrint</source> -+ <translation type="vanished">指纹</translation> -+ </message> -+</context> -+<context> -+ <name>LoginOptionsWidget</name> -+ <message> -+ <location filename="../src/loginoptionswidget.cpp" line="61"/> -+ <source>Login Options</source> -+ <translation>Anmeldeoptionen</translation> -+ </message> -+ <message> -+ <location filename="../src/loginoptionswidget.cpp" line="294"/> -+ <source>Password</source> -+ <translation>Passwort</translation> -+ </message> -+ <message> -+ <source>Wechat</source> -+ <translation type="vanished">微信</translation> -+ </message> -+ <message> -+ <source>Biometric</source> -+ <translation type="vanished">生物识别</translation> -+ </message> -+</context> -+<context> -+ <name>QObject</name> -+ <message> -+ <source>FingerPrint</source> -+ <translation type="vanished">指纹</translation> -+ </message> -+ <message> -+ <source>FingerVein</source> -+ <translation type="vanished">指静脉</translation> -+ </message> -+ <message> -+ <source>Iris</source> -+ <translation type="vanished">虹膜</translation> -+ </message> -+ <message> -+ <source>Face</source> -+ <translation type="vanished">人脸</translation> -+ </message> -+ <message> -+ <source>VoicePrint</source> -+ <translation type="vanished">声纹</translation> -+ </message> -+</context> -+</TS> -diff --git a/bioauth-bin/i18n_ts/es.ts b/bioauth-bin/i18n_ts/es.ts -index 17f03ca..03ba179 100644 ---- a/bioauth-bin/i18n_ts/es.ts -+++ b/bioauth-bin/i18n_ts/es.ts -@@ -2,113 +2,183 @@ - <!DOCTYPE TS> - <TS version="2.1" language="es"> - <context> -- <name>BioDevices</name> -+ <name>BioAuthWidget</name> - <message> -- <source>FingerPrint</source> -- <translation type="vanished">Huella dactilar</translation> -+ <location filename="../src/bioauthwidget.ui" line="14"/> -+ <source>Form</source> -+ <translation>Forma</translation> - </message> - <message> -- <source>FingerVein</source> -- <translation type="vanished">FingerVein</translation> -+ <source>More</source> -+ <translation type="vanished">更多</translation> - </message> - <message> -- <source>Iris</source> -- <translation type="vanished">Iris</translation> -+ <location filename="../src/bioauthwidget.ui" line="146"/> -+ <location filename="../src/bioauthwidget.cpp" line="41"/> -+ <source>Retry</source> -+ <translation>Reintentar</translation> - </message> - <message> -- <source>Face</source> -- <translation type="vanished">Cara</translation> -+ <source>Too many unsuccessful attempts,please enter password.</source> -+ <translation type="vanished">验证失败达最大次数,请使用密码解锁</translation> - </message> - <message> -- <source>VoicePrint</source> -- <translation type="vanished">Impresión de voz</translation> -+ <source>Bioauth authentication failed, you still have %1 verification opportunities</source> -+ <translation type="vanished">生物认证失败,您还有%1次尝试机会</translation> -+ </message> -+ <message> -+ <source>Password</source> -+ <translation>Contraseña</translation> -+ </message> -+ <message> -+ <source>Current Device: </source> -+ <translation type="vanished">当前设备:</translation> -+ </message> -+ <message> -+ <location filename="../src/bioauthwidget.cpp" line="96"/> -+ <location filename="../src/bioauthwidget.cpp" line="212"/> -+ <source>%1 too many unsuccessful attempts,please enter password.</source> -+ <translation>%1 Demasiados intentos fallidos, ingrese la contraseña.</translation> -+ </message> -+ <message> -+ <location filename="../src/bioauthwidget.cpp" line="102"/> -+ <source>%1 authentication failure,there are still %2 remaining opportunities</source> -+ <translation>%1 error de autenticación, todavía quedan %2 oportunidades</translation> -+ </message> -+ <message> -+ <location filename="../src/bioauthwidget.cpp" line="226"/> -+ <source>Please use wechat to scan the code</source> -+ <translation>Utilice wechat para escanear el código</translation> - </message> - </context> - <context> -- <name>QObject</name> -+ <name>BioDevices</name> -+ <message> -+ <location filename="../src/biodevices.cpp" line="78"/> -+ <source>Unplugging of %1 device detected</source> -+ <translation>Se ha detectado la desconexión del dispositivo %1</translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="88"/> -+ <source>%1 device insertion detected</source> -+ <translation>%1 inserción de dispositivo detectada</translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="97"/> -+ <source>ukui-biometric-manager</source> -+ <translation>ukui-gestor-biométrico</translation> -+ </message> - <message> -- <source>Try it again</source> -- <translation>Pruébalo otra vez</translation> -+ <location filename="../src/biodevices.cpp" line="100"/> -+ <source>biometric</source> -+ <translation>biométrico</translation> - </message> - <message> -- <source>Use other Devices</source> -- <translation>Usa otros dispositivos</translation> -+ <location filename="../src/biodevices.cpp" line="647"/> -+ <source>FingerPrint</source> -+ <translation>Huellas</translation> - </message> - <message> -- <source>Cancel</source> -- <translation>Cancelar</translation> -+ <location filename="../src/biodevices.cpp" line="649"/> -+ <source>FingerVein</source> -+ <translation>FingerVein</translation> - </message> - <message> -- <source>Choose the option</source> -- <translation>Elige la opción</translation> -+ <location filename="../src/biodevices.cpp" line="651"/> -+ <source>Iris</source> -+ <translation>Iris</translation> - </message> - <message> -- <source>Invaild response "</source> -- <translation>Respuesta interna</translation> -+ <location filename="../src/biodevices.cpp" line="653"/> -+ <source>Face</source> -+ <translation>Cara</translation> - </message> - <message> -- <source>AUTHENTICATION CANCELED</source> -- <translation>AUTENTIFICACIÓN CANCELADA</translation> -+ <location filename="../src/biodevices.cpp" line="655"/> -+ <source>VoicePrint</source> -+ <translation>Huella de voz</translation> - </message> - <message> -- <source>=== BIOMETRIC DEVICES ===</source> -- <translation>=== DISPOSITIVOS BIOMÉTRICOS ===</translation> -+ <location filename="../src/biodevices.cpp" line="657"/> -+ <source>ukey</source> -+ <translation>ukey</translation> - </message> - <message> -- <source>Choose the device</source> -- <translation>Elige el dispositivo</translation> -+ <location filename="../src/biodevices.cpp" line="659"/> -+ <source>QRCode</source> -+ <translation>QRCode</translation> - </message> - <message> -- <source>Sevice Name</source> -- <translation>Nombre del Servicio</translation> -+ <source>Wechat</source> -+ <translation type="vanished">微信</translation> - </message> -+</context> -+<context> -+ <name>BioDevicesWidget</name> - <message> -- <source>DISPLAY env</source> -- <translation>PANTALLA env</translation> -+ <location filename="../src/biodeviceswidget.ui" line="14"/> -+ <source>Form</source> -+ <translation>Forma</translation> - </message> - <message> -- <source>User</source> -- <translation>Usuario</translation> -+ <source>Device types:</source> -+ <translation type="vanished">设备类型:</translation> - </message> - <message> -- <source>Display debug information</source> -- <translation>Mostrar información de depuración</translation> -+ <source>Back</source> -+ <translation type="vanished">返回</translation> - </message> - <message> -- <source>Device short name</source> -- <translation>Nombre corto del dispositivo</translation> -+ <source>OK</source> -+ <translation type="vanished">确定</translation> - </message> - <message> -- <source>BIOMETRIC AUTHENTICATION</source> -- <translation>AUTENTICACIÓN BIOMÉTRICA</translation> -+ <source>FingerPrint</source> -+ <translation type="vanished">指纹</translation> - </message> -+</context> -+<context> -+ <name>LoginOptionsWidget</name> - <message> -- <source>Press Q or Esc to cancel</source> -- <translation>Presione Q o Esc para cancelar</translation> -+ <location filename="../src/loginoptionswidget.cpp" line="61"/> -+ <source>Login Options</source> -+ <translation>Opciones de inicio de sesión</translation> - </message> - <message> -- <source>AUTHENTICATION SUCCESS</source> -- <translation>ÉXITO DE LA AUTENTICACIÓN</translation> -+ <location filename="../src/loginoptionswidget.cpp" line="294"/> -+ <source>Password</source> -+ <translation>Contraseña</translation> - </message> - <message> -- <source>AUTHENTICATION FAILED</source> -- <translation>Falla la autenticacion</translation> -+ <source>Wechat</source> -+ <translation type="vanished">微信</translation> - </message> - <message> -- <source>BIOMETRIC AUTHENTICATION END</source> -- <translation>FINALIZACIÓN BIOMÉTRICA FINAL</translation> -+ <source>Biometric</source> -+ <translation type="vanished">生物识别</translation> - </message> -+</context> -+<context> -+ <name>QObject</name> - <message> -- <source>authentication will be canceld</source> -- <translation type="unfinished"></translation> -+ <source>FingerPrint</source> -+ <translation type="vanished">指纹</translation> - </message> - <message> -- <source>Failed to verify %1, you still have %2 verification opportunities</source> -- <translation type="unfinished"></translation> -+ <source>FingerVein</source> -+ <translation type="vanished">指静脉</translation> - </message> - <message> -- <source>Unable to verify %1, please enter password.</source> -- <translation type="unfinished"></translation> -+ <source>Iris</source> -+ <translation type="vanished">虹膜</translation> -+ </message> -+ <message> -+ <source>Face</source> -+ <translation type="vanished">人脸</translation> -+ </message> -+ <message> -+ <source>VoicePrint</source> -+ <translation type="vanished">声纹</translation> - </message> - </context> - </TS> -diff --git a/bioauth-bin/i18n_ts/fr.ts b/bioauth-bin/i18n_ts/fr.ts -index bb60fd2..8dbf86c 100644 ---- a/bioauth-bin/i18n_ts/fr.ts -+++ b/bioauth-bin/i18n_ts/fr.ts -@@ -2,113 +2,183 @@ - <!DOCTYPE TS> - <TS version="2.1" language="fr"> - <context> -- <name>BioDevices</name> -+ <name>BioAuthWidget</name> - <message> -- <source>FingerPrint</source> -- <translation type="vanished">Empreinte digitale</translation> -+ <location filename="../src/bioauthwidget.ui" line="14"/> -+ <source>Form</source> -+ <translation>Forme</translation> - </message> - <message> -- <source>FingerVein</source> -- <translation type="vanished">FingerVein</translation> -+ <source>More</source> -+ <translation type="vanished">更多</translation> - </message> - <message> -- <source>Iris</source> -- <translation type="vanished">Iris</translation> -+ <location filename="../src/bioauthwidget.ui" line="146"/> -+ <location filename="../src/bioauthwidget.cpp" line="41"/> -+ <source>Retry</source> -+ <translation>réessayer</translation> - </message> - <message> -- <source>Face</source> -- <translation type="vanished">Visage</translation> -+ <source>Too many unsuccessful attempts,please enter password.</source> -+ <translation type="vanished">验证失败达最大次数,请使用密码解锁</translation> - </message> - <message> -- <source>VoicePrint</source> -- <translation type="vanished">VoicePrint</translation> -+ <source>Bioauth authentication failed, you still have %1 verification opportunities</source> -+ <translation type="vanished">生物认证失败,您还有%1次尝试机会</translation> -+ </message> -+ <message> -+ <source>Password</source> -+ <translation>mot de passe</translation> -+ </message> -+ <message> -+ <source>Current Device: </source> -+ <translation type="vanished">当前设备:</translation> -+ </message> -+ <message> -+ <location filename="../src/bioauthwidget.cpp" line="96"/> -+ <location filename="../src/bioauthwidget.cpp" line="212"/> -+ <source>%1 too many unsuccessful attempts,please enter password.</source> -+ <translation>%1 Il y a trop de tentatives infructueuses, veuillez saisir votre mot de passe.</translation> -+ </message> -+ <message> -+ <location filename="../src/bioauthwidget.cpp" line="102"/> -+ <source>%1 authentication failure,there are still %2 remaining opportunities</source> -+ <translation>%1 authentification a échoué et il reste encore %2 chances</translation> -+ </message> -+ <message> -+ <location filename="../src/bioauthwidget.cpp" line="226"/> -+ <source>Please use wechat to scan the code</source> -+ <translation>Veuillez utiliser WeChat pour scanner le code</translation> - </message> - </context> - <context> -- <name>QObject</name> -+ <name>BioDevices</name> -+ <message> -+ <location filename="../src/biodevices.cpp" line="78"/> -+ <source>Unplugging of %1 device detected</source> -+ <translation>L’appareil %1 a été débranché</translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="88"/> -+ <source>%1 device insertion detected</source> -+ <translation>%1 périphérique branché détecté</translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="97"/> -+ <source>ukui-biometric-manager</source> -+ <translation>Outils de gestion biométrique</translation> -+ </message> - <message> -- <source>Try it again</source> -- <translation>Essayez à nouveau</translation> -+ <location filename="../src/biodevices.cpp" line="100"/> -+ <source>biometric</source> -+ <translation>Caractéristiques biologiques</translation> - </message> - <message> -- <source>Use other Devices</source> -- <translation>Utiliser d'autres appareils</translation> -+ <location filename="../src/biodevices.cpp" line="647"/> -+ <source>FingerPrint</source> -+ <translation>empreinte digitale</translation> - </message> - <message> -- <source>Cancel</source> -- <translation>Annuler</translation> -+ <location filename="../src/biodevices.cpp" line="649"/> -+ <source>FingerVein</source> -+ <translation>Veines des doigts</translation> - </message> - <message> -- <source>Choose the option</source> -- <translation>Choisissez l'option</translation> -+ <location filename="../src/biodevices.cpp" line="651"/> -+ <source>Iris</source> -+ <translation>iris</translation> - </message> - <message> -- <source>Invaild response "</source> -- <translation>Réponse Invaild \ "</translation> -+ <location filename="../src/biodevices.cpp" line="653"/> -+ <source>Face</source> -+ <translation>Reconnaissance faciale</translation> - </message> - <message> -- <source>AUTHENTICATION CANCELED</source> -- <translation>AUTHENTIFICATION ANNULEE</translation> -+ <location filename="../src/biodevices.cpp" line="655"/> -+ <source>VoicePrint</source> -+ <translation>Voiceprint</translation> - </message> - <message> -- <source>=== BIOMETRIC DEVICES ===</source> -- <translation>=== DISPOSITIFS BIOMETRIQUES ===</translation> -+ <location filename="../src/biodevices.cpp" line="657"/> -+ <source>ukey</source> -+ <translation>Clés de sécurité</translation> - </message> - <message> -- <source>Choose the device</source> -- <translation>Choisissez l'appareil</translation> -+ <location filename="../src/biodevices.cpp" line="659"/> -+ <source>QRCode</source> -+ <translation>Code QR</translation> - </message> - <message> -- <source>Sevice Name</source> -- <translation>Nom de Sevice</translation> -+ <source>Wechat</source> -+ <translation type="vanished">微信</translation> - </message> -+</context> -+<context> -+ <name>BioDevicesWidget</name> - <message> -- <source>DISPLAY env</source> -- <translation>AFFICHER env</translation> -+ <location filename="../src/biodeviceswidget.ui" line="14"/> -+ <source>Form</source> -+ <translation>Forme</translation> - </message> - <message> -- <source>User</source> -- <translation>Utilisateur</translation> -+ <source>Device types:</source> -+ <translation type="vanished">设备类型:</translation> - </message> - <message> -- <source>Display debug information</source> -- <translation>Afficher les informations de débogage</translation> -+ <source>Back</source> -+ <translation type="vanished">返回</translation> - </message> - <message> -- <source>Device short name</source> -- <translation>Nom abrégé de l'appareil</translation> -+ <source>OK</source> -+ <translation type="vanished">确定</translation> - </message> - <message> -- <source>BIOMETRIC AUTHENTICATION</source> -- <translation>AUTHENTIFICATION BIOMETRIQUE</translation> -+ <source>FingerPrint</source> -+ <translation type="vanished">指纹</translation> - </message> -+</context> -+<context> -+ <name>LoginOptionsWidget</name> - <message> -- <source>Press Q or Esc to cancel</source> -- <translation>Appuyez sur Q ou Echap pour annuler</translation> -+ <location filename="../src/loginoptionswidget.cpp" line="61"/> -+ <source>Login Options</source> -+ <translation>Options de connexion</translation> - </message> - <message> -- <source>AUTHENTICATION SUCCESS</source> -- <translation>SUCCÈS D'AUTHENTIFICATION</translation> -+ <location filename="../src/loginoptionswidget.cpp" line="294"/> -+ <source>Password</source> -+ <translation>mot de passe</translation> - </message> - <message> -- <source>AUTHENTICATION FAILED</source> -- <translation>AUTHENTIFICATION ÉCHOUÉE</translation> -+ <source>Wechat</source> -+ <translation type="vanished">微信</translation> - </message> - <message> -- <source>BIOMETRIC AUTHENTICATION END</source> -- <translation>FIN DE L'AUTHENTIFICATION BIOMÉTRIQUE</translation> -+ <source>Biometric</source> -+ <translation type="vanished">生物识别</translation> - </message> -+</context> -+<context> -+ <name>QObject</name> - <message> -- <source>authentication will be canceld</source> -- <translation type="unfinished"></translation> -+ <source>FingerPrint</source> -+ <translation type="vanished">指纹</translation> - </message> - <message> -- <source>Failed to verify %1, you still have %2 verification opportunities</source> -- <translation type="unfinished"></translation> -+ <source>FingerVein</source> -+ <translation type="vanished">指静脉</translation> - </message> - <message> -- <source>Unable to verify %1, please enter password.</source> -- <translation type="unfinished"></translation> -+ <source>Iris</source> -+ <translation type="vanished">虹膜</translation> -+ </message> -+ <message> -+ <source>Face</source> -+ <translation type="vanished">人脸</translation> -+ </message> -+ <message> -+ <source>VoicePrint</source> -+ <translation type="vanished">声纹</translation> - </message> - </context> - </TS> -diff --git a/bioauth-bin/i18n_ts/kk.ts b/bioauth-bin/i18n_ts/kk.ts -new file mode 100644 -index 0000000..ad57405 ---- /dev/null -+++ b/bioauth-bin/i18n_ts/kk.ts -@@ -0,0 +1,184 @@ -+<?xml version="1.0" encoding="utf-8"?> -+<!DOCTYPE TS> -+<TS version="2.1" language="kk"> -+<context> -+ <name>BioAuthWidget</name> -+ <message> -+ <location filename="../src/bioauthwidget.ui" line="14"/> -+ <source>Form</source> -+ <translation>Пішін</translation> -+ </message> -+ <message> -+ <source>More</source> -+ <translation type="vanished">更多</translation> -+ </message> -+ <message> -+ <location filename="../src/bioauthwidget.ui" line="146"/> -+ <location filename="../src/bioauthwidget.cpp" line="41"/> -+ <source>Retry</source> -+ <translation>ретри</translation> -+ </message> -+ <message> -+ <source>Too many unsuccessful attempts,please enter password.</source> -+ <translation type="vanished">验证失败达最大次数,请使用密码解锁</translation> -+ </message> -+ <message> -+ <source>Bioauth authentication failed, you still have %1 verification opportunities</source> -+ <translation type="vanished">生物认证失败,您还有%1次尝试机会</translation> -+ </message> -+ <message> -+ <source>Password</source> -+ <translation>құпиясөз</translation> -+ </message> -+ <message> -+ <source>Current Device: </source> -+ <translation type="vanished">当前设备:</translation> -+ </message> -+ <message> -+ <location filename="../src/bioauthwidget.cpp" line="96"/> -+ <location filename="../src/bioauthwidget.cpp" line="212"/> -+ <source>%1 too many unsuccessful attempts,please enter password.</source> -+ <translation>% 1 Қате әрекеттер тым көп, құпия сөзіңізді енгізіңіз.</translation> -+ </message> -+ <message> -+ <location filename="../src/bioauthwidget.cpp" line="102"/> -+ <source>%1 authentication failure,there are still %2 remaining opportunities</source> -+ <translation>% 1 аутентификациясы жаңылысқан және әлі де% 2 мүмкіндігі бар</translation> -+ </message> -+ <message> -+ <location filename="../src/bioauthwidget.cpp" line="226"/> -+ <source>Please use wechat to scan the code</source> -+ <translation>Кодты сканерлеу үшін WeChat пайдалануыңызды сұраймын</translation> -+ </message> -+</context> -+<context> -+ <name>BioDevices</name> -+ <message> -+ <location filename="../src/biodevices.cpp" line="78"/> -+ <source>Unplugging of %1 device detected</source> -+ <translation>% 1 құрылғы ажыратылды</translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="88"/> -+ <source>%1 device insertion detected</source> -+ <translation>% 1 құрылғы анықталды</translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="97"/> -+ <source>ukui-biometric-manager</source> -+ <translation>Биометриялық басқару құралдары</translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="100"/> -+ <source>biometric</source> -+ <translation>Биологиялық сипаттамалары</translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="647"/> -+ <source>FingerPrint</source> -+ <translation>саусақ ізі</translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="649"/> -+ <source>FingerVein</source> -+ <translation>Саусақ көктамырлары</translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="651"/> -+ <source>Iris</source> -+ <translation>ирис</translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="653"/> -+ <source>Face</source> -+ <translation>Бет тану</translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="655"/> -+ <source>VoicePrint</source> -+ <translation>Дауыстық із</translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="657"/> -+ <source>ukey</source> -+ <translation>Қауіпсіздік кілттері</translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="659"/> -+ <source>QRCode</source> -+ <translation>QR коды</translation> -+ </message> -+ <message> -+ <source>Wechat</source> -+ <translation type="vanished">微信</translation> -+ </message> -+</context> -+<context> -+ <name>BioDevicesWidget</name> -+ <message> -+ <location filename="../src/biodeviceswidget.ui" line="14"/> -+ <source>Form</source> -+ <translation>Пішін</translation> -+ </message> -+ <message> -+ <source>Device types:</source> -+ <translation type="vanished">设备类型:</translation> -+ </message> -+ <message> -+ <source>Back</source> -+ <translation type="vanished">返回</translation> -+ </message> -+ <message> -+ <source>OK</source> -+ <translation type="vanished">确定</translation> -+ </message> -+ <message> -+ <source>FingerPrint</source> -+ <translation type="vanished">指纹</translation> -+ </message> -+</context> -+<context> -+ <name>LoginOptionsWidget</name> -+ <message> -+ <location filename="../src/loginoptionswidget.cpp" line="61"/> -+ <source>Login Options</source> -+ <translation>Кіру параметрлері</translation> -+ </message> -+ <message> -+ <location filename="../src/loginoptionswidget.cpp" line="294"/> -+ <source>Password</source> -+ <translation>құпиясөз</translation> -+ </message> -+ <message> -+ <source>Wechat</source> -+ <translation type="vanished">微信</translation> -+ </message> -+ <message> -+ <source>Biometric</source> -+ <translation type="vanished">生物识别</translation> -+ </message> -+</context> -+<context> -+ <name>QObject</name> -+ <message> -+ <source>FingerPrint</source> -+ <translation type="vanished">指纹</translation> -+ </message> -+ <message> -+ <source>FingerVein</source> -+ <translation type="vanished">指静脉</translation> -+ </message> -+ <message> -+ <source>Iris</source> -+ <translation type="vanished">虹膜</translation> -+ </message> -+ <message> -+ <source>Face</source> -+ <translation type="vanished">人脸</translation> -+ </message> -+ <message> -+ <source>VoicePrint</source> -+ <translation type="vanished">声纹</translation> -+ </message> -+</context> -+</TS> -diff --git a/bioauth-bin/i18n_ts/ky.ts b/bioauth-bin/i18n_ts/ky.ts -new file mode 100644 -index 0000000..e9a3f13 ---- /dev/null -+++ b/bioauth-bin/i18n_ts/ky.ts -@@ -0,0 +1,184 @@ -+<?xml version="1.0" encoding="utf-8"?> -+<!DOCTYPE TS> -+<TS version="2.1" language="ky"> -+<context> -+ <name>BioAuthWidget</name> -+ <message> -+ <location filename="../src/bioauthwidget.ui" line="14"/> -+ <source>Form</source> -+ <translation></translation> -+ </message> -+ <message> -+ <source>More</source> -+ <translation type="vanished">更多</translation> -+ </message> -+ <message> -+ <location filename="../src/bioauthwidget.ui" line="146"/> -+ <location filename="../src/bioauthwidget.cpp" line="41"/> -+ <source>Retry</source> -+ <translation>Ретри</translation> -+ </message> -+ <message> -+ <source>Too many unsuccessful attempts,please enter password.</source> -+ <translation type="vanished">验证失败达最大次数,请使用密码解锁</translation> -+ </message> -+ <message> -+ <source>Bioauth authentication failed, you still have %1 verification opportunities</source> -+ <translation type="vanished">生物认证失败,您还有%1次尝试机会</translation> -+ </message> -+ <message> -+ <source>Password</source> -+ <translation>Сырсөз</translation> -+ </message> -+ <message> -+ <source>Current Device: </source> -+ <translation type="vanished">当前设备:</translation> -+ </message> -+ <message> -+ <location filename="../src/bioauthwidget.cpp" line="96"/> -+ <location filename="../src/bioauthwidget.cpp" line="212"/> -+ <source>%1 too many unsuccessful attempts,please enter password.</source> -+ <translation>%1 өтө көп ийгиликсиз аракеттер,, сураныч, сырсөз киргизүү.</translation> -+ </message> -+ <message> -+ <location filename="../src/bioauthwidget.cpp" line="102"/> -+ <source>%1 authentication failure,there are still %2 remaining opportunities</source> -+ <translation>%1 аутентификациялык жетишсиздик,дагы эле %2 калган мүмкүнчүлүктөр бар</translation> -+ </message> -+ <message> -+ <location filename="../src/bioauthwidget.cpp" line="226"/> -+ <source>Please use wechat to scan the code</source> -+ <translation>Кодду сканерлеу үчүн вечат колдонуңуз</translation> -+ </message> -+</context> -+<context> -+ <name>BioDevices</name> -+ <message> -+ <location filename="../src/biodevices.cpp" line="78"/> -+ <source>Unplugging of %1 device detected</source> -+ <translation>%1 орнотмосунун өчүрүлүшү аныкталды</translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="88"/> -+ <source>%1 device insertion detected</source> -+ <translation>%1 түзмөк орнотмосу аныкталды</translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="97"/> -+ <source>ukui-biometric-manager</source> -+ <translation>укуи-биометриялык-менеджери</translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="100"/> -+ <source>biometric</source> -+ <translation>биометрия</translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="647"/> -+ <source>FingerPrint</source> -+ <translation>Манжа изи</translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="649"/> -+ <source>FingerVein</source> -+ <translation>Манжавейн</translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="651"/> -+ <source>Iris</source> -+ <translation>Ирис</translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="653"/> -+ <source>Face</source> -+ <translation>Бет</translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="655"/> -+ <source>VoicePrint</source> -+ <translation>VoicePrint</translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="657"/> -+ <source>ukey</source> -+ <translation>уики</translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="659"/> -+ <source>QRCode</source> -+ <translation>QRCode</translation> -+ </message> -+ <message> -+ <source>Wechat</source> -+ <translation type="vanished">微信</translation> -+ </message> -+</context> -+<context> -+ <name>BioDevicesWidget</name> -+ <message> -+ <location filename="../src/biodeviceswidget.ui" line="14"/> -+ <source>Form</source> -+ <translation></translation> -+ </message> -+ <message> -+ <source>Device types:</source> -+ <translation type="vanished">设备类型:</translation> -+ </message> -+ <message> -+ <source>Back</source> -+ <translation type="vanished">返回</translation> -+ </message> -+ <message> -+ <source>OK</source> -+ <translation type="vanished">确定</translation> -+ </message> -+ <message> -+ <source>FingerPrint</source> -+ <translation type="vanished">指纹</translation> -+ </message> -+</context> -+<context> -+ <name>LoginOptionsWidget</name> -+ <message> -+ <location filename="../src/loginoptionswidget.cpp" line="61"/> -+ <source>Login Options</source> -+ <translation>Кирүү параметрлери</translation> -+ </message> -+ <message> -+ <location filename="../src/loginoptionswidget.cpp" line="294"/> -+ <source>Password</source> -+ <translation>Сырсөз</translation> -+ </message> -+ <message> -+ <source>Wechat</source> -+ <translation type="vanished">微信</translation> -+ </message> -+ <message> -+ <source>Biometric</source> -+ <translation type="vanished">生物识别</translation> -+ </message> -+</context> -+<context> -+ <name>QObject</name> -+ <message> -+ <source>FingerPrint</source> -+ <translation type="vanished">指纹</translation> -+ </message> -+ <message> -+ <source>FingerVein</source> -+ <translation type="vanished">指静脉</translation> -+ </message> -+ <message> -+ <source>Iris</source> -+ <translation type="vanished">虹膜</translation> -+ </message> -+ <message> -+ <source>Face</source> -+ <translation type="vanished">人脸</translation> -+ </message> -+ <message> -+ <source>VoicePrint</source> -+ <translation type="vanished">声纹</translation> -+ </message> -+</context> -+</TS> -diff --git a/bioauth-bin/i18n_ts/mn.ts b/bioauth-bin/i18n_ts/mn.ts -new file mode 100644 -index 0000000..b96b503 ---- /dev/null -+++ b/bioauth-bin/i18n_ts/mn.ts -@@ -0,0 +1,184 @@ -+<?xml version="1.0" encoding="utf-8"?> -+<!DOCTYPE TS> -+<TS version="2.1" language="mn"> -+<context> -+ <name>BioAuthWidget</name> -+ <message> -+ <location filename="../src/bioauthwidget.ui" line="14"/> -+ <source>Form</source> -+ <translation></translation> -+ </message> -+ <message> -+ <source>More</source> -+ <translation type="vanished">更多</translation> -+ </message> -+ <message> -+ <location filename="../src/bioauthwidget.ui" line="146"/> -+ <location filename="../src/bioauthwidget.cpp" line="41"/> -+ <source>Retry</source> -+ <translation>ᠳᠠᠬᠢᠨ ᠲᠤᠷᠰᠢᠬᠤ</translation> -+ </message> -+ <message> -+ <source>Too many unsuccessful attempts,please enter password.</source> -+ <translation type="vanished">验证失败达最大次数,请使用密码解锁</translation> -+ </message> -+ <message> -+ <source>Bioauth authentication failed, you still have %1 verification opportunities</source> -+ <translation type="vanished">生物认证失败,您还有%1次尝试机会</translation> -+ </message> -+ <message> -+ <source>Password</source> -+ <translation>ᠨᠢᠭᠤᠴᠠ ᠺᠣᠳ᠋</translation> -+ </message> -+ <message> -+ <source>Current Device: </source> -+ <translation type="vanished">当前设备:</translation> -+ </message> -+ <message> -+ <location filename="../src/bioauthwidget.cpp" line="96"/> -+ <location filename="../src/bioauthwidget.cpp" line="212"/> -+ <source>%1 too many unsuccessful attempts,please enter password.</source> -+ <translation>%1 ᠢᠯᠠᠭᠳᠠᠭᠰᠠᠨ ᠲᠤᠷᠰᠢᠬᠤ ᠤᠳᠠᠭᠠ ᠲᠣᠭᠠ ᠬᠡᠳᠦ ᠣᠯᠠᠨ ᠂ ᠨᠢᠭᠤᠴᠠ ᠺᠣᠳ᠋ ᠣᠷᠣᠭᠤᠯᠤᠭᠠᠷᠠᠢ ᠃</translation> -+ </message> -+ <message> -+ <location filename="../src/bioauthwidget.cpp" line="102"/> -+ <source>%1 authentication failure,there are still %2 remaining opportunities</source> -+ <translation>%1 ᠪᠡᠶᠡᠶ᠋ᠢᠨ ᠬᠢᠷᠢᠶ᠋ᠢᠨ ᠰᠢᠯᠭᠠᠨ ᠪᠠᠲᠤᠯᠠᠯᠲᠠ ᠢᠯᠠᠭᠳᠠᠪᠠ ᠂ ᠮᠥᠨ %2 ᠦᠯᠡᠳᠡᠬᠦ ᠲᠣᠬᠢᠶᠠᠯ ᠪᠣᠢ</translation> -+ </message> -+ <message> -+ <location filename="../src/bioauthwidget.cpp" line="226"/> -+ <source>Please use wechat to scan the code</source> -+ <translation>ᠸᠢᠴᠠᠲᠢ᠋ᠶ᠋ᠠᠷ ᠦᠰᠦᠭ ᠰᠢᠷᠪᠢᠬᠦ ᠪᠣᠯᠪᠠᠤ</translation> -+ </message> -+</context> -+<context> -+ <name>BioDevices</name> -+ <message> -+ <location filename="../src/biodevices.cpp" line="78"/> -+ <source>Unplugging of %1 device detected</source> -+ <translation>%1 ᠲᠥᠬᠥᠭᠡᠷᠦᠮᠵᠢᠶ᠋ᠢ ᠰᠤᠭᠤᠯᠵᠤ ᠭᠠᠷᠭᠠᠨ ᠠ</translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="88"/> -+ <source>%1 device insertion detected</source> -+ <translation>%1 ᠲᠥᠬᠥᠭᠡᠷᠦᠮᠵᠢ ᠬᠠᠪᠴᠢᠭᠤᠯᠤᠭᠰᠠᠨᠢ᠋ ᠪᠠᠢᠴᠠᠭᠠᠨ ᠣᠯᠪᠠ</translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="97"/> -+ <source>ukui-biometric-manager</source> -+ <translation>ᠠᠮᠢᠳᠤ ᠪᠣᠳᠠᠰᠤ᠋ᠨ ᠣᠨᠴᠠᠯᠢᠭ ᠬᠠᠮᠢᠶᠠᠷᠤᠯᠲᠠᠶ᠋ᠢᠨ ᠪᠠᠭᠠᠵᠢ</translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="100"/> -+ <source>biometric</source> -+ <translation>ᠠᠮᠢᠳᠤ ᠪᠣᠳᠠᠰᠤ᠋ᠨ ᠣᠨᠴᠠᠯᠢᠭ</translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="647"/> -+ <source>FingerPrint</source> -+ <translation>ᠬᠤᠷᠤᠭᠤᠨ ᠬᠡ</translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="649"/> -+ <source>FingerVein</source> -+ <translation>ᠬᠤᠷᠤᠭᠤᠨ ᠨᠠᠮᠵᠢᠭᠤᠨ ᠰᠤᠳᠠᠰᠤ</translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="651"/> -+ <source>Iris</source> -+ <translation>ᠰᠣᠯᠣᠩᠭᠠ ᠪᠦᠷᠬᠦᠭᠦᠯ</translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="653"/> -+ <source>Face</source> -+ <translation>ᠬᠥᠮᠦᠨᠦ᠌ ᠨᠢᠭᠤᠷ ᠲᠠᠨᠢᠬᠤ</translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="655"/> -+ <source>VoicePrint</source> -+ <translation>ᠳᠠᠭᠤᠨ ᠡᠷᠢᠶᠡᠨ</translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="657"/> -+ <source>ukey</source> -+ <translation>ᠠᠶᠤᠯᠭᠦᠢ ᠨᠢᠭᠤᠴᠠ ᠲᠦᠯᠬᠢᠭᠦᠷ</translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="659"/> -+ <source>QRCode</source> -+ <translation>ᠬᠣᠶᠠᠷ ᠬᠡᠮᠵᠢᠯᠲᠦ ᠺᠣᠳ᠋</translation> -+ </message> -+ <message> -+ <source>Wechat</source> -+ <translation type="vanished">微信</translation> -+ </message> -+</context> -+<context> -+ <name>BioDevicesWidget</name> -+ <message> -+ <location filename="../src/biodeviceswidget.ui" line="14"/> -+ <source>Form</source> -+ <translation></translation> -+ </message> -+ <message> -+ <source>Device types:</source> -+ <translation type="vanished">设备类型:</translation> -+ </message> -+ <message> -+ <source>Back</source> -+ <translation type="vanished">返回</translation> -+ </message> -+ <message> -+ <source>OK</source> -+ <translation type="vanished">确定</translation> -+ </message> -+ <message> -+ <source>FingerPrint</source> -+ <translation type="vanished">指纹</translation> -+ </message> -+</context> -+<context> -+ <name>LoginOptionsWidget</name> -+ <message> -+ <location filename="../src/loginoptionswidget.cpp" line="61"/> -+ <source>Login Options</source> -+ <translation>ᠲᠡᠮᠳᠡᠭᠯᠡᠬᠦ ᠰᠤᠩᠭᠤᠭᠳᠠᠬᠤᠨ</translation> -+ </message> -+ <message> -+ <location filename="../src/loginoptionswidget.cpp" line="294"/> -+ <source>Password</source> -+ <translation>ᠨᠢᠭᠤᠴᠠ ᠺᠣᠳ᠋</translation> -+ </message> -+ <message> -+ <source>Wechat</source> -+ <translation type="vanished">微信</translation> -+ </message> -+ <message> -+ <source>Biometric</source> -+ <translation type="vanished">生物识别</translation> -+ </message> -+</context> -+<context> -+ <name>QObject</name> -+ <message> -+ <source>FingerPrint</source> -+ <translation type="vanished">指纹</translation> -+ </message> -+ <message> -+ <source>FingerVein</source> -+ <translation type="vanished">指静脉</translation> -+ </message> -+ <message> -+ <source>Iris</source> -+ <translation type="vanished">虹膜</translation> -+ </message> -+ <message> -+ <source>Face</source> -+ <translation type="vanished">人脸</translation> -+ </message> -+ <message> -+ <source>VoicePrint</source> -+ <translation type="vanished">声纹</translation> -+ </message> -+</context> -+</TS> -diff --git a/bioauth-bin/i18n_ts/ug.ts b/bioauth-bin/i18n_ts/ug.ts -new file mode 100644 -index 0000000..99e8e3f ---- /dev/null -+++ b/bioauth-bin/i18n_ts/ug.ts -@@ -0,0 +1,184 @@ -+<?xml version="1.0" encoding="utf-8"?> -+<!DOCTYPE TS> -+<TS version="2.1" language="ug"> -+<context> -+ <name>BioAuthWidget</name> -+ <message> -+ <location filename="../src/bioauthwidget.ui" line="14"/> -+ <source>Form</source> -+ <translation></translation> -+ </message> -+ <message> -+ <source>More</source> -+ <translation type="vanished">更多</translation> -+ </message> -+ <message> -+ <location filename="../src/bioauthwidget.ui" line="146"/> -+ <location filename="../src/bioauthwidget.cpp" line="41"/> -+ <source>Retry</source> -+ <translation>قايتا سىناپ بىقىڭ</translation> -+ </message> -+ <message> -+ <source>Too many unsuccessful attempts,please enter password.</source> -+ <translation type="vanished">验证失败达最大次数,请使用密码解锁</translation> -+ </message> -+ <message> -+ <source>Bioauth authentication failed, you still have %1 verification opportunities</source> -+ <translation type="vanished">生物认证失败,您还有%1次尝试机会</translation> -+ </message> -+ <message> -+ <source>Password</source> -+ <translation>مەخپىي نومۇر</translation> -+ </message> -+ <message> -+ <source>Current Device: </source> -+ <translation type="vanished">当前设备:</translation> -+ </message> -+ <message> -+ <location filename="../src/bioauthwidget.cpp" line="96"/> -+ <location filename="../src/bioauthwidget.cpp" line="212"/> -+ <source>%1 too many unsuccessful attempts,please enter password.</source> -+ <translation>1-نومۇر مەغلۇپ بولغان سىناق قېتىم سانى زىيادە كۆپ، مەخپىي نومۇرنى كىرگۈزۈڭ</translation> -+ </message> -+ <message> -+ <location filename="../src/bioauthwidget.cpp" line="102"/> -+ <source>%1 authentication failure,there are still %2 remaining opportunities</source> -+ <translation>بىر كىملىك دەلىللەش مەغلۇپ بولدى، يەنىلا ٪2 ئېشىپ قالغان پۇرسەت بار</translation> -+ </message> -+ <message> -+ <location filename="../src/bioauthwidget.cpp" line="226"/> -+ <source>Please use wechat to scan the code</source> -+ <translation>ئۈندىداردا كود سۈپۈرۈڭ</translation> -+ </message> -+</context> -+<context> -+ <name>BioDevices</name> -+ <message> -+ <location filename="../src/biodevices.cpp" line="78"/> -+ <source>Unplugging of %1 device detected</source> -+ <translation>تەكشۈرۈپ بايقىغان 1 ئۈسكۈنىنى تارتىپ چىقارماق</translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="88"/> -+ <source>%1 device insertion detected</source> -+ <translation>٪1 ئۈسكۈنىنىڭ كىرگۈزۈلگەنلىكىنى تەكشۈرۈپ چىقماق</translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="97"/> -+ <source>ukui-biometric-manager</source> -+ <translation>بىئولوگىيەلىك ئالاھىدىلىك باشقۇرۇش قورالى</translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="100"/> -+ <source>biometric</source> -+ <translation>بىئولوگىيەلىك ئالاھىدىلىك</translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="647"/> -+ <source>FingerPrint</source> -+ <translation>بارماق ئىزى</translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="649"/> -+ <source>FingerVein</source> -+ <translation>ۋېنانى كۆرسىتىدۇ</translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="651"/> -+ <source>Iris</source> -+ <translation>رەڭدار پەردە</translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="653"/> -+ <source>Face</source> -+ <translation>ئادەم يۈزىنى پەرقلەندۈرۈش</translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="655"/> -+ <source>VoicePrint</source> -+ <translation>ئاۋاز سىزىقى</translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="657"/> -+ <source>ukey</source> -+ <translation>بىخەتەر ئاچقۇچ</translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="659"/> -+ <source>QRCode</source> -+ <translation>ئىككى ئۆلچەملىك كود</translation> -+ </message> -+ <message> -+ <source>Wechat</source> -+ <translation type="vanished">微信</translation> -+ </message> -+</context> -+<context> -+ <name>BioDevicesWidget</name> -+ <message> -+ <location filename="../src/biodeviceswidget.ui" line="14"/> -+ <source>Form</source> -+ <translation></translation> -+ </message> -+ <message> -+ <source>Device types:</source> -+ <translation type="vanished">设备类型:</translation> -+ </message> -+ <message> -+ <source>Back</source> -+ <translation type="vanished">返回</translation> -+ </message> -+ <message> -+ <source>OK</source> -+ <translation type="vanished">确定</translation> -+ </message> -+ <message> -+ <source>FingerPrint</source> -+ <translation type="vanished">指纹</translation> -+ </message> -+</context> -+<context> -+ <name>LoginOptionsWidget</name> -+ <message> -+ <location filename="../src/loginoptionswidget.cpp" line="61"/> -+ <source>Login Options</source> -+ <translation>تاللاش تۈرىگە كىرمەك</translation> -+ </message> -+ <message> -+ <location filename="../src/loginoptionswidget.cpp" line="294"/> -+ <source>Password</source> -+ <translation>مەخپىي نومۇر</translation> -+ </message> -+ <message> -+ <source>Wechat</source> -+ <translation type="vanished">微信</translation> -+ </message> -+ <message> -+ <source>Biometric</source> -+ <translation type="vanished">生物识别</translation> -+ </message> -+</context> -+<context> -+ <name>QObject</name> -+ <message> -+ <source>FingerPrint</source> -+ <translation type="vanished">指纹</translation> -+ </message> -+ <message> -+ <source>FingerVein</source> -+ <translation type="vanished">指静脉</translation> -+ </message> -+ <message> -+ <source>Iris</source> -+ <translation type="vanished">虹膜</translation> -+ </message> -+ <message> -+ <source>Face</source> -+ <translation type="vanished">人脸</translation> -+ </message> -+ <message> -+ <source>VoicePrint</source> -+ <translation type="vanished">声纹</translation> -+ </message> -+</context> -+</TS> -diff --git a/bioauth-bin/i18n_ts/zh_HK.ts b/bioauth-bin/i18n_ts/zh_HK.ts -new file mode 100644 -index 0000000..d71eed9 ---- /dev/null -+++ b/bioauth-bin/i18n_ts/zh_HK.ts -@@ -0,0 +1,184 @@ -+<?xml version="1.0" encoding="utf-8"?> -+<!DOCTYPE TS> -+<TS version="2.1" language="zh_Hant"> -+<context> -+ <name>BioAuthWidget</name> -+ <message> -+ <location filename="../src/bioauthwidget.ui" line="14"/> -+ <source>Form</source> -+ <translation></translation> -+ </message> -+ <message> -+ <source>More</source> -+ <translation type="vanished">更多</translation> -+ </message> -+ <message> -+ <location filename="../src/bioauthwidget.ui" line="146"/> -+ <location filename="../src/bioauthwidget.cpp" line="41"/> -+ <source>Retry</source> -+ <translation>重試</translation> -+ </message> -+ <message> -+ <source>Too many unsuccessful attempts,please enter password.</source> -+ <translation type="vanished">验证失败达最大次数,请使用密码解锁</translation> -+ </message> -+ <message> -+ <source>Bioauth authentication failed, you still have %1 verification opportunities</source> -+ <translation type="vanished">生物认证失败,您还有%1次尝试机会</translation> -+ </message> -+ <message> -+ <source>Password</source> -+ <translation>密碼</translation> -+ </message> -+ <message> -+ <source>Current Device: </source> -+ <translation type="vanished">当前设备:</translation> -+ </message> -+ <message> -+ <location filename="../src/bioauthwidget.cpp" line="96"/> -+ <location filename="../src/bioauthwidget.cpp" line="212"/> -+ <source>%1 too many unsuccessful attempts,please enter password.</source> -+ <translation>%1失敗的嘗試次數太多,請輸入密碼</translation> -+ </message> -+ <message> -+ <location filename="../src/bioauthwidget.cpp" line="102"/> -+ <source>%1 authentication failure,there are still %2 remaining opportunities</source> -+ <translation>%1 身份驗證失敗,仍有 %2 個剩餘機會</translation> -+ </message> -+ <message> -+ <location filename="../src/bioauthwidget.cpp" line="226"/> -+ <source>Please use wechat to scan the code</source> -+ <translation>請使用微信掃碼</translation> -+ </message> -+</context> -+<context> -+ <name>BioDevices</name> -+ <message> -+ <location filename="../src/biodevices.cpp" line="78"/> -+ <source>Unplugging of %1 device detected</source> -+ <translation>檢測到 %1 設備的拔出</translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="88"/> -+ <source>%1 device insertion detected</source> -+ <translation>檢測到 %1 個設備插入</translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="97"/> -+ <source>ukui-biometric-manager</source> -+ <translation>生物特徵管理工具</translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="100"/> -+ <source>biometric</source> -+ <translation>生物特徵管理工具</translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="647"/> -+ <source>FingerPrint</source> -+ <translation>指紋</translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="649"/> -+ <source>FingerVein</source> -+ <translation>指靜脈</translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="651"/> -+ <source>Iris</source> -+ <translation>虹膜</translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="653"/> -+ <source>Face</source> -+ <translation>人臉</translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="655"/> -+ <source>VoicePrint</source> -+ <translation>聲紋</translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="657"/> -+ <source>ukey</source> -+ <translation>安全金鑰</translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="659"/> -+ <source>QRCode</source> -+ <translation>微信掃碼</translation> -+ </message> -+ <message> -+ <source>Wechat</source> -+ <translation type="vanished">微信</translation> -+ </message> -+</context> -+<context> -+ <name>BioDevicesWidget</name> -+ <message> -+ <location filename="../src/biodeviceswidget.ui" line="14"/> -+ <source>Form</source> -+ <translation></translation> -+ </message> -+ <message> -+ <source>Device types:</source> -+ <translation type="vanished">设备类型:</translation> -+ </message> -+ <message> -+ <source>Back</source> -+ <translation type="vanished">返回</translation> -+ </message> -+ <message> -+ <source>OK</source> -+ <translation type="vanished">确定</translation> -+ </message> -+ <message> -+ <source>FingerPrint</source> -+ <translation type="vanished">指纹</translation> -+ </message> -+</context> -+<context> -+ <name>LoginOptionsWidget</name> -+ <message> -+ <location filename="../src/loginoptionswidget.cpp" line="61"/> -+ <source>Login Options</source> -+ <translation>登錄選項</translation> -+ </message> -+ <message> -+ <location filename="../src/loginoptionswidget.cpp" line="294"/> -+ <source>Password</source> -+ <translation>密碼</translation> -+ </message> -+ <message> -+ <source>Wechat</source> -+ <translation type="vanished">微信</translation> -+ </message> -+ <message> -+ <source>Biometric</source> -+ <translation type="vanished">生物识别</translation> -+ </message> -+</context> -+<context> -+ <name>QObject</name> -+ <message> -+ <source>FingerPrint</source> -+ <translation type="vanished">指纹</translation> -+ </message> -+ <message> -+ <source>FingerVein</source> -+ <translation type="vanished">指静脉</translation> -+ </message> -+ <message> -+ <source>Iris</source> -+ <translation type="vanished">虹膜</translation> -+ </message> -+ <message> -+ <source>Face</source> -+ <translation type="vanished">人脸</translation> -+ </message> -+ <message> -+ <source>VoicePrint</source> -+ <translation type="vanished">声纹</translation> -+ </message> -+</context> -+</TS> -diff --git a/bioauth-bin/src/keywatcher.cpp b/bioauth-bin/src/keywatcher.cpp -index 706f250..aaa4398 100644 ---- a/bioauth-bin/src/keywatcher.cpp -+++ b/bioauth-bin/src/keywatcher.cpp -@@ -35,6 +35,7 @@ void KeyWatcher::run() - current.c_cc[VMIN] = 1; - current.c_cc[VTIME] = 0; - tcsetattr(0, TCSANOW, ¤t); -+ bool isInputEnd = false; - - while(!isInterruptionRequested()){ - -@@ -52,11 +53,18 @@ void KeyWatcher::run() - break; - default: - // 'q' | 'Q' or Esc -- if((ch = getchar()) == 'q' || ch == 'Q' || ch == 27){ -+ if((ch = getchar()) == 'q' || ch == 'Q' || ch == 27 || ch == EOF){ - tcsetattr(0, TCSANOW, &save); - emit exit(); -+ if (ch == EOF) { -+ isInputEnd = true; -+ break; -+ } - } - } -+ if (isInputEnd) { -+ break; -+ } - } - - tcsetattr(0, TCSANOW, &save); // 恢复原来的终端属性,以免干扰shall和之后的程序运行 -diff --git a/bioauth-bin/src/main.cpp b/bioauth-bin/src/main.cpp -index ed29e03..ae13ec6 100644 ---- a/bioauth-bin/src/main.cpp -+++ b/bioauth-bin/src/main.cpp -@@ -93,6 +93,22 @@ void showMessage(const QString &message, int type) - fprintf(stdout, RESET_COLOR); - } - -+static bool isQuickInput() { -+ fd_set readfds; -+ FD_ZERO(&readfds); -+ FD_SET(0, &readfds); // stdin -+ struct timeval timeout = {0, 10*1000}; -+ switch (select(32, &readfds, NULL, NULL, &timeout)) { -+ case 0: // time out -+ break; -+ case -1: // error -+ break; -+ default: -+ return true; -+ } -+ return false; -+} -+ - QString inputPinCode() - { - struct termios current; -@@ -241,7 +257,7 @@ int main(int argc, char *argv[]) - a.installTranslator(&translator_bin); - - QCommandLineParser parser; -- QCommandLineOption serviceOption({"s", "service"}, QObject::tr("Sevice Name")); -+ QCommandLineOption serviceOption({"s", "service"}, QObject::tr("Sevice Name"), "service", ""); - QCommandLineOption displayOption({"x", "display"}, QObject::tr("DISPLAY env"), "display", ":0"); - QCommandLineOption usernameOption({"u", "user"}, QObject::tr("User"), "user", ""); - QCommandLineOption debugOption({"d", "debug"}, QObject::tr("Display debug information")); -@@ -258,6 +274,11 @@ int main(int argc, char *argv[]) - logPrefix = "[pam-diaglog]:"; - qInstallMessageHandler(outputMessage); - -+ QString serverName = parser.value(serviceOption); -+ if (serverName == "sudo" && isQuickInput()) { -+ exit(BIO_ERROR); -+ } -+ - QString userName = parser.value(usernameOption); - if(userName.isEmpty()) - exit(BIO_ERROR); -@@ -298,12 +319,13 @@ int main(int argc, char *argv[]) - }); - QObject::connect(&bioAuth, &BioAuth::authComplete, &a, [&](uid_t uid_, int result, int retErrNo){ - Q_UNUSED(retErrNo); -+ - watcher.stop(); - bool isBioEnable = bioDevices.GetBioAuthEnable(uid_); -- bool isUkeyDevice = false; -- if(deviceInfo && deviceInfo->biotype == 6){ -- isUkeyDevice = true; -- } -+ bool isUkeyDevice = false; -+ if(deviceInfo && deviceInfo->biotype == 6){ -+ isUkeyDevice = true; -+ } - if(!isBioEnable && !isUkeyDevice){ - showMessage(QObject::tr("BIOMETRIC AUTHENTICATION IS CLOSED"), RESULT); - exit(BIO_IGNORE); -@@ -328,11 +350,11 @@ int main(int argc, char *argv[]) - showMessage(QObject::tr("Unable to verify %1, please enter password.").arg(bioDevices.bioTypeToString_tr(curDeviceInfo->biotype)),RESULT); - exit(BIO_IGNORE); - } -- Option option = showOption(bioDevices.count() > 1); -+ Option option = showOption(bioDevices.getAllDevices().count() > 1); - switch(option) { - case OPTION_TRY_AGAIN: - -- if(deviceInfo->biotype == 6){ -+ if(deviceInfo->biotype == 6){ - QString code = inputPinCode(); - bioAuth.SetExtraInfo("pincode",code); - } -@@ -346,7 +368,7 @@ int main(int argc, char *argv[]) - *deviceInfo = showDevices(bioDevices.getAllDevices()); - bioAuth.setDevice(deviceInfo); - -- if(deviceInfo->biotype == 6){ -+ if(deviceInfo->biotype == 6){ - QString code = inputPinCode(); - bioAuth.SetExtraInfo("pincode",code); - } -@@ -360,12 +382,12 @@ int main(int argc, char *argv[]) - { - exit(BIO_ERROR); - }else{ -- if(deviceInfo->biotype == 6){ -- showMessage(QObject::tr("AUTHENTICATION END"), START); -+ if(deviceInfo->biotype == 6){ -+ showMessage(QObject::tr("AUTHENTICATION END"), START); - }else{ -- showMessage(QObject::tr("BIOMETRIC AUTHENTICATION END"), START); -- } -- exit(BIO_IGNORE); -+ showMessage(QObject::tr("BIOMETRIC AUTHENTICATION END"), START); -+ } -+ exit(BIO_IGNORE); - break; - } - default: -@@ -375,8 +397,8 @@ int main(int argc, char *argv[]) - }); - - if(deviceInfo->biotype == 6){ -- QString code = inputPinCode(); -- bioAuth.SetExtraInfo("pincode",code); -+ QString code = inputPinCode(); -+ bioAuth.SetExtraInfo("pincode",code); - } - - bioAuth.startAuth(); -diff --git a/bioauth/i18n_ts/mn.ts b/bioauth/i18n_ts/mn.ts -new file mode 100644 -index 0000000..b96b503 ---- /dev/null -+++ b/bioauth/i18n_ts/mn.ts -@@ -0,0 +1,184 @@ -+<?xml version="1.0" encoding="utf-8"?> -+<!DOCTYPE TS> -+<TS version="2.1" language="mn"> -+<context> -+ <name>BioAuthWidget</name> -+ <message> -+ <location filename="../src/bioauthwidget.ui" line="14"/> -+ <source>Form</source> -+ <translation></translation> -+ </message> -+ <message> -+ <source>More</source> -+ <translation type="vanished">更多</translation> -+ </message> -+ <message> -+ <location filename="../src/bioauthwidget.ui" line="146"/> -+ <location filename="../src/bioauthwidget.cpp" line="41"/> -+ <source>Retry</source> -+ <translation>ᠳᠠᠬᠢᠨ ᠲᠤᠷᠰᠢᠬᠤ</translation> -+ </message> -+ <message> -+ <source>Too many unsuccessful attempts,please enter password.</source> -+ <translation type="vanished">验证失败达最大次数,请使用密码解锁</translation> -+ </message> -+ <message> -+ <source>Bioauth authentication failed, you still have %1 verification opportunities</source> -+ <translation type="vanished">生物认证失败,您还有%1次尝试机会</translation> -+ </message> -+ <message> -+ <source>Password</source> -+ <translation>ᠨᠢᠭᠤᠴᠠ ᠺᠣᠳ᠋</translation> -+ </message> -+ <message> -+ <source>Current Device: </source> -+ <translation type="vanished">当前设备:</translation> -+ </message> -+ <message> -+ <location filename="../src/bioauthwidget.cpp" line="96"/> -+ <location filename="../src/bioauthwidget.cpp" line="212"/> -+ <source>%1 too many unsuccessful attempts,please enter password.</source> -+ <translation>%1 ᠢᠯᠠᠭᠳᠠᠭᠰᠠᠨ ᠲᠤᠷᠰᠢᠬᠤ ᠤᠳᠠᠭᠠ ᠲᠣᠭᠠ ᠬᠡᠳᠦ ᠣᠯᠠᠨ ᠂ ᠨᠢᠭᠤᠴᠠ ᠺᠣᠳ᠋ ᠣᠷᠣᠭᠤᠯᠤᠭᠠᠷᠠᠢ ᠃</translation> -+ </message> -+ <message> -+ <location filename="../src/bioauthwidget.cpp" line="102"/> -+ <source>%1 authentication failure,there are still %2 remaining opportunities</source> -+ <translation>%1 ᠪᠡᠶᠡᠶ᠋ᠢᠨ ᠬᠢᠷᠢᠶ᠋ᠢᠨ ᠰᠢᠯᠭᠠᠨ ᠪᠠᠲᠤᠯᠠᠯᠲᠠ ᠢᠯᠠᠭᠳᠠᠪᠠ ᠂ ᠮᠥᠨ %2 ᠦᠯᠡᠳᠡᠬᠦ ᠲᠣᠬᠢᠶᠠᠯ ᠪᠣᠢ</translation> -+ </message> -+ <message> -+ <location filename="../src/bioauthwidget.cpp" line="226"/> -+ <source>Please use wechat to scan the code</source> -+ <translation>ᠸᠢᠴᠠᠲᠢ᠋ᠶ᠋ᠠᠷ ᠦᠰᠦᠭ ᠰᠢᠷᠪᠢᠬᠦ ᠪᠣᠯᠪᠠᠤ</translation> -+ </message> -+</context> -+<context> -+ <name>BioDevices</name> -+ <message> -+ <location filename="../src/biodevices.cpp" line="78"/> -+ <source>Unplugging of %1 device detected</source> -+ <translation>%1 ᠲᠥᠬᠥᠭᠡᠷᠦᠮᠵᠢᠶ᠋ᠢ ᠰᠤᠭᠤᠯᠵᠤ ᠭᠠᠷᠭᠠᠨ ᠠ</translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="88"/> -+ <source>%1 device insertion detected</source> -+ <translation>%1 ᠲᠥᠬᠥᠭᠡᠷᠦᠮᠵᠢ ᠬᠠᠪᠴᠢᠭᠤᠯᠤᠭᠰᠠᠨᠢ᠋ ᠪᠠᠢᠴᠠᠭᠠᠨ ᠣᠯᠪᠠ</translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="97"/> -+ <source>ukui-biometric-manager</source> -+ <translation>ᠠᠮᠢᠳᠤ ᠪᠣᠳᠠᠰᠤ᠋ᠨ ᠣᠨᠴᠠᠯᠢᠭ ᠬᠠᠮᠢᠶᠠᠷᠤᠯᠲᠠᠶ᠋ᠢᠨ ᠪᠠᠭᠠᠵᠢ</translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="100"/> -+ <source>biometric</source> -+ <translation>ᠠᠮᠢᠳᠤ ᠪᠣᠳᠠᠰᠤ᠋ᠨ ᠣᠨᠴᠠᠯᠢᠭ</translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="647"/> -+ <source>FingerPrint</source> -+ <translation>ᠬᠤᠷᠤᠭᠤᠨ ᠬᠡ</translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="649"/> -+ <source>FingerVein</source> -+ <translation>ᠬᠤᠷᠤᠭᠤᠨ ᠨᠠᠮᠵᠢᠭᠤᠨ ᠰᠤᠳᠠᠰᠤ</translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="651"/> -+ <source>Iris</source> -+ <translation>ᠰᠣᠯᠣᠩᠭᠠ ᠪᠦᠷᠬᠦᠭᠦᠯ</translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="653"/> -+ <source>Face</source> -+ <translation>ᠬᠥᠮᠦᠨᠦ᠌ ᠨᠢᠭᠤᠷ ᠲᠠᠨᠢᠬᠤ</translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="655"/> -+ <source>VoicePrint</source> -+ <translation>ᠳᠠᠭᠤᠨ ᠡᠷᠢᠶᠡᠨ</translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="657"/> -+ <source>ukey</source> -+ <translation>ᠠᠶᠤᠯᠭᠦᠢ ᠨᠢᠭᠤᠴᠠ ᠲᠦᠯᠬᠢᠭᠦᠷ</translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="659"/> -+ <source>QRCode</source> -+ <translation>ᠬᠣᠶᠠᠷ ᠬᠡᠮᠵᠢᠯᠲᠦ ᠺᠣᠳ᠋</translation> -+ </message> -+ <message> -+ <source>Wechat</source> -+ <translation type="vanished">微信</translation> -+ </message> -+</context> -+<context> -+ <name>BioDevicesWidget</name> -+ <message> -+ <location filename="../src/biodeviceswidget.ui" line="14"/> -+ <source>Form</source> -+ <translation></translation> -+ </message> -+ <message> -+ <source>Device types:</source> -+ <translation type="vanished">设备类型:</translation> -+ </message> -+ <message> -+ <source>Back</source> -+ <translation type="vanished">返回</translation> -+ </message> -+ <message> -+ <source>OK</source> -+ <translation type="vanished">确定</translation> -+ </message> -+ <message> -+ <source>FingerPrint</source> -+ <translation type="vanished">指纹</translation> -+ </message> -+</context> -+<context> -+ <name>LoginOptionsWidget</name> -+ <message> -+ <location filename="../src/loginoptionswidget.cpp" line="61"/> -+ <source>Login Options</source> -+ <translation>ᠲᠡᠮᠳᠡᠭᠯᠡᠬᠦ ᠰᠤᠩᠭᠤᠭᠳᠠᠬᠤᠨ</translation> -+ </message> -+ <message> -+ <location filename="../src/loginoptionswidget.cpp" line="294"/> -+ <source>Password</source> -+ <translation>ᠨᠢᠭᠤᠴᠠ ᠺᠣᠳ᠋</translation> -+ </message> -+ <message> -+ <source>Wechat</source> -+ <translation type="vanished">微信</translation> -+ </message> -+ <message> -+ <source>Biometric</source> -+ <translation type="vanished">生物识别</translation> -+ </message> -+</context> -+<context> -+ <name>QObject</name> -+ <message> -+ <source>FingerPrint</source> -+ <translation type="vanished">指纹</translation> -+ </message> -+ <message> -+ <source>FingerVein</source> -+ <translation type="vanished">指静脉</translation> -+ </message> -+ <message> -+ <source>Iris</source> -+ <translation type="vanished">虹膜</translation> -+ </message> -+ <message> -+ <source>Face</source> -+ <translation type="vanished">人脸</translation> -+ </message> -+ <message> -+ <source>VoicePrint</source> -+ <translation type="vanished">声纹</translation> -+ </message> -+</context> -+</TS> -diff --git a/bioauth/i18n_ts/zh_CN.ts b/bioauth/i18n_ts/zh_CN.ts -index d009954..c2c6329 100644 ---- a/bioauth/i18n_ts/zh_CN.ts -+++ b/bioauth/i18n_ts/zh_CN.ts -@@ -100,8 +100,8 @@ - </message> - <message> - <location filename="../src/biodevices.cpp" line="657"/> -- <source>ukey</source> -- <translation type="unfinished"></translation> -+ <source>Ukey</source> -+ <translation>安全密钥</translation> - </message> - <message> - <location filename="../src/biodevices.cpp" line="659"/> -diff --git a/bioauth/i18n_ts/zh_HK.ts b/bioauth/i18n_ts/zh_HK.ts -new file mode 100644 -index 0000000..d71eed9 ---- /dev/null -+++ b/bioauth/i18n_ts/zh_HK.ts -@@ -0,0 +1,184 @@ -+<?xml version="1.0" encoding="utf-8"?> -+<!DOCTYPE TS> -+<TS version="2.1" language="zh_Hant"> -+<context> -+ <name>BioAuthWidget</name> -+ <message> -+ <location filename="../src/bioauthwidget.ui" line="14"/> -+ <source>Form</source> -+ <translation></translation> -+ </message> -+ <message> -+ <source>More</source> -+ <translation type="vanished">更多</translation> -+ </message> -+ <message> -+ <location filename="../src/bioauthwidget.ui" line="146"/> -+ <location filename="../src/bioauthwidget.cpp" line="41"/> -+ <source>Retry</source> -+ <translation>重試</translation> -+ </message> -+ <message> -+ <source>Too many unsuccessful attempts,please enter password.</source> -+ <translation type="vanished">验证失败达最大次数,请使用密码解锁</translation> -+ </message> -+ <message> -+ <source>Bioauth authentication failed, you still have %1 verification opportunities</source> -+ <translation type="vanished">生物认证失败,您还有%1次尝试机会</translation> -+ </message> -+ <message> -+ <source>Password</source> -+ <translation>密碼</translation> -+ </message> -+ <message> -+ <source>Current Device: </source> -+ <translation type="vanished">当前设备:</translation> -+ </message> -+ <message> -+ <location filename="../src/bioauthwidget.cpp" line="96"/> -+ <location filename="../src/bioauthwidget.cpp" line="212"/> -+ <source>%1 too many unsuccessful attempts,please enter password.</source> -+ <translation>%1失敗的嘗試次數太多,請輸入密碼</translation> -+ </message> -+ <message> -+ <location filename="../src/bioauthwidget.cpp" line="102"/> -+ <source>%1 authentication failure,there are still %2 remaining opportunities</source> -+ <translation>%1 身份驗證失敗,仍有 %2 個剩餘機會</translation> -+ </message> -+ <message> -+ <location filename="../src/bioauthwidget.cpp" line="226"/> -+ <source>Please use wechat to scan the code</source> -+ <translation>請使用微信掃碼</translation> -+ </message> -+</context> -+<context> -+ <name>BioDevices</name> -+ <message> -+ <location filename="../src/biodevices.cpp" line="78"/> -+ <source>Unplugging of %1 device detected</source> -+ <translation>檢測到 %1 設備的拔出</translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="88"/> -+ <source>%1 device insertion detected</source> -+ <translation>檢測到 %1 個設備插入</translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="97"/> -+ <source>ukui-biometric-manager</source> -+ <translation>生物特徵管理工具</translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="100"/> -+ <source>biometric</source> -+ <translation>生物特徵管理工具</translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="647"/> -+ <source>FingerPrint</source> -+ <translation>指紋</translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="649"/> -+ <source>FingerVein</source> -+ <translation>指靜脈</translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="651"/> -+ <source>Iris</source> -+ <translation>虹膜</translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="653"/> -+ <source>Face</source> -+ <translation>人臉</translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="655"/> -+ <source>VoicePrint</source> -+ <translation>聲紋</translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="657"/> -+ <source>ukey</source> -+ <translation>安全金鑰</translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="659"/> -+ <source>QRCode</source> -+ <translation>微信掃碼</translation> -+ </message> -+ <message> -+ <source>Wechat</source> -+ <translation type="vanished">微信</translation> -+ </message> -+</context> -+<context> -+ <name>BioDevicesWidget</name> -+ <message> -+ <location filename="../src/biodeviceswidget.ui" line="14"/> -+ <source>Form</source> -+ <translation></translation> -+ </message> -+ <message> -+ <source>Device types:</source> -+ <translation type="vanished">设备类型:</translation> -+ </message> -+ <message> -+ <source>Back</source> -+ <translation type="vanished">返回</translation> -+ </message> -+ <message> -+ <source>OK</source> -+ <translation type="vanished">确定</translation> -+ </message> -+ <message> -+ <source>FingerPrint</source> -+ <translation type="vanished">指纹</translation> -+ </message> -+</context> -+<context> -+ <name>LoginOptionsWidget</name> -+ <message> -+ <location filename="../src/loginoptionswidget.cpp" line="61"/> -+ <source>Login Options</source> -+ <translation>登錄選項</translation> -+ </message> -+ <message> -+ <location filename="../src/loginoptionswidget.cpp" line="294"/> -+ <source>Password</source> -+ <translation>密碼</translation> -+ </message> -+ <message> -+ <source>Wechat</source> -+ <translation type="vanished">微信</translation> -+ </message> -+ <message> -+ <source>Biometric</source> -+ <translation type="vanished">生物识别</translation> -+ </message> -+</context> -+<context> -+ <name>QObject</name> -+ <message> -+ <source>FingerPrint</source> -+ <translation type="vanished">指纹</translation> -+ </message> -+ <message> -+ <source>FingerVein</source> -+ <translation type="vanished">指静脉</translation> -+ </message> -+ <message> -+ <source>Iris</source> -+ <translation type="vanished">虹膜</translation> -+ </message> -+ <message> -+ <source>Face</source> -+ <translation type="vanished">人脸</translation> -+ </message> -+ <message> -+ <source>VoicePrint</source> -+ <translation type="vanished">声纹</translation> -+ </message> -+</context> -+</TS> -diff --git a/bioauth/include/bioauth.h b/bioauth/include/bioauth.h -index ee9d55b..56588f7 100644 ---- a/bioauth/include/bioauth.h -+++ b/bioauth/include/bioauth.h -@@ -62,6 +62,7 @@ public: - - signals: - void authComplete(int uid, bool result, int retErrNo); -+ void authFinished(); - void notify(const QString &message); - void notifyDetail(int deviceId, const QString &message); - void frameWritten(int deviceId); -diff --git a/bioauth/include/biodevices.h b/bioauth/include/biodevices.h -index 2308138..630f25f 100644 ---- a/bioauth/include/biodevices.h -+++ b/bioauth/include/biodevices.h -@@ -57,6 +57,7 @@ public: - void setIsShowHotPlug(bool isShow); - int GetUserDevFeatureCount(int uid,int drvid); - int GetUserDevCount(int uid); -+ FeatureMap GetUserFeatures(int uid); - bool getUseFirstDevice(); - int getFailedTimes(); - bool GetHiddenSwitchButton(); -@@ -71,6 +72,8 @@ public: - */ - StatusReslut UpdateStatus(int drvid); - bool GetBioAuthEnable(uid_t uid); -+ bool GetDirveIsIdle(int drvid); -+ void recordAuthDrive(QString appName,int drvid,bool insert); - - private: - void connectToService(); -diff --git a/bioauth/include/biotypes.h b/bioauth/include/biotypes.h -index 07a940f..b286edb 100644 ---- a/bioauth/include/biotypes.h -+++ b/bioauth/include/biotypes.h -@@ -225,6 +225,9 @@ Q_DECLARE_METATYPE(DeviceInfo) - typedef std::shared_ptr<DeviceInfo> DeviceInfoPtr; - typedef QList<DeviceInfoPtr> DeviceList; - typedef QMap<int, DeviceList> DeviceMap; -+typedef std::shared_ptr<FeatureInfo> FeatureInfoPtr; -+typedef QList<FeatureInfoPtr> FeatureList; -+typedef QMap<QString, FeatureList> FeatureMap; - - QDBusArgument &operator<<(QDBusArgument &argument, const DeviceInfo &deviceInfo); - const QDBusArgument &operator>>(const QDBusArgument &argument, DeviceInfo &deviceInfo); -diff --git a/bioauth/include/loginoptionswidget.h b/bioauth/include/loginoptionswidget.h -index 31c69e2..7ef3db9 100644 ---- a/bioauth/include/loginoptionswidget.h -+++ b/bioauth/include/loginoptionswidget.h -@@ -100,6 +100,7 @@ public: - public slots: - void readDevicesInfo(); - void onIdentifyComplete(int uid, bool ret, int retErrNo); -+ void onAuthFinished(); - void onStatusChanged(int drvid, const QString &message); - void onFrameWritten(int drvid); - void onUSBDeviceCountChange(int newNum); -diff --git a/bioauth/include/uniauthservice.h b/bioauth/include/uniauthservice.h -index 9bbe5b4..3ed8707 100644 ---- a/bioauth/include/uniauthservice.h -+++ b/bioauth/include/uniauthservice.h -@@ -61,9 +61,13 @@ public Q_SLOTS: - bool getUseFirstDevice(); - // 获取是否隐藏切换按钮 - bool getHiddenSwitchButton(); -- -+ // 获取正在认证的应用 -+ QStringList getAuthingApp(); -+ // 获取应用认证的驱动 -+ int getAuthingAppDrivd(QString appName); - public: - bool isActivatable(); -+ void recordAuthDrive(QString appName,int drvid,bool insert); - - Q_SIGNALS: - //默认设备改变 -diff --git a/bioauth/src/bioauth.cpp b/bioauth/src/bioauth.cpp -index df66f19..bf725dc 100644 ---- a/bioauth/src/bioauth.cpp -+++ b/bioauth/src/bioauth.cpp -@@ -17,6 +17,7 @@ - **/ - #include "bioauth.h" - #include <QList> -+#include <unistd.h> - - BioAuth::BioAuth(qint32 uid, const DeviceInfoPtr deviceInfo, QObject *parent) - : QObject(parent), -@@ -110,6 +111,11 @@ void BioAuth::startAuth() - QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(call, this); - connect(watcher, &QDBusPendingCallWatcher::finished, this, &BioAuth::onIdentityComplete); - }else{ -+ //使用sudo等命令时,不停止设备,当存在其他可认证设备时,使用其他可认证设备,否则使用密码 -+ if(qAppName() != "bioauth"){ -+ //stopops在identify之前使用时,不要调用getFeaturelist,否则会出现identify被停止的现象,应该时框架的bug。 -+ serviceInterface->call("StopOps", QVariant(deviceInfo->device_id), QVariant(3000)); -+ } - QDBusPendingCall call = serviceInterface->asyncCallWithArgumentList("Identify", args); - QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(call, this); - connect(watcher, &QDBusPendingCallWatcher::finished, this, &BioAuth::onIdentityComplete); -@@ -175,6 +181,7 @@ void BioAuth::stopAuth() - - QDBusReply<int> reply = serviceInterface->call("StopOps", QVariant(deviceInfo->device_id), QVariant(3000)); - -+ emit authFinished(); - if(!reply.isValid()) - qWarning() << "StopOps error: " << reply.error(); - -@@ -188,6 +195,7 @@ bool BioAuth::isAuthenticating() - - void BioAuth::onIdentityComplete(QDBusPendingCallWatcher *watcher) - { -+ emit authFinished(); - QDBusPendingReply<qint32, qint32> reply = *watcher; - if(reply.isError()){ - isInAuthentication = false; -@@ -227,6 +235,11 @@ void BioAuth::onStatusChanged(int deviceId, int statusType) - LOG() << msg.errorMessage(); - return; - } -+ -+ if(deviceInfo && deviceInfo->device_id != deviceId){ -+ return ; -+ } -+ - QString message = msg.arguments().at(0).toString(); - LOG() << message; - Q_EMIT notify(message); -diff --git a/bioauth/src/biodevices.cpp b/bioauth/src/biodevices.cpp -index 556ed1c..2f6a366 100644 ---- a/bioauth/src/biodevices.cpp -+++ b/bioauth/src/biodevices.cpp -@@ -94,7 +94,7 @@ void BioDevices::onUSBDeviceHotPlug(int deviceId, int action, int devNumNow) - "org.freedesktop.Notifications", - QDBusConnection::sessionBus()); - QList<QVariant> args; -- args<<(tr("ukui-biometric-manager")) -+ args<<(tr("Biometric Manager")) - <<((unsigned int) 0) - <<"biometric-manager" - <<tr("biometric") -@@ -200,10 +200,32 @@ int BioDevices::GetUserDevCount(int uid) - - } - -+FeatureMap BioDevices::GetUserFeatures(int uid) -+{ -+ FeatureMap featureMap; -+ QList<QDBusVariant> qlist; -+ int listsize; -+ QDBusMessage result = serviceInterface->call(QStringLiteral("GetAllFeatureList"), uid, 0, -1); -+ if(result.type() == QDBusMessage::ErrorMessage) -+ { -+ qWarning() << "GetDevList error:" << result.errorMessage(); -+ return featureMap; -+ } -+ -+ QList<QVariant> variantList = result.arguments(); -+ listsize = variantList[0].value<int>(); -+ variantList[1].value<QDBusArgument>() >> qlist; -+ for (int i = 0; i < listsize; i++) { -+ FeatureInfoPtr pFeatureInfo = std::make_shared<FeatureInfo>(); -+ qlist[i].variant().value<QDBusArgument>() >> *pFeatureInfo; -+ featureMap[pFeatureInfo->device_shortname].append(pFeatureInfo); -+ } -+ -+ return featureMap; -+} -+ - int BioDevices::GetUserDevFeatureCount(int uid,int drvid) - { -- // stop last option -- serviceInterface->call("StopOps", QVariant(drvid), QVariant(3000)); - QDBusMessage FeatureResult = serviceInterface->call(QStringLiteral("GetFeatureList"),drvid,uid,0,-1); - if(FeatureResult.type() == QDBusMessage::ErrorMessage) - { -@@ -218,7 +240,6 @@ int BioDevices::getFeatureCount(int uid, int indexStart, int indexEnd) - int res = 0; - for(int i = 0; i < deviceInfos.count(); i++) { - DeviceInfoPtr deviceInfo = deviceInfos.at(i); -- QDBusReply<int> reply = serviceInterface->call("StopOps", QVariant(deviceInfo->device_id), QVariant(3000)); - QDBusMessage featurecount = serviceInterface->call("GetFeatureList",deviceInfo->device_id,uid,indexStart,indexEnd); - if(featurecount.type() == QDBusMessage::ErrorMessage) - { -@@ -237,6 +258,10 @@ QMap<int, QList<DeviceInfo>> BioDevices::getAllDevices() - for(auto deviceInfo : deviceInfos) { - if (deviceInfo->biotype == REMOTE_QRCODE_TYPE) // 终端不使用扫码 - continue; -+ -+ if(!GetDirveIsIdle(deviceInfo->device_id)) -+ continue; -+ - devices[deviceInfo->biotype].push_back(*deviceInfo); - } - -@@ -406,6 +431,7 @@ DeviceInfoPtr BioDevices::getDefaultDevice(uid_t uid,int bioType) - if(deviceInfos.size() <= 0) - return nullptr; - -+ FeatureMap mapFeatures = GetUserFeatures(uid); - if (m_uniAuthService && m_uniAuthService->isActivatable()) { - QString defaultDeviceName = ""; - struct passwd *pwdInfo = getpwuid(uid); -@@ -416,7 +442,8 @@ DeviceInfoPtr BioDevices::getDefaultDevice(uid_t uid,int bioType) - if(!strDeviceName.isEmpty()) { - ptrDevInfo = findDevice(strDeviceName); - if (ptrDevInfo) { -- if (GetUserDevFeatureCount(uid,ptrDevInfo->device_id) > 0) { -+ int isIdle = GetDirveIsIdle(ptrDevInfo->device_id); -+ if(isIdle && mapFeatures.contains(ptrDevInfo->device_shortname)){ - defaultDeviceName = strDeviceName; - } - } -@@ -454,9 +481,11 @@ DeviceInfoPtr BioDevices::getDefaultDevice(uid_t uid,int bioType) - bool defValid = false; - DeviceInfoPtr ptrDevInfo = findDevice(defaultDeviceName); - if (ptrDevInfo) { -- if (GetUserDevFeatureCount(uid,ptrDevInfo->device_id) > 0) { -+ int isIdle = GetDirveIsIdle(ptrDevInfo->device_id); -+ if(isIdle && mapFeatures.contains(ptrDevInfo->device_shortname)){ - defValid = true; - } -+ - } - - if (!defValid) { -@@ -467,11 +496,34 @@ DeviceInfoPtr BioDevices::getDefaultDevice(uid_t uid,int bioType) - } - } - -+void BioDevices::recordAuthDrive(QString appName, int drvid, bool insert) -+{ -+ if(m_uniAuthService && m_uniAuthService->isActivatable()){ -+ m_uniAuthService->recordAuthDrive(appName,drvid,insert); -+ } -+} -+ -+bool BioDevices::GetDirveIsIdle(int drvid) -+{ -+ if(m_uniAuthService && m_uniAuthService->isActivatable()){ -+ QStringList appList = m_uniAuthService->getAuthingApp(); -+ for(QString appName : appList){ -+ int id = m_uniAuthService->getAuthingAppDrivd(appName); -+ if(id == drvid){ -+ return false; -+ } -+ } -+ } -+ -+ return true; -+} -+ - DeviceInfoPtr BioDevices::getDefaultDevice(uid_t uid) - { - if(deviceInfos.size() <= 0) - return nullptr; - -+ FeatureMap mapFeatures = GetUserFeatures(uid); - if (m_uniAuthService && m_uniAuthService->isActivatable()) { - QString defaultDeviceName = ""; - struct passwd *pwdInfo = getpwuid(uid); -@@ -483,7 +535,8 @@ DeviceInfoPtr BioDevices::getDefaultDevice(uid_t uid) - if(!strDeviceName.isEmpty()) { - ptrDevInfo = findDevice(strDeviceName); - if (ptrDevInfo) { -- if (GetUserDevFeatureCount(uid,ptrDevInfo->device_id) > 0) { -+ int isIdle = GetDirveIsIdle(ptrDevInfo->device_id); -+ if(isIdle && mapFeatures.contains(ptrDevInfo->device_shortname)){ - defaultDeviceName = strDeviceName; - break; - } -@@ -525,7 +578,7 @@ DeviceInfoPtr BioDevices::getDefaultDevice(uid_t uid) - bool defValid = false; - DeviceInfoPtr ptrDevInfo = findDevice(defaultDeviceName); - if (ptrDevInfo) { -- if (GetUserDevFeatureCount(uid,ptrDevInfo->device_id) > 0) { -+ if (mapFeatures.contains(ptrDevInfo->device_shortname)) { - defValid = true; - } - } -@@ -654,7 +707,7 @@ QString BioDevices::bioTypeToString_tr(int type) - case BIOTYPE_VOICEPRINT: - return tr("VoicePrint"); - case LOGINOPT_TYPE_GENERAL_UKEY: -- return tr("ukey"); -+ return tr("Ukey"); - case REMOTE_QRCODE_TYPE: - return tr("QRCode"); - } -diff --git a/bioauth/src/loginoptionswidget.cpp b/bioauth/src/loginoptionswidget.cpp -index 955270c..b089b33 100644 ---- a/bioauth/src/loginoptionswidget.cpp -+++ b/bioauth/src/loginoptionswidget.cpp -@@ -48,6 +48,7 @@ LoginOptionsWidget::LoginOptionsWidget(QWidget *parent) - , m_bioDevices(new BioDevices()) - , w_timer(nullptr) - { -+ m_bioDevices->recordAuthDrive("polkit",0,false); - initUI(); - initConnections(); - m_mapDisableDev.clear(); -@@ -161,6 +162,9 @@ void LoginOptionsWidget::initConnections() - - connect(m_biomericProxy, &BioAuth::authComplete, - this, &LoginOptionsWidget::onIdentifyComplete); -+ -+ connect(m_biomericProxy, &BioAuth::authFinished, -+ this, &LoginOptionsWidget::onAuthFinished); - } - if (m_bioDevices) { - connect(m_bioDevices, &BioDevices::deviceCountChanged, -@@ -399,6 +403,9 @@ void LoginOptionsWidget::readDevicesInfo() - bool isQRCodeEnable = m_bioDevices->GetQRCodeEnable(); - DeviceList deviceList = m_bioDevices->GetDevList(); - QStringList listDefDevices = m_bioDevices->getAllDefDevices(); -+ FeatureMap mapFeatures = m_bioDevices->GetUserFeatures(m_uid); -+ qDebug() << m_uid <<",count:"<<mapFeatures.size(); -+ - for(auto pDeviceInfo : deviceList) - { - int nDevFeatureCount = 0; -@@ -407,8 +414,8 @@ void LoginOptionsWidget::readDevicesInfo() - } else { - if (m_uid == -1) { - nDevFeatureCount = 0; -- } else { -- nDevFeatureCount = m_bioDevices->GetUserDevFeatureCount(m_uid, pDeviceInfo->device_id); -+ } else if(mapFeatures.contains(pDeviceInfo->device_shortname)){ -+ nDevFeatureCount = mapFeatures[pDeviceInfo->device_shortname].size(); - } - } - qDebug() << *pDeviceInfo << ",FeatureCount:"<<nDevFeatureCount; -@@ -496,6 +503,7 @@ void LoginOptionsWidget::startAuth_() - m_labelFaceLoad->show(); - } - w_timer->start(); -+ m_bioDevices->recordAuthDrive("polkit",m_curDevInfo->device_id,true); - m_biomericProxy->startAuth(m_uid, m_curDevInfo); - } - -@@ -530,6 +538,13 @@ void LoginOptionsWidget::updatePixmap() - } - } - -+void LoginOptionsWidget::onAuthFinished() -+{ -+ if(m_bioDevices){ -+ m_bioDevices->recordAuthDrive("polkit",0,false); -+ } -+} -+ - void LoginOptionsWidget::onIdentifyComplete(int uid, bool ret, int retErrNo) - { - if(m_isStopped == true) -diff --git a/bioauth/src/uniauthservice.cpp b/bioauth/src/uniauthservice.cpp -index 4f327af..8032cea 100644 ---- a/bioauth/src/uniauthservice.cpp -+++ b/bioauth/src/uniauthservice.cpp -@@ -245,6 +245,45 @@ bool UniAuthService::getHiddenSwitchButton() - } - } - -+// 获取正在认证的应用 -+QStringList UniAuthService::getAuthingApp() -+{ -+ QDBusMessage result = call(QStringLiteral("getAllAuthApp")); -+ if(result.type() == QDBusMessage::ErrorMessage) -+ { -+ qWarning() << "getAuthingApp error:" << result.errorMessage(); -+ return QStringList(); -+ } -+ QList<QVariant> varResult = result.arguments(); -+ if (varResult.size() > 0) { -+ return varResult.takeFirst().toStringList(); -+ } else { -+ return QStringList(); -+ } -+} -+ -+// 获取应用认证的驱动 -+int UniAuthService::getAuthingAppDrivd(QString appName) -+{ -+ QDBusMessage result = call(QStringLiteral("getAppAuthDrive"),appName); -+ if(result.type() == QDBusMessage::ErrorMessage) -+ { -+ qWarning() << "getAuthingAppDrivd error:" << result.errorMessage(); -+ return -1; -+ } -+ QList<QVariant> varResult = result.arguments(); -+ if (varResult.size() > 0) { -+ return varResult.takeFirst().toInt(); -+ } else { -+ return -1; -+ } -+} -+ -+void UniAuthService::recordAuthDrive(QString appName,int drvid,bool insert) -+{ -+ call(QStringLiteral("recordAuthDrive"),appName,drvid,insert); -+} -+ - bool UniAuthService::isActivatable() - { - return m_isActivatable; -diff --git a/images/ukui-loginopt-finger.svg b/images/ukui-loginopt-finger.svg -index ed0d828..c3d3762 100644 ---- a/images/ukui-loginopt-finger.svg -+++ b/images/ukui-loginopt-finger.svg -@@ -1 +1 @@ --<svg id="图层_1" data-name="图层 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 16 16"><defs><clipPath id="clip-path"><circle cx="8" cy="8" r="8" fill="none"/></clipPath></defs><g clip-path="url(#clip-path)"><path d="M8.2,4.33H8A2.3,2.3,0,0,0,5.73,5.91a3.59,3.59,0,0,0-.09,1.5,14.1,14.1,0,0,1-1.3,8.89.45.45,0,0,0,.18.61.54.54,0,0,0,.21.05.46.46,0,0,0,.4-.24,15,15,0,0,0,1.4-9.43,2.83,2.83,0,0,1,.06-1.11c.13-.4.41-.87,1.49-.95H8.2a1.26,1.26,0,0,1,1.24.85A11.83,11.83,0,0,1,10,8.35,8.18,8.18,0,0,1,10,9.58v.57a.85.85,0,0,1,0,.16.44.44,0,0,0,.38.5h.06a.45.45,0,0,0,.45-.39,1.51,1.51,0,0,0,0-.3V9.58a10.42,10.42,0,0,0-.07-1.36,13.39,13.39,0,0,0-.56-2.43A2.16,2.16,0,0,0,8.2,4.33Z" fill="#1a1a1a"/><path d="M8.05,1a6.57,6.57,0,0,0-1.23.12,5.81,5.81,0,0,0-4.6,6.76c.08.52.14,1,.21,1.57l.09.74a.44.44,0,0,0,.45.39H3a.44.44,0,0,0,.38-.5l-.09-.74c-.06-.53-.13-1.06-.21-1.6A4.91,4.91,0,0,1,7,2,5.33,5.33,0,0,1,8,1.9a5.33,5.33,0,0,1,3.8,1.69.43.43,0,0,0,.31.13.42.42,0,0,0,.32-.13.45.45,0,0,0,0-.64A6.15,6.15,0,0,0,8.05,1Z" fill="#1a1a1a"/><path d="M5.54,4.88h0M5.3,3.93a.49.49,0,0,0-.2,0,1.64,1.64,0,0,0-.58.56,4.38,4.38,0,0,0-.6,3.38,13.61,13.61,0,0,1-.11,5,9.55,9.55,0,0,1-1,2.68A.45.45,0,0,0,3,16.2a.42.42,0,0,0,.22.05A.45.45,0,0,0,3.64,16,10.4,10.4,0,0,0,4.69,13.1a14.69,14.69,0,0,0,.12-5.31,3.4,3.4,0,0,1,.44-2.72,1,1,0,0,1,.25-.28.46.46,0,0,0,.2-.61.45.45,0,0,0-.4-.25Z" fill="#1a1a1a"/><path d="M8.15,2.72a5.46,5.46,0,0,0-1.51.22.45.45,0,0,0-.31.56.43.43,0,0,0,.43.32h.12a4.42,4.42,0,0,1,1.25-.19,3.07,3.07,0,0,1,3,2.23,13.82,13.82,0,0,1,.57,4.41,19.75,19.75,0,0,1-.91,5.93,3.74,3.74,0,0,1-.18.48.44.44,0,0,0,.21.6.43.43,0,0,0,.19,0,.45.45,0,0,0,.41-.25c.09-.19.16-.39.23-.58a20.8,20.8,0,0,0,.95-6.22A14.66,14.66,0,0,0,12,5.56,3.93,3.93,0,0,0,8.15,2.72Z" fill="#1a1a1a"/><path d="M3,13.15H3m-.5-.69a.45.45,0,0,0-.4.25,2.37,2.37,0,0,0-.18.53,3,3,0,0,1-.1.32c-.07.16-.15.32-.23.49a6.25,6.25,0,0,0-.31.69.45.45,0,0,0,.26.58.44.44,0,0,0,.16,0,.45.45,0,0,0,.42-.29,4.57,4.57,0,0,1,.28-.6c.09-.18.18-.36.25-.54a2.44,2.44,0,0,0,.14-.44,1.89,1.89,0,0,1,.12-.36.46.46,0,0,0-.21-.61.45.45,0,0,0-.2,0Z" fill="#1a1a1a"/><path d="M13.25,4.89h-.1a.46.46,0,0,0-.34.54,22.64,22.64,0,0,1,.58,5.38,18,18,0,0,1-.66,4.74l0,.14v0a.45.45,0,0,0,.05.57.46.46,0,0,0,.33.13.47.47,0,0,0,.31-.12.81.81,0,0,0,.21-.46.15.15,0,0,1,0-.07,18.82,18.82,0,0,0,.69-5,23.9,23.9,0,0,0-.6-5.59.45.45,0,0,0-.44-.34Z" fill="#1a1a1a"/><path d="M10.35,11.43a.44.44,0,0,0-.45.39,17.13,17.13,0,0,1-1.28,5.06.45.45,0,0,0,.22.6.43.43,0,0,0,.19,0,.45.45,0,0,0,.41-.26,18.25,18.25,0,0,0,1.35-5.33.45.45,0,0,0-.39-.5Z" fill="#1a1a1a"/><path d="M8,15.61H8m-.49-.69a.46.46,0,0,0-.41.26l-.64,1.37a.45.45,0,0,0,.21.6.46.46,0,0,0,.19,0,.44.44,0,0,0,.41-.26l.64-1.37A.44.44,0,0,0,7.71,15a.49.49,0,0,0-.19-.05Z" fill="#1a1a1a"/><path d="M8.06,6.56H8a.46.46,0,0,0-.37.52,17.57,17.57,0,0,1-.07,6.52.45.45,0,0,0,.35.53H8a.44.44,0,0,0,.44-.35A18.12,18.12,0,0,0,8.5,6.93a.43.43,0,0,0-.44-.37Z" fill="#1a1a1a"/></g></svg> -\ No newline at end of file -+<svg id="图层_1" data-name="图层 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><defs><style>.cls-1{fill:#262626;}</style></defs><path class="cls-1" d="M2.79,13.45a2.53,2.53,0,0,1,.12-.36.46.46,0,0,0-.21-.61H2.5v0a.46.46,0,0,0-.4.25,2.19,2.19,0,0,0-.17.49,6.9,6.9,0,0,0,.71.72v0A2.25,2.25,0,0,0,2.79,13.45Z"/><path class="cls-1" d="M10.4,11.39l-.05,0a.44.44,0,0,0-.45.39A16.89,16.89,0,0,1,9,15.93a6.54,6.54,0,0,0,1-.19,18.07,18.07,0,0,0,.81-3.85A.44.44,0,0,0,10.4,11.39Z"/><path class="cls-1" d="M7.71,15A.41.41,0,0,0,7.52,15v0a.46.46,0,0,0-.41.26l-.33.72c.3,0,.61.07.92.08l.22-.46A.43.43,0,0,0,7.71,15Z"/><path class="cls-1" d="M6.53,7.29a3,3,0,0,1,.06-1.11c.13-.4.41-.87,1.49-.95H8.2a1.25,1.25,0,0,1,1.24.85A12,12,0,0,1,10,8.35a8.42,8.42,0,0,1,0,1.23v.57a.43.43,0,0,1,0,.16.44.44,0,0,0,.37.5h.07a.45.45,0,0,0,.45-.39,1.5,1.5,0,0,0,0-.3V9.58a10.33,10.33,0,0,0-.07-1.36,13.39,13.39,0,0,0-.56-2.43A2.15,2.15,0,0,0,8.2,4.33H8A2.31,2.31,0,0,0,5.73,5.91a3.46,3.46,0,0,0-.09,1.5,14.16,14.16,0,0,1-.85,7.91,8.36,8.36,0,0,0,.83.32A15,15,0,0,0,6.53,7.29Z"/><path class="cls-1" d="M12.43,3A6.14,6.14,0,0,0,8.05,1a6.41,6.41,0,0,0-1.23.12,5.81,5.81,0,0,0-4.6,6.76c.08.52.14,1,.21,1.57l.09.74a.44.44,0,0,0,.45.39H3a.44.44,0,0,0,.38-.49h0l-.09-.74c-.06-.53-.13-1.06-.21-1.6A4.92,4.92,0,0,1,7,2H7a5.56,5.56,0,0,1,1-.1,5.38,5.38,0,0,1,3.8,1.69.44.44,0,0,0,.31.13.42.42,0,0,0,.32-.13.45.45,0,0,0,0-.64Z"/><path class="cls-1" d="M4.81,7.79a3.43,3.43,0,0,1,.44-2.72,1,1,0,0,1,.25-.28.46.46,0,0,0,.2-.61.46.46,0,0,0-.4-.25.67.67,0,0,0-.2,0,1.64,1.64,0,0,0-.58.56,4.38,4.38,0,0,0-.6,3.38,13.56,13.56,0,0,1-.11,5,9.89,9.89,0,0,1-.5,1.6A7.11,7.11,0,0,0,4.1,15a10.26,10.26,0,0,0,.59-1.88A14.81,14.81,0,0,0,4.81,7.79Z"/><path class="cls-1" d="M12,5.56A3.93,3.93,0,0,0,8.15,2.72a5.51,5.51,0,0,0-1.51.22.45.45,0,0,0-.31.55h0a.43.43,0,0,0,.43.32h.12a4.46,4.46,0,0,1,1.25-.19,3.07,3.07,0,0,1,3,2.23,13.72,13.72,0,0,1,.57,4.41A19.83,19.83,0,0,1,11,15.41a8.06,8.06,0,0,0,1.06-.53,20.79,20.79,0,0,0,.53-4.65A14.73,14.73,0,0,0,12,5.56Z"/><path class="cls-1" d="M13.72,5.15a.45.45,0,0,0-.44-.34l0,.08h-.1a.46.46,0,0,0-.34.54,22.63,22.63,0,0,1,.58,5.38,18.5,18.5,0,0,1-.35,3.4,7.35,7.35,0,0,0,1.12-1.11,18.59,18.59,0,0,0,.16-2.36A23.88,23.88,0,0,0,13.72,5.15Z"/><path class="cls-1" d="M8.06,6.56H8a.46.46,0,0,0-.37.52,17.65,17.65,0,0,1-.07,6.52.45.45,0,0,0,.35.53H8a.44.44,0,0,0,.44-.35A17.94,17.94,0,0,0,8.5,6.93.43.43,0,0,0,8.06,6.56Z"/></svg> -\ No newline at end of file -diff --git a/pam-biometric/data/org.freedesktop.plicykit.pkexec.bioctl-helper.policy.in b/pam-biometric/data/org.freedesktop.plicykit.pkexec.bioctl-helper.policy.in -index 62c21b6..917979d 100644 ---- a/pam-biometric/data/org.freedesktop.plicykit.pkexec.bioctl-helper.policy.in -+++ b/pam-biometric/data/org.freedesktop.plicykit.pkexec.bioctl-helper.policy.in -@@ -8,9 +8,11 @@ - <description>Run the biometric authentication control tool</description> - <description xml:lang="zh">运行生物识别认证控制工具</description> - <description xml:lang="bo">འཁོར་སྐྱོད་སྐྱེ་དངོས་ཀྱི་ངོས་འཛིན་ཁས་ལེན་ཚོད་འཛིན་ཡོ་བྱད།།</description> -+ <description xml:lang="mn">ᠠᠵᠢᠯᠯᠠᠭᠠᠨ ᠤ ᠠᠮᠢᠳᠤ ᠪᠣᠳᠠᠰ ᠢ ᠢᠯᠭᠠᠨ ᠲᠠᠨᠢᠵᠤ ᠭᠡᠷᠡᠴᠢᠯᠡᠬᠦ ᠡᠵᠡᠮᠳᠡᠯ ᠦᠨ ᠪᠠᠭᠠᠵᠢ ᠶᠢ ᠢᠯᠭᠠᠨ ᠲᠠᠨᠢᠬᠤ ᠬᠡᠷᠡᠭᠲᠡᠶ ᠃</description> - <message>Authentication is required to enable or disable biometric authentication</message> - <message xml:lang="zh">开启或关闭生物识别认证需要进行身份验证</message> - <message xml:lang="bo">སྒོ་རྒྱག་པའམ་ཡང་ན་སྒོ་རྒྱག་པའི་སྐྱེ་དངོས་ངོས་འཛིན་བདེན་དཔངར་སྤྲོད་བྱེད་པར་ཐོབ་ཐང་གི་ཚོད་ལྟསར་སྤྲོད་བྱ་དགོས།</message> -+ <message xml:lang="mn">ᠠᠮᠢᠳᠤ ᠪᠣᠳᠠᠰ ᠢ ᠢᠯᠭᠠᠨ ᠲᠠᠨᠢᠬᠤ ᠭᠡᠷᠡᠴᠢᠯᠡᠭᠡ ᠶᠢ ᠨᠡᠭᠡᠭᠡᠬᠦ ᠪᠤᠶᠤ ᠬᠠᠭᠠᠬᠤ ᠳᠤ ᠪᠡᠶᠡ ᠶᠢᠨ ᠭᠠᠷᠤᠯ ᠤᠨ ᠭᠡᠷᠡᠴᠢᠯᠡᠯ ᠬᠢᠬᠦ ᠴᠢᠬᠤᠯᠠ ᠲᠠᠶ ᠪᠠᠶᠢᠨᠠ᠃</message> - <icon_name>stock_person</icon_name> - <defaults> - <allow_any>no</allow_any> -diff --git a/pam-biometric/data/org.freedesktop.plicykit.pkexec.biodrvctl.policy.in b/pam-biometric/data/org.freedesktop.plicykit.pkexec.biodrvctl.policy.in -index aed20c3..708011b 100644 ---- a/pam-biometric/data/org.freedesktop.plicykit.pkexec.biodrvctl.policy.in -+++ b/pam-biometric/data/org.freedesktop.plicykit.pkexec.biodrvctl.policy.in -@@ -8,9 +8,11 @@ - <description>Run the biometric device driver control tool</description> - <description xml:lang="zh">运行生物识别设备驱动控制工具</description> - <description xml:lang="bo">སྐྱ་དངོས་དབྱེ་འབྱེད་སྒྲག་ཆས་ཀྱི་ཁ་ལོ་བའི་ཚོད་འཛིན་ཡོ་བྱད་</description> -+ <description xml:lang="mn">ᠠᠮᠢᠳᠤ ᠪᠣᠳᠠᠰ ᠢ ᠢᠯᠭᠠᠨ ᠲᠠᠨᠢᠬᠤ ᠲᠥᠬᠥᠭᠡᠷᠦᠮᠵᠢ ᠪᠡᠷ ᠬᠥᠳᠡᠯᠭᠡᠭᠦᠷ ᠪᠣᠯᠭᠠᠬᠤ ᠡᠵᠡᠮᠳᠡᠯ ᠦᠨ ᠪᠠᠭᠠᠵᠢ ᠶᠢ ᠠᠵᠢᠯᠯᠠᠭᠤᠯᠤᠨᠠ ᠃</description> - <message>Authentication is required to change the status of biometric device's driver</message> - <message xml:lang="zh">改变生物识别设备驱动状态需要进行身份验证</message> -- <message xml:lang="bo">སྐྱ་དངོས་དབྱེ་འབྱེད་སྒྲག་ཆས་ཀྱི་ཁ་ལོ་བའི་གནས་ཚུལ་ལ་འགྱུར་ལྡོག་གཏོང་བར་བདེན་དཔང་ར་སྤྲད་བྱ་དགོས།</message> -+ <message xml:lang="bo">སྐྱ་དངོས་དབྱེ་འབྱེད་སྒྲག་ཆས་ཀྱི་ཁ་ལོ་བའི་གནས་ཚུལ་ལ་འགྱུར་ལྡོག་གཏོང་བར་བདེན་དཔང་ར་སྤྲད་བྱ་དགོས།</message> -+ <message xml:lang="mn">ᠠᠮᠢᠳᠤ ᠪᠣᠳᠠᠰ ᠢ ᠢᠯᠭᠠᠨ ᠲᠠᠨᠢᠬᠤ ᠲᠥᠬᠥᠭᠡᠷᠦᠮᠵᠢ ᠶᠢᠨ ᠬᠥᠳᠡᠯᠭᠡᠭᠦᠷ ᠪᠣᠯᠭᠠᠬᠤ ᠪᠠᠶᠢᠳᠠᠯ ᠢ ᠬᠤᠪᠢᠷᠠᠭᠤᠯᠬᠤ ᠳᠤ ᠪᠡᠶᠡ ᠶᠢᠨ ᠭᠠᠷᠤᠯ ᠤᠨ ᠭᠡᠷᠡᠴᠢᠯᠡᠯ ᠬᠢᠬᠦ ᠴᠢᠬᠤᠯᠠ ᠲᠠᠶ ᠪᠠᠶᠢᠬᠤ ᠬᠡᠷᠡᠭᠲᠡᠶ᠃</message> - <icon_name>stock_person</icon_name> - <defaults> - <allow_any>auth_admin</allow_any> -diff --git a/pam-biometric/data/org.freedesktop.plicykit.pkexec.biorestart.policy.in b/pam-biometric/data/org.freedesktop.plicykit.pkexec.biorestart.policy.in -index cbad164..0c5cf79 100644 ---- a/pam-biometric/data/org.freedesktop.plicykit.pkexec.biorestart.policy.in -+++ b/pam-biometric/data/org.freedesktop.plicykit.pkexec.biorestart.policy.in -@@ -8,9 +8,11 @@ - <description>Restart Service</description> - <description xml:lang="zh">重启生物特征服务</description> - <description xml:lang="bo">བསྐྱར་དུ་ཞབས་འདེགས་ཞུ་བ</description> -+ <description xml:lang="mn">ᠠᠮᠢᠳᠤ ᠪᠣᠳᠠᠰ ᠤᠨ ᠣᠨᠴᠠᠯᠢᠭ ᠤᠨ ᠦᠢᠯᠡᠴᠢᠯᠡᠭᠡ ᠶᠢ ᠳᠠᠬᠢᠨ ᠡᠭᠢᠯᠡᠭᠦᠯᠪᠡ᠃</description> - <message>Authentication is required to restart biometric service</message> - <message xml:lang="zh">重启生物特征服务需要身份验证</message> -- <message xml:lang="bo">སྐྱ་དངོས་དབྱེ་འབྱེད་ཞབས་ཞུ་སླར་གསོ་བྱེད་པར་བདེན་དཔང་ར་སྤྲད་བྱ་དགོས།</message> -+ <message xml:lang="bo">སྐྱ་དངོས་དབྱེ་འབྱེད་ཞབས་ཞུ་སླར་གསོ་བྱེད་པར་བདེན་དཔང་ར་སྤྲད་བྱ་དགོས།</message> -+ <message xml:lang="mn">ᠠᠮᠢᠳᠤ ᠪᠣᠳᠠᠰ ᠤᠨ ᠣᠨᠴᠠᠯᠢᠭ ᠰᠢᠨᠵᠢ ᠲᠡᠮᠳᠡᠭ ᠦᠨ ᠦᠢᠯᠡᠴᠢᠯᠡᠭᠡ ᠶᠢ ᠳᠠᠬᠢᠨ ᠰᠡᠩᠬᠡᠷᠡᠭᠦᠯᠬᠦ ᠳᠦ ᠪᠡᠶᠡ ᠶᠢᠨ ᠭᠠᠷᠤᠯ ᠢ ᠰᠢᠯᠭᠠᠨ ᠭᠡᠷᠡᠴᠢᠯᠡᠬᠦ ᠴᠢᠬᠤᠯᠠ ᠲᠠᠶ ᠪᠠᠶᠢᠨᠠ ᠃</message> - <icon_name>stock_person</icon_name> - <defaults> - <allow_any>auth_admin</allow_any> -diff --git a/pam-biometric/data/ukui-biometric.conf b/pam-biometric/data/ukui-biometric.conf -index e96090b..0d1c89c 100644 ---- a/pam-biometric/data/ukui-biometric.conf -+++ b/pam-biometric/data/ukui-biometric.conf -@@ -8,6 +8,7 @@ isShownInControlCenter=false - UseFirstDevice=true - MaxFailedTimes=5 - HiddenSwitchButton=false -+FaceTimeoutTimes=1 - - [Functions] - EnableQRCode=true -diff --git a/polkit-agent/CMakeLists.txt b/polkit-agent/CMakeLists.txt -index fa7768e..c5065d1 100644 ---- a/polkit-agent/CMakeLists.txt -+++ b/polkit-agent/CMakeLists.txt -@@ -6,6 +6,7 @@ pkg_check_modules(KDKINFO REQUIRED kysdk-sysinfo) - - find_package(PolkitQt5-1 REQUIRED 0.103.0) - find_package(Qt5 COMPONENTS Core Widgets DBus X11Extras Xml Network Svg) -+find_package(KF5WindowSystem) - set(CMAKE_AUTOMOC ON) - set(CMAKE_AUTOUIC ON) - set(CMAKE_AUTORCC ON) -@@ -59,7 +60,7 @@ set(polkit_SRCS - - add_executable(polkit-ukui-authentication-agent-1 ${polkit_SRCS}) - target_link_libraries(polkit-ukui-authentication-agent-1 -- Qt5::Core Qt5::Widgets Qt5::DBus ${EXTRA_LIBS} -+ Qt5::Core Qt5::Widgets Qt5::DBus ${EXTRA_LIBS} KF5::WindowSystem - ${POLKITQT-1_LIBRARIES} - BioAuthWidgets - -lrt -diff --git a/polkit-agent/i18n_ts/bo_CN.ts b/polkit-agent/i18n_ts/bo_CN.ts -index 75bd971..2b67f3f 100644 ---- a/polkit-agent/i18n_ts/bo_CN.ts -+++ b/polkit-agent/i18n_ts/bo_CN.ts -@@ -67,7 +67,7 @@ - <message> - <location filename="../src/mainwindow.cpp" line="65"/> - <source>Authentication</source> -- <translation>བདེན་དཔང་ར་སྤྲོད་</translation> -+ <translation>དབང་བསྐུར།</translation> - </message> - <message> - <source>Fingerprint authentication failed, you still have %1 verification opportunities</source> -@@ -95,12 +95,12 @@ - <location filename="../src/mainwindow.cpp" line="882"/> - <location filename="../src/mainwindow.cpp" line="948"/> - <source>Biometric</source> -- <translation>སྐྱེ་དངོས་རིག་པ།</translation> -+ <translation>སྐྱེ་དངོས་དབྱེ་འབྱེད་བཀོལ་བ།</translation> - </message> - <message> - <location filename="../src/mainwindow.ui" line="373"/> - <source>use password</source> -- <translation>གསང་གྲངས་བེད་སྤྱོད་བྱ་དགོས</translation> -+ <translation>གསང་གྲངས་བེད་སྤྱོད་བྱ་དགོས།</translation> - </message> - <message> - <source>DeviceType:</source> -@@ -156,13 +156,13 @@ - <location filename="../src/mainwindow.ui" line="353"/> - <location filename="../src/mainwindow.cpp" line="880"/> - <source>Authenticate</source> -- <translation>བདེན་དཔང་ར་སྤྲོད་བྱ་དགོས</translation> -+ <translation>དབང་བསྐུར་བ།</translation> - </message> - <message> - <location filename="../src/mainwindow.cpp" line="886"/> - <location filename="../src/mainwindow.cpp" line="991"/> - <source>Use password</source> -- <translation>གསང་གྲངས་བེད་སྤྱོད་བྱ་དགོས</translation> -+ <translation>གསང་གྲངས་བེད་སྤྱོད་བྱ་དགོས།</translation> - </message> - <message> - <source>Auth</source> -@@ -189,7 +189,7 @@ - <location filename="../src/mainwindow.cpp" line="1093"/> - <location filename="../src/mainwindow.cpp" line="1094"/> - <source>Please try again in %1 minutes.</source> -- <translation>ཁྱོད་ཀྱིས་ཡང་བསྐྱར་ཐེངས་གཅིག་ལ་ཚོད་ལྟ་ཞིག་བྱེད་རོགས།</translation> -+ <translation>%1ཡང་བསྐྱར་ཚོད་ལྟ་ཞིག་བྱེད་རོགས།</translation> - </message> - <message> - <location filename="../src/mainwindow.cpp" line="1036"/> -@@ -237,37 +237,37 @@ - <message> - <location filename="../src/mainwindow.cpp" line="261"/> - <source>Please enter your password or enroll your fingerprint </source> -- <translation>ཁྱེད་ཀྱི་གསང་གྲངས་ནང་འཇུག་བྱེད་པའམ་ཡང་ན་ཁྱེད་ཀྱི་མཛུབ་རིས </translation> -+ <translation>ཁྱེད་ཀྱི་གསང་གྲངས་ནང་འཇུག་བྱེད་པའམ་ཡང་ན་ཁྱེད་ཀྱི་མཛུབ་རིས་ནང་འཇུག་བྱེད་པ། </translation> - </message> - <message> - <location filename="../src/mainwindow.cpp" line="187"/> - <source>Abnormal network</source> -- <translation>རྒྱུན་ལྡན་མིན་པའི་དྲ་</translation> -+ <translation>རྒྱུན་ལྡན་མིན་པའི་དྲ་བ།</translation> - </message> - <message> - <location filename="../src/mainwindow.cpp" line="511"/> - <source>This operation requires the administrator's authorization. Please enter your password to allow this operation.</source> -- <translation>བྱ་སྤྱོད་འདི་ལ་དོ་དམ་པས་དབང་ཆ་སྤྲོད་དགོས། ཁྱེད་ཀྱི་གསང་གྲངས་ནང་དུ་བཅུག་ནས་གཤག་བཅོས་འདི་བྱེད་དུ་འཇུག་རོགས།</translation> -+ <translation>ཐེངས་འདིའི་བཀོལ་སྤྱོད་ལ་དོ་དམ་པའི་དབང་ཆ་ཐོབ་ན་ད་གཟོད་མུ་མཐུད་དུ་ལག་བསྟར་བྱེད་ཐུབ།གསང་གྲངས་ནང་འཇུག་བྱས་ནས་ཐེངས་འདིའི་བཀོལ་སྤྱོད་བྱེད་ཆོག</translation> - </message> - <message> - <location filename="../src/mainwindow.cpp" line="580"/> - <source>_Password: </source> -- <translation>_Password་ནི། </translation> -+ <translation>གསང་གྲངས། </translation> - </message> - <message> - <location filename="../src/mainwindow.cpp" line="582"/> - <source>_Password:</source> -- <translation>_Password་ནི།</translation> -+ <translation>གསང་གྲངས།:</translation> - </message> - <message> - <location filename="../src/mainwindow.cpp" line="691"/> - <source>Authentication failed, please try again.</source> -- <translation>བདེན་དཔང་ར་སྤྲོད་བྱེད་མ་ཐུབ་པས་ཁྱེད་ཀྱིས་ཡང་བསྐྱར་ཚོད་ལྟ་ཞིག་བྱེད་</translation> -+ <translation>བདེན་དཔང་ར་སྤྲོད་ལ་ཕམ་ཁ་བྱུང་བས་ཡང་བསྐྱར་ཚོད་ལྟ་བྱོས།</translation> - </message> - <message> - <location filename="../src/mainwindow.cpp" line="623"/> - <source>days left</source> -- <translation>ཉིན་ཁ་ཤས་ལས་ལྷག་མེད</translation> -+ <translation>གནམ་རྒྱབ་ཟྭ་འབྱེད།</translation> - </message> - <message> - <source>Biometric/code scan authentication failed too many times, please enter the password.</source> -@@ -296,7 +296,7 @@ - <message> - <location filename="../src/mainwindow.cpp" line="517"/> - <source>A program is attempting to perform an action that requires privileges.It requires authorization to perform the action.</source> -- <translation>གོ་རིམ་ཞིག་གིས་དམིགས་བསལ་དབང་ཆ་དགོས་པའི་བྱ་སྤྱོད་ཅིག་སྤེལ་རྩིས་བྱེད་བཞིན་ཡོད། དེས་བྱ་སྤྱོད་སྤེལ་བའི་དབང་ཆ་སྤྲོད་དགོས།</translation> -+ <translation>གོ་རིམ་ཞིག་གིས་ཁྱད་དབང་དགོས་པའི་འགུལ་སྟངས་ཤིག་ལག་བསྟར་བྱེད་པར་ཚོད་ལྟ་བྱེད་བཞིན་ཡོད་པ་དང་།་འགུལ་སྟངས་འདི་ལག་བསྟར་བྱེད་པའི་དབང་ཆ་སྤྲོད་དགོས་པའི་རེ་བ་བཏོན།</translation> - </message> - <message> - <location filename="../src/mainwindow.cpp" line="576"/> -@@ -304,59 +304,49 @@ - <translation>ནང་འཇུག་གི་གསང་གྲངས།</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="104"/> -- <source>Insert the ukey into the USB port</source> -- <translation>བདེ་འཇགས་ཀྱི་གསང་བའི་ལྡེ་མིག་དེ་USBཡི་སྣེ་འདྲེན་དུ་འཇུག་རོགས།</translation> -- </message> -- <message> -- <location filename="../src/mainwindow.cpp" line="106"/> -- <source>Enter the ukey password</source> -- <translation>གསང་བའི་ཨང་གྲངས་ནང་འཇུག་བྱེད་པ།</translation> -- </message> -- <message> -- <location filename="../src/mainwindow.cpp" line="764"/> -+ <location filename="../src/mainwindow.cpp" line="627"/> - <source>hours left</source> - <translation>དུས་ཚོད་འགའ་ལས་ལྷག་མེད</translation> - </message> - <message> - <location filename="../src/mainwindow.cpp" line="631"/> - <source>minutes left</source> -- <translation>སྐར་མ་འགའ་ལས་ལྷག་མེད</translation> -+ <translation>སྐར་མ་རྗེས་ནས་ཟྭ་ཕྱེ།</translation> - </message> - <message> - <location filename="../src/mainwindow.cpp" line="635"/> - <source>seconds left</source> -- <translation>གཡོན་ཕྱོགས་ཀྱི་དུས་ཚོད་སྐར་ཆ</translation> -+ <translation>སྐར་ཆའི་རྗེས་ནས་ཟྭ་ཕྱེ་བ།</translation> - </message> - <message> - <location filename="../src/mainwindow.cpp" line="1193"/> - <source>Verify face recognition or enter password to unlock</source> -- <translation>ངོ་གདོང་ངོས་འཛིན་ལ་ཞིབ་བཤེར་བྱེད་པའམ་ཡང་ན་གསང་གྲངས་ནང་</translation> -+ <translation>དཔང་མིའི་གདོང་ལ་ཞིབ་བཤེར་བྱེད་པའམ་ཡང་ན་གསང་གྲངས་བསྣན་ནས་ཟྭ་འབྱེད་པ།</translation> - </message> - <message> - <location filename="../src/mainwindow.cpp" line="1198"/> - <source>Press fingerprint or enter password to unlock</source> -- <translation>མཛུབ་རིས་མནན་པའམ་ཡང་ན་གསང་གྲངས་ནང་འཇུག་བྱས་ནས་</translation> -+ <translation>མཛུབ་རིས་མནན་པའམ་ཡང་ན་གསང་གྲངས་བསྣན་ནས་ཟྭ་འབྱེད་པ།</translation> - </message> - <message> - <location filename="../src/mainwindow.cpp" line="1203"/> - <source>Verify voiceprint or enter password to unlock</source> -- <translation>སྒྲ་པར་ཞིབ་བཤེར་བྱེད་པའམ་ཡང་ན་གསང་གྲངས་ནང་འཇུག་བྱས་ནས་ཟྭ་རྒྱག</translation> -+ <translation>སྒྲ་རིས་ར་སྤྲོད་བྱེད་པའམ་ཡང་ན་གསང་གྲངས་བསྣན་ནས་ཟྭ་འབྱེད་པ།</translation> - </message> - <message> - <location filename="../src/mainwindow.cpp" line="1208"/> - <source>Verify finger vein or enter password to unlock</source> -- <translation>མཛུབ་མོའི་ནང་དུ་ཞིབ་བཤེར་བྱེད་པའམ་ཡང་ན་གསང་གྲངས་ནང་འཇུག་བྱས་</translation> -+ <translation>ཚོད་ལྟས་ར་སྤྲོད་བྱེད་པ་ནི་སྡོད་རྩ་དང་གསང་གྲངས་བསྣན་ནས་ཟྭ་འབྱེད་པ་དེ་ཡིན།</translation> - </message> - <message> - <location filename="../src/mainwindow.cpp" line="1213"/> - <source>Verify iris or enter password to unlock</source> -- <translation>iris ཞིབ་བཤེར་བྱེད་པའམ་ཡང་ན་གསང་གྲངས་ནང་འཇུག་བྱས་ནས་ཟྭ་</translation> -+ <translation>འཇའ་སྐྱི་ར་སྤྲོད་བྱེད་པའམ་ཡང་ན་གསང་གྲངས་བསྣན་ནས་ཟྭ་འབྱེད་པ།</translation> - </message> - <message> - <location filename="../src/mainwindow.cpp" line="1218"/> - <source>Use the bound wechat scanning code or enter the password to unlock</source> -- <translation>འབྲེལ་མཐུད་ཀྱི་འཕྲིན་ཕྲན་ཞིབ་བཤེར་ཨང་གྲངས་སམ་ཡང་ན་གསང་གྲངས་ནང་འཇུག་བྱས་ནས་ཟྭ་རྒྱག་པ།</translation> -+ <translation>སྦྲེལ་ཡོད་པའི་སྐད་འཕྲིན་གྱི་ཨང་གྲངས་སམ་གསང་གྲངས་བསྣན་ནས་ཟྭ་འབྱེད་དགོས།</translation> - </message> - <message> - <source>Use the bound wechat scanning code or enter the password to log in</source> -@@ -380,17 +370,17 @@ - <message> - <location filename="../src/PolkitListener.cpp" line="88"/> - <source>Another client is already authenticating, please try again later.</source> -- <translation>མངགས་བཅོལ་བྱེད་མཁན་གཞན་ཞིག་གིས་བདེན་དཔང་ར་སྤྲོད་བྱེད་བཞིན་ཡོད། ཅུང་ཙམ་འགོར་རྗེས་ཡང་བསྐྱར་ཚོད་ལྟ</translation> -+ <translation>མཁོ་མཁན་གཞན་པ་ཞིག་གིས་བདེན་དཔང་ར་སྤྲོད་བྱེད་བཞིན་ཡོད།ཅུང་ཙམ་འགོར་རྗེས་ཡང་བསྐྱར་ཚོད་ལྟ་བྱོས།</translation> - </message> - <message> - <location filename="../src/PolkitListener.cpp" line="257"/> - <source>Authentication failure, please try again.</source> -- <translation>བདེན་དཔང་ར་སྤྲོད་བྱེད་མ་ཐུབ་ན་ཁྱེད་ཀྱིས་ཡང་བསྐྱར་ཚོད་ལྟ་</translation> -+ <translation>བདེན་དཔང་ར་སྤྲོད་བྱེད་མ་ཐུབ་ན་ཁྱེད་ཀྱིས་ཡང་བསྐྱར་ཚོད་ལྟ་བྱེད།</translation> - </message> - <message> - <location filename="../src/PolkitListener.cpp" line="264"/> - <source>Password input error!</source> -- <translation>གསང་གྲངས་ནང་འཇུག་ནོར་འཁྲུལ་བྱུང་བ་རེད</translation> -+ <translation>གསང་གྲངས་ནང་འཇུག་ནོར་འཁྲུལ་བྱུང་བ་རེད།</translation> - </message> - <message> - <source>Account locked %1 minutes due to %2 fail attempts</source> -diff --git a/polkit-agent/i18n_ts/de.ts b/polkit-agent/i18n_ts/de.ts -new file mode 100644 -index 0000000..8017b6c ---- /dev/null -+++ b/polkit-agent/i18n_ts/de.ts -@@ -0,0 +1,421 @@ -+<?xml version="1.0" encoding="utf-8"?> -+<!DOCTYPE TS> -+<TS version="2.1" language="de"> -+<context> -+ <name>BioAuthWidget</name> -+ <message> -+ <source>Retry</source> -+ <translation type="obsolete">重试</translation> -+ </message> -+ <message> -+ <source>%1 too many unsuccessful attempts,please enter password.</source> -+ <translation type="obsolete">%1验证失败达最大次数,请使用密码登录</translation> -+ </message> -+ <message> -+ <source>%1 authentication failure,there are still %2 remaining opportunities</source> -+ <translation type="obsolete">%1认证失败,还剩%2次尝试机会</translation> -+ </message> -+ <message> -+ <source>Please use wechat to scan the code</source> -+ <translation type="vanished">请使用微信扫码</translation> -+ </message> -+</context> -+<context> -+ <name>BioDevices</name> -+ <message> -+ <source>FingerPrint</source> -+ <translation type="obsolete">指纹</translation> -+ </message> -+ <message> -+ <source>FingerVein</source> -+ <translation type="obsolete">指静脉</translation> -+ </message> -+ <message> -+ <source>Iris</source> -+ <translation type="obsolete">虹膜</translation> -+ </message> -+ <message> -+ <source>Face</source> -+ <translation type="obsolete">人脸</translation> -+ </message> -+ <message> -+ <source>VoicePrint</source> -+ <translation type="obsolete">声纹</translation> -+ </message> -+ <message> -+ <source>Wechat</source> -+ <translation type="vanished">微信</translation> -+ </message> -+ <message> -+ <source>QRCode</source> -+ <translation type="vanished">二维码</translation> -+ </message> -+</context> -+<context> -+ <name>LoginOptionsWidget</name> -+ <message> -+ <source>Login Options</source> -+ <translation type="vanished">登录选项</translation> -+ </message> -+ <message> -+ <source>Wechat</source> -+ <translation type="vanished">微信</translation> -+ </message> -+</context> -+<context> -+ <name>MainWindow</name> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="65"/> -+ <source>Authentication</source> -+ <translation>Authentifizierung</translation> -+ </message> -+ <message> -+ <source>Fingerprint authentication failed, you still have %1 verification opportunities</source> -+ <translation type="vanished">指纹验证失败,您还有%1次尝试机会</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.ui" line="26"/> -+ <source>Form</source> -+ <translation></translation> -+ </message> -+ <message> -+ <source>More</source> -+ <translation type="obsolete">更多</translation> -+ </message> -+ <message> -+ <source>Restart</source> -+ <translation type="obsolete">重新开始</translation> -+ </message> -+ <message> -+ <source>Password</source> -+ <translation type="vanished">密码</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.ui" line="302"/> -+ <location filename="../src/mainwindow.cpp" line="882"/> -+ <location filename="../src/mainwindow.cpp" line="948"/> -+ <source>Biometric</source> -+ <translation>Biometrisch</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.ui" line="373"/> -+ <source>use password</source> -+ <translation>Passwort verwenden</translation> -+ </message> -+ <message> -+ <source>DeviceType:</source> -+ <translation type="obsolete">设备类型:</translation> -+ </message> -+ <message> -+ <source>Back</source> -+ <translation type="obsolete">返回</translation> -+ </message> -+ <message> -+ <source>Details</source> -+ <translation type="vanished">详细</translation> -+ </message> -+ <message> -+ <source>Action Id:</source> -+ <translation type="obsolete">动作:</translation> -+ </message> -+ <message> -+ <source>Description:</source> -+ <translation type="vanished">描述:</translation> -+ </message> -+ <message> -+ <source>Polkit.subject-pid:</source> -+ <translation type="vanished">Polkit.subject-pid:</translation> -+ </message> -+ <message> -+ <source>Retry</source> -+ <translation type="obsolete">重试</translation> -+ </message> -+ <message> -+ <source>Device types:</source> -+ <translation type="obsolete">设备类型:</translation> -+ </message> -+ <message> -+ <source>Vendor:</source> -+ <translation type="vanished">发行商:</translation> -+ </message> -+ <message> -+ <source>Action:</source> -+ <translation type="vanished">动作:</translation> -+ </message> -+ <message> -+ <source>Polkit.caller-pid:</source> -+ <translation type="vanished">Polkit.caller-pid:</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.ui" line="334"/> -+ <location filename="../src/mainwindow.cpp" line="884"/> -+ <source>Cancel</source> -+ <translation>Abbrechen</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.ui" line="353"/> -+ <location filename="../src/mainwindow.cpp" line="880"/> -+ <source>Authenticate</source> -+ <translation>Beglaubigen</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="886"/> -+ <location filename="../src/mainwindow.cpp" line="991"/> -+ <source>Use password</source> -+ <translation>Passwort verwenden</translation> -+ </message> -+ <message> -+ <source>Auth</source> -+ <translation type="obsolete">授权</translation> -+ </message> -+ <message> -+ <source>Too many unsuccessful attempts,please enter password.</source> -+ <translation type="vanished">指纹验证失败达最大次数,请使用密码解锁</translation> -+ </message> -+ <message> -+ <source>%1 authentication failure,there are still %2 remaining opportunities</source> -+ <translation type="vanished">%1认证失败,还剩%2次尝试机会</translation> -+ </message> -+ <message> -+ <source>%1 too many unsuccessful attempts,please enter password.</source> -+ <translation type="vanished">%1验证失败达最大次数,请使用密码登录</translation> -+ </message> -+ <message> -+ <source>in authentication, please wait...</source> -+ <translation type="vanished">认证中,请稍等...</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="1026"/> -+ <location filename="../src/mainwindow.cpp" line="1093"/> -+ <location filename="../src/mainwindow.cpp" line="1094"/> -+ <source>Please try again in %1 minutes.</source> -+ <translation>Versuchen Sie es in %1 Minuten erneut.</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="1036"/> -+ <location filename="../src/mainwindow.cpp" line="1103"/> -+ <location filename="../src/mainwindow.cpp" line="1104"/> -+ <source>Please try again in %1 seconds.</source> -+ <translation>Bitte versuchen Sie es in %1 Sekunden erneut.</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="1045"/> -+ <location filename="../src/mainwindow.cpp" line="1046"/> -+ <location filename="../src/mainwindow.cpp" line="1112"/> -+ <location filename="../src/mainwindow.cpp" line="1113"/> -+ <source>Account locked permanently.</source> -+ <translation>Das Konto wurde dauerhaft gesperrt.</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="675"/> -+ <location filename="../src/mainwindow.cpp" line="676"/> -+ <source>Password cannot be empty</source> -+ <translation>Das Kennwort darf nicht leer sein.</translation> -+ </message> -+ <message> -+ <source>Failed to verify %1, please enter password.</source> -+ <translation type="vanished">验证%1失败,请输入密码.</translation> -+ </message> -+ <message> -+ <source>Unable to verify %1, please enter password.</source> -+ <translation type="vanished">无法验证%1,请输入密码.</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="175"/> -+ <source>Failed to verify %1, you still have %2 verification opportunities</source> -+ <translation>%1 konnte nicht verifiziert werden, Sie haben immer noch %2 Überprüfungsmöglichkeiten</translation> -+ </message> -+ <message> -+ <source>An application is attempting to perform an action that requires privileges. Authentication is required to perform this action.</source> -+ <translation type="vanished">一个程序正试图执行一个需要特权的动作。要求授权以执行该动作。</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="578"/> -+ <source>Password: </source> -+ <translation>Passwort: </translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="261"/> -+ <source>Please enter your password or enroll your fingerprint </source> -+ <translation>Bitte geben Sie Ihr Passwort ein oder registrieren Sie Ihren Fingerabdruck </translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="187"/> -+ <source>Abnormal network</source> -+ <translation>Ungewöhnliches Netzwerk</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="511"/> -+ <source>This operation requires the administrator's authorization. Please enter your password to allow this operation.</source> -+ <translation>Für diesen Vorgang ist die Autorisierung des Administrators erforderlich. Bitte geben Sie Ihr Passwort ein, um diesen Vorgang zuzulassen.</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="580"/> -+ <source>_Password: </source> -+ <translation>_Passwort: </translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="582"/> -+ <source>_Password:</source> -+ <translation>_Passwort:</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="691"/> -+ <source>Authentication failed, please try again.</source> -+ <translation>Authentifizierung fehlgeschlagen, bitte versuchen Sie es erneut.</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="623"/> -+ <source>days left</source> -+ <translation>Verbleibende Tage</translation> -+ </message> -+ <message> -+ <source>Biometric/code scan authentication failed too many times, please enter the password.</source> -+ <translation type="vanished">生物/扫码验证失败达最大次数,请使用密码解锁.</translation> -+ </message> -+ <message> -+ <source>Bioauth/code scan authentication failed, you still have %1 verification opportunities</source> -+ <translation type="vanished">生物/扫码验证失败,您还有%1次尝试机会</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="164"/> -+ <location filename="../src/mainwindow.cpp" line="1176"/> -+ <source>Failed to verify %1, please enter password to unlock</source> -+ <translation>%1 konnte nicht verifiziert werden, bitte geben Sie das Kennwort zum Entsperren ein</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="168"/> -+ <location filename="../src/mainwindow.cpp" line="1178"/> -+ <source>Unable to verify %1, please enter password to unlock</source> -+ <translation>%1 kann nicht verifiziert werden, bitte geben Sie das Kennwort zum Entsperren ein</translation> -+ </message> -+ <message> -+ <source>NET Exception</source> -+ <translation type="vanished">网络异常</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="517"/> -+ <source>A program is attempting to perform an action that requires privileges.It requires authorization to perform the action.</source> -+ <translation>Ein Programm versucht, eine Aktion auszuführen, für die Berechtigungen erforderlich sind. Zum Ausführen der Aktion ist eine Autorisierung erforderlich.</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="576"/> -+ <source>Input Password</source> -+ <translation>Passwort eingeben</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="627"/> -+ <source>hours left</source> -+ <translation>Verbleibende Stunden</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="631"/> -+ <source>minutes left</source> -+ <translation>Noch Minuten</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="635"/> -+ <source>seconds left</source> -+ <translation>Verbleibende Sekunden</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="1193"/> -+ <source>Verify face recognition or enter password to unlock</source> -+ <translation>Überprüfen Sie die Gesichtserkennung oder geben Sie das Passwort ein, um zu entsperren</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="1198"/> -+ <source>Press fingerprint or enter password to unlock</source> -+ <translation>Drücken Sie den Fingerabdruck oder geben Sie das Passwort ein, um zu entsperren</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="1203"/> -+ <source>Verify voiceprint or enter password to unlock</source> -+ <translation>Überprüfen Sie den Stimmabdruck oder geben Sie das Passwort ein, um zu entsperren</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="1208"/> -+ <source>Verify finger vein or enter password to unlock</source> -+ <translation>Überprüfen Sie die Fingervene oder geben Sie das Passwort ein, um zu entsperren</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="1213"/> -+ <source>Verify iris or enter password to unlock</source> -+ <translation>Überprüfen Sie die Iris oder geben Sie das Passwort ein, um zu entsperren</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="1218"/> -+ <source>Use the bound wechat scanning code or enter the password to unlock</source> -+ <translation>Verwenden Sie den gebundenen Wechat-Scan-Code oder geben Sie das Passwort zum Entsperren ein</translation> -+ </message> -+ <message> -+ <source>Use the bound wechat scanning code or enter the password to log in</source> -+ <translation type="vanished">使用绑定的微信扫码或输入密码登录</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="623"/> -+ <location filename="../src/mainwindow.cpp" line="627"/> -+ <location filename="../src/mainwindow.cpp" line="631"/> -+ <location filename="../src/mainwindow.cpp" line="635"/> -+ <source>Account locked,</source> -+ <translation>Konto gesperrt,</translation> -+ </message> -+ <message> -+ <source>Authentication failed, please try again</source> -+ <translation type="obsolete">认证失败,请重试</translation> -+ </message> -+</context> -+<context> -+ <name>PolkitListener</name> -+ <message> -+ <location filename="../src/PolkitListener.cpp" line="88"/> -+ <source>Another client is already authenticating, please try again later.</source> -+ <translation>Ein anderer Client authentifiziert sich bereits, bitte versuchen Sie es später noch einmal.</translation> -+ </message> -+ <message> -+ <location filename="../src/PolkitListener.cpp" line="257"/> -+ <source>Authentication failure, please try again.</source> -+ <translation>Authentifizierungsfehler, bitte versuchen Sie es erneut.</translation> -+ </message> -+ <message> -+ <location filename="../src/PolkitListener.cpp" line="264"/> -+ <source>Password input error!</source> -+ <translation>Fehler bei der Passworteingabe!</translation> -+ </message> -+ <message> -+ <source>Account locked %1 minutes due to %2 fail attempts</source> -+ <translation type="vanished">账户锁定%1分钟由于%2次错误尝试</translation> -+ </message> -+ <message> -+ <source>Authentication failure,there are still %1 remaining opportunities</source> -+ <translation type="vanished">认证失败,还剩余%1次尝试机会</translation> -+ </message> -+</context> -+<context> -+ <name>QObject</name> -+ <message> -+ <source>FingerPrint</source> -+ <translation type="obsolete">指纹</translation> -+ </message> -+ <message> -+ <source>FingerVein</source> -+ <translation type="obsolete">指静脉</translation> -+ </message> -+ <message> -+ <source>Iris</source> -+ <translation type="obsolete">虹膜</translation> -+ </message> -+ <message> -+ <source>Face</source> -+ <translation type="obsolete">人脸</translation> -+ </message> -+ <message> -+ <source>VoicePrint</source> -+ <translation type="obsolete">声纹</translation> -+ </message> -+ <message> -+ <source>Cancel</source> -+ <translation type="obsolete">取消</translation> -+ </message> -+</context> -+</TS> -diff --git a/polkit-agent/i18n_ts/es.ts b/polkit-agent/i18n_ts/es.ts -index ac1ddd7..a395a53 100644 ---- a/polkit-agent/i18n_ts/es.ts -+++ b/polkit-agent/i18n_ts/es.ts -@@ -4,208 +4,418 @@ - <context> - <name>BioAuthWidget</name> - <message> -- <source>Form</source> -- <translation type="obsolete">Formar</translation> -+ <source>Retry</source> -+ <translation type="obsolete">重试</translation> -+ </message> -+ <message> -+ <source>%1 too many unsuccessful attempts,please enter password.</source> -+ <translation type="obsolete">%1验证失败达最大次数,请使用密码登录</translation> -+ </message> -+ <message> -+ <source>%1 authentication failure,there are still %2 remaining opportunities</source> -+ <translation type="obsolete">%1认证失败,还剩%2次尝试机会</translation> -+ </message> -+ <message> -+ <source>Please use wechat to scan the code</source> -+ <translation type="vanished">请使用微信扫码</translation> - </message> - </context> - <context> -- <name>BioDevicesWidget</name> -+ <name>BioDevices</name> - <message> -- <source>Form</source> -- <translation type="obsolete">Formar</translation> -+ <source>FingerPrint</source> -+ <translation type="obsolete">指纹</translation> -+ </message> -+ <message> -+ <source>FingerVein</source> -+ <translation type="obsolete">指静脉</translation> -+ </message> -+ <message> -+ <source>Iris</source> -+ <translation type="obsolete">虹膜</translation> -+ </message> -+ <message> -+ <source>Face</source> -+ <translation type="obsolete">人脸</translation> -+ </message> -+ <message> -+ <source>VoicePrint</source> -+ <translation type="obsolete">声纹</translation> -+ </message> -+ <message> -+ <source>Wechat</source> -+ <translation type="vanished">微信</translation> -+ </message> -+ <message> -+ <source>QRCode</source> -+ <translation type="vanished">二维码</translation> -+ </message> -+</context> -+<context> -+ <name>LoginOptionsWidget</name> -+ <message> -+ <source>Login Options</source> -+ <translation type="vanished">登录选项</translation> -+ </message> -+ <message> -+ <source>Wechat</source> -+ <translation type="vanished">微信</translation> - </message> - </context> - <context> - <name>MainWindow</name> - <message> -+ <location filename="../src/mainwindow.cpp" line="65"/> -+ <source>Authentication</source> -+ <translation>Autenticación</translation> -+ </message> -+ <message> -+ <source>Fingerprint authentication failed, you still have %1 verification opportunities</source> -+ <translation type="vanished">指纹验证失败,您还有%1次尝试机会</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.ui" line="26"/> - <source>Form</source> -- <translation>Formar</translation> -+ <translation>Forma</translation> -+ </message> -+ <message> -+ <source>More</source> -+ <translation type="obsolete">更多</translation> -+ </message> -+ <message> -+ <source>Restart</source> -+ <translation type="obsolete">重新开始</translation> -+ </message> -+ <message> -+ <source>Password</source> -+ <translation type="vanished">密码</translation> - </message> - <message> -+ <location filename="../src/mainwindow.ui" line="302"/> -+ <location filename="../src/mainwindow.cpp" line="882"/> -+ <location filename="../src/mainwindow.cpp" line="948"/> - <source>Biometric</source> -- <translation>Biometrico</translation> -+ <translation>Biométrico</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.ui" line="373"/> -+ <source>use password</source> -+ <translation>Usar contraseña</translation> -+ </message> -+ <message> -+ <source>DeviceType:</source> -+ <translation type="obsolete">设备类型:</translation> -+ </message> -+ <message> -+ <source>Back</source> -+ <translation type="obsolete">返回</translation> - </message> - <message> - <source>Details</source> -- <translation type="vanished">Detalles</translation> -+ <translation type="vanished">详细</translation> -+ </message> -+ <message> -+ <source>Action Id:</source> -+ <translation type="obsolete">动作:</translation> -+ </message> -+ <message> -+ <source>Description:</source> -+ <translation type="vanished">描述:</translation> - </message> - <message> - <source>Polkit.subject-pid:</source> -- <translation type="vanished">Polkit.subject-pid:</translation> -+ <translation type="vanished">Polkit.subject-pid:</translation> - </message> - <message> -- <source>Vendor:</source> -- <translation type="vanished">Vendedor:</translation> -+ <source>Retry</source> -+ <translation type="obsolete">重试</translation> - </message> - <message> -- <source>Description:</source> -- <translation type="vanished">Descripción:</translation> -+ <source>Device types:</source> -+ <translation type="obsolete">设备类型:</translation> - </message> - <message> -- <source>Polkit.caller-pid:</source> -- <translation type="vanished">Polkit.caller-pid:</translation> -+ <source>Vendor:</source> -+ <translation type="vanished">发行商:</translation> - </message> - <message> - <source>Action:</source> -- <translation type="vanished">Acción:</translation> -+ <translation type="vanished">动作:</translation> -+ </message> -+ <message> -+ <source>Polkit.caller-pid:</source> -+ <translation type="vanished">Polkit.caller-pid:</translation> - </message> - <message> -+ <location filename="../src/mainwindow.ui" line="334"/> -+ <location filename="../src/mainwindow.cpp" line="884"/> - <source>Cancel</source> - <translation>Cancelar</translation> - </message> - <message> -+ <location filename="../src/mainwindow.ui" line="353"/> -+ <location filename="../src/mainwindow.cpp" line="880"/> - <source>Authenticate</source> -- <translation>Autenticar</translation> -+ <translation>Autentificar</translation> - </message> - <message> -- <source>Authentication</source> -- <translation>Autenticación</translation> -+ <location filename="../src/mainwindow.cpp" line="886"/> -+ <location filename="../src/mainwindow.cpp" line="991"/> -+ <source>Use password</source> -+ <translation>Usar contraseña</translation> -+ </message> -+ <message> -+ <source>Auth</source> -+ <translation type="obsolete">授权</translation> -+ </message> -+ <message> -+ <source>Too many unsuccessful attempts,please enter password.</source> -+ <translation type="vanished">指纹验证失败达最大次数,请使用密码解锁</translation> -+ </message> -+ <message> -+ <source>%1 authentication failure,there are still %2 remaining opportunities</source> -+ <translation type="vanished">%1认证失败,还剩%2次尝试机会</translation> -+ </message> -+ <message> -+ <source>%1 too many unsuccessful attempts,please enter password.</source> -+ <translation type="vanished">%1验证失败达最大次数,请使用密码登录</translation> - </message> - <message> - <source>in authentication, please wait...</source> -- <translation type="vanished">En autenticación, por favor espere ...</translation> -+ <translation type="vanished">认证中,请稍等...</translation> - </message> - <message> -- <source>An application is attempting to perform an action that requires privileges. Authentication is required to perform this action.</source> -- <translation type="vanished">Una aplicación está intentando realizar una acción que requiere privilegios. Se requiere autenticación para realizar esta acción.</translation> -+ <location filename="../src/mainwindow.cpp" line="1026"/> -+ <location filename="../src/mainwindow.cpp" line="1093"/> -+ <location filename="../src/mainwindow.cpp" line="1094"/> -+ <source>Please try again in %1 minutes.</source> -+ <translation>Inténtelo de nuevo en %1 minutos.</translation> - </message> - <message> -- <source>Password: </source> -- <translation>Contraseña: </translation> -+ <location filename="../src/mainwindow.cpp" line="1036"/> -+ <location filename="../src/mainwindow.cpp" line="1103"/> -+ <location filename="../src/mainwindow.cpp" line="1104"/> -+ <source>Please try again in %1 seconds.</source> -+ <translation>Inténtelo de nuevo en %1 segundos.</translation> - </message> - <message> -- <source>Authentication failed, please try again.</source> -- <translation>Autenticación fallida. Por favor intente de nuevo.</translation> -+ <location filename="../src/mainwindow.cpp" line="1045"/> -+ <location filename="../src/mainwindow.cpp" line="1046"/> -+ <location filename="../src/mainwindow.cpp" line="1112"/> -+ <location filename="../src/mainwindow.cpp" line="1113"/> -+ <source>Account locked permanently.</source> -+ <translation>Cuenta bloqueada permanentemente.</translation> - </message> - <message> -- <source>Please enter your password or enroll your fingerprint </source> -- <translation type="unfinished"></translation> -+ <location filename="../src/mainwindow.cpp" line="675"/> -+ <location filename="../src/mainwindow.cpp" line="676"/> -+ <source>Password cannot be empty</source> -+ <translation>La contraseña no puede estar vacía</translation> - </message> - <message> -- <source>use password</source> -- <translation type="unfinished"></translation> -+ <source>Failed to verify %1, please enter password.</source> -+ <translation type="vanished">验证%1失败,请输入密码.</translation> - </message> - <message> -- <source>Account locked,</source> -- <translation type="unfinished"></translation> -+ <source>Unable to verify %1, please enter password.</source> -+ <translation type="vanished">无法验证%1,请输入密码.</translation> - </message> - <message> -- <source>days left</source> -- <translation type="unfinished"></translation> -+ <location filename="../src/mainwindow.cpp" line="175"/> -+ <source>Failed to verify %1, you still have %2 verification opportunities</source> -+ <translation>No se pudo verificar %1, todavía tiene %2 oportunidades de verificación</translation> - </message> - <message> -- <source>hours left</source> -- <translation type="unfinished"></translation> -+ <source>An application is attempting to perform an action that requires privileges. Authentication is required to perform this action.</source> -+ <translation type="vanished">一个程序正试图执行一个需要特权的动作。要求授权以执行该动作。</translation> - </message> - <message> -- <source>minutes left</source> -- <translation type="unfinished"></translation> -+ <location filename="../src/mainwindow.cpp" line="578"/> -+ <source>Password: </source> -+ <translation>Contraseña: </translation> - </message> - <message> -- <source>seconds left</source> -- <translation type="unfinished"></translation> -+ <location filename="../src/mainwindow.cpp" line="261"/> -+ <source>Please enter your password or enroll your fingerprint </source> -+ <translation>Ingrese su contraseña o registre su huella dactilar </translation> - </message> - <message> -- <source>Password cannot be empty</source> -- <translation type="unfinished"></translation> -+ <location filename="../src/mainwindow.cpp" line="187"/> -+ <source>Abnormal network</source> -+ <translation>Red anormal</translation> - </message> - <message> -- <source>Use password</source> -- <translation type="unfinished"></translation> -+ <location filename="../src/mainwindow.cpp" line="511"/> -+ <source>This operation requires the administrator's authorization. Please enter your password to allow this operation.</source> -+ <translation>Esta operación requiere la autorización del administrador. Introduzca su contraseña para permitir esta operación.</translation> - </message> - <message> -- <source>Please try again in %1 minutes.</source> -- <translation type="unfinished"></translation> -+ <location filename="../src/mainwindow.cpp" line="580"/> -+ <source>_Password: </source> -+ <translation>_Contraseña: </translation> - </message> - <message> -- <source>Please try again in %1 seconds.</source> -- <translation type="unfinished"></translation> -+ <location filename="../src/mainwindow.cpp" line="582"/> -+ <source>_Password:</source> -+ <translation>_Contraseña:</translation> - </message> - <message> -- <source>Account locked permanently.</source> -- <translation type="unfinished"></translation> -+ <location filename="../src/mainwindow.cpp" line="691"/> -+ <source>Authentication failed, please try again.</source> -+ <translation>Error de autenticación, inténtelo de nuevo.</translation> - </message> - <message> -- <source>Verify face recognition or enter password to unlock</source> -- <translation type="unfinished"></translation> -+ <location filename="../src/mainwindow.cpp" line="623"/> -+ <source>days left</source> -+ <translation>Días restantes</translation> - </message> - <message> -- <source>Press fingerprint or enter password to unlock</source> -- <translation type="unfinished"></translation> -+ <source>Biometric/code scan authentication failed too many times, please enter the password.</source> -+ <translation type="vanished">生物/扫码验证失败达最大次数,请使用密码解锁.</translation> - </message> - <message> -- <source>Verify voiceprint or enter password to unlock</source> -- <translation type="unfinished"></translation> -+ <source>Bioauth/code scan authentication failed, you still have %1 verification opportunities</source> -+ <translation type="vanished">生物/扫码验证失败,您还有%1次尝试机会</translation> - </message> - <message> -- <source>Verify finger vein or enter password to unlock</source> -- <translation type="unfinished"></translation> -+ <location filename="../src/mainwindow.cpp" line="164"/> -+ <location filename="../src/mainwindow.cpp" line="1176"/> -+ <source>Failed to verify %1, please enter password to unlock</source> -+ <translation>No se pudo verificar %1, ingrese la contraseña para desbloquear</translation> - </message> - <message> -- <source>Verify iris or enter password to unlock</source> -- <translation type="unfinished"></translation> -+ <location filename="../src/mainwindow.cpp" line="168"/> -+ <location filename="../src/mainwindow.cpp" line="1178"/> -+ <source>Unable to verify %1, please enter password to unlock</source> -+ <translation>No se puede verificar %1, ingrese la contraseña para desbloquear</translation> - </message> - <message> -- <source>Failed to verify %1, you still have %2 verification opportunities</source> -- <translation type="unfinished"></translation> -+ <source>NET Exception</source> -+ <translation type="vanished">网络异常</translation> - </message> - <message> -+ <location filename="../src/mainwindow.cpp" line="517"/> -+ <source>A program is attempting to perform an action that requires privileges.It requires authorization to perform the action.</source> -+ <translation>Un programa está intentando realizar una acción que requiere privilegios. Requiere autorización para realizar la acción.</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="576"/> - <source>Input Password</source> -- <translation type="unfinished"></translation> -+ <translation>Contraseña de entrada</translation> - </message> - <message> -- <source>Use the bound wechat scanning code or enter the password to unlock</source> -- <translation type="unfinished"></translation> -+ <location filename="../src/mainwindow.cpp" line="627"/> -+ <source>hours left</source> -+ <translation>horas restantes</translation> - </message> - <message> -- <source>Failed to verify %1, please enter password to unlock</source> -- <translation type="unfinished"></translation> -+ <location filename="../src/mainwindow.cpp" line="631"/> -+ <source>minutes left</source> -+ <translation>Quedan minutos</translation> - </message> - <message> -- <source>Unable to verify %1, please enter password to unlock</source> -- <translation type="unfinished"></translation> -+ <location filename="../src/mainwindow.cpp" line="635"/> -+ <source>seconds left</source> -+ <translation>segundos restantes</translation> - </message> - <message> -- <source>A program is attempting to perform an action that requires privileges.It requires authorization to perform the action.</source> -- <translation type="unfinished"></translation> -+ <location filename="../src/mainwindow.cpp" line="1193"/> -+ <source>Verify face recognition or enter password to unlock</source> -+ <translation>Verifique el reconocimiento facial o ingrese la contraseña para desbloquear</translation> - </message> - <message> -- <source>_Password:</source> -- <translation type="unfinished"></translation> -+ <location filename="../src/mainwindow.cpp" line="1198"/> -+ <source>Press fingerprint or enter password to unlock</source> -+ <translation>Presione la huella dactilar o ingrese la contraseña para desbloquear</translation> - </message> - <message> -- <source>_Password: </source> -- <translation type="unfinished"></translation> -+ <location filename="../src/mainwindow.cpp" line="1203"/> -+ <source>Verify voiceprint or enter password to unlock</source> -+ <translation>Verifica la huella de voz o ingresa la contraseña para desbloquear</translation> - </message> - <message> -- <source>Abnormal network</source> -- <translation type="unfinished"></translation> -+ <location filename="../src/mainwindow.cpp" line="1208"/> -+ <source>Verify finger vein or enter password to unlock</source> -+ <translation>Verifique la vena del dedo o ingrese la contraseña para desbloquear</translation> - </message> - <message> -- <source>This operation requires the administrator's authorization. Please enter your password to allow this operation.</source> -- <translation type="unfinished"></translation> -+ <location filename="../src/mainwindow.cpp" line="1213"/> -+ <source>Verify iris or enter password to unlock</source> -+ <translation>Verifique el iris o ingrese la contraseña para desbloquear</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="1218"/> -+ <source>Use the bound wechat scanning code or enter the password to unlock</source> -+ <translation>Use el código de escaneo de wechat vinculado o ingrese la contraseña para desbloquear</translation> -+ </message> -+ <message> -+ <source>Use the bound wechat scanning code or enter the password to log in</source> -+ <translation type="vanished">使用绑定的微信扫码或输入密码登录</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="623"/> -+ <location filename="../src/mainwindow.cpp" line="627"/> -+ <location filename="../src/mainwindow.cpp" line="631"/> -+ <location filename="../src/mainwindow.cpp" line="635"/> -+ <source>Account locked,</source> -+ <translation>Cuenta bloqueada,</translation> -+ </message> -+ <message> -+ <source>Authentication failed, please try again</source> -+ <translation type="obsolete">认证失败,请重试</translation> - </message> - </context> - <context> - <name>PolkitListener</name> - <message> -+ <location filename="../src/PolkitListener.cpp" line="88"/> - <source>Another client is already authenticating, please try again later.</source> -- <translation>Otro cliente ya se está autenticando, inténtalo de nuevo más tarde.</translation> -+ <translation>Otro cliente ya se está autenticando, inténtelo de nuevo más tarde.</translation> - </message> - <message> -+ <location filename="../src/PolkitListener.cpp" line="257"/> - <source>Authentication failure, please try again.</source> -- <translation>Fallo de autenticación, por favor intente de nuevo.</translation> -+ <translation>Error de autenticación, inténtelo de nuevo.</translation> - </message> - <message> -+ <location filename="../src/PolkitListener.cpp" line="264"/> - <source>Password input error!</source> -- <translation type="unfinished"></translation> -+ <translation>¡Error de entrada de contraseña!</translation> -+ </message> -+ <message> -+ <source>Account locked %1 minutes due to %2 fail attempts</source> -+ <translation type="vanished">账户锁定%1分钟由于%2次错误尝试</translation> -+ </message> -+ <message> -+ <source>Authentication failure,there are still %1 remaining opportunities</source> -+ <translation type="vanished">认证失败,还剩余%1次尝试机会</translation> - </message> - </context> - <context> - <name>QObject</name> -+ <message> -+ <source>FingerPrint</source> -+ <translation type="obsolete">指纹</translation> -+ </message> -+ <message> -+ <source>FingerVein</source> -+ <translation type="obsolete">指静脉</translation> -+ </message> -+ <message> -+ <source>Iris</source> -+ <translation type="obsolete">虹膜</translation> -+ </message> -+ <message> -+ <source>Face</source> -+ <translation type="obsolete">人脸</translation> -+ </message> -+ <message> -+ <source>VoicePrint</source> -+ <translation type="obsolete">声纹</translation> -+ </message> - <message> - <source>Cancel</source> -- <translation type="obsolete">Cancelar</translation> -+ <translation type="obsolete">取消</translation> - </message> - </context> - </TS> -diff --git a/polkit-agent/i18n_ts/fr.ts b/polkit-agent/i18n_ts/fr.ts -index 87ca0d5..6ac2c2b 100644 ---- a/polkit-agent/i18n_ts/fr.ts -+++ b/polkit-agent/i18n_ts/fr.ts -@@ -4,208 +4,418 @@ - <context> - <name>BioAuthWidget</name> - <message> -- <source>Form</source> -- <translation type="obsolete">Forme</translation> -+ <source>Retry</source> -+ <translation type="obsolete">重试</translation> -+ </message> -+ <message> -+ <source>%1 too many unsuccessful attempts,please enter password.</source> -+ <translation type="obsolete">%1验证失败达最大次数,请使用密码登录</translation> -+ </message> -+ <message> -+ <source>%1 authentication failure,there are still %2 remaining opportunities</source> -+ <translation type="obsolete">%1认证失败,还剩%2次尝试机会</translation> -+ </message> -+ <message> -+ <source>Please use wechat to scan the code</source> -+ <translation type="vanished">请使用微信扫码</translation> - </message> - </context> - <context> -- <name>BioDevicesWidget</name> -+ <name>BioDevices</name> - <message> -- <source>Form</source> -- <translation type="obsolete">Forme</translation> -+ <source>FingerPrint</source> -+ <translation type="obsolete">指纹</translation> -+ </message> -+ <message> -+ <source>FingerVein</source> -+ <translation type="obsolete">指静脉</translation> -+ </message> -+ <message> -+ <source>Iris</source> -+ <translation type="obsolete">虹膜</translation> -+ </message> -+ <message> -+ <source>Face</source> -+ <translation type="obsolete">人脸</translation> -+ </message> -+ <message> -+ <source>VoicePrint</source> -+ <translation type="obsolete">声纹</translation> -+ </message> -+ <message> -+ <source>Wechat</source> -+ <translation type="vanished">微信</translation> -+ </message> -+ <message> -+ <source>QRCode</source> -+ <translation type="vanished">二维码</translation> -+ </message> -+</context> -+<context> -+ <name>LoginOptionsWidget</name> -+ <message> -+ <source>Login Options</source> -+ <translation type="vanished">登录选项</translation> -+ </message> -+ <message> -+ <source>Wechat</source> -+ <translation type="vanished">微信</translation> - </message> - </context> - <context> - <name>MainWindow</name> - <message> -+ <location filename="../src/mainwindow.cpp" line="65"/> -+ <source>Authentication</source> -+ <translation>Authentification</translation> -+ </message> -+ <message> -+ <source>Fingerprint authentication failed, you still have %1 verification opportunities</source> -+ <translation type="vanished">指纹验证失败,您还有%1次尝试机会</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.ui" line="26"/> - <source>Form</source> -- <translation>Forme</translation> -+ <translation></translation> -+ </message> -+ <message> -+ <source>More</source> -+ <translation type="obsolete">更多</translation> -+ </message> -+ <message> -+ <source>Restart</source> -+ <translation type="obsolete">重新开始</translation> -+ </message> -+ <message> -+ <source>Password</source> -+ <translation type="vanished">密码</translation> - </message> - <message> -+ <location filename="../src/mainwindow.ui" line="302"/> -+ <location filename="../src/mainwindow.cpp" line="882"/> -+ <location filename="../src/mainwindow.cpp" line="948"/> - <source>Biometric</source> - <translation>Biométrique</translation> - </message> -+ <message> -+ <location filename="../src/mainwindow.ui" line="373"/> -+ <source>use password</source> -+ <translation>Utiliser le mot de passe</translation> -+ </message> -+ <message> -+ <source>DeviceType:</source> -+ <translation type="obsolete">设备类型:</translation> -+ </message> -+ <message> -+ <source>Back</source> -+ <translation type="obsolete">返回</translation> -+ </message> - <message> - <source>Details</source> -- <translation type="vanished">Détails</translation> -+ <translation type="vanished">详细</translation> -+ </message> -+ <message> -+ <source>Action Id:</source> -+ <translation type="obsolete">动作:</translation> -+ </message> -+ <message> -+ <source>Description:</source> -+ <translation type="vanished">描述:</translation> - </message> - <message> - <source>Polkit.subject-pid:</source> -- <translation type="vanished">Polkit.subject-pid:</translation> -+ <translation type="vanished">Polkit.subject-pid:</translation> - </message> - <message> -- <source>Vendor:</source> -- <translation type="vanished">Vendeur:</translation> -+ <source>Retry</source> -+ <translation type="obsolete">重试</translation> - </message> - <message> -- <source>Description:</source> -- <translation type="vanished">La description:</translation> -+ <source>Device types:</source> -+ <translation type="obsolete">设备类型:</translation> - </message> - <message> -- <source>Polkit.caller-pid:</source> -- <translation type="vanished">Polkit.caller-pid:</translation> -+ <source>Vendor:</source> -+ <translation type="vanished">发行商:</translation> - </message> - <message> - <source>Action:</source> -- <translation type="vanished">Action:</translation> -+ <translation type="vanished">动作:</translation> -+ </message> -+ <message> -+ <source>Polkit.caller-pid:</source> -+ <translation type="vanished">Polkit.caller-pid:</translation> - </message> - <message> -+ <location filename="../src/mainwindow.ui" line="334"/> -+ <location filename="../src/mainwindow.cpp" line="884"/> - <source>Cancel</source> - <translation>Annuler</translation> - </message> - <message> -+ <location filename="../src/mainwindow.ui" line="353"/> -+ <location filename="../src/mainwindow.cpp" line="880"/> - <source>Authenticate</source> - <translation>Authentifier</translation> - </message> - <message> -- <source>Authentication</source> -- <translation>Authentification</translation> -+ <location filename="../src/mainwindow.cpp" line="886"/> -+ <location filename="../src/mainwindow.cpp" line="991"/> -+ <source>Use password</source> -+ <translation>Utiliser le mot de passe</translation> -+ </message> -+ <message> -+ <source>Auth</source> -+ <translation type="obsolete">授权</translation> -+ </message> -+ <message> -+ <source>Too many unsuccessful attempts,please enter password.</source> -+ <translation type="vanished">指纹验证失败达最大次数,请使用密码解锁</translation> -+ </message> -+ <message> -+ <source>%1 authentication failure,there are still %2 remaining opportunities</source> -+ <translation type="vanished">%1认证失败,还剩%2次尝试机会</translation> -+ </message> -+ <message> -+ <source>%1 too many unsuccessful attempts,please enter password.</source> -+ <translation type="vanished">%1验证失败达最大次数,请使用密码登录</translation> - </message> - <message> - <source>in authentication, please wait...</source> -- <translation type="vanished">en cours d'authentification, veuillez patienter ...</translation> -+ <translation type="vanished">认证中,请稍等...</translation> - </message> - <message> -- <source>An application is attempting to perform an action that requires privileges. Authentication is required to perform this action.</source> -- <translation type="vanished">Une application tente d'exécuter une action nécessitant des privilèges. Une authentification est requise pour effectuer cette action.</translation> -+ <location filename="../src/mainwindow.cpp" line="1026"/> -+ <location filename="../src/mainwindow.cpp" line="1093"/> -+ <location filename="../src/mainwindow.cpp" line="1094"/> -+ <source>Please try again in %1 minutes.</source> -+ <translation>Veuillez réessayer dans %1 minutes.</translation> - </message> - <message> -- <source>Password: </source> -- <translation>Mot de passe: </translation> -+ <location filename="../src/mainwindow.cpp" line="1036"/> -+ <location filename="../src/mainwindow.cpp" line="1103"/> -+ <location filename="../src/mainwindow.cpp" line="1104"/> -+ <source>Please try again in %1 seconds.</source> -+ <translation>Veuillez réessayer dans %1 secondes.</translation> - </message> - <message> -- <source>Authentication failed, please try again.</source> -- <translation>Authentification échouée. Veuillez réessayer.</translation> -+ <location filename="../src/mainwindow.cpp" line="1045"/> -+ <location filename="../src/mainwindow.cpp" line="1046"/> -+ <location filename="../src/mainwindow.cpp" line="1112"/> -+ <location filename="../src/mainwindow.cpp" line="1113"/> -+ <source>Account locked permanently.</source> -+ <translation>Compte verrouillé définitivement.</translation> - </message> - <message> -- <source>Please enter your password or enroll your fingerprint </source> -- <translation type="unfinished"></translation> -+ <location filename="../src/mainwindow.cpp" line="675"/> -+ <location filename="../src/mainwindow.cpp" line="676"/> -+ <source>Password cannot be empty</source> -+ <translation>Le mot de passe ne peut pas être vide</translation> - </message> - <message> -- <source>use password</source> -- <translation type="unfinished"></translation> -+ <source>Failed to verify %1, please enter password.</source> -+ <translation type="vanished">验证%1失败,请输入密码.</translation> - </message> - <message> -- <source>Account locked,</source> -- <translation type="unfinished"></translation> -+ <source>Unable to verify %1, please enter password.</source> -+ <translation type="vanished">无法验证%1,请输入密码.</translation> - </message> - <message> -- <source>days left</source> -- <translation type="unfinished"></translation> -+ <location filename="../src/mainwindow.cpp" line="175"/> -+ <source>Failed to verify %1, you still have %2 verification opportunities</source> -+ <translation>Échec de la vérification %1, vous avez encore %2 possibilités de vérification</translation> - </message> - <message> -- <source>hours left</source> -- <translation type="unfinished"></translation> -+ <source>An application is attempting to perform an action that requires privileges. Authentication is required to perform this action.</source> -+ <translation type="vanished">一个程序正试图执行一个需要特权的动作。要求授权以执行该动作。</translation> - </message> - <message> -- <source>minutes left</source> -- <translation type="unfinished"></translation> -+ <location filename="../src/mainwindow.cpp" line="578"/> -+ <source>Password: </source> -+ <translation>Mot de passe: </translation> - </message> - <message> -- <source>seconds left</source> -- <translation type="unfinished"></translation> -+ <location filename="../src/mainwindow.cpp" line="261"/> -+ <source>Please enter your password or enroll your fingerprint </source> -+ <translation>Veuillez saisir votre mot de passe ou enregistrer votre empreinte digitale </translation> - </message> - <message> -- <source>Password cannot be empty</source> -- <translation type="unfinished"></translation> -+ <location filename="../src/mainwindow.cpp" line="187"/> -+ <source>Abnormal network</source> -+ <translation>Réseau anormal</translation> - </message> - <message> -- <source>Use password</source> -- <translation type="unfinished"></translation> -+ <location filename="../src/mainwindow.cpp" line="511"/> -+ <source>This operation requires the administrator's authorization. Please enter your password to allow this operation.</source> -+ <translation>Cette opération nécessite l’autorisation de l’administrateur. Veuillez saisir votre mot de passe pour autoriser cette opération.</translation> - </message> - <message> -- <source>Please try again in %1 minutes.</source> -- <translation type="unfinished"></translation> -+ <location filename="../src/mainwindow.cpp" line="580"/> -+ <source>_Password: </source> -+ <translation>_Mot de passe: </translation> - </message> - <message> -- <source>Please try again in %1 seconds.</source> -- <translation type="unfinished"></translation> -+ <location filename="../src/mainwindow.cpp" line="582"/> -+ <source>_Password:</source> -+ <translation>_Mot de passe:</translation> - </message> - <message> -- <source>Account locked permanently.</source> -- <translation type="unfinished"></translation> -+ <location filename="../src/mainwindow.cpp" line="691"/> -+ <source>Authentication failed, please try again.</source> -+ <translation>L’authentification a échoué, veuillez réessayer.</translation> - </message> - <message> -- <source>Verify face recognition or enter password to unlock</source> -- <translation type="unfinished"></translation> -+ <location filename="../src/mainwindow.cpp" line="623"/> -+ <source>days left</source> -+ <translation>jours restants</translation> - </message> - <message> -- <source>Press fingerprint or enter password to unlock</source> -- <translation type="unfinished"></translation> -+ <source>Biometric/code scan authentication failed too many times, please enter the password.</source> -+ <translation type="vanished">生物/扫码验证失败达最大次数,请使用密码解锁.</translation> - </message> - <message> -- <source>Verify voiceprint or enter password to unlock</source> -- <translation type="unfinished"></translation> -+ <source>Bioauth/code scan authentication failed, you still have %1 verification opportunities</source> -+ <translation type="vanished">生物/扫码验证失败,您还有%1次尝试机会</translation> - </message> - <message> -- <source>Verify finger vein or enter password to unlock</source> -- <translation type="unfinished"></translation> -+ <location filename="../src/mainwindow.cpp" line="164"/> -+ <location filename="../src/mainwindow.cpp" line="1176"/> -+ <source>Failed to verify %1, please enter password to unlock</source> -+ <translation>Impossible de vérifier %1, veuillez entrer le mot de passe pour déverrouiller</translation> - </message> - <message> -- <source>Verify iris or enter password to unlock</source> -- <translation type="unfinished"></translation> -+ <location filename="../src/mainwindow.cpp" line="168"/> -+ <location filename="../src/mainwindow.cpp" line="1178"/> -+ <source>Unable to verify %1, please enter password to unlock</source> -+ <translation>Impossible de vérifier %1, veuillez entrer le mot de passe pour déverrouiller</translation> - </message> - <message> -- <source>Failed to verify %1, you still have %2 verification opportunities</source> -- <translation type="unfinished"></translation> -+ <source>NET Exception</source> -+ <translation type="vanished">网络异常</translation> - </message> - <message> -+ <location filename="../src/mainwindow.cpp" line="517"/> -+ <source>A program is attempting to perform an action that requires privileges.It requires authorization to perform the action.</source> -+ <translation>Un programme tente d’effectuer une action qui nécessite des privilèges. Il nécessite une autorisation pour effectuer l’action.</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="576"/> - <source>Input Password</source> -- <translation type="unfinished"></translation> -+ <translation>Mot de passe d’entrée</translation> - </message> - <message> -- <source>Use the bound wechat scanning code or enter the password to unlock</source> -- <translation type="unfinished"></translation> -+ <location filename="../src/mainwindow.cpp" line="627"/> -+ <source>hours left</source> -+ <translation>Heures restantes</translation> - </message> - <message> -- <source>Failed to verify %1, please enter password to unlock</source> -- <translation type="unfinished"></translation> -+ <location filename="../src/mainwindow.cpp" line="631"/> -+ <source>minutes left</source> -+ <translation>minutes restantes</translation> - </message> - <message> -- <source>Unable to verify %1, please enter password to unlock</source> -- <translation type="unfinished"></translation> -+ <location filename="../src/mainwindow.cpp" line="635"/> -+ <source>seconds left</source> -+ <translation>secondes restantes</translation> - </message> - <message> -- <source>A program is attempting to perform an action that requires privileges.It requires authorization to perform the action.</source> -- <translation type="unfinished"></translation> -+ <location filename="../src/mainwindow.cpp" line="1193"/> -+ <source>Verify face recognition or enter password to unlock</source> -+ <translation>Vérifier la reconnaissance faciale ou saisir le mot de passe pour déverrouiller</translation> - </message> - <message> -- <source>_Password:</source> -- <translation type="unfinished"></translation> -+ <location filename="../src/mainwindow.cpp" line="1198"/> -+ <source>Press fingerprint or enter password to unlock</source> -+ <translation>Appuyez sur l’empreinte digitale ou entrez le mot de passe pour déverrouiller</translation> - </message> - <message> -- <source>_Password: </source> -- <translation type="unfinished"></translation> -+ <location filename="../src/mainwindow.cpp" line="1203"/> -+ <source>Verify voiceprint or enter password to unlock</source> -+ <translation>Vérifier l’empreinte vocale ou saisir le mot de passe pour déverrouiller</translation> - </message> - <message> -- <source>Abnormal network</source> -- <translation type="unfinished"></translation> -+ <location filename="../src/mainwindow.cpp" line="1208"/> -+ <source>Verify finger vein or enter password to unlock</source> -+ <translation>Vérifiez la veine du doigt ou entrez le mot de passe pour déverrouiller</translation> - </message> - <message> -- <source>This operation requires the administrator's authorization. Please enter your password to allow this operation.</source> -- <translation type="unfinished"></translation> -+ <location filename="../src/mainwindow.cpp" line="1213"/> -+ <source>Verify iris or enter password to unlock</source> -+ <translation>Vérifiez l’iris ou entrez le mot de passe pour déverrouiller</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="1218"/> -+ <source>Use the bound wechat scanning code or enter the password to unlock</source> -+ <translation>Utilisez le code d’analyse wechat lié ou entrez le mot de passe pour déverrouiller</translation> -+ </message> -+ <message> -+ <source>Use the bound wechat scanning code or enter the password to log in</source> -+ <translation type="vanished">使用绑定的微信扫码或输入密码登录</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="623"/> -+ <location filename="../src/mainwindow.cpp" line="627"/> -+ <location filename="../src/mainwindow.cpp" line="631"/> -+ <location filename="../src/mainwindow.cpp" line="635"/> -+ <source>Account locked,</source> -+ <translation>Compte verrouillé,</translation> -+ </message> -+ <message> -+ <source>Authentication failed, please try again</source> -+ <translation type="obsolete">认证失败,请重试</translation> - </message> - </context> - <context> - <name>PolkitListener</name> - <message> -+ <location filename="../src/PolkitListener.cpp" line="88"/> - <source>Another client is already authenticating, please try again later.</source> -- <translation>Un autre client s'authentifie déjà. Veuillez réessayer ultérieurement.</translation> -+ <translation>Un autre client est déjà en train de s’authentifier, veuillez réessayer plus tard.</translation> - </message> - <message> -+ <location filename="../src/PolkitListener.cpp" line="257"/> - <source>Authentication failure, please try again.</source> -- <translation>Échec de l'authentification, veuillez réessayer.</translation> -+ <translation>Échec de l’authentification, veuillez réessayer.</translation> - </message> - <message> -+ <location filename="../src/PolkitListener.cpp" line="264"/> - <source>Password input error!</source> -- <translation type="unfinished"></translation> -+ <translation>Erreur de saisie du mot de passe !</translation> -+ </message> -+ <message> -+ <source>Account locked %1 minutes due to %2 fail attempts</source> -+ <translation type="vanished">账户锁定%1分钟由于%2次错误尝试</translation> -+ </message> -+ <message> -+ <source>Authentication failure,there are still %1 remaining opportunities</source> -+ <translation type="vanished">认证失败,还剩余%1次尝试机会</translation> - </message> - </context> - <context> - <name>QObject</name> -+ <message> -+ <source>FingerPrint</source> -+ <translation type="obsolete">指纹</translation> -+ </message> -+ <message> -+ <source>FingerVein</source> -+ <translation type="obsolete">指静脉</translation> -+ </message> -+ <message> -+ <source>Iris</source> -+ <translation type="obsolete">虹膜</translation> -+ </message> -+ <message> -+ <source>Face</source> -+ <translation type="obsolete">人脸</translation> -+ </message> -+ <message> -+ <source>VoicePrint</source> -+ <translation type="obsolete">声纹</translation> -+ </message> - <message> - <source>Cancel</source> -- <translation type="obsolete">Annuler</translation> -+ <translation type="obsolete">取消</translation> - </message> - </context> - </TS> -diff --git a/polkit-agent/i18n_ts/kk.ts b/polkit-agent/i18n_ts/kk.ts -new file mode 100644 -index 0000000..f2eb55e ---- /dev/null -+++ b/polkit-agent/i18n_ts/kk.ts -@@ -0,0 +1,421 @@ -+<?xml version="1.0" encoding="utf-8"?> -+<!DOCTYPE TS> -+<TS version="2.1" language="kk"> -+<context> -+ <name>BioAuthWidget</name> -+ <message> -+ <source>Retry</source> -+ <translation type="obsolete">重试</translation> -+ </message> -+ <message> -+ <source>%1 too many unsuccessful attempts,please enter password.</source> -+ <translation type="obsolete">%1验证失败达最大次数,请使用密码登录</translation> -+ </message> -+ <message> -+ <source>%1 authentication failure,there are still %2 remaining opportunities</source> -+ <translation type="obsolete">%1认证失败,还剩%2次尝试机会</translation> -+ </message> -+ <message> -+ <source>Please use wechat to scan the code</source> -+ <translation type="vanished">请使用微信扫码</translation> -+ </message> -+</context> -+<context> -+ <name>BioDevices</name> -+ <message> -+ <source>FingerPrint</source> -+ <translation type="obsolete">指纹</translation> -+ </message> -+ <message> -+ <source>FingerVein</source> -+ <translation type="obsolete">指静脉</translation> -+ </message> -+ <message> -+ <source>Iris</source> -+ <translation type="obsolete">虹膜</translation> -+ </message> -+ <message> -+ <source>Face</source> -+ <translation type="obsolete">人脸</translation> -+ </message> -+ <message> -+ <source>VoicePrint</source> -+ <translation type="obsolete">声纹</translation> -+ </message> -+ <message> -+ <source>Wechat</source> -+ <translation type="vanished">微信</translation> -+ </message> -+ <message> -+ <source>QRCode</source> -+ <translation type="vanished">二维码</translation> -+ </message> -+</context> -+<context> -+ <name>LoginOptionsWidget</name> -+ <message> -+ <source>Login Options</source> -+ <translation type="vanished">登录选项</translation> -+ </message> -+ <message> -+ <source>Wechat</source> -+ <translation type="vanished">微信</translation> -+ </message> -+</context> -+<context> -+ <name>MainWindow</name> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="65"/> -+ <source>Authentication</source> -+ <translation>Аутентификация</translation> -+ </message> -+ <message> -+ <source>Fingerprint authentication failed, you still have %1 verification opportunities</source> -+ <translation type="vanished">指纹验证失败,您还有%1次尝试机会</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.ui" line="26"/> -+ <source>Form</source> -+ <translation></translation> -+ </message> -+ <message> -+ <source>More</source> -+ <translation type="obsolete">更多</translation> -+ </message> -+ <message> -+ <source>Restart</source> -+ <translation type="obsolete">重新开始</translation> -+ </message> -+ <message> -+ <source>Password</source> -+ <translation type="vanished">密码</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.ui" line="302"/> -+ <location filename="../src/mainwindow.cpp" line="882"/> -+ <location filename="../src/mainwindow.cpp" line="948"/> -+ <source>Biometric</source> -+ <translation>Биометриялық</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.ui" line="373"/> -+ <source>use password</source> -+ <translation>құпия сөзді пайдалану</translation> -+ </message> -+ <message> -+ <source>DeviceType:</source> -+ <translation type="obsolete">设备类型:</translation> -+ </message> -+ <message> -+ <source>Back</source> -+ <translation type="obsolete">返回</translation> -+ </message> -+ <message> -+ <source>Details</source> -+ <translation type="vanished">详细</translation> -+ </message> -+ <message> -+ <source>Action Id:</source> -+ <translation type="obsolete">动作:</translation> -+ </message> -+ <message> -+ <source>Description:</source> -+ <translation type="vanished">描述:</translation> -+ </message> -+ <message> -+ <source>Polkit.subject-pid:</source> -+ <translation type="vanished">Polkit.subject-pid:</translation> -+ </message> -+ <message> -+ <source>Retry</source> -+ <translation type="obsolete">重试</translation> -+ </message> -+ <message> -+ <source>Device types:</source> -+ <translation type="obsolete">设备类型:</translation> -+ </message> -+ <message> -+ <source>Vendor:</source> -+ <translation type="vanished">发行商:</translation> -+ </message> -+ <message> -+ <source>Action:</source> -+ <translation type="vanished">动作:</translation> -+ </message> -+ <message> -+ <source>Polkit.caller-pid:</source> -+ <translation type="vanished">Polkit.caller-pid:</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.ui" line="334"/> -+ <location filename="../src/mainwindow.cpp" line="884"/> -+ <source>Cancel</source> -+ <translation>Болдырмау</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.ui" line="353"/> -+ <location filename="../src/mainwindow.cpp" line="880"/> -+ <source>Authenticate</source> -+ <translation>Аутентификация</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="886"/> -+ <location filename="../src/mainwindow.cpp" line="991"/> -+ <source>Use password</source> -+ <translation>Құпиясөзді пайдалану</translation> -+ </message> -+ <message> -+ <source>Auth</source> -+ <translation type="obsolete">授权</translation> -+ </message> -+ <message> -+ <source>Too many unsuccessful attempts,please enter password.</source> -+ <translation type="vanished">指纹验证失败达最大次数,请使用密码解锁</translation> -+ </message> -+ <message> -+ <source>%1 authentication failure,there are still %2 remaining opportunities</source> -+ <translation type="vanished">%1认证失败,还剩%2次尝试机会</translation> -+ </message> -+ <message> -+ <source>%1 too many unsuccessful attempts,please enter password.</source> -+ <translation type="vanished">%1验证失败达最大次数,请使用密码登录</translation> -+ </message> -+ <message> -+ <source>in authentication, please wait...</source> -+ <translation type="vanished">认证中,请稍等...</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="1026"/> -+ <location filename="../src/mainwindow.cpp" line="1093"/> -+ <location filename="../src/mainwindow.cpp" line="1094"/> -+ <source>Please try again in %1 minutes.</source> -+ <translation>% 1 минутта қайталап көріңіз.</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="1036"/> -+ <location filename="../src/mainwindow.cpp" line="1103"/> -+ <location filename="../src/mainwindow.cpp" line="1104"/> -+ <source>Please try again in %1 seconds.</source> -+ <translation>% 1 секундта қайталап көріңіз.</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="1045"/> -+ <location filename="../src/mainwindow.cpp" line="1046"/> -+ <location filename="../src/mainwindow.cpp" line="1112"/> -+ <location filename="../src/mainwindow.cpp" line="1113"/> -+ <source>Account locked permanently.</source> -+ <translation>Тіркелгі біржолата құлыпталады.</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="675"/> -+ <location filename="../src/mainwindow.cpp" line="676"/> -+ <source>Password cannot be empty</source> -+ <translation>Құпия сөз бос болмады</translation> -+ </message> -+ <message> -+ <source>Failed to verify %1, please enter password.</source> -+ <translation type="vanished">验证%1失败,请输入密码.</translation> -+ </message> -+ <message> -+ <source>Unable to verify %1, please enter password.</source> -+ <translation type="vanished">无法验证%1,请输入密码.</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="175"/> -+ <source>Failed to verify %1, you still have %2 verification opportunities</source> -+ <translation>% 1 дегенді тексеру мүмкін болмады, сізде әлі де% 2 тексеру мүмкіндіктері бар</translation> -+ </message> -+ <message> -+ <source>An application is attempting to perform an action that requires privileges. Authentication is required to perform this action.</source> -+ <translation type="vanished">一个程序正试图执行一个需要特权的动作。要求授权以执行该动作。</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="578"/> -+ <source>Password: </source> -+ <translation>Құпия сөз: </translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="261"/> -+ <source>Please enter your password or enroll your fingerprint </source> -+ <translation>Құпия сөзді енгізіңіз немесе саусақ ізін жазыңыз </translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="187"/> -+ <source>Abnormal network</source> -+ <translation>Аномальды желі</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="511"/> -+ <source>This operation requires the administrator's authorization. Please enter your password to allow this operation.</source> -+ <translation>Бұл операция әкімшінің рұқсатын талап етеді. Осы операцияға рұқсат ету үшін құпия сөзіңізді енгізіңіз.</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="580"/> -+ <source>_Password: </source> -+ <translation>_Password: </translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="582"/> -+ <source>_Password:</source> -+ <translation>_Password:</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="691"/> -+ <source>Authentication failed, please try again.</source> -+ <translation>Аутентификация сәтсіз аяқталды, қайталап көріңіз.</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="623"/> -+ <source>days left</source> -+ <translation>қалған күндер</translation> -+ </message> -+ <message> -+ <source>Biometric/code scan authentication failed too many times, please enter the password.</source> -+ <translation type="vanished">生物/扫码验证失败达最大次数,请使用密码解锁.</translation> -+ </message> -+ <message> -+ <source>Bioauth/code scan authentication failed, you still have %1 verification opportunities</source> -+ <translation type="vanished">生物/扫码验证失败,您还有%1次尝试机会</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="164"/> -+ <location filename="../src/mainwindow.cpp" line="1176"/> -+ <source>Failed to verify %1, please enter password to unlock</source> -+ <translation>% 1 дегенді тексеру мүмкін болмады, құлыптан босату үшін құпия сөзді енгізіңіз</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="168"/> -+ <location filename="../src/mainwindow.cpp" line="1178"/> -+ <source>Unable to verify %1, please enter password to unlock</source> -+ <translation>% 1 дегенді тексеру мүмкін болмады, құлыптан босату үшін құпия сөзді енгізіңіз</translation> -+ </message> -+ <message> -+ <source>NET Exception</source> -+ <translation type="vanished">网络异常</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="517"/> -+ <source>A program is attempting to perform an action that requires privileges.It requires authorization to perform the action.</source> -+ <translation>Бағдарлама артықшылықтарды талап ететін әрекетті орындауға талпыныс жасайды. Іс-әрекетті орындау үшін рұқсат талап етуге болады.</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="576"/> -+ <source>Input Password</source> -+ <translation>Құпиясөзді енгізу</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="627"/> -+ <source>hours left</source> -+ <translation>сағаттар қалды</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="631"/> -+ <source>minutes left</source> -+ <translation>минуттар қалды</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="635"/> -+ <source>seconds left</source> -+ <translation>секундтар қалды</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="1193"/> -+ <source>Verify face recognition or enter password to unlock</source> -+ <translation>Бет тануды тексеру немесе құлыптан босату үшін құпия сөзді енгізу</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="1198"/> -+ <source>Press fingerprint or enter password to unlock</source> -+ <translation>Құлыптан босату үшін дактилоскопияны басу немесе құпия сөзді енгізу</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="1203"/> -+ <source>Verify voiceprint or enter password to unlock</source> -+ <translation>Құлыптан босату үшін дауыстық ізді тексеру немесе құпия сөзді енгізу</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="1208"/> -+ <source>Verify finger vein or enter password to unlock</source> -+ <translation>Құлыптан босату үшін саусақ көктамырын тексеру немесе құпия сөзді енгізу</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="1213"/> -+ <source>Verify iris or enter password to unlock</source> -+ <translation>Құлыптан босату үшін IRIS тексеру немесе құпиясөзді енгізу</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="1218"/> -+ <source>Use the bound wechat scanning code or enter the password to unlock</source> -+ <translation>Байланыстыратын wechat сканерлеу кодын пайдаланыңыз немесе құлыптан босату үшін құпия сөзді енгізіңіз</translation> -+ </message> -+ <message> -+ <source>Use the bound wechat scanning code or enter the password to log in</source> -+ <translation type="vanished">使用绑定的微信扫码或输入密码登录</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="623"/> -+ <location filename="../src/mainwindow.cpp" line="627"/> -+ <location filename="../src/mainwindow.cpp" line="631"/> -+ <location filename="../src/mainwindow.cpp" line="635"/> -+ <source>Account locked,</source> -+ <translation>Тіркелгі құлыпталған,</translation> -+ </message> -+ <message> -+ <source>Authentication failed, please try again</source> -+ <translation type="obsolete">认证失败,请重试</translation> -+ </message> -+</context> -+<context> -+ <name>PolkitListener</name> -+ <message> -+ <location filename="../src/PolkitListener.cpp" line="88"/> -+ <source>Another client is already authenticating, please try again later.</source> -+ <translation>Басқа клиент қазірдің өзінде аутентификацияда, кейінірек қайталап көріңіз.</translation> -+ </message> -+ <message> -+ <location filename="../src/PolkitListener.cpp" line="257"/> -+ <source>Authentication failure, please try again.</source> -+ <translation>Аутентификация сәтсіздігі, қайталап көріңіз.</translation> -+ </message> -+ <message> -+ <location filename="../src/PolkitListener.cpp" line="264"/> -+ <source>Password input error!</source> -+ <translation>Құпия сөзді енгізу қатесі!</translation> -+ </message> -+ <message> -+ <source>Account locked %1 minutes due to %2 fail attempts</source> -+ <translation type="vanished">账户锁定%1分钟由于%2次错误尝试</translation> -+ </message> -+ <message> -+ <source>Authentication failure,there are still %1 remaining opportunities</source> -+ <translation type="vanished">认证失败,还剩余%1次尝试机会</translation> -+ </message> -+</context> -+<context> -+ <name>QObject</name> -+ <message> -+ <source>FingerPrint</source> -+ <translation type="obsolete">指纹</translation> -+ </message> -+ <message> -+ <source>FingerVein</source> -+ <translation type="obsolete">指静脉</translation> -+ </message> -+ <message> -+ <source>Iris</source> -+ <translation type="obsolete">虹膜</translation> -+ </message> -+ <message> -+ <source>Face</source> -+ <translation type="obsolete">人脸</translation> -+ </message> -+ <message> -+ <source>VoicePrint</source> -+ <translation type="obsolete">声纹</translation> -+ </message> -+ <message> -+ <source>Cancel</source> -+ <translation type="obsolete">取消</translation> -+ </message> -+</context> -+</TS> -diff --git a/polkit-agent/i18n_ts/ky.ts b/polkit-agent/i18n_ts/ky.ts -new file mode 100644 -index 0000000..a761425 ---- /dev/null -+++ b/polkit-agent/i18n_ts/ky.ts -@@ -0,0 +1,421 @@ -+<?xml version="1.0" encoding="utf-8"?> -+<!DOCTYPE TS> -+<TS version="2.1" language="ky"> -+<context> -+ <name>BioAuthWidget</name> -+ <message> -+ <source>Retry</source> -+ <translation type="obsolete">重试</translation> -+ </message> -+ <message> -+ <source>%1 too many unsuccessful attempts,please enter password.</source> -+ <translation type="obsolete">%1验证失败达最大次数,请使用密码登录</translation> -+ </message> -+ <message> -+ <source>%1 authentication failure,there are still %2 remaining opportunities</source> -+ <translation type="obsolete">%1认证失败,还剩%2次尝试机会</translation> -+ </message> -+ <message> -+ <source>Please use wechat to scan the code</source> -+ <translation type="vanished">请使用微信扫码</translation> -+ </message> -+</context> -+<context> -+ <name>BioDevices</name> -+ <message> -+ <source>FingerPrint</source> -+ <translation type="obsolete">指纹</translation> -+ </message> -+ <message> -+ <source>FingerVein</source> -+ <translation type="obsolete">指静脉</translation> -+ </message> -+ <message> -+ <source>Iris</source> -+ <translation type="obsolete">虹膜</translation> -+ </message> -+ <message> -+ <source>Face</source> -+ <translation type="obsolete">人脸</translation> -+ </message> -+ <message> -+ <source>VoicePrint</source> -+ <translation type="obsolete">声纹</translation> -+ </message> -+ <message> -+ <source>Wechat</source> -+ <translation type="vanished">微信</translation> -+ </message> -+ <message> -+ <source>QRCode</source> -+ <translation type="vanished">二维码</translation> -+ </message> -+</context> -+<context> -+ <name>LoginOptionsWidget</name> -+ <message> -+ <source>Login Options</source> -+ <translation type="vanished">登录选项</translation> -+ </message> -+ <message> -+ <source>Wechat</source> -+ <translation type="vanished">微信</translation> -+ </message> -+</context> -+<context> -+ <name>MainWindow</name> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="65"/> -+ <source>Authentication</source> -+ <translation>Аутентификация</translation> -+ </message> -+ <message> -+ <source>Fingerprint authentication failed, you still have %1 verification opportunities</source> -+ <translation type="vanished">指纹验证失败,您还有%1次尝试机会</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.ui" line="26"/> -+ <source>Form</source> -+ <translation></translation> -+ </message> -+ <message> -+ <source>More</source> -+ <translation type="obsolete">更多</translation> -+ </message> -+ <message> -+ <source>Restart</source> -+ <translation type="obsolete">重新开始</translation> -+ </message> -+ <message> -+ <source>Password</source> -+ <translation type="vanished">密码</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.ui" line="302"/> -+ <location filename="../src/mainwindow.cpp" line="882"/> -+ <location filename="../src/mainwindow.cpp" line="948"/> -+ <source>Biometric</source> -+ <translation>Биометрия</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.ui" line="373"/> -+ <source>use password</source> -+ <translation>сырсөз колдонуу</translation> -+ </message> -+ <message> -+ <source>DeviceType:</source> -+ <translation type="obsolete">设备类型:</translation> -+ </message> -+ <message> -+ <source>Back</source> -+ <translation type="obsolete">返回</translation> -+ </message> -+ <message> -+ <source>Details</source> -+ <translation type="vanished">详细</translation> -+ </message> -+ <message> -+ <source>Action Id:</source> -+ <translation type="obsolete">动作:</translation> -+ </message> -+ <message> -+ <source>Description:</source> -+ <translation type="vanished">描述:</translation> -+ </message> -+ <message> -+ <source>Polkit.subject-pid:</source> -+ <translation type="vanished">Polkit.subject-pid:</translation> -+ </message> -+ <message> -+ <source>Retry</source> -+ <translation type="obsolete">重试</translation> -+ </message> -+ <message> -+ <source>Device types:</source> -+ <translation type="obsolete">设备类型:</translation> -+ </message> -+ <message> -+ <source>Vendor:</source> -+ <translation type="vanished">发行商:</translation> -+ </message> -+ <message> -+ <source>Action:</source> -+ <translation type="vanished">动作:</translation> -+ </message> -+ <message> -+ <source>Polkit.caller-pid:</source> -+ <translation type="vanished">Polkit.caller-pid:</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.ui" line="334"/> -+ <location filename="../src/mainwindow.cpp" line="884"/> -+ <source>Cancel</source> -+ <translation>Жокко чыгаруу</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.ui" line="353"/> -+ <location filename="../src/mainwindow.cpp" line="880"/> -+ <source>Authenticate</source> -+ <translation>Аутентификация</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="886"/> -+ <location filename="../src/mainwindow.cpp" line="991"/> -+ <source>Use password</source> -+ <translation>Сырсөз колдонуу</translation> -+ </message> -+ <message> -+ <source>Auth</source> -+ <translation type="obsolete">授权</translation> -+ </message> -+ <message> -+ <source>Too many unsuccessful attempts,please enter password.</source> -+ <translation type="vanished">指纹验证失败达最大次数,请使用密码解锁</translation> -+ </message> -+ <message> -+ <source>%1 authentication failure,there are still %2 remaining opportunities</source> -+ <translation type="vanished">%1认证失败,还剩%2次尝试机会</translation> -+ </message> -+ <message> -+ <source>%1 too many unsuccessful attempts,please enter password.</source> -+ <translation type="vanished">%1验证失败达最大次数,请使用密码登录</translation> -+ </message> -+ <message> -+ <source>in authentication, please wait...</source> -+ <translation type="vanished">认证中,请稍等...</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="1026"/> -+ <location filename="../src/mainwindow.cpp" line="1093"/> -+ <location filename="../src/mainwindow.cpp" line="1094"/> -+ <source>Please try again in %1 minutes.</source> -+ <translation>%1 мүнөттө кайра аракет кылыңыз.</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="1036"/> -+ <location filename="../src/mainwindow.cpp" line="1103"/> -+ <location filename="../src/mainwindow.cpp" line="1104"/> -+ <source>Please try again in %1 seconds.</source> -+ <translation>%1 секунданын ичинде кайра аракет кылыңыз.</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="1045"/> -+ <location filename="../src/mainwindow.cpp" line="1046"/> -+ <location filename="../src/mainwindow.cpp" line="1112"/> -+ <location filename="../src/mainwindow.cpp" line="1113"/> -+ <source>Account locked permanently.</source> -+ <translation>Эсеп биротоло кулпуланган.</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="675"/> -+ <location filename="../src/mainwindow.cpp" line="676"/> -+ <source>Password cannot be empty</source> -+ <translation>Сырсөз бош болушу мүмкүн эмес</translation> -+ </message> -+ <message> -+ <source>Failed to verify %1, please enter password.</source> -+ <translation type="vanished">验证%1失败,请输入密码.</translation> -+ </message> -+ <message> -+ <source>Unable to verify %1, please enter password.</source> -+ <translation type="vanished">无法验证%1,请输入密码.</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="175"/> -+ <source>Failed to verify %1, you still have %2 verification opportunities</source> -+ <translation>%1 текшерүүгө болбоду, сизде дагы эле %2 текшерүү мүмкүнчүлүктөрү бар</translation> -+ </message> -+ <message> -+ <source>An application is attempting to perform an action that requires privileges. Authentication is required to perform this action.</source> -+ <translation type="vanished">一个程序正试图执行一个需要特权的动作。要求授权以执行该动作。</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="578"/> -+ <source>Password: </source> -+ <translation>Сырсөз: </translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="261"/> -+ <source>Please enter your password or enroll your fingerprint </source> -+ <translation>Сырсөзүңөрдү киргизиңиз же манжа изин жазыңыз </translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="187"/> -+ <source>Abnormal network</source> -+ <translation>Аномалдуу тармак</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="511"/> -+ <source>This operation requires the administrator's authorization. Please enter your password to allow this operation.</source> -+ <translation>Бул операция администратордун уруксатын талап кылат. Бул операцияга уруксат берүү үчүн сырсөздү киргизиңиз.</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="580"/> -+ <source>_Password: </source> -+ <translation>_Password: </translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="582"/> -+ <source>_Password:</source> -+ <translation>_Password:</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="691"/> -+ <source>Authentication failed, please try again.</source> -+ <translation>Аутентификация ишке ашпады, кайра аракет кылыңыз.</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="623"/> -+ <source>days left</source> -+ <translation>калган күндөр</translation> -+ </message> -+ <message> -+ <source>Biometric/code scan authentication failed too many times, please enter the password.</source> -+ <translation type="vanished">生物/扫码验证失败达最大次数,请使用密码解锁.</translation> -+ </message> -+ <message> -+ <source>Bioauth/code scan authentication failed, you still have %1 verification opportunities</source> -+ <translation type="vanished">生物/扫码验证失败,您还有%1次尝试机会</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="164"/> -+ <location filename="../src/mainwindow.cpp" line="1176"/> -+ <source>Failed to verify %1, please enter password to unlock</source> -+ <translation>%1 текшерүүгө болбоду, кулпусун ачуу үчүн сырсөздү киргизиңиз</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="168"/> -+ <location filename="../src/mainwindow.cpp" line="1178"/> -+ <source>Unable to verify %1, please enter password to unlock</source> -+ <translation>%1 текшерүүгө болбоду, кулпусун ачуу үчүн сырсөздү киргизиңиз</translation> -+ </message> -+ <message> -+ <source>NET Exception</source> -+ <translation type="vanished">网络异常</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="517"/> -+ <source>A program is attempting to perform an action that requires privileges.It requires authorization to perform the action.</source> -+ <translation>Программа артыкчылыктарды талап кылган акцияны аткарууга аракет кылат. Акцияны аткарууга уруксат талап кылынат.</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="576"/> -+ <source>Input Password</source> -+ <translation>Сырсөз киргизүү</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="627"/> -+ <source>hours left</source> -+ <translation>саат калды</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="631"/> -+ <source>minutes left</source> -+ <translation>мүнөт калды</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="635"/> -+ <source>seconds left</source> -+ <translation>секуд калды</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="1193"/> -+ <source>Verify face recognition or enter password to unlock</source> -+ <translation>Беттин таанылышын текшерүү же кулпуну ачуу үчүн сырсөз киргизүү</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="1198"/> -+ <source>Press fingerprint or enter password to unlock</source> -+ <translation>Манжа изин басуу же кулпуну ачуу үчүн сырсөз киргизүү</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="1203"/> -+ <source>Verify voiceprint or enter password to unlock</source> -+ <translation>Үн изин текшерүү же сырсөз киргизүү</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="1208"/> -+ <source>Verify finger vein or enter password to unlock</source> -+ <translation>Манжа тамырын текшерүү же кулпуну ачуу үчүн сырсөз киргизүү</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="1213"/> -+ <source>Verify iris or enter password to unlock</source> -+ <translation>Ирис текшерүү же кулпусун ачуу үчүн сырсөз киргизүү</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="1218"/> -+ <source>Use the bound wechat scanning code or enter the password to unlock</source> -+ <translation>Чектелген вечат сканерлеу кодын колдонуңуз же сырсөздү ачуу үчүн киргизиңиз</translation> -+ </message> -+ <message> -+ <source>Use the bound wechat scanning code or enter the password to log in</source> -+ <translation type="vanished">使用绑定的微信扫码或输入密码登录</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="623"/> -+ <location filename="../src/mainwindow.cpp" line="627"/> -+ <location filename="../src/mainwindow.cpp" line="631"/> -+ <location filename="../src/mainwindow.cpp" line="635"/> -+ <source>Account locked,</source> -+ <translation>Эсеп кулпуланган,</translation> -+ </message> -+ <message> -+ <source>Authentication failed, please try again</source> -+ <translation type="obsolete">认证失败,请重试</translation> -+ </message> -+</context> -+<context> -+ <name>PolkitListener</name> -+ <message> -+ <location filename="../src/PolkitListener.cpp" line="88"/> -+ <source>Another client is already authenticating, please try again later.</source> -+ <translation>Дагы бир кардар буга чейин аутентификацияланган, кийин кайра аракет кылыңыз.</translation> -+ </message> -+ <message> -+ <location filename="../src/PolkitListener.cpp" line="257"/> -+ <source>Authentication failure, please try again.</source> -+ <translation>Аутентификациянын жетишсиздиги, сураныч, кайрадан аракет кылыңыз.</translation> -+ </message> -+ <message> -+ <location filename="../src/PolkitListener.cpp" line="264"/> -+ <source>Password input error!</source> -+ <translation>Сырсөз киргизүү катасы!</translation> -+ </message> -+ <message> -+ <source>Account locked %1 minutes due to %2 fail attempts</source> -+ <translation type="vanished">账户锁定%1分钟由于%2次错误尝试</translation> -+ </message> -+ <message> -+ <source>Authentication failure,there are still %1 remaining opportunities</source> -+ <translation type="vanished">认证失败,还剩余%1次尝试机会</translation> -+ </message> -+</context> -+<context> -+ <name>QObject</name> -+ <message> -+ <source>FingerPrint</source> -+ <translation type="obsolete">指纹</translation> -+ </message> -+ <message> -+ <source>FingerVein</source> -+ <translation type="obsolete">指静脉</translation> -+ </message> -+ <message> -+ <source>Iris</source> -+ <translation type="obsolete">虹膜</translation> -+ </message> -+ <message> -+ <source>Face</source> -+ <translation type="obsolete">人脸</translation> -+ </message> -+ <message> -+ <source>VoicePrint</source> -+ <translation type="obsolete">声纹</translation> -+ </message> -+ <message> -+ <source>Cancel</source> -+ <translation type="obsolete">取消</translation> -+ </message> -+</context> -+</TS> -diff --git a/polkit-agent/i18n_ts/mn.ts b/polkit-agent/i18n_ts/mn.ts -new file mode 100644 -index 0000000..ddf8371 ---- /dev/null -+++ b/polkit-agent/i18n_ts/mn.ts -@@ -0,0 +1,441 @@ -+<?xml version="1.0" encoding="utf-8"?> -+<!DOCTYPE TS> -+<TS version="2.1" language="mn"> -+<context> -+ <name>BioAuthWidget</name> -+ <message> -+ <source>Retry</source> -+ <translation type="obsolete">重试</translation> -+ </message> -+ <message> -+ <source>%1 too many unsuccessful attempts,please enter password.</source> -+ <translation type="obsolete">%1验证失败达最大次数,请使用密码登录</translation> -+ </message> -+ <message> -+ <source>%1 authentication failure,there are still %2 remaining opportunities</source> -+ <translation type="obsolete">%1认证失败,还剩%2次尝试机会</translation> -+ </message> -+ <message> -+ <source>Please use wechat to scan the code</source> -+ <translation type="vanished">请使用微信扫码</translation> -+ </message> -+</context> -+<context> -+ <name>BioDevices</name> -+ <message> -+ <source>FingerPrint</source> -+ <translation type="obsolete">指纹</translation> -+ </message> -+ <message> -+ <source>FingerVein</source> -+ <translation type="obsolete">指静脉</translation> -+ </message> -+ <message> -+ <source>Iris</source> -+ <translation type="obsolete">虹膜</translation> -+ </message> -+ <message> -+ <source>Face</source> -+ <translation type="obsolete">人脸</translation> -+ </message> -+ <message> -+ <source>VoicePrint</source> -+ <translation type="obsolete">声纹</translation> -+ </message> -+ <message> -+ <source>Wechat</source> -+ <translation type="vanished">微信</translation> -+ </message> -+ <message> -+ <source>QRCode</source> -+ <translation type="vanished">二维码</translation> -+ </message> -+</context> -+<context> -+ <name>LoginOptionsWidget</name> -+ <message> -+ <source>Login Options</source> -+ <translation type="vanished">登录选项</translation> -+ </message> -+ <message> -+ <source>Wechat</source> -+ <translation type="vanished">微信</translation> -+ </message> -+</context> -+<context> -+ <name>MainWindow</name> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="65"/> -+ <source>Authentication</source> -+ <translation>ᠡᠷᠬᠡ ᠤᠯᠭᠤᠬᠤ</translation> -+ </message> -+ <message> -+ <source>Fingerprint authentication failed, you still have %1 verification opportunities</source> -+ <translation type="vanished">指纹验证失败,您还有%1次尝试机会</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.ui" line="26"/> -+ <source>Form</source> -+ <translation></translation> -+ </message> -+ <message> -+ <source>More</source> -+ <translation type="obsolete">更多</translation> -+ </message> -+ <message> -+ <source>Restart</source> -+ <translation type="obsolete">重新开始</translation> -+ </message> -+ <message> -+ <source>Password</source> -+ <translation type="vanished">密码</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.ui" line="409"/> -+ <location filename="../src/mainwindow.cpp" line="1075"/> -+ <location filename="../src/mainwindow.cpp" line="1146"/> -+ <source>Biometric</source> -+ <translation>ᠠᠮᠢᠳᠤ ᠪᠤᠳᠠᠰ ᠢ᠋ ᠬᠡᠷᠡᠭᠯᠡᠵᠤ ᠢᠯᠭᠠᠨ ᠳᠠᠨᠢᠬᠤ</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.ui" line="480"/> -+ <source>use password</source> -+ <translation>ᠰᠢᠯᠭᠠᠨ ᠪᠠᠳᠤᠯᠠᠭᠰᠠᠨ ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋ ᠢ᠋ ᠬᠡᠷᠡᠭᠯᠡᠬᠦ</translation> -+ </message> -+ <message> -+ <source>DeviceType:</source> -+ <translation type="obsolete">设备类型:</translation> -+ </message> -+ <message> -+ <source>Back</source> -+ <translation type="obsolete">返回</translation> -+ </message> -+ <message> -+ <source>Details</source> -+ <translation type="vanished">详细</translation> -+ </message> -+ <message> -+ <source>Action Id:</source> -+ <translation type="obsolete">动作:</translation> -+ </message> -+ <message> -+ <source>Description:</source> -+ <translation type="vanished">描述:</translation> -+ </message> -+ <message> -+ <source>Polkit.subject-pid:</source> -+ <translation type="vanished">Polkit.subject-pid:</translation> -+ </message> -+ <message> -+ <source>Retry</source> -+ <translation type="obsolete">重试</translation> -+ </message> -+ <message> -+ <source>Device types:</source> -+ <translation type="obsolete">设备类型:</translation> -+ </message> -+ <message> -+ <source>Vendor:</source> -+ <translation type="vanished">发行商:</translation> -+ </message> -+ <message> -+ <source>Action:</source> -+ <translation type="vanished">动作:</translation> -+ </message> -+ <message> -+ <source>Polkit.caller-pid:</source> -+ <translation type="vanished">Polkit.caller-pid:</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.ui" line="441"/> -+ <location filename="../src/mainwindow.cpp" line="1077"/> -+ <source>Cancel</source> -+ <translation>ᠦᠬᠡᠢᠰᠭᠡᠬᠦ᠌</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.ui" line="460"/> -+ <location filename="../src/mainwindow.cpp" line="1073"/> -+ <source>Authenticate</source> -+ <translation>ᠡᠷᠬᠡ ᠤᠯᠭᠤᠬᠤ</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="1079"/> -+ <location filename="../src/mainwindow.cpp" line="1189"/> -+ <source>Use password</source> -+ <translation>ᠰᠢᠯᠭᠠᠨ ᠪᠠᠳᠤᠯᠠᠭᠰᠠᠨ ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋ ᠢ᠋ ᠬᠡᠷᠡᠭᠯᠡᠬᠦ</translation> -+ </message> -+ <message> -+ <source>Auth</source> -+ <translation type="obsolete">授权</translation> -+ </message> -+ <message> -+ <source>Too many unsuccessful attempts,please enter password.</source> -+ <translation type="vanished">指纹验证失败达最大次数,请使用密码解锁</translation> -+ </message> -+ <message> -+ <source>%1 authentication failure,there are still %2 remaining opportunities</source> -+ <translation type="vanished">%1认证失败,还剩%2次尝试机会</translation> -+ </message> -+ <message> -+ <source>%1 too many unsuccessful attempts,please enter password.</source> -+ <translation type="vanished">%1验证失败达最大次数,请使用密码登录</translation> -+ </message> -+ <message> -+ <source>in authentication, please wait...</source> -+ <translation type="vanished">认证中,请稍等...</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="1225"/> -+ <location filename="../src/mainwindow.cpp" line="1298"/> -+ <location filename="../src/mainwindow.cpp" line="1299"/> -+ <source>Please try again in %1 minutes.</source> -+ <translation>%1 ᠮᠢᠨᠦ᠋ᠲᠦᠨ ᠳᠠᠷᠠᠭᠠ ᠳᠠᠬᠢᠵᠤ ᠳᠤᠷᠱᠢᠭᠠᠷᠠᠢ.</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="1236"/> -+ <location filename="../src/mainwindow.cpp" line="1308"/> -+ <location filename="../src/mainwindow.cpp" line="1309"/> -+ <source>Please try again in %1 seconds.</source> -+ <translation>%1 ᠮᠢᠨᠦ᠋ᠲᠦᠨ ᠳᠠᠷᠠᠭᠠ ᠳᠠᠬᠢᠵᠤ ᠳᠤᠷᠱᠢᠭᠠᠷᠠᠢ.</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="1246"/> -+ <location filename="../src/mainwindow.cpp" line="1247"/> -+ <location filename="../src/mainwindow.cpp" line="1317"/> -+ <location filename="../src/mainwindow.cpp" line="1318"/> -+ <source>Account locked permanently.</source> -+ <translation>ᠳᠠᠩᠰᠠ ᠨᠢᠭᠡᠨᠳᠡ ᠦᠨᠢᠳᠡ ᠤᠨᠢᠰᠤᠯᠠᠭᠳᠠᠪᠠ.</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="834"/> -+ <location filename="../src/mainwindow.cpp" line="835"/> -+ <source>Password cannot be empty</source> -+ <translation>ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋ ᠬᠤᠭᠤᠰᠤᠨ ᠪᠠᠢᠵᠤ ᠪᠤᠯᠬᠤ ᠦᠬᠡᠢ</translation> -+ </message> -+ <message> -+ <source>Failed to verify %1, please enter password.</source> -+ <translation type="vanished">验证%1失败,请输入密码.</translation> -+ </message> -+ <message> -+ <source>Unable to verify %1, please enter password.</source> -+ <translation type="vanished">无法验证%1,请输入密码.</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="242"/> -+ <location filename="../src/mainwindow.cpp" line="246"/> -+ <source>Failed to verify %1, you still have %2 verification opportunities</source> -+ <translation>%1ᠶᠢᠨ/ᠦᠨ ᠰᠢᠯᠭᠠᠨ ᠪᠠᠢᠴᠠᠭᠠᠯᠳᠠ ᠢᠯᠠᠭᠳᠠᠪᠠ ᠂ ᠲᠠ ᠪᠠᠰᠠ%2 ᠤᠳᠠᠭᠠᠨᠤ ᠳᠤᠷᠱᠢᠬᠤ ᠵᠠᠪᠱᠢᠶᠠᠨ ᠲᠠᠢ</translation> -+ </message> -+ <message> -+ <source>An application is attempting to perform an action that requires privileges. Authentication is required to perform this action.</source> -+ <translation type="vanished">一个程序正试图执行一个需要特权的动作。要求授权以执行该动作。</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="731"/> -+ <source>Password: </source> -+ <translation>ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋᠄ </translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="335"/> -+ <source>Please enter your password or enroll your fingerprint </source> -+ <translation>ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋ ᠪᠤᠶᠤ ᠬᠤᠷᠤᠭᠤᠨ ᠤ᠋ ᠤᠷᠤᠮ ᠵᠢᠨᠨ ᠤᠷᠤᠭᠤᠯᠤᠭᠠᠷᠠᠢ </translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="259"/> -+ <source>Abnormal network</source> -+ <translation>ᠲᠤᠷ ᠰᠦᠯᠵᠢᠶᠡ ᠬᠡᠪ ᠤ᠋ᠨ ᠪᠤᠰᠤ</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="665"/> -+ <source>This operation requires the administrator's authorization. Please enter your password to allow this operation.</source> -+ <translation>ᠳᠤᠰ ᠤᠳᠠᠭᠠᠨ ᠤ᠋ ᠠᠵᠢᠯᠯᠠᠬᠤᠢ ᠵᠢᠨ ᠬᠠᠮᠢᠶᠠᠷᠤᠭᠴᠢ ᠵᠢᠨ ᠡᠷᠬᠡ ᠤᠯᠭᠤᠯᠳᠠ ᠪᠡᠷ ᠰᠠᠶᠢ ᠦᠷᠬᠦᠯᠵᠢᠯᠡᠨ ᠬᠡᠷᠡᠭᠵᠢᠬᠦᠯᠦᠨᠡ᠂ ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋ ᠵᠢᠨᠨ ᠤᠷᠤᠭᠤᠯᠵᠤ ᠳᠤᠰ ᠠᠵᠢᠯᠯᠠᠬᠤᠢ ᠵᠢ ᠵᠦᠪᠰᠢᠶᠡᠷᠡᠭᠡᠷᠡᠢ.</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="733"/> -+ <source>_Password: </source> -+ <translation>ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋: </translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="735"/> -+ <source>_Password:</source> -+ <translation>ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋:</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="850"/> -+ <source>Authentication failed, please try again.</source> -+ <translation>ᠰᠢᠯᠭᠠᠨ ᠪᠠᠳᠤᠯᠠᠵᠤ ᠴᠢᠳᠠᠭᠰᠠᠨ ᠦᠬᠡᠢ᠂ ᠳᠠᠬᠢᠵᠤ ᠳᠤᠷᠰᠢᠭᠠᠷᠠᠢ.</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="779"/> -+ <source>days left</source> -+ <translation>ᠡᠳᠦᠷ ᠤ᠋ᠨ ᠳᠠᠷᠠᠭᠠ ᠤᠨᠢᠰᠤ ᠳᠠᠢᠯᠤᠨᠠ</translation> -+ </message> -+ <message> -+ <source>Biometric/code scan authentication failed too many times, please enter the password.</source> -+ <translation type="vanished">生物/扫码验证失败达最大次数,请使用密码解锁.</translation> -+ </message> -+ <message> -+ <source>Bioauth/code scan authentication failed, you still have %1 verification opportunities</source> -+ <translation type="vanished">生物/扫码验证失败,您还有%1次尝试机会</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="226"/> -+ <location filename="../src/mainwindow.cpp" line="1421"/> -+ <location filename="../src/mainwindow.cpp" line="1423"/> -+ <source>Failed to verify %1, please enter password to unlock</source> -+ <translation>%1ᠶᠢ/ᠢ ᠪᠠᠳᠤᠯᠭᠠᠵᠢᠭᠤᠯᠬᠤ ᠠᠷᠭᠠ ᠦᠬᠡᠢ ᠂ ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋ ᠤᠷᠤᠭᠤᠯᠵᠤ ᠤᠨᠢᠰᠤᠶᠢ ᠳᠠᠢᠯᠤᠭᠠᠷᠠᠢ</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="231"/> -+ <location filename="../src/mainwindow.cpp" line="233"/> -+ <location filename="../src/mainwindow.cpp" line="1425"/> -+ <source>Unable to verify %1, please enter password to unlock</source> -+ <translation>%1ᠶᠢ/ᠢ ᠪᠠᠳᠤᠯᠭᠠᠵᠢᠭᠤᠯᠬᠤ ᠠᠷᠭᠠ ᠦᠬᠡᠢ ᠂ ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋ ᠤᠷᠤᠭᠤᠯᠵᠤ ᠤᠨᠢᠰᠤᠶᠢ ᠳᠠᠢᠯᠤᠭᠠᠷᠠᠢ</translation> -+ </message> -+ <message> -+ <source>NET Exception</source> -+ <translation type="vanished">网络异常</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="671"/> -+ <source>A program is attempting to perform an action that requires privileges.It requires authorization to perform the action.</source> -+ <translation>ᠨᠢᠭᠡ ᠫᠡᠷᠦᠭᠷᠡᠮ ᠶᠠᠭ ᠨᠢᠭᠡ ᠤᠨᠠᠴᠠ ᠡᠷᠬᠡ ᠬᠡᠷᠡᠭᠰᠡᠬᠦ ᠬᠦᠳᠡᠯᠬᠡᠬᠡᠨ ᠢ᠋ ᠬᠡᠷᠡᠭᠵᠢᠬᠦᠯᠬᠦ ᠪᠡᠷ ᠳᠤᠷᠰᠢᠵᠤ ᠪᠠᠢᠨᠠ᠂ ᠳᠤᠰ ᠬᠦᠳᠡᠯᠬᠡᠬᠡᠨ ᠢ᠋ ᠬᠦᠢᠴᠡᠳᠬᠡᠬᠦ ᠡᠷᠬᠡ ᠤᠯᠭᠤᠬᠤ ᠵᠢ ᠱᠠᠭᠠᠷᠳᠠᠵᠤ ᠪᠠᠢᠨᠠ.</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="108"/> -+ <location filename="../src/mainwindow.cpp" line="729"/> -+ <source>Input Password</source> -+ <translation>ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋ ᠤᠷᠤᠭᠤᠯᠬᠤ</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="105"/> -+ <source>Insert the ukey into the USB port</source> -+ <translation>ᠠᠮᠤᠷ ᠲᠦᠪᠰᠢᠨ ᠦ ᠨᠢᠭᠤᠴᠠ ᠶᠢ USB ᠦᠵᠦᠭᠦᠷ ᠲᠦ ᠬᠠᠳᠬᠤᠵᠤ ᠣᠷᠣᠭᠠᠷᠠᠢ ᠃</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="107"/> -+ <source>Enter the ukey password</source> -+ <translation>ᠠᠮᠤᠷ ᠲᠦᠪᠰᠢᠨ ᠨᠢᠭᠤᠴᠠ ᠨᠣᠮᠧᠷ ᠢ ᠣᠷᠣᠭᠤᠯᠤᠨᠠ ᠃</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="783"/> -+ <source>hours left</source> -+ <translation>ᠨᠢᠭᠡ ᠴᠠᠭ ᠤ᠋ᠨ ᠳᠠᠷᠠᠭᠠ ᠤᠨᠢᠰᠤ ᠳᠠᠢᠯᠤᠨᠠ</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="787"/> -+ <source>minutes left</source> -+ <translation>ᠮᠢᠨᠦ᠋ᠲ ᠤ᠋ᠨ ᠳᠠᠷᠠᠭᠠ ᠤᠨᠢᠰᠤ ᠳᠠᠢᠯᠤᠨᠠ</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="791"/> -+ <source>seconds left</source> -+ <translation>ᠰᠸᠺᠦᠨ᠋ᠲ ᠤ᠋ᠨ ᠳᠠᠷᠠᠭᠠ ᠤᠨᠢᠰᠤ ᠳᠠᠢᠯᠤᠨᠠ</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="880"/> -+ <location filename="../src/mainwindow.cpp" line="888"/> -+ <source>Input your password to authentication</source> -+ <translation>ᠨᠢᠭᠤᠴᠠ ᠨᠣᠮᠧᠷ ᠣᠷᠣᠭᠤᠯᠬᠤ ᠳᠤ ᠡᠷᠬᠡ ᠣᠯᠭᠣᠨᠠ ᠃</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="1440"/> -+ <source>Verify face recognition or enter password to unlock</source> -+ <translation>ᠨᠢᠭᠤᠷ ᠱᠢᠷᠪᠢᠵᠤ ᠪᠠᠳᠤᠯᠭᠠᠵᠢᠭᠤᠯᠬᠤ ᠪᠤᠶᠤ ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋ ᠤᠷᠤᠭᠤᠯᠵᠤ ᠤᠨᠢᠰᠤᠶᠢ ᠳᠠᠢᠯᠤᠭᠠᠷᠠᠢ</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="1445"/> -+ <source>Press fingerprint or enter password to unlock</source> -+ <translation>ᠬᠤᠷᠤᠭᠤᠨᠤ ᠤᠷᠤᠮ ᠳᠠᠷᠤᠬᠤ ᠪᠤᠶᠤ ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋ ᠤᠷᠤᠭᠤᠯᠵᠤ ᠤᠨᠢᠰᠤᠶᠢ ᠳᠠᠢᠯᠤᠭᠠᠷᠠᠢ</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="1450"/> -+ <source>Verify voiceprint or enter password to unlock</source> -+ <translation>ᠳᠠᠭᠤᠪᠠᠷ ᠰᠢᠯᠭᠠᠨ ᠪᠠᠳᠤᠯᠠᠬᠤ ᠪᠤᠶᠤ ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋ ᠤᠷᠤᠭᠤᠯᠵᠤ ᠤᠨᠢᠰᠤᠶᠢ ᠳᠠᠢᠯᠤᠭᠠᠷᠠᠢ</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="1455"/> -+ <source>Verify finger vein or enter password to unlock</source> -+ <translation>ᠬᠤᠷᠤᠭᠤᠨᠤ ᠨᠠᠮᠵᠢᠭᠤᠨ ᠰᠤᠳᠠᠯᠢᠶᠠᠷ ᠰᠢᠯᠭᠠᠨ ᠪᠠᠳᠤᠯᠠᠬᠤ ᠪᠤᠶᠤ ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋ ᠤᠷᠤᠭᠤᠯᠵᠤ ᠤᠨᠢᠰᠤᠶᠢ ᠳᠠᠢᠯᠤᠭᠠᠷᠠᠢ</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="1460"/> -+ <source>Verify iris or enter password to unlock</source> -+ <translation>ᠰᠤᠯᠤᠩᠭᠠ ᠪᠦᠷᠬᠦᠪᠴᠢᠶᠢ ᠰᠢᠯᠭᠠᠨ ᠪᠠᠳᠤᠯᠠᠬᠤ ᠪᠤᠶᠤ ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋ ᠤᠷᠤᠭᠤᠯᠵᠤ ᠤᠨᠢᠰᠤᠶᠢ ᠳᠠᠢᠯᠤᠭᠠᠷᠠᠢ</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="1465"/> -+ <source>Use the bound wechat scanning code or enter the password to unlock</source> -+ <translation>ᠤᠶᠠᠭᠰᠠᠨ ᠸᠢᠴᠠᠲᠢᠶᠠᠷ ᠺᠤᠳ᠋ ᠱᠢᠷᠪᠢᠬᠦ᠌ ᠪᠤᠶᠤ ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋ ᠤᠷᠤᠭᠤᠯᠵᠤ ᠤᠨᠢᠰᠤᠶᠢ ᠳᠠᠢᠯᠤᠭᠠᠷᠠᠢ</translation> -+ </message> -+ <message> -+ <source>Use the bound wechat scanning code or enter the password to log in</source> -+ <translation type="vanished">使用绑定的微信扫码或输入密码登录</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="779"/> -+ <location filename="../src/mainwindow.cpp" line="783"/> -+ <location filename="../src/mainwindow.cpp" line="787"/> -+ <location filename="../src/mainwindow.cpp" line="791"/> -+ <source>Account locked,</source> -+ <translation>ᠳᠠᠨᠭᠰᠠ ᠵᠢ ᠨᠢᠬᠡᠨᠳᠡ ᠤᠨᠢᠰᠤᠯᠠᠪᠠ</translation> -+ </message> -+ <message> -+ <source>Authentication failed, please try again</source> -+ <translation type="obsolete">认证失败,请重试</translation> -+ </message> -+</context> -+<context> -+ <name>PolkitListener</name> -+ <message> -+ <location filename="../src/PolkitListener.cpp" line="88"/> -+ <source>Another client is already authenticating, please try again later.</source> -+ <translation>ᠦᠬᠡᠷᠡ ᠨᠢᠭᠡ ᠬᠡᠷᠡᠭᠯᠡᠭᠴᠢ ᠵᠢᠨ ᠦᠵᠦᠬᠦᠷᠯᠢᠭ ᠢ᠋ ᠶᠠᠭ ᠨᠤᠳᠠᠯᠠᠵᠤ ᠪᠠᠢᠨᠠ᠂ ᠤᠳᠠᠰᠬᠢᠭᠠᠳ ᠳᠠᠬᠢᠨ ᠳᠤᠷᠰᠢᠭᠠᠷᠠᠢ.</translation> -+ </message> -+ <message> -+ <location filename="../src/PolkitListener.cpp" line="261"/> -+ <source>Authentication failure, please try again.</source> -+ <translation>ᠰᠢᠯᠭᠠᠨ ᠪᠠᠳᠤᠯᠠᠵᠤ ᠴᠢᠳᠠᠭᠰᠠᠨ ᠦᠬᠡᠢ᠂ ᠳᠠᠬᠢᠵᠤ ᠳᠤᠷᠰᠢᠭᠠᠷᠠᠢ.</translation> -+ </message> -+ <message> -+ <location filename="../src/PolkitListener.cpp" line="268"/> -+ <source>Password input error!</source> -+ <translation>ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋ ᠢ᠋ ᠪᠤᠷᠤᠭᠤ ᠤᠷᠤᠭᠤᠯᠪᠠ!</translation> -+ </message> -+ <message> -+ <source>Account locked %1 minutes due to %2 fail attempts</source> -+ <translation type="vanished">账户锁定%1分钟由于%2次错误尝试</translation> -+ </message> -+ <message> -+ <source>Authentication failure,there are still %1 remaining opportunities</source> -+ <translation type="vanished">认证失败,还剩余%1次尝试机会</translation> -+ </message> -+</context> -+<context> -+ <name>QObject</name> -+ <message> -+ <source>FingerPrint</source> -+ <translation type="obsolete">指纹</translation> -+ </message> -+ <message> -+ <source>FingerVein</source> -+ <translation type="obsolete">指静脉</translation> -+ </message> -+ <message> -+ <source>Iris</source> -+ <translation type="obsolete">虹膜</translation> -+ </message> -+ <message> -+ <source>Face</source> -+ <translation type="obsolete">人脸</translation> -+ </message> -+ <message> -+ <source>VoicePrint</source> -+ <translation type="obsolete">声纹</translation> -+ </message> -+ <message> -+ <source>Cancel</source> -+ <translation type="obsolete">取消</translation> -+ </message> -+</context> -+</TS> -diff --git a/polkit-agent/i18n_ts/ug.ts b/polkit-agent/i18n_ts/ug.ts -new file mode 100644 -index 0000000..628eadd ---- /dev/null -+++ b/polkit-agent/i18n_ts/ug.ts -@@ -0,0 +1,421 @@ -+<?xml version="1.0" encoding="utf-8"?> -+<!DOCTYPE TS> -+<TS version="2.1" language="ug"> -+<context> -+ <name>BioAuthWidget</name> -+ <message> -+ <source>Retry</source> -+ <translation type="obsolete">重试</translation> -+ </message> -+ <message> -+ <source>%1 too many unsuccessful attempts,please enter password.</source> -+ <translation type="obsolete">%1验证失败达最大次数,请使用密码登录</translation> -+ </message> -+ <message> -+ <source>%1 authentication failure,there are still %2 remaining opportunities</source> -+ <translation type="obsolete">%1认证失败,还剩%2次尝试机会</translation> -+ </message> -+ <message> -+ <source>Please use wechat to scan the code</source> -+ <translation type="vanished">请使用微信扫码</translation> -+ </message> -+</context> -+<context> -+ <name>BioDevices</name> -+ <message> -+ <source>FingerPrint</source> -+ <translation type="obsolete">指纹</translation> -+ </message> -+ <message> -+ <source>FingerVein</source> -+ <translation type="obsolete">指静脉</translation> -+ </message> -+ <message> -+ <source>Iris</source> -+ <translation type="obsolete">虹膜</translation> -+ </message> -+ <message> -+ <source>Face</source> -+ <translation type="obsolete">人脸</translation> -+ </message> -+ <message> -+ <source>VoicePrint</source> -+ <translation type="obsolete">声纹</translation> -+ </message> -+ <message> -+ <source>Wechat</source> -+ <translation type="vanished">微信</translation> -+ </message> -+ <message> -+ <source>QRCode</source> -+ <translation type="vanished">二维码</translation> -+ </message> -+</context> -+<context> -+ <name>LoginOptionsWidget</name> -+ <message> -+ <source>Login Options</source> -+ <translation type="vanished">登录选项</translation> -+ </message> -+ <message> -+ <source>Wechat</source> -+ <translation type="vanished">微信</translation> -+ </message> -+</context> -+<context> -+ <name>MainWindow</name> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="65"/> -+ <source>Authentication</source> -+ <translation>راستىنى دەلىللەش</translation> -+ </message> -+ <message> -+ <source>Fingerprint authentication failed, you still have %1 verification opportunities</source> -+ <translation type="vanished">指纹验证失败,您还有%1次尝试机会</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.ui" line="26"/> -+ <source>Form</source> -+ <translation></translation> -+ </message> -+ <message> -+ <source>More</source> -+ <translation type="obsolete">更多</translation> -+ </message> -+ <message> -+ <source>Restart</source> -+ <translation type="obsolete">重新开始</translation> -+ </message> -+ <message> -+ <source>Password</source> -+ <translation type="vanished">密码</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.ui" line="302"/> -+ <location filename="../src/mainwindow.cpp" line="882"/> -+ <location filename="../src/mainwindow.cpp" line="948"/> -+ <source>Biometric</source> -+ <translation>بىئومېتىرىيە</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.ui" line="373"/> -+ <source>use password</source> -+ <translation>مەخپىي نومۇر ئىشلىتىش</translation> -+ </message> -+ <message> -+ <source>DeviceType:</source> -+ <translation type="obsolete">设备类型:</translation> -+ </message> -+ <message> -+ <source>Back</source> -+ <translation type="obsolete">返回</translation> -+ </message> -+ <message> -+ <source>Details</source> -+ <translation type="vanished">详细</translation> -+ </message> -+ <message> -+ <source>Action Id:</source> -+ <translation type="obsolete">动作:</translation> -+ </message> -+ <message> -+ <source>Description:</source> -+ <translation type="vanished">描述:</translation> -+ </message> -+ <message> -+ <source>Polkit.subject-pid:</source> -+ <translation type="vanished">Polkit.subject-pid:</translation> -+ </message> -+ <message> -+ <source>Retry</source> -+ <translation type="obsolete">重试</translation> -+ </message> -+ <message> -+ <source>Device types:</source> -+ <translation type="obsolete">设备类型:</translation> -+ </message> -+ <message> -+ <source>Vendor:</source> -+ <translation type="vanished">发行商:</translation> -+ </message> -+ <message> -+ <source>Action:</source> -+ <translation type="vanished">动作:</translation> -+ </message> -+ <message> -+ <source>Polkit.caller-pid:</source> -+ <translation type="vanished">Polkit.caller-pid:</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.ui" line="334"/> -+ <location filename="../src/mainwindow.cpp" line="884"/> -+ <source>Cancel</source> -+ <translation>ئەمەلدىن قالدۇرۇش</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.ui" line="353"/> -+ <location filename="../src/mainwindow.cpp" line="880"/> -+ <source>Authenticate</source> -+ <translation>چىنلىق دەلىللەش</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="886"/> -+ <location filename="../src/mainwindow.cpp" line="991"/> -+ <source>Use password</source> -+ <translation>پارول ئىشلىتىش</translation> -+ </message> -+ <message> -+ <source>Auth</source> -+ <translation type="obsolete">授权</translation> -+ </message> -+ <message> -+ <source>Too many unsuccessful attempts,please enter password.</source> -+ <translation type="vanished">指纹验证失败达最大次数,请使用密码解锁</translation> -+ </message> -+ <message> -+ <source>%1 authentication failure,there are still %2 remaining opportunities</source> -+ <translation type="vanished">%1认证失败,还剩%2次尝试机会</translation> -+ </message> -+ <message> -+ <source>%1 too many unsuccessful attempts,please enter password.</source> -+ <translation type="vanished">%1验证失败达最大次数,请使用密码登录</translation> -+ </message> -+ <message> -+ <source>in authentication, please wait...</source> -+ <translation type="vanished">认证中,请稍等...</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="1026"/> -+ <location filename="../src/mainwindow.cpp" line="1093"/> -+ <location filename="../src/mainwindow.cpp" line="1094"/> -+ <source>Please try again in %1 minutes.</source> -+ <translation>٪1 مىنۇت ئىچىدە قايتا سىناپ بېقىڭ.</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="1036"/> -+ <location filename="../src/mainwindow.cpp" line="1103"/> -+ <location filename="../src/mainwindow.cpp" line="1104"/> -+ <source>Please try again in %1 seconds.</source> -+ <translation>٪1 سېكۇنت ئىچىدە قايتا سىناپ بېقىڭ.</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="1045"/> -+ <location filename="../src/mainwindow.cpp" line="1046"/> -+ <location filename="../src/mainwindow.cpp" line="1112"/> -+ <location filename="../src/mainwindow.cpp" line="1113"/> -+ <source>Account locked permanently.</source> -+ <translation>ھېسابات مەڭگۈلۈك قۇلۇپلىنىدۇ.</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="675"/> -+ <location filename="../src/mainwindow.cpp" line="676"/> -+ <source>Password cannot be empty</source> -+ <translation>مەخپىي نومۇرنى بوش قويۇشقا بولمايدۇ</translation> -+ </message> -+ <message> -+ <source>Failed to verify %1, please enter password.</source> -+ <translation type="vanished">验证%1失败,请输入密码.</translation> -+ </message> -+ <message> -+ <source>Unable to verify %1, please enter password.</source> -+ <translation type="vanished">无法验证%1,请输入密码.</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="175"/> -+ <source>Failed to verify %1, you still have %2 verification opportunities</source> -+ <translation>٪1 نى دەلىللەش مەغلۇپ بولدى، سىزدە يەنىلا ٪2 دەلىللەش پۇرسىتى بار</translation> -+ </message> -+ <message> -+ <source>An application is attempting to perform an action that requires privileges. Authentication is required to perform this action.</source> -+ <translation type="vanished">一个程序正试图执行一个需要特权的动作。要求授权以执行该动作。</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="578"/> -+ <source>Password: </source> -+ <translation>مەخپىي نومۇرى: </translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="261"/> -+ <source>Please enter your password or enroll your fingerprint </source> -+ <translation>مەخپىي نومۇرىڭىزنى كىرگۈزۈڭ ياكى بارماق ئىزىڭىزنى تىزىملىتىڭ </translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="187"/> -+ <source>Abnormal network</source> -+ <translation>بىنورمال تور</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="511"/> -+ <source>This operation requires the administrator's authorization. Please enter your password to allow this operation.</source> -+ <translation>بۇ مەشغۇلات باشقۇرغۇچىنىڭ ھوقۇق بېرىشىنى تەلەپ قىلىدۇ. بۇ مەشغۇلاتقا رۇخسەت قىلىش ئۈچۈن پارولىڭىزنى كىرگۈزۈڭ.</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="580"/> -+ <source>_Password: </source> -+ <translation>_Password: </translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="582"/> -+ <source>_Password:</source> -+ <translation>_Password:</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="691"/> -+ <source>Authentication failed, please try again.</source> -+ <translation>دەلىللەش مەغلۇپ بولدى، قايتا سىناپ بېقىڭ.</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="623"/> -+ <source>days left</source> -+ <translation>قالغان كۈنلەر</translation> -+ </message> -+ <message> -+ <source>Biometric/code scan authentication failed too many times, please enter the password.</source> -+ <translation type="vanished">生物/扫码验证失败达最大次数,请使用密码解锁.</translation> -+ </message> -+ <message> -+ <source>Bioauth/code scan authentication failed, you still have %1 verification opportunities</source> -+ <translation type="vanished">生物/扫码验证失败,您还有%1次尝试机会</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="164"/> -+ <location filename="../src/mainwindow.cpp" line="1176"/> -+ <source>Failed to verify %1, please enter password to unlock</source> -+ <translation>٪1 نى دەلىللەش مەغلۇپ بولدى، مەخپى نۇمۇر كىرگۈزۈڭ</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="168"/> -+ <location filename="../src/mainwindow.cpp" line="1178"/> -+ <source>Unable to verify %1, please enter password to unlock</source> -+ <translation>٪1 نى دەلىللەشكە ئامالسىز، مەخپىي نومۇرنى كىرگۈزۈپ قۇلۇپنى ئاچ</translation> -+ </message> -+ <message> -+ <source>NET Exception</source> -+ <translation type="vanished">网络异常</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="517"/> -+ <source>A program is attempting to perform an action that requires privileges.It requires authorization to perform the action.</source> -+ <translation>بىر پروگرامما ئىمتىياز تەلەپ قىلىدىغان ھەرىكەتنى قىلىشقا ئۇرۇنماقتا. بۇ ھەرىكەتنى ئىجرا قىلىش ئۈچۈن ھوقۇق تەلەپ قىلىدۇ.</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="576"/> -+ <source>Input Password</source> -+ <translation>ئىم كىرگۈزۈش</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="627"/> -+ <source>hours left</source> -+ <translation>قالغان سائەتلەر</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="631"/> -+ <source>minutes left</source> -+ <translation>مىنۇت قالدى</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="635"/> -+ <source>seconds left</source> -+ <translation>سېكۇنت قالدى</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="1193"/> -+ <source>Verify face recognition or enter password to unlock</source> -+ <translation>چىراي تونۇشنى دەلىللەش ياكى مەخپىي نومۇر كىرگۈزۈش ئارقىلىق قۇلۇپ ئېچىش</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="1198"/> -+ <source>Press fingerprint or enter password to unlock</source> -+ <translation>بارماق ئىزىنى بېسىش ياكى مەخپىي نومۇر كىرگۈزۈش ئارقىلىق قۇلۇپ ئېچىش</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="1203"/> -+ <source>Verify voiceprint or enter password to unlock</source> -+ <translation>ئاۋاز ئىزىنى دەلىللەش ياكى مەخپىي نومۇر كىرگۈزۈش ئارقىلىق قۇلۇپ ئېچىش</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="1208"/> -+ <source>Verify finger vein or enter password to unlock</source> -+ <translation>بارماق تومۇرىنى ئېنىقلاش ياكى مەخپىي نومۇر كىرگۈزۈش ئارقىلىق قۇلۇپ ئېچىش</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="1213"/> -+ <source>Verify iris or enter password to unlock</source> -+ <translation>Iris نى ئېنىقلاش ياكى مەخپىي نومۇر كىرگۈزۈش ئارقىلىق قۇلۇپ ئېچىش</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="1218"/> -+ <source>Use the bound wechat scanning code or enter the password to unlock</source> -+ <translation>باغلانغان ئۈندىدارنى سىكاننېرلاش كودى ياكى مەخپىي نومۇرىنى كىرگۈزۈپ قۇلۇپ ئېچىش</translation> -+ </message> -+ <message> -+ <source>Use the bound wechat scanning code or enter the password to log in</source> -+ <translation type="vanished">使用绑定的微信扫码或输入密码登录</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="623"/> -+ <location filename="../src/mainwindow.cpp" line="627"/> -+ <location filename="../src/mainwindow.cpp" line="631"/> -+ <location filename="../src/mainwindow.cpp" line="635"/> -+ <source>Account locked,</source> -+ <translation>ھېسابات قۇلۇپلانغان ،</translation> -+ </message> -+ <message> -+ <source>Authentication failed, please try again</source> -+ <translation type="obsolete">认证失败,请重试</translation> -+ </message> -+</context> -+<context> -+ <name>PolkitListener</name> -+ <message> -+ <location filename="../src/PolkitListener.cpp" line="88"/> -+ <source>Another client is already authenticating, please try again later.</source> -+ <translation>يەنە بىر خېرىدار ئاللىقاچان دەلىللەشكە باشلىدى، سەل تۇرۇپ قايتا سىناپ بېقىڭ.</translation> -+ </message> -+ <message> -+ <location filename="../src/PolkitListener.cpp" line="257"/> -+ <source>Authentication failure, please try again.</source> -+ <translation>دەلىللەش مەغلۇپ بولدى، قايتا سىناپ بېقىڭ.</translation> -+ </message> -+ <message> -+ <location filename="../src/PolkitListener.cpp" line="264"/> -+ <source>Password input error!</source> -+ <translation>پارول كىرگۈزۈش خاتالىقى!</translation> -+ </message> -+ <message> -+ <source>Account locked %1 minutes due to %2 fail attempts</source> -+ <translation type="vanished">账户锁定%1分钟由于%2次错误尝试</translation> -+ </message> -+ <message> -+ <source>Authentication failure,there are still %1 remaining opportunities</source> -+ <translation type="vanished">认证失败,还剩余%1次尝试机会</translation> -+ </message> -+</context> -+<context> -+ <name>QObject</name> -+ <message> -+ <source>FingerPrint</source> -+ <translation type="obsolete">指纹</translation> -+ </message> -+ <message> -+ <source>FingerVein</source> -+ <translation type="obsolete">指静脉</translation> -+ </message> -+ <message> -+ <source>Iris</source> -+ <translation type="obsolete">虹膜</translation> -+ </message> -+ <message> -+ <source>Face</source> -+ <translation type="obsolete">人脸</translation> -+ </message> -+ <message> -+ <source>VoicePrint</source> -+ <translation type="obsolete">声纹</translation> -+ </message> -+ <message> -+ <source>Cancel</source> -+ <translation type="obsolete">取消</translation> -+ </message> -+</context> -+</TS> -diff --git a/polkit-agent/i18n_ts/zh_HK.ts b/polkit-agent/i18n_ts/zh_HK.ts -new file mode 100644 -index 0000000..aea8f94 ---- /dev/null -+++ b/polkit-agent/i18n_ts/zh_HK.ts -@@ -0,0 +1,441 @@ -+<?xml version="1.0" encoding="utf-8"?> -+<!DOCTYPE TS> -+<TS version="2.1" language="zh_Hant"> -+<context> -+ <name>BioAuthWidget</name> -+ <message> -+ <source>Retry</source> -+ <translation type="obsolete">重试</translation> -+ </message> -+ <message> -+ <source>%1 too many unsuccessful attempts,please enter password.</source> -+ <translation type="obsolete">%1验证失败达最大次数,请使用密码登录</translation> -+ </message> -+ <message> -+ <source>%1 authentication failure,there are still %2 remaining opportunities</source> -+ <translation type="obsolete">%1认证失败,还剩%2次尝试机会</translation> -+ </message> -+ <message> -+ <source>Please use wechat to scan the code</source> -+ <translation type="vanished">请使用微信扫码</translation> -+ </message> -+</context> -+<context> -+ <name>BioDevices</name> -+ <message> -+ <source>FingerPrint</source> -+ <translation type="obsolete">指纹</translation> -+ </message> -+ <message> -+ <source>FingerVein</source> -+ <translation type="obsolete">指静脉</translation> -+ </message> -+ <message> -+ <source>Iris</source> -+ <translation type="obsolete">虹膜</translation> -+ </message> -+ <message> -+ <source>Face</source> -+ <translation type="obsolete">人脸</translation> -+ </message> -+ <message> -+ <source>VoicePrint</source> -+ <translation type="obsolete">声纹</translation> -+ </message> -+ <message> -+ <source>Wechat</source> -+ <translation type="vanished">微信</translation> -+ </message> -+ <message> -+ <source>QRCode</source> -+ <translation type="vanished">二维码</translation> -+ </message> -+</context> -+<context> -+ <name>LoginOptionsWidget</name> -+ <message> -+ <source>Login Options</source> -+ <translation type="vanished">登录选项</translation> -+ </message> -+ <message> -+ <source>Wechat</source> -+ <translation type="vanished">微信</translation> -+ </message> -+</context> -+<context> -+ <name>MainWindow</name> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="67"/> -+ <source>Authentication</source> -+ <translation>授權</translation> -+ </message> -+ <message> -+ <source>Fingerprint authentication failed, you still have %1 verification opportunities</source> -+ <translation type="vanished">指纹验证失败,您还有%1次尝试机会</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.ui" line="26"/> -+ <source>Form</source> -+ <translation></translation> -+ </message> -+ <message> -+ <source>More</source> -+ <translation type="obsolete">更多</translation> -+ </message> -+ <message> -+ <source>Restart</source> -+ <translation type="obsolete">重新开始</translation> -+ </message> -+ <message> -+ <source>Password</source> -+ <translation type="vanished">密码</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.ui" line="409"/> -+ <location filename="../src/mainwindow.cpp" line="1077"/> -+ <location filename="../src/mainwindow.cpp" line="1145"/> -+ <source>Biometric</source> -+ <translation>使用生物識別</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.ui" line="480"/> -+ <source>use password</source> -+ <translation>使用密碼驗證</translation> -+ </message> -+ <message> -+ <source>DeviceType:</source> -+ <translation type="obsolete">设备类型:</translation> -+ </message> -+ <message> -+ <source>Back</source> -+ <translation type="obsolete">返回</translation> -+ </message> -+ <message> -+ <source>Details</source> -+ <translation type="vanished">详细</translation> -+ </message> -+ <message> -+ <source>Action Id:</source> -+ <translation type="obsolete">动作:</translation> -+ </message> -+ <message> -+ <source>Description:</source> -+ <translation type="vanished">描述:</translation> -+ </message> -+ <message> -+ <source>Polkit.subject-pid:</source> -+ <translation type="vanished">Polkit.subject-pid:</translation> -+ </message> -+ <message> -+ <source>Retry</source> -+ <translation type="obsolete">重试</translation> -+ </message> -+ <message> -+ <source>Device types:</source> -+ <translation type="obsolete">设备类型:</translation> -+ </message> -+ <message> -+ <source>Vendor:</source> -+ <translation type="vanished">发行商:</translation> -+ </message> -+ <message> -+ <source>Action:</source> -+ <translation type="vanished">动作:</translation> -+ </message> -+ <message> -+ <source>Polkit.caller-pid:</source> -+ <translation type="vanished">Polkit.caller-pid:</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.ui" line="441"/> -+ <location filename="../src/mainwindow.cpp" line="1079"/> -+ <source>Cancel</source> -+ <translation>取消</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.ui" line="460"/> -+ <location filename="../src/mainwindow.cpp" line="1075"/> -+ <source>Authenticate</source> -+ <translation>授權</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="1081"/> -+ <location filename="../src/mainwindow.cpp" line="1185"/> -+ <source>Use password</source> -+ <translation>使用密碼驗證</translation> -+ </message> -+ <message> -+ <source>Auth</source> -+ <translation type="obsolete">授权</translation> -+ </message> -+ <message> -+ <source>Too many unsuccessful attempts,please enter password.</source> -+ <translation type="vanished">指纹验证失败达最大次数,请使用密码解锁</translation> -+ </message> -+ <message> -+ <source>%1 authentication failure,there are still %2 remaining opportunities</source> -+ <translation type="vanished">%1认证失败,还剩%2次尝试机会</translation> -+ </message> -+ <message> -+ <source>%1 too many unsuccessful attempts,please enter password.</source> -+ <translation type="vanished">%1验证失败达最大次数,请使用密码登录</translation> -+ </message> -+ <message> -+ <source>in authentication, please wait...</source> -+ <translation type="vanished">认证中,请稍等...</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="1221"/> -+ <location filename="../src/mainwindow.cpp" line="1294"/> -+ <location filename="../src/mainwindow.cpp" line="1295"/> -+ <source>Please try again in %1 minutes.</source> -+ <translation>請%1分鐘后再試</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="1232"/> -+ <location filename="../src/mainwindow.cpp" line="1304"/> -+ <location filename="../src/mainwindow.cpp" line="1305"/> -+ <source>Please try again in %1 seconds.</source> -+ <translation>請%1秒後再試</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="1242"/> -+ <location filename="../src/mainwindow.cpp" line="1243"/> -+ <location filename="../src/mainwindow.cpp" line="1313"/> -+ <location filename="../src/mainwindow.cpp" line="1314"/> -+ <source>Account locked permanently.</source> -+ <translation>帳號已被永久鎖定</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="836"/> -+ <location filename="../src/mainwindow.cpp" line="837"/> -+ <source>Password cannot be empty</source> -+ <translation>密碼不能為空</translation> -+ </message> -+ <message> -+ <source>Failed to verify %1, please enter password.</source> -+ <translation type="vanished">验证%1失败,请输入密码.</translation> -+ </message> -+ <message> -+ <source>Unable to verify %1, please enter password.</source> -+ <translation type="vanished">无法验证%1,请输入密码.</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="244"/> -+ <location filename="../src/mainwindow.cpp" line="248"/> -+ <source>Failed to verify %1, you still have %2 verification opportunities</source> -+ <translation>驗證%1失敗,您還有%2次嘗試機會</translation> -+ </message> -+ <message> -+ <source>An application is attempting to perform an action that requires privileges. Authentication is required to perform this action.</source> -+ <translation type="vanished">一个程序正试图执行一个需要特权的动作。要求授权以执行该动作。</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="733"/> -+ <source>Password: </source> -+ <translation>密碼: </translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="337"/> -+ <source>Please enter your password or enroll your fingerprint </source> -+ <translation>請輸入密碼或者錄入指紋 </translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="261"/> -+ <source>Abnormal network</source> -+ <translation>網路異常</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="511"/> -+ <source>This operation requires the administrator's authorization. Please enter your password to allow this operation.</source> -+ <translation>本次操作需要通過管理員的授權才能繼續執行,請輸入密碼以允許本次操作。</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="735"/> -+ <source>_Password: </source> -+ <translation>密碼: </translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="737"/> -+ <source>_Password:</source> -+ <translation>密碼:</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="852"/> -+ <source>Authentication failed, please try again.</source> -+ <translation>認證失敗,請重試。</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="781"/> -+ <source>days left</source> -+ <translation>天后解鎖</translation> -+ </message> -+ <message> -+ <source>Biometric/code scan authentication failed too many times, please enter the password.</source> -+ <translation type="vanished">生物/扫码验证失败达最大次数,请使用密码解锁.</translation> -+ </message> -+ <message> -+ <source>Bioauth/code scan authentication failed, you still have %1 verification opportunities</source> -+ <translation type="vanished">生物/扫码验证失败,您还有%1次尝试机会</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="228"/> -+ <location filename="../src/mainwindow.cpp" line="1417"/> -+ <location filename="../src/mainwindow.cpp" line="1419"/> -+ <source>Failed to verify %1, please enter password to unlock</source> -+ <translation>驗證%1失敗,請輸入密碼解鎖</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="233"/> -+ <location filename="../src/mainwindow.cpp" line="235"/> -+ <location filename="../src/mainwindow.cpp" line="1421"/> -+ <source>Unable to verify %1, please enter password to unlock</source> -+ <translation>無法驗證%1,請輸入密碼解鎖</translation> -+ </message> -+ <message> -+ <source>NET Exception</source> -+ <translation type="vanished">网络异常</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="673"/> -+ <source>A program is attempting to perform an action that requires privileges.It requires authorization to perform the action.</source> -+ <translation>一個程式正試圖執行一個需要特權的動作,要求授權以執行該動作。</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="110"/> -+ <location filename="../src/mainwindow.cpp" line="731"/> -+ <source>Input Password</source> -+ <translation>輸入密碼</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="107"/> -+ <source>Insert the ukey into the USB port</source> -+ <translation>請將安全金鑰插入USB埠</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="109"/> -+ <source>Enter the ukey password</source> -+ <translation>輸入安全金鑰密碼</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="785"/> -+ <source>hours left</source> -+ <translation>小時後解鎖</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="789"/> -+ <source>minutes left</source> -+ <translation>分鐘後解鎖</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="793"/> -+ <source>seconds left</source> -+ <translation>秒後解鎖</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="882"/> -+ <location filename="../src/mainwindow.cpp" line="890"/> -+ <source>Input your password to authentication</source> -+ <translation>輸入密碼以認證</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="1436"/> -+ <source>Verify face recognition or enter password to unlock</source> -+ <translation>驗證人臉識別或輸入密碼解鎖</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="1441"/> -+ <source>Press fingerprint or enter password to unlock</source> -+ <translation>按壓指紋或輸入密碼解鎖</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="1446"/> -+ <source>Verify voiceprint or enter password to unlock</source> -+ <translation>驗證聲紋或輸入密碼解鎖</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="1451"/> -+ <source>Verify finger vein or enter password to unlock</source> -+ <translation>驗證指靜脈或輸入密碼解鎖</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="1456"/> -+ <source>Verify iris or enter password to unlock</source> -+ <translation>驗證虹膜或輸入密碼解鎖</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="1461"/> -+ <source>Use the bound wechat scanning code or enter the password to unlock</source> -+ <translation>使用綁定的微信掃碼或輸入密碼解鎖</translation> -+ </message> -+ <message> -+ <source>Use the bound wechat scanning code or enter the password to log in</source> -+ <translation type="vanished">使用绑定的微信扫码或输入密码登录</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="781"/> -+ <location filename="../src/mainwindow.cpp" line="785"/> -+ <location filename="../src/mainwindow.cpp" line="789"/> -+ <location filename="../src/mainwindow.cpp" line="793"/> -+ <source>Account locked,</source> -+ <translation>帳戶已鎖定,</translation> -+ </message> -+ <message> -+ <source>Authentication failed, please try again</source> -+ <translation type="obsolete">认证失败,请重试</translation> -+ </message> -+</context> -+<context> -+ <name>PolkitListener</name> -+ <message> -+ <location filename="../src/PolkitListener.cpp" line="90"/> -+ <source>Another client is already authenticating, please try again later.</source> -+ <translation>有另外一個用戶端正在認證,請稍後重試。</translation> -+ </message> -+ <message> -+ <location filename="../src/PolkitListener.cpp" line="265"/> -+ <source>Authentication failure, please try again.</source> -+ <translation>認證失敗,請重試。</translation> -+ </message> -+ <message> -+ <location filename="../src/PolkitListener.cpp" line="272"/> -+ <source>Password input error!</source> -+ <translation>密碼輸入錯誤!</translation> -+ </message> -+ <message> -+ <source>Account locked %1 minutes due to %2 fail attempts</source> -+ <translation type="vanished">账户锁定%1分钟由于%2次错误尝试</translation> -+ </message> -+ <message> -+ <source>Authentication failure,there are still %1 remaining opportunities</source> -+ <translation type="vanished">认证失败,还剩余%1次尝试机会</translation> -+ </message> -+</context> -+<context> -+ <name>QObject</name> -+ <message> -+ <source>FingerPrint</source> -+ <translation type="obsolete">指纹</translation> -+ </message> -+ <message> -+ <source>FingerVein</source> -+ <translation type="obsolete">指静脉</translation> -+ </message> -+ <message> -+ <source>Iris</source> -+ <translation type="obsolete">虹膜</translation> -+ </message> -+ <message> -+ <source>Face</source> -+ <translation type="obsolete">人脸</translation> -+ </message> -+ <message> -+ <source>VoicePrint</source> -+ <translation type="obsolete">声纹</translation> -+ </message> -+ <message> -+ <source>Cancel</source> -+ <translation type="obsolete">取消</translation> -+ </message> -+</context> -+</TS> -diff --git a/polkit-agent/src/PolkitListener.cpp b/polkit-agent/src/PolkitListener.cpp -index 88d9cdb..67fe34c 100644 ---- a/polkit-agent/src/PolkitListener.cpp -+++ b/polkit-agent/src/PolkitListener.cpp -@@ -357,6 +357,7 @@ void PolkitListener::onShowPrompt(const QString &prompt, bool echo) - mainWindow->setPrompt(prompt, echo); - } - -+ mainWindow->setFixedSize(mainWindow->width(),mainWindow->height()); - mainWindow->show(); - // 重新开始认证不调整窗口位置 - // QPoint pos = QCursor::pos(); -diff --git a/polkit-agent/src/mainwindow.cpp b/polkit-agent/src/mainwindow.cpp -index e8b66c1..c72a01d 100644 ---- a/polkit-agent/src/mainwindow.cpp -+++ b/polkit-agent/src/mainwindow.cpp -@@ -30,6 +30,7 @@ - #include <QFontMetrics> - #include <QtMath> - #include <QAbstractItemView> -+#include <KWindowSystem> - #include <fcntl.h> - #include <unistd.h> - #include <sys/types.h> -@@ -61,6 +62,7 @@ MainWindow::MainWindow(QWidget *parent) : - m_nCurLockMin(0), - isbioSuccess(false) - { -+ KWindowSystem::setState(this->winId(), NET::SkipTaskbar | NET::SkipPager); - ui->setupUi(this); - setWindowTitle(tr("Authentication")); - setWindowFlags(Qt::WindowCloseButtonHint | Qt::WindowStaysOnTopHint); -@@ -97,6 +99,7 @@ MainWindow::MainWindow(QWidget *parent) : - ui->titleTipLayout->addWidget(m_labelTip); - ui->loginOptionsLayout->setAlignment(Qt::AlignTop|Qt::AlignCenter); - ui->loginOptionsLayout->addWidget(m_loginOptsWidget); -+ ui->loadingUkeyWidget->adjustSize(); - ui->loadingUkeyWidget->hide(); - ui->widgetUkeyAuth->hide(); - ui->loadingUkeyBtn->setAttribute(Qt::WA_TransparentForMouseEvents, true); -@@ -105,14 +108,12 @@ MainWindow::MainWindow(QWidget *parent) : - ui->loadingUkeyLbl->setAlignment(Qt::AlignTop|Qt::AlignHCenter); - ui->ukeyTipLbl->setText(tr("Enter the ukey password")); - ui->ukeyPassword->setPlaceholderText(tr("Input Password")); -- ui->loadingUkeyWidget->adjustSize(); - maxFailedTimes = bioDevices.getFailedTimes(); - isHiddenSwitchButton = bioDevices.GetHiddenSwitchButton(); - - connect(m_loginOptsWidget, &LoginOptionsWidget::optionSelected, - this, [&](unsigned uCurLoginOptType, const DeviceInfoPtr &deviceInfo){ -- -- isLoadingUkey = false; -+ isLoadingUkey = false; - - if(uCurLoginOptType == LOGINOPT_TYPE_GENERAL_UKEY){ - stopLoadingUkey(); -@@ -142,7 +143,7 @@ MainWindow::MainWindow(QWidget *parent) : - - if (uCurLoginOptType == LOGINOPT_TYPE_GENERAL_UKEY && !deviceInfo){ - isLoadingUkey = true; -- startLoadingUkey(); -+ startLoadingUkey(); - m_loginOptsWidget->updateUkeyUIStatus(LOGINOPT_TYPE_GENERAL_UKEY); - }else if(uCurLoginOptType == LOGINOPT_TYPE_GENERAL_UKEY && deviceInfo){ - stopLoadingUkey(); -@@ -157,8 +158,8 @@ MainWindow::MainWindow(QWidget *parent) : - return ; - } - -- if(m_bioTimer) -- m_bioTimer->stop(); -+ if(m_bioTimer) -+ m_bioTimer->stop(); - - m_deviceInfo = deviceInfo; - switchLoginOptType(uCurLoginOptType); -@@ -365,24 +366,27 @@ void MainWindow::setUkeyTypeTip(QString text) - - void MainWindow::startLoadingUkey() - { -+ m_loadingPixmap = QIcon::fromTheme("ukui-loading-0-symbolic").pixmap(27,27); -+ ui->loadingUkeyBtn->setIcon(m_loadingPixmap); -+ ui->loadingUkeyBtn->setIconSize(QSize(27, 27)); -+ -+ ui->loadingUkeyWidget->adjustSize(); -+ ui->cmbUsers->hide(); -+ ui->widgetUkeyAuth->hide(); -+ ui->lePassword->hide(); -+ -+ ui->widgetPasswdAuth->hide(); -+ - isLoadingUkey = true; - ui->loadingUkeyWidget->show(); -+ - if(!m_loadingTimer) - { - m_loadingTimer = new QTimer(this); - m_loadingTimer->setInterval(150); - connect(m_loadingTimer, &QTimer::timeout, this, &MainWindow::updateLoadingPixmap); - } -- -- m_loadingPixmap = QIcon::fromTheme("ukui-loading-0-symbolic").pixmap(27,27); -- ui->loadingUkeyBtn->setIcon(m_loadingPixmap); -- ui->loadingUkeyBtn->setIconSize(QSize(27, 27)); - m_loadingTimer->start(); -- ui->loadingUkeyWidget->adjustSize(); -- ui->cmbUsers->hide(); -- ui->widgetUkeyAuth->hide(); -- ui->lePassword->hide(); -- ui->widgetPasswdAuth->hide(); - } - - void MainWindow::stopLoadingUkey() -@@ -391,9 +395,10 @@ void MainWindow::stopLoadingUkey() - if(m_loadingTimer){ - m_loadingTimer->stop(); - } -+ - ui->loadingUkeyWidget->hide(); - //ui->cmbUsers->show(); -- ui->widgetUkeyAuth->show(); -+ //ui->widgetUkeyAuth->show(); - } - - void MainWindow::updateLoadingPixmap() -@@ -874,6 +879,7 @@ void MainWindow::switchAuthMode(Mode mode) - int count = m_loginOptsWidget->getLoginOptCount(); - enableBioAuth = count > 0; - if (count < 1) { -+ setLoginTypeTip(tr("Input your password to authentication")); - m_loginOptsWidget->hide(); - } else { - m_loginOptsWidget->show(); -@@ -881,6 +887,7 @@ void MainWindow::switchAuthMode(Mode mode) - } - - if(m_loginOptsWidget->getHasUkeyOptions()){ -+ setLoginTypeTip(tr("Input your password to authentication")); - m_loginOptsWidget->show(); - } - -@@ -1074,6 +1081,7 @@ void MainWindow::switchWidget(Mode mode) - ui->returnButton->setText(tr("Use password")); - ui->btnLoading->setDisabled(true); - ui->returnButton->adjustSize(); -+ m_labelTip->adjustSize(); - if(is_Mavis){ - ui->cmbUsers->setFixedHeight(48); - ui->lePassword->setFixedHeight(48); -@@ -1084,8 +1092,7 @@ void MainWindow::switchWidget(Mode mode) - switch(mode){ - case PASSWORD: - { -- setMinimumWidth(420); -- setMaximumWidth(420); -+ setFixedWidth(420); - - if (m_deviceInfo && m_loginOptsWidget->findDeviceById(m_deviceInfo->device_id)) { - switchLoginOptType(m_loginOptsWidget->convertDeviceType(m_deviceInfo->biotype)); -@@ -1121,18 +1128,16 @@ void MainWindow::switchWidget(Mode mode) - + ui->cmbUsers->height() + ui->lePassword->height() + ui->lblMessage->height() - + ui->btnAuth->height(); - } -- if (m_loginOptsWidget->isHidden()) { -- height -= 20 ; -- } -+// if (m_loginOptsWidget->isHidden()) { -+// height = height - m_labelTip->height() - 10; -+// } - - unsigned uOptsWidgetHeight = m_loginOptsWidget->height(); - if (m_loginOptsWidget->isHidden()) { - uOptsWidgetHeight = 0; -- height -= 20 ; -+ height = height + m_labelTip->height() - 10; - } -- setMinimumHeight(height + uOptsWidgetHeight + 10); -- setMaximumHeight(height + uOptsWidgetHeight + 10); -- -+ setFixedHeight(height + uOptsWidgetHeight + 10); - - //m_loginOptsWidget->updateUIStatus(); - ui->btnBioAuth->setStyleSheet("QPushButton{font-size:14px;}QPushButton:hover{border:none;color:#3E6CE5;}QPushButton:pressed{border:none;}"); -@@ -1163,14 +1168,11 @@ void MainWindow::switchWidget(Mode mode) - break; - - case BIOMETRIC: -- setMinimumWidth(420); -- setMaximumWidth(420); -+ setFixedWidth(420); - if(m_loginOptsWidget->getLoginOptCount() <= 1){ -- setMinimumHeight(392+ui->cmbUsers->height()+ui->lblHeader->height()); -- setMaximumHeight(392+ui->cmbUsers->height()+ui->lblHeader->height()); -+ setFixedHeight(392+ui->cmbUsers->height()+ui->lblHeader->height()); - } else { -- setMinimumHeight(482+ui->cmbUsers->height()+ui->lblHeader->height()); -- setMaximumHeight(482+ui->cmbUsers->height()+ui->lblHeader->height()); -+ setFixedHeight(482+ui->cmbUsers->height()+ui->lblHeader->height()); - } - - ui->btnCancel->hide(); -@@ -1484,11 +1486,15 @@ void MainWindow::setLoginTypeTip(QString strLoginTypeTip) - m_labelTip->hide(); - } else { - QPalette pe; -- if(no_changes) -+ if(no_changes) { - pe.setColor(QPalette::WindowText,Qt::red); -- else -- pe.setColor(QPalette::WindowText,QColor(55, 144, 250, 255)); -- m_labelTip->setPalette(pe); -+ m_labelTip->setPalette(pe); -+ } else { -+ QColor color = palette().color(QPalette::WindowText); -+ QPalette pal(this->palette()); -+ pal.setColor(QPalette::WindowText,QColor(color)); -+ m_labelTip->setPalette(pal); -+ } - m_labelTip->setText(m_strLoginTypeTip); - m_labelTip->show(); - } -@@ -1499,7 +1505,7 @@ void MainWindow::startBioAuthDelay() - if (m_deviceInfo) { - if(m_deviceInfo->biotype == LOGINOPT_TYPE_GENERAL_UKEY){ - -- }else{ -+ }else{ - m_loginOptsWidget->startAuth(m_deviceInfo, getUid(userName)); - } - switchLoginOptType(m_loginOptsWidget->convertDeviceType(m_deviceInfo->biotype)); -@@ -1589,17 +1595,14 @@ void MainWindow::onUpdateWndSize(unsigned uLoginOptType, unsigned uLoginOptSize) - + ui->btnAuth->height(); - } - if (m_loginOptsWidget->isHidden()) { -- height -= 20 ; -+ height = height + m_labelTip->height() - 10; - } - - if(uLoginOptType == LOGINOPT_TYPE_GENERAL_UKEY){ -- -- setMinimumHeight(height + uOptsWidgetHeight + 10); -- setMaximumHeight(height + uOptsWidgetHeight + 10); -+ setLoginTypeTip(""); -+ setFixedSize(width(), height + uOptsWidgetHeight + 10); - }else{ -- -- setMinimumHeight(height + uOptsWidgetHeight); -- setMaximumHeight(height + uOptsWidgetHeight); -+ setFixedSize(width(), height + uOptsWidgetHeight); - } - } - -diff --git a/polkit-agent/src/mainwindow.ui b/polkit-agent/src/mainwindow.ui -index e9cf404..01fc13b 100644 ---- a/polkit-agent/src/mainwindow.ui -+++ b/polkit-agent/src/mainwindow.ui -@@ -7,7 +7,7 @@ - <x>0</x> - <y>0</y> - <width>459</width> -- <height>547</height> -+ <height>646</height> - </rect> - </property> - <property name="sizePolicy"> -@@ -120,6 +120,9 @@ - </item> - <item row="4" column="1"> - <layout class="QHBoxLayout" name="titleTipLayout"> -+ <property name="topMargin"> -+ <number>8</number> -+ </property> - <property name="bottomMargin"> - <number>8</number> - </property> -@@ -380,19 +383,6 @@ - </property> - </layout> - </item> -- <item> -- <spacer name="verticalSpacer"> -- <property name="orientation"> -- <enum>Qt::Vertical</enum> -- </property> -- <property name="sizeHint" stdset="0"> -- <size> -- <width>20</width> -- <height>40</height> -- </size> -- </property> -- </spacer> -- </item> - <item> - <layout class="QHBoxLayout" name="horizontalLayout_7"> - <property name="spacing"> -@@ -410,7 +400,7 @@ - <item> - <widget class="QPushButton" name="btnBioAuth"> - <property name="cursor"> -- <cursorShape>PointingHandCursor</cursorShape> -+ <cursorShape>ArrowCursor</cursorShape> - </property> - <property name="styleSheet"> - <string notr="true"/> -@@ -442,7 +432,7 @@ - </sizepolicy> - </property> - <property name="cursor"> -- <cursorShape>PointingHandCursor</cursorShape> -+ <cursorShape>ArrowCursor</cursorShape> - </property> - <property name="styleSheet"> - <string notr="true"/> -@@ -461,7 +451,7 @@ - </sizepolicy> - </property> - <property name="cursor"> -- <cursorShape>PointingHandCursor</cursorShape> -+ <cursorShape>ArrowCursor</cursorShape> - </property> - <property name="styleSheet"> - <string notr="true"/> -diff --git a/polkit-agent/src/modeButton.cpp b/polkit-agent/src/modeButton.cpp -index 53d0ffc..66f712c 100644 ---- a/polkit-agent/src/modeButton.cpp -+++ b/polkit-agent/src/modeButton.cpp -@@ -39,7 +39,7 @@ void ModeButton::initUI() - setModeIcon(); - setFixedSize(QSize(24, 24)); - setModeIcon(); -- setCursor(Qt::PointingHandCursor); -+ setCursor(Qt::ArrowCursor); - setStyleSheet("QPushButton::pressed{border:none;background-color:transparent}" - "QPushButton::hover::!pressed{border:none;background-color:transparent}"); - -diff --git a/uniauth-backend/CMakeLists.txt b/uniauth-backend/CMakeLists.txt -index 4ba44ec..5ee3930 100644 ---- a/uniauth-backend/CMakeLists.txt -+++ b/uniauth-backend/CMakeLists.txt -@@ -2,9 +2,12 @@ project(uniauth-backend) - - set(CMAKE_AUTOMOC ON) - -+pkg_check_modules(LIGHTDM-QT5-3 REQUIRED liblightdm-qt5-3) -+ - include_directories( - ${Qt5Core_INCLUDE_DIRS} - ${Qt5DBus_INCLUDE_DIRS} -+ ${LIGHTDM-QT5-3_INCLUDE_DIRS} - ) - - set(bin_SRCS -@@ -16,10 +19,15 @@ set(bin_SRCS - src/serviceinterface.cpp - src/servicemanager.h - src/servicemanager.cpp -+ src/personalizeddata.h -+ src/CSingleton.h -+ src/personalizeddata.cpp -+ src/rsac.h -+ src/rsac.cpp - ) - - add_executable(uniauth-backend ${bin_SRCS}) --target_link_libraries(uniauth-backend Qt5::Core Qt5::DBus -lukui-log4qt) -+target_link_libraries(uniauth-backend Qt5::Core Qt5::DBus -lukui-log4qt ${LIGHTDM-QT5-3_LIBRARIES} -lcrypto) - - install(TARGETS uniauth-backend DESTINATION bin) - install(FILES org.ukui.UniauthBackend.conf DESTINATION /etc/dbus-1/system.d/) -diff --git a/uniauth-backend/src/CSingleton.h b/uniauth-backend/src/CSingleton.h -new file mode 100644 -index 0000000..99c42d8 ---- /dev/null -+++ b/uniauth-backend/src/CSingleton.h -@@ -0,0 +1,46 @@ -+#ifndef CSINGLETON_H -+#define CSINGLETON_H -+ -+ -+template <typename T> -+class SingleTon -+{ -+public: -+ // 创建单例实例 -+ template<typename... Args> -+ static T* instance(Args&&... args) -+ { -+ if (m_pInstance == nullptr) -+ { -+ m_pInstance = new T(std::forward<Args>(args)...); -+ } -+ -+ return m_pInstance; -+ } -+ -+ // 获取单例 -+ static T* getInstance() -+ { -+ return m_pInstance; -+ } -+ -+ // 删除单例 -+ static void destroyInstance() -+ { -+ delete m_pInstance; -+ m_pInstance = nullptr; -+ } -+ -+private: -+ SingleTon(); -+ virtual ~SingleTon(); -+ -+private: -+ static T* m_pInstance; -+}; -+ -+template <class T> -+T* SingleTon<T>::m_pInstance = nullptr; -+ -+ -+#endif -diff --git a/uniauth-backend/src/biodeviceinfo.h b/uniauth-backend/src/biodeviceinfo.h -index 3ec5c81..87c5f87 100644 ---- a/uniauth-backend/src/biodeviceinfo.h -+++ b/uniauth-backend/src/biodeviceinfo.h -@@ -21,6 +21,7 @@ - #include <QDBusInterface> - #include <QDBusArgument> - #include <QDBusMetaType> -+#include <memory> - - struct DeviceInfo { - int device_id; -@@ -52,6 +53,10 @@ enum BioType { - - Q_DECLARE_METATYPE(DeviceInfo) - Q_DECLARE_METATYPE(QList<QDBusVariant>) -+ -+typedef std::shared_ptr<DeviceInfo> DeviceInfoPtr; -+typedef QList<DeviceInfoPtr> DeviceList; -+ - void registerCustomTypes(); - QDBusArgument &operator<<(QDBusArgument &argument, const DeviceInfo &deviceInfo); - const QDBusArgument &operator>>(const QDBusArgument &argument, DeviceInfo &deviceInfo); -diff --git a/uniauth-backend/src/main.cpp b/uniauth-backend/src/main.cpp -index e52bac8..f719754 100644 ---- a/uniauth-backend/src/main.cpp -+++ b/uniauth-backend/src/main.cpp -@@ -17,6 +17,7 @@ - **/ - #include <QCoreApplication> - #include "serviceinterface.h" -+#include "personalizeddata.h" - #include <ukui-log4qt.h> - - int main(int argc, char *argv[]) -@@ -24,6 +25,8 @@ int main(int argc, char *argv[]) - initUkuiLog4qt("ukui-biometric-uniauth"); - QCoreApplication a(argc, argv); - -+ KYLINUSERDATAMNG::instance(); -+ - ServiceInterface serviveInterface; - Q_UNUSED(serviveInterface); - -diff --git a/uniauth-backend/src/personalizeddata.cpp b/uniauth-backend/src/personalizeddata.cpp -new file mode 100644 -index 0000000..d093977 ---- /dev/null -+++ b/uniauth-backend/src/personalizeddata.cpp -@@ -0,0 +1,345 @@ -+#include "personalizeddata.h" -+ -+#include <QJsonDocument> -+#include <QJsonObject> -+#include <QJsonValue> -+#include <QJsonParseError> -+#include <QJsonArray> -+#include <QFile> -+#include <QDate> -+#include <QTime> -+ -+enum enum_operation -+{ -+ enum_operation_update = 0, -+ enum_operation_add, -+ enum_operation_del, -+}; -+ -+PersonalizedData::PersonalizedData(QString user) -+{ -+ KyInfo() << user; -+ m_user = user; -+ m_usd_conf_path = QString("/var/lib/lightdm-data/%1/usd/config/ukui-settings-daemon.settings").arg(m_user); -+ m_greeter_conf_path = QString("/var/lib/lightdm-data/%1/ukui-greeter.conf").arg(m_user); -+ m_file_watch = new QFileSystemWatcher(); -+ connect(m_file_watch, &QFileSystemWatcher::fileChanged, this, &PersonalizedData::fileChanged); -+ this->__load_conf_ukuigreeterconf(); -+ //无需读取usd配置 -+ //this->__load_conf_usd_conf(); -+ -+} -+ -+PersonalizedData::~PersonalizedData() -+{ -+ KyInfo() << m_user; -+ if(0 != m_conf_TimerID) -+ { -+ this->killTimer(m_conf_TimerID); -+ m_conf_TimerID = 0; -+ } -+ if(nullptr != m_file_watch) -+ { -+ delete m_file_watch; -+ m_file_watch = nullptr; -+ } -+ -+} -+ -+void PersonalizedData::getJsonData(QJsonObject & json) -+{ -+ json["user"] = m_user; -+ { -+ QJsonObject json_1; -+ json_1["dateType"] = m_dateType; -+ json_1["fontSize"] = m_fontSize; -+ json_1["timeType"] = m_timeType; -+ json_1["backgroundPath"] = m_backgroundPath; -+ json_1["color"] = m_color; -+ json["greeter"] = json_1; -+ } -+} -+ -+QString PersonalizedData::getJsonData() -+{ -+ QJsonObject json; -+ this->getJsonData(json); -+ json["operation"] = enum_operation_update; -+ QJsonDocument document; -+ document.setObject(json); -+ return document.toJson(QJsonDocument::Compact); -+} -+ -+void PersonalizedData::fileChanged(const QString &path) -+{ -+ KyInfo() << path; -+ if(m_greeter_conf_path == path) -+ { -+ m_greeter_conf_path_changed = true; -+ } -+ if(m_usd_conf_path == path) -+ { -+ m_usd_conf_path_changed = true; -+ } -+ -+ if(0 != m_conf_TimerID) -+ { -+ this->killTimer(m_conf_TimerID); -+ m_conf_TimerID = 0; -+ } -+ m_conf_TimerID = this->startTimer(100); -+} -+ -+void PersonalizedData::timerEvent(QTimerEvent *event) -+{ -+ KyInfo() << m_file_watch->files(); -+ if(event->timerId() == m_conf_TimerID) -+ { -+ this->killTimer(m_conf_TimerID); -+ m_conf_TimerID = 0; -+ -+ if(m_greeter_conf_path_changed) -+ { -+ m_greeter_conf_path_changed = false; -+ this->__load_conf_ukuigreeterconf(); -+ } -+ if(m_usd_conf_path_changed) -+ { -+ m_usd_conf_path_changed = false; -+ this->__load_conf_usd_conf(); -+ } -+ emit KYLINUSERDATAMNG::getInstance()->conf_changed(this->getJsonData()); -+ } -+} -+ -+int PersonalizedData::__load_conf_ukuigreeterconf() -+{ -+ KyInfo(); -+ QSettings conf(m_greeter_conf_path, QSettings::IniFormat); -+ if(QSettings::NoError != conf.status()) -+ { -+ KyWarning() << m_greeter_conf_path << conf.status(); -+ return -1; -+ } -+ -+ if(conf.childGroups().contains("Greeter")) -+ { -+ conf.beginGroup("Greeter"); -+ -+ if(conf.contains("dateType")) -+ m_dateType = conf.value("dateType", m_dateType).toString(); -+ -+ if(conf.contains("fontSize")) -+ m_fontSize = conf.value("fontSize", m_fontSize).toInt(); -+ -+ if(conf.contains("timeType")) -+ m_timeType = conf.value("timeType", m_timeType).toInt(); -+ -+ conf.endGroup(); -+ } -+ -+ if(conf.childGroups().contains("greeter")) -+ { -+ conf.beginGroup("greeter"); -+ -+ if(conf.contains("backgroundPath")) -+ { -+ m_backgroundPath = conf.value("backgroundPath", m_backgroundPath).toString(); -+ if(!m_backgroundPath.isEmpty()) -+ { -+ m_backgroundPath = this->__copy_file(m_backgroundPath); -+ } -+ } -+ -+ -+ if(conf.contains("color")) -+ m_color = conf.value("color", m_color).toString(); -+ -+ conf.endGroup(); -+ } -+ -+ if(nullptr != m_file_watch && !m_file_watch->files().contains(m_greeter_conf_path)) -+ { -+ m_file_watch->addPath(m_greeter_conf_path); -+ } -+ return 0; -+} -+ -+int PersonalizedData::__load_conf_usd_conf() -+{ -+ KyInfo(); -+ QSettings conf(m_usd_conf_path, QSettings::IniFormat); -+ if(QSettings::NoError != conf.status()) -+ { -+ KyWarning() << m_usd_conf_path << conf.status(); -+ return -1; -+ } -+ -+ if(conf.childGroups().contains("xsettings")) -+ { -+ conf.beginGroup("xsettings"); -+ -+ if(conf.contains("cursor-size")) -+ m_cursor_size = conf.value("cursor-size", m_cursor_size).toInt(); -+ -+ if(conf.contains("cursor-theme")) -+ m_cursor_theme = conf.value("cursor-theme", m_cursor_theme).toString(); -+ -+ if(conf.contains("scaling-factor")) -+ m_scaling_factor = conf.value("scaling-factor", m_scaling_factor).toInt(); -+ -+ conf.endGroup(); -+ } -+ -+ if(nullptr != m_file_watch && !m_file_watch->files().contains(m_usd_conf_path)) -+ { -+ m_file_watch->addPath(m_usd_conf_path); -+ } -+ return 0; -+} -+ -+QString PersonalizedData::__copy_file(QString oldfile) -+{ -+ if(QFile::exists(oldfile)) -+ { -+ QString newfile = "/tmp/loginBackground-" + m_user; -+ QDate d =QDate::currentDate(); -+ newfile += d.toString("yyyy-MM-dd"); -+ if(QFile::exists(newfile)) -+ { -+ QFile::remove(newfile); -+ } -+ if(QFile::copy(oldfile, newfile)) -+ { -+ return newfile; -+ } -+ } -+ return ""; -+} -+ -+ -+ -+/////////////////////////PersonalizedDataMng////////////////////////////////////// -+ -+PersonalizedDataMng::PersonalizedDataMng(void) -+{ -+ m_usersModel = new QLightDM::UsersModel(this); -+ connect(m_usersModel, &QAbstractListModel::rowsInserted, this, &PersonalizedDataMng::onUserAdded); -+ connect(m_usersModel, &QAbstractListModel::rowsRemoved, this, &PersonalizedDataMng::onUserRemoved); -+ this->__updateUsersInfo(); -+} -+ -+PersonalizedDataMng::~PersonalizedDataMng() -+{ -+ if(nullptr != m_usersModel) -+ { -+ delete m_usersModel; -+ m_usersModel = nullptr; -+ } -+} -+ -+QString PersonalizedDataMng::GetConfInformation(QString name) -+{ -+ QJsonObject json; -+ if(m_userPersonalizedData.contains(name)) -+ { -+ QJsonObject json1; -+ m_userPersonalizedData[name]->getJsonData(json1); -+ json[name] = json1; -+ } -+ else if(name.isEmpty()) -+ { -+ for(auto & it : m_userPersonalizedData.toStdMap()) -+ { -+ QJsonObject json1; -+ it.second->getJsonData(json1); -+ json[it.first] = json1; -+ } -+ } -+ else if("lightdm" == name) -+ { -+ QString tmp(m_lightdm_str); -+ m_lightdm_str = ""; -+ return tmp; -+ } -+ -+ QJsonDocument document; -+ document.setObject(json); -+ QString strJson(document.toJson(QJsonDocument::Compact)); -+ KyDebug() << strJson; -+ return strJson; -+} -+ -+void PersonalizedDataMng::SetLoginSynInformation(QString val) -+{ -+ m_lightdm_str = val; -+} -+ -+void PersonalizedDataMng::onUserAdded(const QModelIndex &, int left, int right) -+{ -+ if(!m_usersModel) -+ return; -+ -+ for(int i = left; i <= right; i++) -+ { -+ QString name = m_usersModel->index(i).data(QLightDM::UsersModel::NameRole).toString(); -+ KyInfo() << left << right << name; -+ if(!name.isEmpty()) -+ { -+ m_userPersonalizedData[name] = KylinUserDatePtr(new PersonalizedData(name)); -+ -+ QJsonObject json; -+ m_userPersonalizedData[name]->getJsonData(json); -+ json["operation"] = enum_operation_add; -+ QJsonDocument document; -+ document.setObject(json); -+ emit conf_changed(document.toJson()); -+ } -+ } -+} -+ -+void PersonalizedDataMng::onUserRemoved(const QModelIndex &, int, int) -+{ -+ if(!m_usersModel) -+ return; -+ -+ auto tmp = m_userPersonalizedData; -+ for(int i = 0; i < m_usersModel->rowCount(QModelIndex()); i++) -+ { -+ QString name = m_usersModel->index(i).data(QLightDM::UsersModel::NameRole).toString(); -+ if(!name.isEmpty()) -+ tmp.remove(name); -+ } -+ -+ if(tmp.size() > 0) -+ { -+ KyInfo() << tmp.begin().key(); -+ m_userPersonalizedData.remove(tmp.begin().key()); -+ -+ QJsonObject json; -+ json["operation"] = enum_operation_del; -+ json["user"] = tmp.begin().key(); -+ QJsonDocument document; -+ document.setObject(json); -+ emit conf_changed(document.toJson()); -+ } -+} -+ -+void PersonalizedDataMng::__updateUsersInfo() -+{ -+ if (m_usersModel) -+ { -+ for(int i = 0; i < m_usersModel->rowCount(QModelIndex()); i++) -+ { -+ QString name = m_usersModel->index(i).data(QLightDM::UsersModel::NameRole).toString(); -+ if(!name.isEmpty()) -+ { -+ m_userPersonalizedData[name] = KylinUserDatePtr(new PersonalizedData(name)); -+ } -+ -+ } -+ } -+} -+ -+ -+ -diff --git a/uniauth-backend/src/personalizeddata.h b/uniauth-backend/src/personalizeddata.h -new file mode 100644 -index 0000000..b8fb872 ---- /dev/null -+++ b/uniauth-backend/src/personalizeddata.h -@@ -0,0 +1,140 @@ -+#ifndef PERSONALIZEDDATA_H -+#define PERSONALIZEDDATA_H -+ -+#include <QObject> -+#include <QSettings> -+#include <QMap> -+#include <QFile> -+#include <QTimer> -+#include <QEventLoop> -+#include <QTimerEvent> -+#include <QFileSystemWatcher> -+#include <QSharedPointer> -+#include <QLightDM/Greeter> -+#include <QLightDM/SessionsModel> -+#include <QLightDM/UsersModel> -+#include <QModelIndex> -+ -+#include <QJsonDocument> -+#include <QJsonObject> -+#include <QJsonValue> -+#include <QJsonParseError> -+#include <QJsonArray> -+ -+#include "ukui-log4qt.h" -+#include "CSingleton.h" -+ -+ -+class PersonalizedData : public QObject -+{ -+ Q_OBJECT -+public: -+ explicit PersonalizedData(QString user); -+ virtual ~PersonalizedData(); -+ -+ ////////////////////ukui-greeter-conf////////////////////////////// -+ QString dateType(void){ return m_dateType; } -+ void dateType(QString val){ m_dateType = val; } -+ -+ int fontSize(void){ return m_fontSize; } -+ void fontSize(int val){ m_fontSize = val; } -+ -+ int timeType(void){ return m_timeType; } -+ void timeType(int val){ m_timeType = val; } -+ -+ QString backgroundPath(void){ return m_backgroundPath; } -+ void backgroundPath(QString val){ m_backgroundPath = val; } -+ -+ QString color(void){ return m_color; } -+ void color(QString val){ m_color = val; } -+ -+ /////////////////////usd-ukui-settings-daemon//////////////////////////////// -+ int cursor_size(void){ return m_cursor_size; } -+ void cursor_size(int val){ m_cursor_size = val; } -+ -+ QString cursor_theme(void){ return m_cursor_theme; } -+ void cursor_theme(QString val){ m_cursor_theme = val; } -+ -+ int scaling_factor(void){ return m_scaling_factor; } -+ void scaling_factor(int val){ m_scaling_factor = val; } -+ -+ -+ void getJsonData(QJsonObject & json); -+ QString getJsonData(void); -+ -+ -+protected slots: -+ void fileChanged(const QString &path); -+ -+ virtual void timerEvent( QTimerEvent *event); -+ -+private: -+ int __load_conf_ukuigreeterconf(void); -+ int __load_conf_usd_conf(void); -+ QString __copy_file(QString); -+protected: -+ //ukui-greeter-conf -+ QString m_dateType = "cn"; -+ int m_fontSize = 5; -+ int m_timeType = 24; -+ QString m_backgroundPath; -+ QString m_color; -+ -+ //usd-ukui-settings-daemon -+ int m_cursor_size = 48; -+ QString m_cursor_theme; -+ int m_scaling_factor = 1; -+ -+ //用户名 -+ QString m_user; -+ -+ QFileSystemWatcher * m_file_watch = nullptr; -+ QString m_greeter_conf_path; -+ bool m_greeter_conf_path_changed = false; -+ QString m_usd_conf_path; -+ bool m_usd_conf_path_changed = false; -+ int m_conf_TimerID = 0; -+}; -+ -+ -+ -+typedef QSharedPointer<PersonalizedData> KylinUserDatePtr; -+ -+///////////////////////////////////////////////// -+/// \brief The PersonalizedDataMng class -+/// -+ -+class PersonalizedDataMng : public QObject -+{ -+ Q_OBJECT -+protected: -+ explicit PersonalizedDataMng(void); -+ virtual ~PersonalizedDataMng(); -+ -+ -+public: -+ QString GetConfInformation(QString); -+ -+ void SetLoginSynInformation(QString val); -+ -+signals: -+ void conf_changed(QString jsonstr); -+ -+protected Q_SLOTS: -+ void onUserAdded(const QModelIndex&, int, int); -+ -+ void onUserRemoved(const QModelIndex&, int, int ); -+ -+protected: -+ void __updateUsersInfo(); -+ -+protected: -+ QMap<QString, KylinUserDatePtr > m_userPersonalizedData; -+ QLightDM::UsersModel * m_usersModel = nullptr; -+ QString m_lightdm_str; -+ friend class SingleTon<PersonalizedDataMng>; -+}; -+ -+typedef SingleTon<PersonalizedDataMng> KYLINUSERDATAMNG; -+ -+#endif // PERSONALIZEDDATA_H -diff --git a/uniauth-backend/src/rsac.cpp b/uniauth-backend/src/rsac.cpp -new file mode 100644 -index 0000000..0c6877d ---- /dev/null -+++ b/uniauth-backend/src/rsac.cpp -@@ -0,0 +1,199 @@ -+#include "rsac.h" -+#include <openssl/rsa.h> -+#include <openssl/pem.h> -+ -+RSA* publicKeyToRSA(const QByteArray &pubKey) -+{ -+ BIO *pBio = BIO_new_mem_buf(pubKey.data(), pubKey.size()); // 创建内存 -+ RSA* rsa = PEM_read_bio_RSA_PUBKEY(pBio, nullptr, nullptr, nullptr); -+ BIO_free_all(pBio); // 释放内存 -+ return rsa; -+} -+ -+RSA* privateKeyToRSA(const QByteArray &priKey) -+{ -+ BIO *pBio = BIO_new_mem_buf(priKey.data(), priKey.size()); // 创建内存 -+ RSA* rsa = PEM_read_bio_RSAPrivateKey(pBio, nullptr, nullptr, nullptr); -+ BIO_free_all(pBio); // 释放内存 -+ return rsa; -+} -+ -+/** -+ * @brief RSAC::generateKeyPair -+ * 生成密钥对,并分别保存为文件 -+ * @param priKeyFile 私钥文件名 -+ * @param pubKeyFile 公钥文件名 -+ * @param bits 秘钥长度,一般建议1024及以上 -+ */ -+void RSAC::generateKeyPair(const QString &priKeyFile, const QString &pubKeyFile, int bits) -+{ -+ // 生成公钥 -+ RSA* rsa = RSA_generate_key(bits, RSA_F4, nullptr, nullptr); -+ BIO *bp = BIO_new(BIO_s_file()); -+ BIO_write_filename(bp, (void*)pubKeyFile.toStdString().c_str()); -+ PEM_write_bio_RSAPublicKey(bp, rsa); -+ BIO_free_all(bp); -+ -+ // 生成私钥 -+ bp = BIO_new(BIO_s_file()); -+ BIO_write_filename(bp, (void*)priKeyFile.toStdString().c_str()); -+ PEM_write_bio_RSAPrivateKey(bp, rsa, nullptr, nullptr, 0, nullptr, nullptr); -+ CRYPTO_cleanup_all_ex_data(); -+ BIO_free_all(bp); -+ RSA_free(rsa); -+} -+ -+/** -+ * @brief RSAC::generateKeyPair -+ * 生成密钥对数据 -+ * @param privateKey 私钥数据 -+ * @param publicKey 公钥数据 -+ * @param bits 秘钥长度,一般建议1024及以上 -+ */ -+void RSAC::generateKeyPair(QByteArray &privateKey, QByteArray &pubKey, int bits) -+{ -+ // 生成密钥对 -+ RSA *keyPair = RSA_generate_key(bits, RSA_F4, nullptr, nullptr); -+ -+ BIO *pri = BIO_new(BIO_s_mem()); -+ BIO *pub = BIO_new(BIO_s_mem()); -+ -+ PEM_write_bio_RSAPrivateKey(pri, keyPair, nullptr, nullptr, 0, nullptr, nullptr); -+ PEM_write_bio_RSA_PUBKEY(pub, keyPair); -+ -+ // 获取长度 -+ int pri_len = BIO_pending(pri); -+ int pub_len = BIO_pending(pub); -+ -+ privateKey.resize(pri_len); -+ pubKey.resize(pub_len); -+ -+ BIO_read(pri, privateKey.data(), pri_len); -+ BIO_read(pub, pubKey.data(), pub_len); -+ -+ // 内存释放 -+ RSA_free(keyPair); -+ BIO_free_all(pub); -+ BIO_free_all(pri); -+} -+ -+/** -+ * @brief RSAC::encrypt -+ * RSA加密函数,使用公钥对输入数据,进行加密 -+ * @param in 输入数据(明文) -+ * @param out 输出数据(密文) -+ * @param pubKey 公钥 -+ * @return 执行结果 -+ */ -+bool RSAC::encrypt(const QByteArray &in, QByteArray &out, const QByteArray& pubKey) -+{ -+ // 公钥数据转RSA -+ RSA* rsa = publicKeyToRSA(pubKey); -+ if (rsa == nullptr) -+ { -+ return false; -+ } -+ -+ // 对任意长度数据进行加密,超长时,进行分段加密 -+ int keySize = RSA_size(rsa); -+ int dataLen = in.size(); -+ const unsigned char *from = (const unsigned char *)in.data(); -+ QByteArray to(keySize, 0); -+ int readLen = 0; -+ do -+ { -+ int select = (keySize - 11) > dataLen ? dataLen : (keySize - 11); -+ RSA_public_encrypt(select, (from + readLen), (unsigned char *)to.data(), rsa, RSA_PKCS1_PADDING); -+ dataLen -= select; -+ readLen += select; -+ out.append(to); -+ }while (dataLen > 0); -+ RSA_free(rsa); -+ return true; -+} -+ -+/** -+ * @brief RSAC::private_decrypt -+ * RSA解密函数,使用私钥对输入数据,进行解密 -+ * @param in 输入数据(密文) -+ * @param out 输出数据(解密后的内容) -+ * @param priKey 私钥 -+ * @return 执行结果 -+ */ -+bool RSAC::decrypt(const QByteArray &in, QByteArray &out, const QByteArray& priKey) -+{ -+ // 私钥数据转RSA -+ RSA* rsa = privateKeyToRSA(priKey); -+ if (rsa == nullptr) -+ { -+ return false; -+ } -+ -+ // 对任意长度数据进行解密,超长时,进行分段解密 -+ int keySize = RSA_size(rsa); -+ int dataLen = in.size(); -+ const unsigned char *from = (const unsigned char *)in.data(); -+ QByteArray to(keySize, 0); -+ int readLen = 0; -+ do -+ { -+ int size = RSA_private_decrypt(keySize, (from + readLen), (unsigned char *)to.data(), rsa, RSA_PKCS1_PADDING); -+ dataLen -= keySize; -+ readLen += keySize; -+ out.append(to.data(), size); -+ }while (dataLen > 0); -+ RSA_free(rsa); -+ return true; -+} -+ -+/** -+ * @brief RSAC::sign -+ * 使用私钥对摘要数据进行签名 -+ * @param digest 摘要数据 -+ * @param sign 签名后的数据 -+ * @param priKey 私钥 -+ * @return 执行结果 -+ */ -+bool RSAC::sign(const QByteArray &digest, QByteArray &sign, const QByteArray& priKey) -+{ -+ // 私钥数据转RSA -+ RSA* rsa = privateKeyToRSA(priKey); -+ if (rsa == nullptr) -+ { -+ return false; -+ } -+ -+ // 对digest进行签名 -+ unsigned int siglen = 0; -+ QByteArray temp(RSA_size(rsa), 0); -+ RSA_sign(NID_sha1, (const unsigned char*)digest.data(), digest.size(), -+ (unsigned char*)temp.data(), &siglen, rsa); -+ sign.clear(); -+ sign.append(temp.data(), siglen); -+ RSA_free(rsa); -+ return true; -+} -+ -+/** -+ * @brief RSAC::verify -+ * 使用公钥对摘要数据进行验签 -+ * @param digest 摘要数据 -+ * @param sign 签名后的数据 -+ * @param pubKey 公钥 -+ * @return 执行结果 -+ */ -+bool RSAC::verify(const QByteArray &digest, const QByteArray &sign, const QByteArray& pubKey) -+{ -+ // 公钥数据转RSA -+ RSA* rsa = publicKeyToRSA(pubKey); -+ if (rsa == nullptr) -+ { -+ return false; -+ } -+ -+ // 对digest、sign进行验签 -+ int ret = RSA_verify(NID_sha1, (const unsigned char*)digest.data(), digest.size(), -+ (const unsigned char *)sign.data(), sign.size(), rsa); -+ RSA_free(rsa); -+ return (ret == 1); -+} -diff --git a/uniauth-backend/src/rsac.h b/uniauth-backend/src/rsac.h -new file mode 100644 -index 0000000..93d4678 ---- /dev/null -+++ b/uniauth-backend/src/rsac.h -@@ -0,0 +1,26 @@ -+#ifndef RSAC_H -+#define RSAC_H -+ -+#include <QString> -+ -+/** -+ * @brief The RSAC class -+ * RSA算法相关实现,包括密钥对生成,加密与解密,签名与验签。 -+ */ -+class RSAC -+{ -+public: -+ // 生成秘钥对 -+ void generateKeyPair(const QString& priKeyFile, const QString &pubKeyFile, int bits = 1024); -+ void generateKeyPair(QByteArray& priKey, QByteArray& pubKey, int bits = 1024); -+ -+ // 对数据进行加解密 -+ bool encrypt(const QByteArray& in, QByteArray& out, const QByteArray& pubKey); -+ bool decrypt(const QByteArray& in, QByteArray& out, const QByteArray& priKey); -+ -+ // 对摘要进行签名和验签 -+ bool sign(const QByteArray& digest, QByteArray& sign, const QByteArray &priKey); -+ bool verify(const QByteArray& digest, const QByteArray &sign, const QByteArray &pubKey); -+}; -+ -+#endif // RSAC_H -diff --git a/uniauth-backend/src/serviceinterface.cpp b/uniauth-backend/src/serviceinterface.cpp -index b6ae9f0..58670dd 100644 ---- a/uniauth-backend/src/serviceinterface.cpp -+++ b/uniauth-backend/src/serviceinterface.cpp -@@ -19,6 +19,9 @@ - #include <QDBusConnection> - #include <QSettings> - #include <QDir> -+#include <QRegExp> -+#include <QFile> -+#include <QTimer> - #include <pwd.h> - #include <unistd.h> - #include <sys/types.h> -@@ -29,11 +32,25 @@ - #include <QDBusMetaType> - #include <QDBusConnectionInterface> - #include <QDBusContext> -+#include <QDBusInterface> - #include <QDBusMessage> - #include "servicemanager.h" -+#include "personalizeddata.h" -+#include <unistd.h> -+#include <openssl/rsa.h> -+#include <openssl/pem.h> -+ -+#define UKUI_GREETER "/usr/sbin/ukui-greeter" -+#define UKUI_SCREENSAVER "/usr/bin/ukui-screensaver-dialog" - -+#define GREETER_DBUS_PATH "/" -+#define GREETER_DBUS_INTERFACE "org.ukui.greeter" -+#define SCREENSAVER_DBUS_PATH "/" -+#define SCREENSAVER_DBUS_INTERFACE "org.ukui.screensaver" - #define COMM_CONFIG_PATH "/etc/biometric-auth/ukui-biometric.conf" - #define USER_CONFIG_PATH "/home/%1/.biometric_auth/ukui_biometric.conf" -+#define OLD_990_USER_CONFIG_PATH "/home/%1/.biometric-auth/ukui-biometric.conf" -+#define PROC_CPUINFO "/proc/cpuinfo" - - ServiceInterface::ServiceInterface() - { -@@ -50,9 +67,10 @@ ServiceInterface::ServiceInterface() - } - - registerCustomTypes(); -+ checkIs990(); - m_serviceInterface = new QDBusInterface(DBUS_SERVICE, DBUS_PATH, - DBUS_INTERFACE, -- QDBusConnection::systemBus()); -+ QDBusConnection::systemBus(), this); - - m_serviceInterface->setTimeout(2147483647); - connect(m_serviceInterface, SIGNAL(USBDeviceHotPlug(int, int, int)), -@@ -63,6 +81,9 @@ ServiceInterface::ServiceInterface() - ServiceManager *sm = ServiceManager::instance(); - connect(sm, &ServiceManager::serviceStatusChanged, - this, &ServiceInterface::onBiometricDbusChanged); -+ -+ rsac.generateKeyPair(priKey, pubKey, 1024); -+ connect(KYLINUSERDATAMNG::getInstance(), &PersonalizedDataMng::conf_changed, this, &ServiceInterface::updateUserInformation); - } - - void ServiceInterface::setDefaultDevice(QString userName, int bioDevType, QString deviceName) -@@ -475,8 +496,22 @@ bool ServiceInterface::getBioAuthStatus(QString userName, int bioAuthType) - default: - return false; - } -+ -+ //同步990旧的配置文件,然后删除 -+ if(getIs990() && (bioAuthType == ENABLETYPE_BIO)){ -+ QString oldConfigPath = QString(OLD_990_USER_CONFIG_PATH).arg(userName); -+ QSettings oldSettings(oldConfigPath, QSettings::IniFormat); -+ if(oldSettings.contains(strBioAuthType)){ -+ settings.setValue(strBioAuthType,oldSettings.value(strBioAuthType).toBool()); -+ oldSettings.remove(strBioAuthType); -+ oldSettings.sync(); -+ } -+ } - if (settings.contains(strBioAuthType)) { - return settings.value(strBioAuthType).toBool(); -+ }else if(getIs990() && (bioAuthType == ENABLETYPE_BIO)){ -+ //990默认为打开 -+ return true; - } else { - QSettings settings2(COMM_CONFIG_PATH, QSettings::IniFormat); - if (settings2.contains(strBioAuthType)) { -@@ -496,6 +531,23 @@ int ServiceInterface::getMaxFailedTimes() - return 3; - } - -+int ServiceInterface::getFTimeoutTimes() -+{ -+ QSettings sysSettings(COMM_CONFIG_PATH, QSettings::IniFormat); -+ if(sysSettings.contains("FaceTimeoutTimes")) -+ return sysSettings.value("FaceTimeoutTimes").toInt(); -+ else -+ return 1; -+} -+ -+void ServiceInterface::setFTimeoutTimes(int times) -+{ -+ if (times < 1) -+ times = 1; -+ QSettings settings(COMM_CONFIG_PATH, QSettings::IniFormat); -+ settings.setValue("FaceTimeoutTimes", times); -+} -+ - bool ServiceInterface::getQRCodeEnable() - { - bool isEnable = false; -@@ -576,6 +628,44 @@ void ServiceInterface::onUSBDeviceHotPlug(int drvid, int action, int deviceNum) - } - } - -+//记录当前生物认证信息 -+void ServiceInterface::recordAuthDrive(QString appName,int drvid,bool insert) -+{ -+ if(insert){ -+ m_AuthingDriveList.insert(appName,drvid); -+ }else{ -+ m_AuthingDriveList.remove(appName); -+ } -+} -+ -+ -+//获取当前正在认证的应用 -+QStringList ServiceInterface::getAllAuthApp() -+{ -+ return m_AuthingDriveList.keys(); -+} -+ -+//根据应用名称获取认证的驱动 -+int ServiceInterface::getAppAuthDrive(QString appName) -+{ -+ if(m_AuthingDriveList.contains(appName)){ -+ return m_AuthingDriveList.value(appName); -+ } -+ return -1; -+} -+ -+QString ServiceInterface::GetUserInformation(QString username) -+{ -+ KyInfo() << username; -+ return KYLINUSERDATAMNG::getInstance()->GetConfInformation(username); -+} -+ -+void ServiceInterface::SetLoginSynInformation(QString val) -+{ -+ KyInfo() << val; -+ KYLINUSERDATAMNG::getInstance()->SetLoginSynInformation(val); -+} -+ - void ServiceInterface::waitBiometricServiceStatus() - { - qDebug()<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~` get biometric status"; -@@ -628,7 +718,7 @@ void ServiceInterface::updateCommDefaultDevice(int nDriId) - QDBusArgument argument; - QList<QDBusVariant> qlist; - QDBusVariant item; -- DeviceInfo *deviceInfo; -+ DeviceInfoPtr deviceInfo = nullptr; - - /* 返回值为 i -- int 和 av -- array of variant */ - QDBusPendingReply<int, QList<QDBusVariant> > reply = m_serviceInterface->call("GetDrvList"); -@@ -652,7 +742,7 @@ void ServiceInterface::updateCommDefaultDevice(int nDriId) - variant = item.variant(); /* 转为普通QVariant对象 */ - /* 解封装得到 QDBusArgument 对象 */ - argument = variant.value<QDBusArgument>(); -- deviceInfo = new DeviceInfo(); -+ deviceInfo = std::make_shared<DeviceInfo>(); - argument >> *deviceInfo; /* 提取最终的 DeviceInfo 结构体 */ - if (nDriId == deviceInfo->device_id) { - if (getCommDefaultDevice(deviceInfo->biotype).isEmpty()) { -@@ -662,19 +752,13 @@ void ServiceInterface::updateCommDefaultDevice(int nDriId) - } - } - } else { -- for (auto devInfo : m_listDeviceInfos) { -- if (devInfo) { -- delete devInfo; -- devInfo = nullptr; -- } -- } - m_listDeviceInfos.clear(); - for (int i = 0; i < deviceCount; i++) { - item = qlist[i]; /* 取出一个元素 */ - variant = item.variant(); /* 转为普通QVariant对象 */ - /* 解封装得到 QDBusArgument 对象 */ - argument = variant.value<QDBusArgument>(); -- deviceInfo = new DeviceInfo(); -+ deviceInfo = std::make_shared<DeviceInfo>(); - argument >> *deviceInfo; /* 提取最终的 DeviceInfo 结构体 */ - m_listDeviceInfos.push_back(deviceInfo); - } -@@ -797,3 +881,230 @@ void ServiceInterface::onBiometricDbusChanged(bool bActive) - initData(); - } - } -+ -+void ServiceInterface::checkIs990() -+{ -+ QRegExp r1("kirin.*9.0"); -+ r1.setCaseSensitivity(Qt::CaseInsensitive); -+ QRegExp r2("pangu.*m900"); -+ r2.setCaseSensitivity(Qt::CaseInsensitive); -+ -+ QFile file(PROC_CPUINFO); -+ if(!file.exists()){ -+ is990 = false; -+ } -+ file.open(QFile::ReadOnly); -+ QString str(file.readAll()); -+ is990 = (str.contains(r1) || str.contains(r2)); -+ file.close(); -+} -+ -+bool ServiceInterface::getIs990() -+{ -+ return is990; -+} -+ -+QString ServiceInterface::getPublicEncrypt() -+{ -+ return pubKey; -+} -+ -+bool ServiceInterface::sendPassword(QString username,QByteArray password) -+{ -+ QByteArray decryptText; -+ QByteArray encryptText; -+ rsac.decrypt(password, decryptText, priKey); // 解密 -+ //如果处于登录状态 -+ -+ qDebug()<<"sendPassword"<<loginAppList.count(); -+ if(loginAppList.contains("lightdm")){ -+ qDebug()<<"login:"; -+ isFirstLogin = false; -+ QString publicKey = getLoginPubKey(loginAppList.value("lightdm"),GREETER_DBUS_PATH,GREETER_DBUS_INTERFACE); -+ rsac.encrypt(decryptText, encryptText, publicKey.toLatin1()); -+ return sendLoginPassword(loginAppList.value("lightdm"),GREETER_DBUS_PATH,GREETER_DBUS_INTERFACE,username,encryptText); -+ } -+ -+ //处于锁屏状态 -+ if(loginAppList.contains(username)){ -+ qDebug()<<"unlock:"; -+ isFirstLogin = false; -+ QString publicKey = getLoginPubKey(loginAppList.value(username),SCREENSAVER_DBUS_PATH,SCREENSAVER_DBUS_INTERFACE); -+ rsac.encrypt(decryptText, encryptText, publicKey.toLatin1()); -+ return sendLoginPassword(loginAppList.value(username),SCREENSAVER_DBUS_PATH,SCREENSAVER_DBUS_INTERFACE,username,encryptText); -+ } -+ -+ //如果是第一次调用,则配置自动登录 -+ if(isFirstLogin){ -+ qDebug()<<"isFirstLogin:"; -+ isFirstLogin = false; -+ hasSaveLogin = true; -+ return handleFirstSingleLogn(username,decryptText); -+ } -+ -+ isFirstLogin = false; -+ return false; -+} -+ -+bool ServiceInterface::handleFirstSingleLogn(QString username,QByteArray decryptText) -+{ -+ QEventLoop loopTemp; -+ bool ret = false; -+ QByteArray encryptText; -+ -+ qDebug()<<"handleFirstSingleLogn wait"; -+ QMetaObject::Connection connection = QObject::connect(this, &ServiceInterface::onLoginServicdRegisted, [&loopTemp]() { -+ if (loopTemp.isRunning()) { -+ loopTemp.quit(); -+ } -+ }); -+ QTimer::singleShot(10000, &loopTemp, SLOT(quit())); -+ loopTemp.exec(); -+ qDebug()<<"handleFirstSingleLogn finished"; -+ disconnect(connection); -+ qDebug()<<loginAppList.count(); -+ if(loginAppList.contains("lightdm")){ -+ isFirstLogin = false; -+ QString publicKey = getLoginPubKey(loginAppList.value("lightdm"),GREETER_DBUS_PATH,GREETER_DBUS_INTERFACE); -+ if(publicKey.isEmpty()){ -+ qDebug()<<"get Login PubKey failed!"; -+ return false; -+ } -+ rsac.encrypt(decryptText, encryptText, publicKey.toLatin1()); -+ return sendLoginPassword(loginAppList.value("lightdm"),GREETER_DBUS_PATH,GREETER_DBUS_INTERFACE,username,encryptText); -+ } -+ return ret; -+} -+ -+QString ServiceInterface::getLoginPubKey(QString service,QString path,QString interface) -+{ -+ QDBusInterface iface(service, -+ path, -+ interface, -+ QDBusConnection::systemBus()); -+ QDBusReply<QString> stateReply = iface.call("getPublicEncrypt"); -+ -+ if(!stateReply.isValid()){ -+ qWarning()<< "Get state error:" << stateReply.error(); -+ qDebug()<<"getPublicEncrypt failed"; -+ return ""; -+ } -+ return stateReply.value(); -+} -+ -+bool ServiceInterface::sendSignalLoginFinished(QString username,bool res) -+{ -+ qDebug()<<"sendSignalLoginFinished "<<username<<res; -+ emit onSignalLoginFinished(username,res); -+ -+ return true; -+} -+ -+bool ServiceInterface::sendLoginPassword(QString service,QString path,QString interface,QString username,QByteArray array) -+{ -+ QEventLoop loopTemp; -+ bool ret = false; -+ -+ qDebug()<<"sendLoginPassword"; -+ QMetaObject::Connection connection = QObject::connect(this, &ServiceInterface::onSignalLoginFinished, [&loopTemp,&ret](QString username,bool res) { -+ qDebug()<<"onSignalLoginFinished:"<<username<<res; -+ ret = res; -+ if (loopTemp.isRunning()) { -+ loopTemp.quit(); -+ } -+ }); -+ -+ QDBusInterface iface(service, -+ path, -+ interface, -+ QDBusConnection::systemBus()); -+ -+ QDBusReply<bool> stateReply = iface.call("sendPassword",username,array); -+ if(!stateReply.isValid()){ -+ disconnect(connection); -+ return false; -+ } -+ -+ if(!stateReply.value()){ -+ disconnect(connection); -+ return stateReply.value(); -+ } -+ -+ QTimer::singleShot(30000, &loopTemp, SLOT(quit())); -+ -+ loopTemp.exec(); -+ disconnect(connection); -+ -+ return ret; -+} -+QString ServiceInterface::getProcessNameFromPid(int pid) -+{ -+ QString filename = "/proc/" + QString::number(pid) + "/cmdline"; -+ qDebug()<<"filename is "<<filename; -+ QFile file(filename); -+ if(!file.open(QIODevice::ReadOnly | QIODevice::Text)) { -+ qDebug()<<"Can't open the file!"<<endl; -+ return ""; -+ } -+ QByteArray text = file.readAll(); -+ return QString(text); -+} -+ -+QString ServiceInterface::getUserNameFromUid(int uid) -+{ -+ struct passwd *pw = NULL; -+ pw = getpwuid(uid); -+ if(pw){ -+ return QString(pw->pw_name); -+ } -+ return ""; -+} -+ -+void ServiceInterface::onDbusNameOwnerChanged(QString name,QString oldOwner,QString newOwner) -+{ -+ if(newOwner.isEmpty()){ -+ for(QString str:loginAppList.keys()){ -+ if(name == loginAppList.value(str)){ -+ qDebug()<<"remove name "<<name; -+ loginAppList.remove(str); -+ } -+ } -+ } -+} -+ -+bool ServiceInterface::registerLoginApp() -+{ -+ QDBusConnection conn = connection(); -+ QDBusMessage msg = message(); -+ -+ qDebug() << "Sender Name" << conn.interface()->serviceOwner(msg.service()).value(); -+ qDebug() << "Sender Pid " << conn.interface()->servicePid(msg.service()).value(); -+ qDebug() << "Sender uid " << conn.interface()->serviceUid(msg.service()).value(); -+ -+ int pid = conn.interface()->servicePid(msg.service()).value(); -+ QString serviceOwner = conn.interface()->serviceOwner(msg.service()).value(); -+ int uid = conn.interface()->serviceUid(msg.service()).value(); -+ -+ QString appName = getProcessNameFromPid(pid); -+ qDebug()<<"appName = "<<appName; -+ -+ if(appName != UKUI_GREETER && appName != UKUI_SCREENSAVER){ -+ return false; -+ } -+ -+ QString appUser = getUserNameFromUid(uid); -+ if(appUser.isEmpty()) -+ return false; -+ -+ qDebug()<<"insert "<<appUser<<serviceOwner; -+ loginAppList.insert(appUser,serviceOwner); -+ -+ if(appUser == "lightdm" && hasSaveLogin){ -+ QTimer::singleShot(1000, this, [=](){ -+ emit onLoginServicdRegisted(); -+ }); -+ } -+ -+ return true; -+} -+ -diff --git a/uniauth-backend/src/serviceinterface.h b/uniauth-backend/src/serviceinterface.h -index dddf1cc..cf13d8c 100644 ---- a/uniauth-backend/src/serviceinterface.h -+++ b/uniauth-backend/src/serviceinterface.h -@@ -22,7 +22,10 @@ - #include <QCoreApplication> - #include <QDBusContext> - #include <QObject> -+#include <QMap> - #include <QFileSystemWatcher> -+#include <QDBusInterface> -+#include "rsac.h" - - #define DBUS_SERVICE "org.ukui.Biometric" - #define DBUS_PATH "/org/ukui/Biometric" -@@ -57,6 +60,10 @@ public slots: - void setBioAuthStatus(int bioAuthType, bool status); - // 获取最大失败次数 - int getMaxFailedTimes(); -+ // 获取人脸识别超时停用次数 -+ int getFTimeoutTimes(); -+ // 设置人脸识别超时停用次数 -+ void setFTimeoutTimes(int times); - // 获取是否使能微信扫码登录 - bool getQRCodeEnable(); - // 获取是否双认证 -@@ -69,17 +76,39 @@ public slots: - bool getUseFirstDevice(); - // 获取是否隐藏切换按钮 - bool getHiddenSwitchButton(); -- -+ // 记录当前正在进行生物认证的设备 -+ void recordAuthDrive(QString appName,int drvid,bool insert); -+ // 获取当前正在进行生物认证的应用 -+ QStringList getAllAuthApp(); -+ // 获取当前应用在认证的驱动 -+ int getAppAuthDrive(QString appName); -+ //获取用户配置 -+ QString GetUserInformation(QString username); -+ //同步登录界面配置 -+ void SetLoginSynInformation(QString val); -+ // 获取公钥 -+ QString getPublicEncrypt(); -+ //发送用户名和密码 -+ bool sendPassword(QString username,QByteArray password); -+ //前端注册到后端接口 -+ bool registerLoginApp(); -+ //发送认证结果 -+ bool sendSignalLoginFinished(QString username,bool res); - private slots: - void onUSBDeviceHotPlug(int drvid, int action, int deviceNum); - void onBiometricDbusChanged(bool bActive); -- -+ void onDbusNameOwnerChanged(QString name,QString oldOwner,QString newOwner); - signals: - //默认设备改变 - void defaultDeviceChanged(QString userName, int bioDevType, QString deviceName); - //开关状态改变 - void bioAuthStatusChanged(QString userName, int type, bool status); -- -+ //用户配置改变 -+ void updateUserInformation(QString jsonstring); -+ //单点登录完成信号 -+ void onSignalLoginFinished(QString username,bool res); -+ //登录服务以启动信号 -+ void onLoginServicdRegisted(); - private: - //设置默认设备 - void setDefaultDevice(QString userName, int bioDevType, QString deviceName); -@@ -95,11 +124,34 @@ private: - void updateCommDefaultDevice(int nDriId); - // 等待生物识别服务 - void waitBiometricServiceStatus(); -- -+ //判断系统是否为990 -+ void checkIs990(); -+ //获取系统是否为990 -+ bool getIs990(); -+ //根据pid获取进程名称 -+ QString getProcessNameFromPid(int pid); -+ //根据uid获取用户名 -+ QString getUserNameFromUid(int uid); -+ //获取登录锁屏界面的公钥 -+ QString getLoginPubKey(QString service,QString path,QString interface); -+ //发送密码到登录锁屏界面 -+ bool sendLoginPassword(QString service,QString path,QString interface,QString username,QByteArray array); -+ //处理首次登录逻辑 -+ bool handleFirstSingleLogn(QString username,QByteArray decryptText); - private: - QDBusInterface *m_serviceInterface = nullptr; -- QList<DeviceInfo *> m_listDeviceInfos; -+ DeviceList m_listDeviceInfos; - int deviceCount = 0; -+ bool is990 = false; -+ QMap<QString,int> m_AuthingDriveList; -+ -+ QMap<QString,QString> loginAppList; -+ RSAC rsac; -+ QByteArray priKey, pubKey; -+ bool isFirstLogin = true; -+ bool hasSaveLogin = false; -+ QString savedUsername; -+ QByteArray savedPassword; - }; - - #endif // SERVICEINTERFACE_H -diff --git a/uniauth-backend/src/servicemanager.cpp b/uniauth-backend/src/servicemanager.cpp -index 7219d32..a9b61c3 100644 ---- a/uniauth-backend/src/servicemanager.cpp -+++ b/uniauth-backend/src/servicemanager.cpp -@@ -83,6 +83,8 @@ void ServiceManager::onDBusNameOwnerChanged(const QString &name, - << (newOwner.isEmpty() ? "inactivate" : "activate"); - Q_EMIT serviceStatusChanged(!newOwner.isEmpty()); - } -+ -+ Q_EMIT dbusNameOwnerChanged(name,oldOwner,newOwner); - } - - /*! -diff --git a/uniauth-backend/src/servicemanager.h b/uniauth-backend/src/servicemanager.h -index 0128b38..6c85df3 100644 ---- a/uniauth-backend/src/servicemanager.h -+++ b/uniauth-backend/src/servicemanager.h -@@ -36,6 +36,7 @@ private: - - Q_SIGNALS: - void serviceStatusChanged(bool activate); -+ void dbusNameOwnerChanged(QString name,QString oldOwner,QString newOwner); - - public Q_SLOTS: - void onDBusNameOwnerChanged(const QString &name, diff -Nru ukui-biometric-auth-4.10.0.0/debian/patches/0001-update-changelog.patch ukui-biometric-auth-4.20.0.0/debian/patches/0001-update-changelog.patch --- ukui-biometric-auth-4.10.0.0/debian/patches/0001-update-changelog.patch 1970-01-01 08:00:00.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/debian/patches/0001-update-changelog.patch 2024-11-15 17:01:40.000000000 +0800 @@ -0,0 +1,12282 @@ +From: yangmin100 <yangmin@kylinos.cn> +Date: Wed, 13 Nov 2024 19:58:45 +0800 +Subject: update changelog + +--- + bioauth-bin/src/main.cpp | 16 +- + bioauth/include/bioauth.h | 2 +- + bioauth/include/loginoptionswidget.h | 16 +- + bioauth/src/bioauth.cpp | 6 +- + bioauth/src/biodevices.cpp | 281 ++-- + bioauth/src/loginoptionswidget.cpp | 814 ++++++---- + ...desktop.plicykit.pkexec.bioctl-helper.policy.in | 8 +- + ...freedesktop.plicykit.pkexec.biodrvctl.policy.in | 8 +- + ...reedesktop.plicykit.pkexec.biorestart.policy.in | 8 +- + polkit-agent/CMakeLists.txt | 22 +- + polkit-agent/assets.qrc | 47 + + polkit-agent/assets/biowaiting/fingerprint0.svg | 1 + + polkit-agent/assets/biowaiting/fingerprint1.svg | 1 + + polkit-agent/assets/biowaiting/fingerprint10.svg | 1 + + polkit-agent/assets/biowaiting/fingerprint11.svg | 1 + + polkit-agent/assets/biowaiting/fingerprint12.svg | 1 + + polkit-agent/assets/biowaiting/fingerprint13.svg | 1 + + polkit-agent/assets/biowaiting/fingerprint14.svg | 1 + + polkit-agent/assets/biowaiting/fingerprint2.svg | 1 + + polkit-agent/assets/biowaiting/fingerprint3.svg | 1 + + polkit-agent/assets/biowaiting/fingerprint4.svg | 1 + + polkit-agent/assets/biowaiting/fingerprint5.svg | 1 + + polkit-agent/assets/biowaiting/fingerprint6.svg | 1 + + polkit-agent/assets/biowaiting/fingerprint7.svg | 1 + + polkit-agent/assets/biowaiting/fingerprint8.svg | 1 + + polkit-agent/assets/biowaiting/fingerprint9.svg | 1 + + polkit-agent/assets/biowaiting/fingervein0.svg | 1 + + polkit-agent/assets/biowaiting/fingervein1.svg | 1 + + polkit-agent/assets/biowaiting/fingervein10.svg | 1 + + polkit-agent/assets/biowaiting/fingervein11.svg | 1 + + polkit-agent/assets/biowaiting/fingervein2.svg | 1 + + polkit-agent/assets/biowaiting/fingervein3.svg | 1 + + polkit-agent/assets/biowaiting/fingervein4.svg | 1 + + polkit-agent/assets/biowaiting/fingervein5.svg | 1 + + polkit-agent/assets/biowaiting/fingervein6.svg | 1 + + polkit-agent/assets/biowaiting/fingervein7.svg | 1 + + polkit-agent/assets/biowaiting/fingervein8.svg | 1 + + polkit-agent/assets/biowaiting/fingervein9.svg | 1 + + polkit-agent/assets/biowaiting/iris0.svg | 1 + + polkit-agent/assets/biowaiting/iris1.svg | 1 + + polkit-agent/assets/biowaiting/iris10.svg | 1 + + polkit-agent/assets/biowaiting/iris11.svg | 1 + + polkit-agent/assets/biowaiting/iris2.svg | 1 + + polkit-agent/assets/biowaiting/iris3.svg | 1 + + polkit-agent/assets/biowaiting/iris4.svg | 1 + + polkit-agent/assets/biowaiting/iris5.svg | 1 + + polkit-agent/assets/biowaiting/iris6.svg | 1 + + polkit-agent/assets/biowaiting/iris7.svg | 1 + + polkit-agent/assets/biowaiting/iris8.svg | 1 + + polkit-agent/assets/biowaiting/iris9.svg | 1 + + polkit-agent/assets/biowaiting/voiceprint0.svg | 1 + + polkit-agent/assets/biowaiting/voiceprint1.svg | 1 + + polkit-agent/assets/biowaiting/voiceprint2.svg | 1 + + polkit-agent/assets/biowaiting/voiceprint3.svg | 1 + + polkit-agent/assets/biowaiting/voiceprint4.svg | 1 + + polkit-agent/assets/biowaiting/voiceprint5.svg | 1 + + polkit-agent/assets/biowaiting/voiceprint6.svg | 1 + + polkit-agent/assets/biowaiting/voiceprint7.svg | 1 + + polkit-agent/i18n_ts/bo.ts | 192 +-- + polkit-agent/i18n_ts/bo_CN.ts | 180 ++- + polkit-agent/i18n_ts/de.ts | 180 ++- + polkit-agent/i18n_ts/es.ts | 180 ++- + polkit-agent/i18n_ts/fr.ts | 180 ++- + polkit-agent/i18n_ts/kk.ts | 180 ++- + polkit-agent/i18n_ts/ky.ts | 180 ++- + polkit-agent/i18n_ts/mn.ts | 180 ++- + polkit-agent/i18n_ts/pt.ts | 53 +- + polkit-agent/i18n_ts/ru.ts | 53 +- + polkit-agent/i18n_ts/tr.ts | 178 ++- + polkit-agent/i18n_ts/ug.ts | 180 ++- + polkit-agent/i18n_ts/zh_CN.ts | 180 ++- + polkit-agent/i18n_ts/zh_HK.ts | 182 ++- + polkit-agent/src/PolkitListener.cpp | 354 ++--- + polkit-agent/src/PolkitListener.h | 48 +- + polkit-agent/src/fullscreenbackground.cpp | 513 ++++++ + polkit-agent/src/fullscreenbackground.h | 173 ++ + polkit-agent/src/kalabel.cpp | 16 +- + polkit-agent/src/kalabel.h | 3 +- + polkit-agent/src/mainwindow.cpp | 1654 ++++++++++---------- + polkit-agent/src/mainwindow.h | 90 +- + polkit-agent/src/mainwindow.ui | 165 +- + polkit-agent/src/modeButton.h | 2 +- + polkit-agent/src/pam-tally.c | 16 +- + polkit-agent/src/pam-tally.h | 42 +- + polkit-agent/src/sessionmanager.cpp | 35 +- + polkit-agent/src/types.h | 36 +- + polkit-agent/src/usdblockshortcut.cpp | 61 + + polkit-agent/src/usdblockshortcut.h | 49 + + polkit-agent/src/users.cpp | 94 +- + polkit-agent/src/users.h | 13 +- + 90 files changed, 4209 insertions(+), 2708 deletions(-) + create mode 100644 polkit-agent/assets/biowaiting/fingerprint0.svg + create mode 100644 polkit-agent/assets/biowaiting/fingerprint1.svg + create mode 100644 polkit-agent/assets/biowaiting/fingerprint10.svg + create mode 100644 polkit-agent/assets/biowaiting/fingerprint11.svg + create mode 100644 polkit-agent/assets/biowaiting/fingerprint12.svg + create mode 100644 polkit-agent/assets/biowaiting/fingerprint13.svg + create mode 100644 polkit-agent/assets/biowaiting/fingerprint14.svg + create mode 100644 polkit-agent/assets/biowaiting/fingerprint2.svg + create mode 100644 polkit-agent/assets/biowaiting/fingerprint3.svg + create mode 100644 polkit-agent/assets/biowaiting/fingerprint4.svg + create mode 100644 polkit-agent/assets/biowaiting/fingerprint5.svg + create mode 100644 polkit-agent/assets/biowaiting/fingerprint6.svg + create mode 100644 polkit-agent/assets/biowaiting/fingerprint7.svg + create mode 100644 polkit-agent/assets/biowaiting/fingerprint8.svg + create mode 100644 polkit-agent/assets/biowaiting/fingerprint9.svg + create mode 100644 polkit-agent/assets/biowaiting/fingervein0.svg + create mode 100644 polkit-agent/assets/biowaiting/fingervein1.svg + create mode 100644 polkit-agent/assets/biowaiting/fingervein10.svg + create mode 100644 polkit-agent/assets/biowaiting/fingervein11.svg + create mode 100644 polkit-agent/assets/biowaiting/fingervein2.svg + create mode 100644 polkit-agent/assets/biowaiting/fingervein3.svg + create mode 100644 polkit-agent/assets/biowaiting/fingervein4.svg + create mode 100644 polkit-agent/assets/biowaiting/fingervein5.svg + create mode 100644 polkit-agent/assets/biowaiting/fingervein6.svg + create mode 100644 polkit-agent/assets/biowaiting/fingervein7.svg + create mode 100644 polkit-agent/assets/biowaiting/fingervein8.svg + create mode 100644 polkit-agent/assets/biowaiting/fingervein9.svg + create mode 100644 polkit-agent/assets/biowaiting/iris0.svg + create mode 100644 polkit-agent/assets/biowaiting/iris1.svg + create mode 100644 polkit-agent/assets/biowaiting/iris10.svg + create mode 100644 polkit-agent/assets/biowaiting/iris11.svg + create mode 100644 polkit-agent/assets/biowaiting/iris2.svg + create mode 100644 polkit-agent/assets/biowaiting/iris3.svg + create mode 100644 polkit-agent/assets/biowaiting/iris4.svg + create mode 100644 polkit-agent/assets/biowaiting/iris5.svg + create mode 100644 polkit-agent/assets/biowaiting/iris6.svg + create mode 100644 polkit-agent/assets/biowaiting/iris7.svg + create mode 100644 polkit-agent/assets/biowaiting/iris8.svg + create mode 100644 polkit-agent/assets/biowaiting/iris9.svg + create mode 100644 polkit-agent/assets/biowaiting/voiceprint0.svg + create mode 100644 polkit-agent/assets/biowaiting/voiceprint1.svg + create mode 100644 polkit-agent/assets/biowaiting/voiceprint2.svg + create mode 100644 polkit-agent/assets/biowaiting/voiceprint3.svg + create mode 100644 polkit-agent/assets/biowaiting/voiceprint4.svg + create mode 100644 polkit-agent/assets/biowaiting/voiceprint5.svg + create mode 100644 polkit-agent/assets/biowaiting/voiceprint6.svg + create mode 100644 polkit-agent/assets/biowaiting/voiceprint7.svg + create mode 100644 polkit-agent/src/fullscreenbackground.cpp + create mode 100644 polkit-agent/src/fullscreenbackground.h + create mode 100644 polkit-agent/src/usdblockshortcut.cpp + create mode 100644 polkit-agent/src/usdblockshortcut.h + +diff --git a/bioauth-bin/src/main.cpp b/bioauth-bin/src/main.cpp +index 81ffdb4..a88dfe8 100644 +--- a/bioauth-bin/src/main.cpp ++++ b/bioauth-bin/src/main.cpp +@@ -21,6 +21,7 @@ + #include <QCommandLineOption> + #include <QCommandLineParser> + #include <termios.h> ++#include <signal.h> + + #include <pwd.h> + +@@ -38,7 +39,7 @@ + + bool enableDebug; + QString logPrefix; +- ++BioAuth bioAuth; + enum MsgType + { + START, +@@ -241,6 +242,13 @@ DeviceInfo showDevices(const QMap<int, QList<DeviceInfo>> &devicesMap) + return DeviceInfo(); + } + ++static void signal_handler(int signo) ++{ ++ if (signo == SIGHUP) { ++ bioAuth.stopAuth(); ++ } ++} ++ + int main(int argc, char *argv[]) + { + QCoreApplication::setSetuidAllowed(true); +@@ -310,7 +318,8 @@ int main(int argc, char *argv[]) + showMessage(QObject::tr("Press Q or Esc to cancel"), PROMPT); + } + +- BioAuth bioAuth(uid, deviceInfo); ++ bioAuth.setUid(uid); ++ bioAuth.setDevice(deviceInfo); + KeyWatcher watcher; + QMap<int,int> m_failedTimes; + +@@ -403,7 +412,7 @@ int main(int argc, char *argv[]) + + bioAuth.startAuth(); + +- if(!isHiddenSwitchButton){ ++ if (!isHiddenSwitchButton) { + QObject::connect(&watcher, &KeyWatcher::exit, &a, [&]{ + showMessage(QObject::tr("AUTHENTICATION CANCELED"), START); + bioAuth.stopAuth(); +@@ -411,6 +420,7 @@ int main(int argc, char *argv[]) + }); + } + watcher.start(); ++ signal(SIGHUP, signal_handler); + + return a.exec(); + } +diff --git a/bioauth/include/bioauth.h b/bioauth/include/bioauth.h +index 477d3b3..bc7d325 100644 +--- a/bioauth/include/bioauth.h ++++ b/bioauth/include/bioauth.h +@@ -36,6 +36,7 @@ public: + explicit BioAuth(QObject *parent = nullptr); + ~BioAuth(); + void setDevice(const DeviceInfoPtr deviceInfo); ++ void setUid(qint32 uid); + DeviceInfoPtr getDevice(); + void startAuth(); + void startUkeyAuth(); +@@ -59,7 +60,6 @@ public: + */ + bool GetHasUkeyFeature(int uid, int indexStart = 0, int indexEnd = -1); + +- + signals: + void authComplete(int uid, bool result, int retErrNo); + void authFinished(); +diff --git a/bioauth/include/loginoptionswidget.h b/bioauth/include/loginoptionswidget.h +index dbbe1af..0eca34d 100644 +--- a/bioauth/include/loginoptionswidget.h ++++ b/bioauth/include/loginoptionswidget.h +@@ -54,7 +54,7 @@ public: + unsigned getLoginOptCount(); + DeviceInfoPtr getFirstDevInfo(); + int convertDeviceType(int nDevType); +- void updateUIStatus(bool update); ++ void updateUIStatus(bool update, int nPreOptType = -1); + void updateUkeyUIStatus(int type); + void setUser(int uid); + void setCurrentDevice(int drvid); +@@ -97,6 +97,13 @@ public: + void SetExtraInfo(QString extra_info,QString info_type); + bool getHasUkeyOptions(); + void setSelectedPassword(); ++ ++ // 设置所有生物识别的禁用状态 ++ void setAllDeviceDisable(bool bDisable = true); ++ ++ void startBioWaiting(unsigned uCurLoginOptType); ++ void stopBioWaiting(bool isDisable = false); ++ + public slots: + void readDevicesInfo(); + void onIdentifyComplete(int uid, bool ret, int retErrNo); +@@ -129,6 +136,7 @@ private: + QPixmap scaledPixmap(int width, int height, QString url); + QPixmap drawSymbolicColoredPixmap(QPixmap &source, QString cgColor); + void updatePixmap(); ++ QPixmap scaledSmoothPixmap(const QPixmap &src, int nWidth, int nHeight); + + private: + BioAuth *m_biomericProxy = nullptr; +@@ -164,6 +172,12 @@ private: + QTimer *w_timer; + + bool isShowUkey = false; ++ ++ // 指纹、指静脉、虹膜、声纹识别动图 ++ QLabel *m_labelBioWaiting = nullptr; // 指纹、指静脉、虹膜、声纹识别动图提示 ++ QTimer *m_timerBioWaiting = nullptr; // 指纹、指静脉、虹膜、声纹识别动图切换定时器 ++ int m_nBioWaitingFrame = 0; // 当前显示的动图帧 ++ int m_nCurBioWaitingType = -1; // 当前显示的动图类型 + }; + + #endif // LOGINOPTIONSWIDGET_H +diff --git a/bioauth/src/bioauth.cpp b/bioauth/src/bioauth.cpp +index 98143e6..076f282 100644 +--- a/bioauth/src/bioauth.cpp ++++ b/bioauth/src/bioauth.cpp +@@ -61,6 +61,11 @@ void BioAuth::setDevice(const DeviceInfoPtr deviceInfo) + this->deviceInfo = deviceInfo; + } + ++void BioAuth::setUid(qint32 uid) ++{ ++ this->uid = uid; ++} ++ + void BioAuth::startUkeyAuth() + { + // stopAuth(); +@@ -209,7 +214,6 @@ void BioAuth::onIdentityComplete(QDBusPendingCallWatcher *watcher) + + /* 识别生物特征成功,发送认证结果 */ + if(isInAuthentication){ +- + isInAuthentication = false; + + if(result == DBUS_RESULT_SUCCESS && retUid == uid){ +diff --git a/bioauth/src/biodevices.cpp b/bioauth/src/biodevices.cpp +index e1287b0..29c2d09 100644 +--- a/bioauth/src/biodevices.cpp ++++ b/bioauth/src/biodevices.cpp +@@ -13,8 +13,8 @@ + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see <http://www.gnu.org/licenses/>. +- * +-**/ ++ * ++ **/ + #include "biodevices.h" + #include <QDBusInterface> + #include <QSettings> +@@ -26,13 +26,12 @@ + + #include "generic.h" + +- + BioDevices::BioDevices(bool isIgnoreQrCode, QObject *parent) +- : QObject(parent), +- m_uniAuthService(new UniAuthService(this)), +- isShowHotPlug(false), +- useFirstDevice(false), +- m_isIgnoreQrCode(isIgnoreQrCode) ++ : QObject(parent) ++ , m_uniAuthService(new UniAuthService(this)) ++ , isShowHotPlug(false) ++ , useFirstDevice(false) ++ , m_isIgnoreQrCode(isIgnoreQrCode) + { + connectToService(); + +@@ -57,54 +56,45 @@ void BioDevices::connectToService() + qRegisterMetaType<DeviceInfo>(); + qDBusRegisterMetaType<DeviceInfo>(); + +- serviceInterface = new QDBusInterface(BIO_DBUS_SERVICE, +- BIO_DBUS_PATH, +- BIO_DBUS_INTERFACE, +- QDBusConnection::systemBus()); ++ serviceInterface ++ = new QDBusInterface(BIO_DBUS_SERVICE, BIO_DBUS_PATH, BIO_DBUS_INTERFACE, QDBusConnection::systemBus()); + +- connect(serviceInterface, SIGNAL(USBDeviceHotPlug(int, int, int)), +- this, SLOT(onUSBDeviceHotPlug(int,int,int))); ++ connect(serviceInterface, SIGNAL(USBDeviceHotPlug(int, int, int)), this, SLOT(onUSBDeviceHotPlug(int, int, int))); + serviceInterface->setTimeout(2147483647); + } + + void BioDevices::onUSBDeviceHotPlug(int deviceId, int action, int devNumNow) + { + qDebug() << deviceId << action << devNumNow; +- QString text = ""; ++ QString text = ""; + +- if(action == -1){ ++ if (action == -1) { + DeviceInfoPtr device = findDevice(deviceId); +- if(device) +- text = tr("Unplugging of %1 device detected").arg(bioTypeToString_tr(device->biotype)); ++ if (device) ++ text = tr("Unplugging of %1 device detected").arg(bioTypeToString_tr(device->biotype)); + } + + getDevicesList(); + + emit deviceCountChanged(deviceInfos.size()); + +- if(action == 1){ ++ if (action == 1) { + DeviceInfoPtr device = findDevice(deviceId); +- if(device) +- text = tr("%1 device insertion detected").arg(bioTypeToString_tr(device->biotype)); ++ if (device) ++ text = tr("%1 device insertion detected").arg(bioTypeToString_tr(device->biotype)); + } + +- if(isShowHotPlug && text != ""){ +- QDBusInterface iface("org.freedesktop.Notifications", +- "/org/freedesktop/Notifications", +- "org.freedesktop.Notifications", +- QDBusConnection::sessionBus()); ++ if (isShowHotPlug && text != "") { ++ QDBusInterface iface( ++ "org.freedesktop.Notifications", ++ "/org/freedesktop/Notifications", ++ "org.freedesktop.Notifications", ++ QDBusConnection::sessionBus()); + QList<QVariant> args; +- args<<(tr("Biometric Manager")) +- <<((unsigned int) 0) +- <<"biometric-manager" +- <<tr("biometric") +- <<text +- <<QStringList() +- <<QVariantMap() +- <<(int)-1; +- iface.callWithArgumentList(QDBus::AutoDetect,"Notify",args); ++ args << (tr("Biometric Manager")) << ((unsigned int)0) << "biometric-manager" << tr("biometric") << text ++ << QStringList() << QVariantMap() << (int)-1; ++ iface.callWithArgumentList(QDBus::AutoDetect, "Notify", args); + } +- + } + + bool BioDevices::GetBioAuthEnable(uid_t uid) +@@ -121,11 +111,11 @@ bool BioDevices::GetBioAuthEnable(uid_t uid) + QSettings settings(configPath, QSettings::IniFormat); + qDebug() << "configure path: " << settings.fileName(); + +- if(settings.allKeys().contains("EnableAuth")){ ++ if (settings.allKeys().contains("EnableAuth")) { + return settings.value("EnableAuth").toBool(); +- }else{ ++ } else { + QSettings sysSettings(GET_STR(CONFIG_FILE), QSettings::IniFormat); +- if(sysSettings.contains("EnableAuth")) ++ if (sysSettings.contains("EnableAuth")) + return sysSettings.value("EnableAuth").toBool(); + else + return true; +@@ -140,7 +130,7 @@ void BioDevices::getDevicesList() + { + /* 返回值为 i -- int 和 av -- array of variant */ + QDBusMessage msg = serviceInterface->call("GetDevList"); +- if(msg.type() == QDBusMessage::ErrorMessage){ ++ if (msg.type() == QDBusMessage::ErrorMessage) { + LOG() << msg.errorMessage(); + return; + } +@@ -155,21 +145,20 @@ void BioDevices::getDevicesList() + + deviceInfos.clear(); + +- for(int i = 0; i < deviceNum; i++) { ++ for (int i = 0; i < deviceNum; i++) { + DeviceInfoPtr pDeviceInfo = std::make_shared<DeviceInfo>(); + infos.at(i).value<QDBusArgument>() >> *pDeviceInfo; + +- if(pDeviceInfo->device_available > 0) { //设备可用 ++ if (pDeviceInfo->device_available > 0) { // 设备可用 + if (pDeviceInfo->biotype == REMOTE_QRCODE_TYPE && m_isIgnoreQrCode) + continue; + if (!bEnableBioAuth && pDeviceInfo->biotype <= BIOTYPE_VOICEPRINT) + continue; + deviceInfos.push_back(pDeviceInfo); +- } ++ } + } + } + +- + int BioDevices::count() + { + return deviceInfos.size(); +@@ -179,7 +168,7 @@ int BioDevices::GetUserDevCount(int uid) + { + int count = 0; + QDBusMessage msg = serviceInterface->call("GetDevList"); +- if(msg.type() == QDBusMessage::ErrorMessage){ ++ if (msg.type() == QDBusMessage::ErrorMessage) { + LOG() << msg.errorMessage(); + return 0; + } +@@ -190,14 +179,13 @@ int BioDevices::GetUserDevCount(int uid) + QList<QVariant> infos; + argument >> infos; + +- for(int i = 0; i < deviceNum; i++) { ++ for (int i = 0; i < deviceNum; i++) { + DeviceInfoPtr pDeviceInfo = std::make_shared<DeviceInfo>(); + infos.at(i).value<QDBusArgument>() >> *pDeviceInfo; +- if(pDeviceInfo->device_available > 0 && GetUserDevFeatureCount(uid,pDeviceInfo->device_id)>0) //设备可用 ++ if (pDeviceInfo->device_available > 0 && GetUserDevFeatureCount(uid, pDeviceInfo->device_id) > 0) // 设备可用 + count++; + } + return count; +- + } + + FeatureMap BioDevices::GetUserFeatures(int uid) +@@ -206,8 +194,7 @@ FeatureMap BioDevices::GetUserFeatures(int uid) + QList<QDBusVariant> qlist; + int listsize; + QDBusMessage result = serviceInterface->call(QStringLiteral("GetAllFeatureList"), uid, 0, -1); +- if(result.type() == QDBusMessage::ErrorMessage) +- { ++ if (result.type() == QDBusMessage::ErrorMessage) { + qWarning() << "GetDevList error:" << result.errorMessage(); + return featureMap; + } +@@ -224,13 +211,12 @@ FeatureMap BioDevices::GetUserFeatures(int uid) + return featureMap; + } + +-int BioDevices::GetUserDevFeatureCount(int uid,int drvid) ++int BioDevices::GetUserDevFeatureCount(int uid, int drvid) + { +- QDBusMessage FeatureResult = serviceInterface->call(QStringLiteral("GetFeatureList"),drvid,uid,0,-1); +- if(FeatureResult.type() == QDBusMessage::ErrorMessage) +- { +- qWarning() << "GetFeatureList error:" << FeatureResult.errorMessage(); +- return 0; ++ QDBusMessage FeatureResult = serviceInterface->call(QStringLiteral("GetFeatureList"), drvid, uid, 0, -1); ++ if (FeatureResult.type() == QDBusMessage::ErrorMessage) { ++ qWarning() << "GetFeatureList error:" << FeatureResult.errorMessage(); ++ return 0; + } + return FeatureResult.arguments().takeFirst().toInt(); + } +@@ -238,13 +224,13 @@ int BioDevices::GetUserDevFeatureCount(int uid,int drvid) + int BioDevices::getFeatureCount(int uid, int indexStart, int indexEnd) + { + int res = 0; +- for(int i = 0; i < deviceInfos.count(); i++) { ++ for (int i = 0; i < deviceInfos.count(); i++) { + DeviceInfoPtr deviceInfo = deviceInfos.at(i); +- QDBusMessage featurecount = serviceInterface->call("GetFeatureList",deviceInfo->device_id,uid,indexStart,indexEnd); +- if(featurecount.type() == QDBusMessage::ErrorMessage) +- { +- qWarning() << "GetFeatureList error:" << featurecount.errorMessage(); +- }else{ ++ QDBusMessage featurecount ++ = serviceInterface->call("GetFeatureList", deviceInfo->device_id, uid, indexStart, indexEnd); ++ if (featurecount.type() == QDBusMessage::ErrorMessage) { ++ qWarning() << "GetFeatureList error:" << featurecount.errorMessage(); ++ } else { + res += featurecount.arguments().takeFirst().toInt(); + } + } +@@ -255,11 +241,11 @@ QMap<int, QList<DeviceInfo>> BioDevices::getAllDevices() + { + QMap<int, QList<DeviceInfo>> devices; + +- for(auto deviceInfo : deviceInfos) { +- if (deviceInfo->biotype == REMOTE_QRCODE_TYPE) // 终端不使用扫码 ++ for (auto deviceInfo : deviceInfos) { ++ if (deviceInfo->biotype == REMOTE_QRCODE_TYPE) // 终端不使用扫码 + continue; + +- if(!GetDirveIsIdle(deviceInfo->device_id)) ++ if (!GetDirveIsIdle(deviceInfo->device_id)) + continue; + + devices[deviceInfo->biotype].push_back(*deviceInfo); +@@ -272,9 +258,9 @@ QMap<int, QList<DeviceInfo>> BioDevices::getUserDevices(int uid) + { + QMap<int, QList<DeviceInfo>> devices; + bool isQRCodeEnable = GetQRCodeEnable(); +- for(auto deviceInfo : deviceInfos) { +- if(GetUserDevFeatureCount(uid,deviceInfo->device_id) > 0) { +- if (!isQRCodeEnable && deviceInfo->biotype == REMOTE_QRCODE_TYPE) // 关闭了二维码功能 ++ for (auto deviceInfo : deviceInfos) { ++ if (GetUserDevFeatureCount(uid, deviceInfo->device_id) > 0) { ++ if (!isQRCodeEnable && deviceInfo->biotype == REMOTE_QRCODE_TYPE) // 关闭了二维码功能 + continue; + devices[deviceInfo->biotype].push_back(*deviceInfo); + } +@@ -287,7 +273,7 @@ QList<DeviceInfo> BioDevices::getDevices(int type) + { + QList<DeviceInfo> devices; + +- for(auto deviceInfo : deviceInfos) { ++ for (auto deviceInfo : deviceInfos) { + if (deviceInfo->biotype == type) + devices.push_back(*deviceInfo); + } +@@ -316,7 +302,7 @@ bool BioDevices::GetHiddenSwitchButton() + return m_uniAuthService->getHiddenSwitchButton(); + } else { + QSettings sysSettings("/etc/biometric-auth/ukui-biometric.conf", QSettings::IniFormat); +- if(sysSettings.contains("HiddenSwitchButton")) ++ if (sysSettings.contains("HiddenSwitchButton")) + return sysSettings.value("HiddenSwitchButton").toBool(); + else + return false; +@@ -329,7 +315,7 @@ int BioDevices::getFailedTimes() + return m_uniAuthService->getMaxFailedTimes(); + } else { + QSettings sysSettings("/etc/biometric-auth/ukui-biometric.conf", QSettings::IniFormat); +- if(sysSettings.contains("MaxFailedTimes")) ++ if (sysSettings.contains("MaxFailedTimes")) + return sysSettings.value("MaxFailedTimes").toInt(); + else + return 3; +@@ -369,22 +355,22 @@ bool BioDevices::GetBioAuthEnable() + isEnable = m_uniAuthService->getBioAuthStatus(pwd->pw_name, ENABLETYPE_BIO); + } + if (isEnable && !isShowHotPlug) { +- if(qAppName() == "polkit-ukui-authentication-agent-1") //获取polkit开关是否打开 ++ if (qAppName() == "polkit-ukui-authentication-agent-1") // 获取polkit开关是否打开 + isEnable = m_uniAuthService->getBioAuthStatus(pwd->pw_name, ENABLETYPE_POLKIT); +- if(qAppName() == "bioauth"){ //获取父进程名称为sudo,su,或者login +- int ppid = getppid(); //获取父进程pid ++ if (qAppName() == "bioauth") { // 获取父进程名称为sudo,su,或者login ++ int ppid = getppid(); // 获取父进程pid + QString filename = "/proc/" + QString::number(ppid) + "/cmdline"; + QFile file(filename); +- if(!file.open(QIODevice::ReadOnly | QIODevice::Text)) { +- qDebug()<<"Can't open the file!"<<endl; ++ if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { ++ qDebug() << "Can't open the file!" << endl; + } + QByteArray text = file.readAll(); + file.close(); +- if(text.contains("sudo")){ ++ if (text.contains("sudo")) { + isEnable = m_uniAuthService->getBioAuthStatus(pwd->pw_name, ENABLETYPE_SUDO); +- }else if(text.contains("su")){ ++ } else if (text.contains("su")) { + isEnable = m_uniAuthService->getBioAuthStatus(pwd->pw_name, ENABLETYPE_SU); +- }else if(text.contains("login")){ ++ } else if (text.contains("login")) { + isEnable = m_uniAuthService->getBioAuthStatus(pwd->pw_name, ENABLETYPE_LOGIN); + } + } +@@ -401,23 +387,23 @@ bool BioDevices::GetBioAuthEnable() + + if (isEnable && sysSettings.allKeys().contains("EnableAuthApp")) { + isEnableApp = sysSettings.value("EnableAuthApp").toInt(); +- if(qAppName() == "polkit-ukui-authentication-agent-1") //获取polkit开关是否打开 +- isEnable = isEnableApp & (1<<2); +- if(qAppName() == "bioauth"){ //获取父进程名称为sudo,su,或者login +- int ppid = getppid(); //获取父进程pid ++ if (qAppName() == "polkit-ukui-authentication-agent-1") // 获取polkit开关是否打开 ++ isEnable = isEnableApp & (1 << 2); ++ if (qAppName() == "bioauth") { // 获取父进程名称为sudo,su,或者login ++ int ppid = getppid(); // 获取父进程pid + QString filename = "/proc/" + QString::number(ppid) + "/cmdline"; + QFile file(filename); +- if(!file.open(QIODevice::ReadOnly | QIODevice::Text)) { +- qDebug()<<"Can't open the file!"<<endl; ++ if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { ++ qDebug() << "Can't open the file!" << endl; + } + QByteArray text = file.readAll(); + file.close(); +- if(text.contains("sudo")){ +- isEnable = isEnableApp & (1<<3); +- }else if(text.contains("su")){ +- isEnable = isEnableApp & (1<<4); +- }else if(text.contains("login")){ +- isEnable = isEnableApp & (1<<5); ++ if (text.contains("sudo")) { ++ isEnable = isEnableApp & (1 << 3); ++ } else if (text.contains("su")) { ++ isEnable = isEnableApp & (1 << 4); ++ } else if (text.contains("login")) { ++ isEnable = isEnableApp & (1 << 5); + } + } + } +@@ -426,9 +412,9 @@ bool BioDevices::GetBioAuthEnable() + } + } + +-DeviceInfoPtr BioDevices::getDefaultDevice(uid_t uid,int bioType) ++DeviceInfoPtr BioDevices::getDefaultDevice(uid_t uid, int bioType) + { +- if(deviceInfos.size() <= 0) ++ if (deviceInfos.size() <= 0) + return nullptr; + + FeatureMap mapFeatures = GetUserFeatures(uid); +@@ -438,18 +424,18 @@ DeviceInfoPtr BioDevices::getDefaultDevice(uid_t uid,int bioType) + DeviceInfoPtr ptrDevInfo = nullptr; + if (pwdInfo) { + QString strDeviceName = m_uniAuthService->getDefaultDevice(pwdInfo->pw_name, bioType); +- qDebug()<<strDeviceName; +- if(!strDeviceName.isEmpty()) { ++ qDebug() << strDeviceName; ++ if (!strDeviceName.isEmpty()) { + ptrDevInfo = findDevice(strDeviceName); + if (ptrDevInfo) { + int isIdle = GetDirveIsIdle(ptrDevInfo->device_id); +- if(isIdle && mapFeatures.contains(ptrDevInfo->device_shortname)){ ++ if (isIdle && mapFeatures.contains(ptrDevInfo->device_shortname)) { + defaultDeviceName = strDeviceName; + } + } + } + } +- if(defaultDeviceName.isEmpty()){ ++ if (defaultDeviceName.isEmpty()) { + return nullptr; + } + return ptrDevInfo; +@@ -463,29 +449,28 @@ DeviceInfoPtr BioDevices::getDefaultDevice(uid_t uid,int bioType) + defaultDeviceName = userConfig.value(DEFAULT_DEVICE).toString(); + qDebug() << defaultDeviceName; + +- if(defaultDeviceName.isEmpty() || !findDevice(defaultDeviceName)) { ++ if (defaultDeviceName.isEmpty() || !findDevice(defaultDeviceName)) { + QSettings sysConfig(GET_STR(CONFIG_FILE), QSettings::IniFormat); + defaultDeviceName = sysConfig.value(DEFAULT_DEVICE).toString(); + } + +- if(defaultDeviceName.isEmpty() || !findDevice(defaultDeviceName)){ ++ if (defaultDeviceName.isEmpty() || !findDevice(defaultDeviceName)) { + QString userConfigFile = QString(pwd->pw_dir) + "/.biometric_auth/ukui_biometric.conf"; + QSettings userConfig(userConfigFile, QSettings::IniFormat); + defaultDeviceName = userConfig.value(DEFAULT_DEVICE).toString(); + } + qDebug() << "default device: " << defaultDeviceName; + // 终端不默认使用第一个设备 +- if(defaultDeviceName.isEmpty()){ ++ if (defaultDeviceName.isEmpty()) { + return nullptr; + } + bool defValid = false; + DeviceInfoPtr ptrDevInfo = findDevice(defaultDeviceName); + if (ptrDevInfo) { + int isIdle = GetDirveIsIdle(ptrDevInfo->device_id); +- if(isIdle && mapFeatures.contains(ptrDevInfo->device_shortname)){ ++ if (isIdle && mapFeatures.contains(ptrDevInfo->device_shortname)) { + defValid = true; + } +- + } + + if (!defValid) { +@@ -498,18 +483,18 @@ DeviceInfoPtr BioDevices::getDefaultDevice(uid_t uid,int bioType) + + void BioDevices::recordAuthDrive(QString appName, int drvid, bool insert) + { +- if(m_uniAuthService && m_uniAuthService->isActivatable()){ +- m_uniAuthService->recordAuthDrive(appName,drvid,insert); ++ if (m_uniAuthService && m_uniAuthService->isActivatable()) { ++ m_uniAuthService->recordAuthDrive(appName, drvid, insert); + } + } + + bool BioDevices::GetDirveIsIdle(int drvid) + { +- if(m_uniAuthService && m_uniAuthService->isActivatable()){ ++ if (m_uniAuthService && m_uniAuthService->isActivatable()) { + QStringList appList = m_uniAuthService->getAuthingApp(); +- for(QString appName : appList){ ++ for (QString appName : appList) { + int id = m_uniAuthService->getAuthingAppDrivd(appName); +- if(id == drvid){ ++ if (id == drvid) { + return false; + } + } +@@ -520,7 +505,7 @@ bool BioDevices::GetDirveIsIdle(int drvid) + + DeviceInfoPtr BioDevices::getDefaultDevice(uid_t uid) + { +- if(deviceInfos.size() <= 0) ++ if (deviceInfos.size() <= 0) + return nullptr; + + FeatureMap mapFeatures = GetUserFeatures(uid); +@@ -530,13 +515,16 @@ DeviceInfoPtr BioDevices::getDefaultDevice(uid_t uid) + DeviceInfoPtr ptrDevInfo = nullptr; + if (pwdInfo) { + for (auto bioType : m_listPriority) { ++ if (bioType == REMOTE_QRCODE_TYPE) { ++ continue; ++ } + QString strDeviceName = m_uniAuthService->getDefaultDevice(pwdInfo->pw_name, bioType); +- qDebug()<<strDeviceName; +- if(!strDeviceName.isEmpty()) { ++ qDebug() << strDeviceName; ++ if (!strDeviceName.isEmpty()) { + ptrDevInfo = findDevice(strDeviceName); + if (ptrDevInfo) { + int isIdle = GetDirveIsIdle(ptrDevInfo->device_id); +- if(isIdle && mapFeatures.contains(ptrDevInfo->device_shortname)){ ++ if (isIdle && mapFeatures.contains(ptrDevInfo->device_shortname)) { + defaultDeviceName = strDeviceName; + break; + } +@@ -544,7 +532,7 @@ DeviceInfoPtr BioDevices::getDefaultDevice(uid_t uid) + } + } + } +- if(defaultDeviceName.isEmpty()){ ++ if (defaultDeviceName.isEmpty()) { + return nullptr; + } + return ptrDevInfo; +@@ -558,21 +546,19 @@ DeviceInfoPtr BioDevices::getDefaultDevice(uid_t uid) + defaultDeviceName = userConfig.value(DEFAULT_DEVICE).toString(); + qDebug() << defaultDeviceName; + +- if(defaultDeviceName.isEmpty() || !findDevice(defaultDeviceName)) { ++ if (defaultDeviceName.isEmpty() || !findDevice(defaultDeviceName)) { + QSettings sysConfig(GET_STR(CONFIG_FILE), QSettings::IniFormat); + defaultDeviceName = sysConfig.value(DEFAULT_DEVICE).toString(); + } + +- if(defaultDeviceName.isEmpty() || !findDevice(defaultDeviceName)){ ++ if (defaultDeviceName.isEmpty() || !findDevice(defaultDeviceName)) { + QString userConfigFile = QString(pwd->pw_dir) + "/.biometric_auth/ukui_biometric.conf"; + QSettings userConfig(userConfigFile, QSettings::IniFormat); + defaultDeviceName = userConfig.value(DEFAULT_DEVICE).toString(); +- +- + } + qDebug() << "default device: " << defaultDeviceName; + // 终端不默认使用第一个设备 +- if(defaultDeviceName.isEmpty()){ ++ if (defaultDeviceName.isEmpty()) { + return nullptr; + } + bool defValid = false; +@@ -609,18 +595,18 @@ QStringList BioDevices::getAllDefDevices() + defaultDeviceName = userConfig.value(DEFAULT_DEVICE).toString(); + qDebug() << defaultDeviceName; + +- if(defaultDeviceName.isEmpty() || !findDevice(defaultDeviceName)) { ++ if (defaultDeviceName.isEmpty() || !findDevice(defaultDeviceName)) { + QSettings sysConfig(GET_STR(CONFIG_FILE), QSettings::IniFormat); + defaultDeviceName = sysConfig.value(DEFAULT_DEVICE).toString(); + } + +- if(defaultDeviceName.isEmpty() || !findDevice(defaultDeviceName)){ ++ if (defaultDeviceName.isEmpty() || !findDevice(defaultDeviceName)) { + QString userConfigFile = QString(pwd->pw_dir) + "/.biometric_auth/ukui_biometric.conf"; + QSettings userConfig(userConfigFile, QSettings::IniFormat); + defaultDeviceName = userConfig.value(DEFAULT_DEVICE).toString(); + } + qDebug() << "default device: " << defaultDeviceName; +- if(!defaultDeviceName.isEmpty()){ ++ if (!defaultDeviceName.isEmpty()) { + listDefDevices.push_back(defaultDeviceName); + } + } +@@ -664,18 +650,18 @@ void BioDevices::SetLastDevice(const QString &userName, int drvid) + + DeviceInfoPtr BioDevices::findDevice(const int id) + { +- for(auto deviceInfo : deviceInfos) { +- if(deviceInfo->device_id == id) ++ for (auto deviceInfo : deviceInfos) { ++ if (deviceInfo->device_id == id) + return deviceInfo; + } +- //qDebug() << deviceName << "doesn't exists"; ++ // qDebug() << deviceName << "doesn't exists"; + return nullptr; + } + + DeviceInfoPtr BioDevices::findDevice(const QString &deviceName) + { +- for(auto deviceInfo : deviceInfos) { +- if(deviceInfo->device_shortname == deviceName) ++ for (auto deviceInfo : deviceInfos) { ++ if (deviceInfo->device_shortname == deviceName) + return deviceInfo; + } + qDebug() << deviceName << "doesn't exists"; +@@ -695,21 +681,21 @@ DeviceInfoPtr BioDevices::getFirstDevice(int uid) + + QString BioDevices::bioTypeToString_tr(int type) + { +- switch(type) { +- case BIOTYPE_FINGERPRINT: +- return tr("FingerPrint"); +- case BIOTYPE_FINGERVEIN: +- return tr("FingerVein"); +- case BIOTYPE_IRIS: +- return tr("Iris"); +- case BIOTYPE_FACE: +- return tr("Face"); +- case BIOTYPE_VOICEPRINT: +- return tr("VoicePrint"); +- case LOGINOPT_TYPE_GENERAL_UKEY: +- return tr("Ukey"); +- case REMOTE_QRCODE_TYPE: +- return tr("QRCode"); ++ switch (type) { ++ case BIOTYPE_FINGERPRINT: ++ return tr("FingerPrint"); ++ case BIOTYPE_FINGERVEIN: ++ return tr("FingerVein"); ++ case BIOTYPE_IRIS: ++ return tr("Iris"); ++ case BIOTYPE_FACE: ++ return tr("Face"); ++ case BIOTYPE_VOICEPRINT: ++ return tr("VoicePrint"); ++ case LOGINOPT_TYPE_GENERAL_UKEY: ++ return tr("Ukey"); ++ case REMOTE_QRCODE_TYPE: ++ return tr("QRCode"); + } + return QString(); + } +@@ -723,19 +709,18 @@ StatusReslut BioDevices::UpdateStatus(int drvid) + { + StatusReslut status; + QDBusMessage result = serviceInterface->call(QStringLiteral("UpdateStatus"), drvid); +- if(result.type() == QDBusMessage::ErrorMessage) +- { ++ if (result.type() == QDBusMessage::ErrorMessage) { + qWarning() << "UpdateStatus error:" << result.errorMessage(); + status.result = -1; + return status; + } + +- status.result = result.arguments().at(0).toInt(); +- status.enable = result.arguments().at(1).toInt(); +- status.devNum = result.arguments().at(2).toInt(); +- status.devStatus = result.arguments().at(3).toInt(); +- status.opsStatus = result.arguments().at(4).toInt(); +- status.notifyMessageId = result.arguments().at(5).toInt(); ++ status.result = result.arguments().at(0).toInt(); ++ status.enable = result.arguments().at(1).toInt(); ++ status.devNum = result.arguments().at(2).toInt(); ++ status.devStatus = result.arguments().at(3).toInt(); ++ status.opsStatus = result.arguments().at(4).toInt(); ++ status.notifyMessageId = result.arguments().at(5).toInt(); + + return status; + } +diff --git a/bioauth/src/loginoptionswidget.cpp b/bioauth/src/loginoptionswidget.cpp +index bc54363..f75be62 100644 +--- a/bioauth/src/loginoptionswidget.cpp ++++ b/bioauth/src/loginoptionswidget.cpp +@@ -40,90 +40,69 @@ + #include <QApplication> + #include <QFont> + #include <QDebug> +- ++#include <QPixmapCache> + + LoginOptionsWidget::LoginOptionsWidget(QWidget *parent) +- : QWidget(parent) +- , m_biomericProxy(new BioAuth(this)) +- , m_bioDevices(new BioDevices()) +- , w_timer(nullptr) ++ : QWidget(parent), m_biomericProxy(new BioAuth(this)), m_bioDevices(new BioDevices()), w_timer(nullptr) + { +- m_bioDevices->recordAuthDrive("polkit",0,false); ++ m_bioDevices->recordAuthDrive("polkit", 0, false); + initUI(); + initConnections(); + m_mapDisableDev.clear(); + } + +-LoginOptionsWidget::~LoginOptionsWidget() +-{ +- +-} ++LoginOptionsWidget::~LoginOptionsWidget() {} + + void LoginOptionsWidget::initUI() + { + // 初始化UI + m_layoutMain = new QVBoxLayout(); +- m_layoutMain->setContentsMargins(0,0,0,30); ++ m_layoutMain->setContentsMargins(0, 0, 0, 30); + m_layoutMain->setSpacing(12); + m_layoutMain->setAlignment(Qt::AlignTop); +- m_layoutOptBtns = new QHBoxLayout(); +- m_layoutOptBtns->setContentsMargins(0,0,0,0); +- m_layoutOptBtns->setSpacing(16); ++ ++ m_widgetImage = new QWidget(); ++ m_widgetImage->setFixedSize(154, 154); + m_layoutImage = new QHBoxLayout(); +- m_layoutImage->setContentsMargins(0,0,0,0); ++ m_layoutImage->setContentsMargins(0, 8, 0, 16); + m_layoutImage->setSpacing(0); + m_layoutImage->setAlignment(Qt::AlignCenter); +- +- m_labelOptTitle = new QLabel(); +- m_labelOptTitle->setAlignment(Qt::AlignLeft); +- m_labelOptTitle->setText(tr("Login Options")); +- m_layoutMain->addWidget(m_labelOptTitle); +- +- m_btnGroup = new QButtonGroup(this); +- m_btnGroup->setExclusive(true); +- +- m_layoutOptBtns->setAlignment(Qt::AlignLeft); +- m_layoutMain->addLayout(m_layoutOptBtns); +- +- m_widgetImage = new QWidget(); +- m_widgetImage->setFixedSize(154,154); + m_layoutImage->addSpacerItem(new QSpacerItem(109, 0, QSizePolicy::Expanding)); + m_layoutImage->addWidget(m_widgetImage); + m_layoutImage->addSpacerItem(new QSpacerItem(109, 0, QSizePolicy::Expanding)); + m_widgetImage->hide(); ++ + // 人脸识别 + m_labelFace = new QLabel(m_widgetImage); + m_labelFace->setObjectName("faceLabel"); + m_labelFace->setAlignment(Qt::AlignCenter); +- m_labelFace->setFixedSize(154,154); ++ m_labelFace->setFixedSize(154, 154); + QHBoxLayout *layoutFace = new QHBoxLayout(); +- layoutFace->setContentsMargins(0,0,0,0); ++ layoutFace->setContentsMargins(0, 0, 0, 0); + layoutFace->setAlignment(Qt::AlignCenter); + m_labelFace->setLayout(layoutFace); ++ m_labelFace->hide(); + m_labelFaceLoad = new QLabel(); + m_labelFaceLoad->setAlignment(Qt::AlignCenter); + m_labelFaceLoad->setFixedSize(142, 142); +- m_labelFaceLoad->setStyleSheet(QString("QLabel{background-color: rgba(230,230,230,0.39); border-radius: %1px; border: 8px solid white;}").arg(71)); ++ m_labelFaceLoad->setStyleSheet( ++ QString("QLabel{background-color: rgba(230,230,230,0.39); border-radius: %1px; border: 8px solid white;}") ++ .arg(71)); + layoutFace->addWidget(m_labelFaceLoad, 0, Qt::AlignVCenter); + +- +-// QImage img; +-// setFaceImg(img); +- m_labelFace->hide(); + // 二维码窗口 + m_labelQRCode = new QLabel(m_widgetImage); + m_labelQRCode->setObjectName("qrCodeLabel"); + m_labelQRCode->setAlignment(Qt::AlignCenter); +- m_labelQRCode->setFixedSize(154,154); ++ m_labelQRCode->setFixedSize(154, 154); + m_labelQRCode->hide(); +- m_layoutMain->addLayout(m_layoutImage); + QVBoxLayout *layoutQRCode = new QVBoxLayout(); + layoutQRCode->setAlignment(Qt::AlignCenter); + layoutQRCode->setSpacing(5); + m_labelQRCode->setLayout(layoutQRCode); + m_labelQRCodeTip = new QLabel(); +- m_labelQRCodeTip->setFixedSize(22,22); +- m_labelQRCodeTip->setPixmap(QIcon::fromTheme("dialog-warning").pixmap(QSize(22,22))); ++ m_labelQRCodeTip->setFixedSize(22, 22); ++ m_labelQRCodeTip->setPixmap(QIcon::fromTheme("dialog-warning").pixmap(QSize(22, 22))); + layoutQRCode->addWidget(m_labelQRCodeTip, 0, Qt::AlignHCenter); + m_labelQRCodeMsg = new QLabel(); + m_labelQRCodeMsg->setFixedHeight(24); +@@ -133,9 +112,33 @@ void LoginOptionsWidget::initUI() + m_labelQRCodeMsg->setFont(font); + layoutQRCode->addWidget(m_labelQRCodeMsg, 0, Qt::AlignHCenter); + ++ // 生物特征等待验证动画 ++ m_labelBioWaiting = new QLabel(m_widgetImage); ++ m_labelBioWaiting->setAlignment(Qt::AlignCenter); ++ m_labelBioWaiting->setFixedSize(154, 154); ++ m_labelBioWaiting->hide(); ++ ++ m_layoutMain->addLayout(m_layoutImage); ++ ++ m_layoutOptBtns = new QHBoxLayout(); ++ m_layoutOptBtns->setContentsMargins(0, 0, 0, 0); ++ m_layoutOptBtns->setSpacing(16); ++ ++ m_labelOptTitle = new QLabel(); ++ m_labelOptTitle->setFixedHeight(30); ++ m_labelOptTitle->setAlignment(Qt::AlignLeft); ++ m_labelOptTitle->setText(tr("Login Options")); ++ m_layoutMain->addWidget(m_labelOptTitle); ++ ++ m_btnGroup = new QButtonGroup(this); ++ m_btnGroup->setExclusive(true); ++ ++ m_layoutOptBtns->setAlignment(Qt::AlignLeft); ++ m_layoutMain->addLayout(m_layoutOptBtns); ++ + this->setLayout(m_layoutMain); + +- //设置水平扩展 ++ // 设置水平扩展 + QSizePolicy sizePolicy = this->sizePolicy(); + sizePolicy.setHorizontalPolicy(QSizePolicy::Expanding); + this->setSizePolicy(sizePolicy); +@@ -143,38 +146,32 @@ void LoginOptionsWidget::initUI() + + void LoginOptionsWidget::SetExtraInfo(QString extra_info, QString info_type) + { +- if(!m_biomericProxy) +- { ++ if (!m_biomericProxy) { + qWarning() << "BiometricProxy doesn't exist."; + return; + } +- m_biomericProxy->SetExtraInfo(info_type,extra_info); ++ m_biomericProxy->SetExtraInfo(info_type, extra_info); + } + + void LoginOptionsWidget::initConnections() + { +- if(m_biomericProxy) { +- connect(m_biomericProxy, &BioAuth::notifyDetail, +- this, &LoginOptionsWidget::onStatusChanged); ++ if (m_biomericProxy) { ++ connect(m_biomericProxy, &BioAuth::notifyDetail, this, &LoginOptionsWidget::onStatusChanged); + +- connect(m_biomericProxy, &BioAuth::frameWritten, +- this, &LoginOptionsWidget::onFrameWritten); ++ connect(m_biomericProxy, &BioAuth::frameWritten, this, &LoginOptionsWidget::onFrameWritten); + +- connect(m_biomericProxy, &BioAuth::authComplete, +- this, &LoginOptionsWidget::onIdentifyComplete); ++ connect(m_biomericProxy, &BioAuth::authComplete, this, &LoginOptionsWidget::onIdentifyComplete); + +- connect(m_biomericProxy, &BioAuth::authFinished, +- this, &LoginOptionsWidget::onAuthFinished); ++ connect(m_biomericProxy, &BioAuth::authFinished, this, &LoginOptionsWidget::onAuthFinished); + } + if (m_bioDevices) { +- connect(m_bioDevices, &BioDevices::deviceCountChanged, +- this, &LoginOptionsWidget::onUSBDeviceCountChange); +- //readDevicesInfo(); ++ connect(m_bioDevices, &BioDevices::deviceCountChanged, this, &LoginOptionsWidget::onUSBDeviceCountChange); ++ // readDevicesInfo(); + } + connect(m_btnGroup, SIGNAL(buttonClicked(int)), this, SLOT(onOptionSelected(int))); + } + +-bool LoginOptionsWidget::getCurLoginOpt(int& nLoginOptType, int& nDrvId) ++bool LoginOptionsWidget::getCurLoginOpt(int &nLoginOptType, int &nDrvId) + { + if (m_curDevInfo) { + nLoginOptType = convertDeviceType(m_curDevInfo->biotype); +@@ -192,18 +189,18 @@ unsigned LoginOptionsWidget::getLoginOptCount() + DeviceInfoPtr LoginOptionsWidget::getFirstDevInfo() + { + DeviceInfoPtr devInfo = nullptr; +- struct passwd* pwdInfo = getpwuid(m_uid); ++ struct passwd *pwdInfo = getpwuid(m_uid); + if (!pwdInfo) + return devInfo; + int nDrvId = m_bioDevices->GetLastDevice(pwdInfo->pw_name); + if (nDrvId >= 0) { +- qDebug()<<"GetLastDevice:"<<nDrvId; ++ qDebug() << "GetLastDevice:" << nDrvId; + DeviceMap::iterator itDevInfo = m_mapDevices.begin(); + for (; itDevInfo != m_mapDevices.end(); itDevInfo++) { + for (auto devinfo : itDevInfo.value()) { + if (devinfo && devinfo->device_id == nDrvId) { + if (!isDeviceDisable(devinfo->device_id)) { +- devInfo = devinfo; ++ devInfo = devinfo; + break; + } + } +@@ -218,7 +215,7 @@ DeviceInfoPtr LoginOptionsWidget::getFirstDevInfo() + for (; itDevInfo != m_mapDevices.end(); itDevInfo++) { + for (auto devinfo : itDevInfo.value()) { + if (devinfo && !isDeviceDisable(devinfo->device_id)) { +- devInfo = devinfo; ++ devInfo = devinfo; + break; + } + } +@@ -238,53 +235,45 @@ bool LoginOptionsWidget::getHasUkeyOptions() + void LoginOptionsWidget::addOptionButton(unsigned uLoginOptType, int nDrvId, QString strDrvName) + { + if (m_mapOptBtns.contains(nDrvId)) { +- return ; ++ return; + } + + QToolButton *newButton = new QToolButton(); +-// newButton->setStyleSheet(QString("QToolButton{text-align:center;border: none;border-radius: 6px;outline: none;background-color: rgba(230, 230, 230, 100%);} \ +-// QToolButton::hover{background-color: rgba(55, 144, 250, 40%);} \ +-// QToolButton::pressed {background-color: rgba(55, 144, 250, 100%);} \ +-// QToolButton::checked {background-color: rgba(55, 144, 250, 100%);} \ +-// ")); + newButton->setCheckable(true); + newButton->setChecked(false); + newButton->setFocusPolicy(Qt::NoFocus); +- newButton->setContentsMargins(16,16,16,16); +-// if (nDrvId == -1) { +-// newButton->setEnabled(false); +-// newButton->setChecked(true); +-// } else { +- int nLength = m_btnGroup->buttons().length(); +- m_btnGroup->addButton(newButton, nLength); +- m_listDriveId.append(nDrvId); +-// } ++ newButton->setContentsMargins(16, 16, 16, 16); ++ ++ int nLength = m_btnGroup->buttons().length(); ++ m_btnGroup->addButton(newButton, nLength); ++ m_listDriveId.append(nDrvId); ++ + QIcon icon; + switch (uLoginOptType) { +- case LOGINOPT_TYPE_PASSWORD: +- icon = QIcon(QString("%1/images/ukui-loginopt-password.svg").arg(GET_STR(UKUI_BIOMETRIC))); +- break; +- case LOGINOPT_TYPE_GENERAL_UKEY: +- icon = QIcon(QString("%1/images/ukui-loginopt-ukey.svg").arg(GET_STR(UKUI_BIOMETRIC))); +- break; +- case LOGINOPT_TYPE_FACE: +- icon = QIcon(QString("%1/images/ukui-loginopt-face.svg").arg(GET_STR(UKUI_BIOMETRIC))); +- break; +- case LOGINOPT_TYPE_FINGERPRINT: +- icon = QIcon(QString("%1/images/ukui-loginopt-finger.svg").arg(GET_STR(UKUI_BIOMETRIC))); +- break; +- case LOGINOPT_TYPE_IRIS: +- icon = QIcon(QString("%1/images/ukui-loginopt-iris.svg").arg(GET_STR(UKUI_BIOMETRIC))); +- break; +- case LOGINOPT_TYPE_VOICEPRINT: +- icon = QIcon(QString("%1/images/ukui-loginopt-voice.svg").arg(GET_STR(UKUI_BIOMETRIC))); +- break; +- case LOGINOPT_TYPE_FINGERVEIN: +- icon = QIcon(QString("%1/images/ukui-loginopt-fingervein.svg").arg(GET_STR(UKUI_BIOMETRIC))); +- break; +- case LOGINOPT_TYPE_QRCODE: +- icon = QIcon(QString("%1/images/ukui-loginopt-qrcode.svg").arg(GET_STR(UKUI_BIOMETRIC))); +- break; ++ case LOGINOPT_TYPE_PASSWORD: ++ icon = QIcon(QString("%1/images/ukui-loginopt-password.svg").arg(GET_STR(UKUI_BIOMETRIC))); ++ break; ++ case LOGINOPT_TYPE_GENERAL_UKEY: ++ icon = QIcon(QString("%1/images/ukui-loginopt-ukey.svg").arg(GET_STR(UKUI_BIOMETRIC))); ++ break; ++ case LOGINOPT_TYPE_FACE: ++ icon = QIcon(QString("%1/images/ukui-loginopt-face.svg").arg(GET_STR(UKUI_BIOMETRIC))); ++ break; ++ case LOGINOPT_TYPE_FINGERPRINT: ++ icon = QIcon(QString("%1/images/ukui-loginopt-finger.svg").arg(GET_STR(UKUI_BIOMETRIC))); ++ break; ++ case LOGINOPT_TYPE_IRIS: ++ icon = QIcon(QString("%1/images/ukui-loginopt-iris.svg").arg(GET_STR(UKUI_BIOMETRIC))); ++ break; ++ case LOGINOPT_TYPE_VOICEPRINT: ++ icon = QIcon(QString("%1/images/ukui-loginopt-voice.svg").arg(GET_STR(UKUI_BIOMETRIC))); ++ break; ++ case LOGINOPT_TYPE_FINGERVEIN: ++ icon = QIcon(QString("%1/images/ukui-loginopt-fingervein.svg").arg(GET_STR(UKUI_BIOMETRIC))); ++ break; ++ case LOGINOPT_TYPE_QRCODE: ++ icon = QIcon(QString("%1/images/ukui-loginopt-qrcode.svg").arg(GET_STR(UKUI_BIOMETRIC))); ++ break; + } + newButton->setIcon(icon); + newButton->setToolTip(strDrvName); +@@ -301,8 +290,8 @@ void LoginOptionsWidget::addOptionButton(unsigned uLoginOptType, int nDrvId, QSt + + void LoginOptionsWidget::clearOptionButtons() + { +- QMap<int, QToolButton*>::iterator itMapBtn = m_mapOptBtns.begin(); +- for ( ; itMapBtn != m_mapOptBtns.end(); itMapBtn++) { ++ QMap<int, QToolButton *>::iterator itMapBtn = m_mapOptBtns.begin(); ++ for (; itMapBtn != m_mapOptBtns.end(); itMapBtn++) { + if (itMapBtn.value()) { + m_btnGroup->removeButton(itMapBtn.value()); + m_layoutOptBtns->removeWidget(itMapBtn.value()); +@@ -319,66 +308,44 @@ void LoginOptionsWidget::updateOptionButtons() + clearOptionButtons(); + addOptionButton(LOGINOPT_TYPE_PASSWORD, -1, tr("Password")); + DeviceMap::iterator itMapDev = m_mapDevices.begin(); +- for ( ; itMapDev != m_mapDevices.end(); itMapDev++) { ++ for (; itMapDev != m_mapDevices.end(); itMapDev++) { + for (DeviceInfoPtr devPtr : itMapDev.value()) { + if (devPtr) { +- if(devPtr->biotype == LOGINOPT_TYPE_GENERAL_UKEY){ +- //ukey 设备类型排在二维码前,但实际上应该显示在二维码之后,因此暂时不添加 ++ if (devPtr->biotype == LOGINOPT_TYPE_GENERAL_UKEY) { ++ // ukey 设备类型排在二维码前,但实际上应该显示在二维码之后,因此暂时不添加 + isShowUkey = true; + continue; + } +- addOptionButton(itMapDev.key(), devPtr->device_id, BioDevices::bioTypeToString_tr(devPtr->biotype)); +- } ++ addOptionButton(itMapDev.key(), devPtr->device_id, BioDevices::bioTypeToString_tr(devPtr->biotype)); ++ } + } + } + + itMapDev = m_mapDevices.begin(); +- if(isShowUkey){ +- for ( ; itMapDev != m_mapDevices.end(); itMapDev++) { ++ if (isShowUkey) { ++ for (; itMapDev != m_mapDevices.end(); itMapDev++) { + for (DeviceInfoPtr devPtr : itMapDev.value()) { +- if(devPtr && devPtr->biotype == LOGINOPT_TYPE_GENERAL_UKEY){ +- //此处才添加ukey ++ if (devPtr && devPtr->biotype == LOGINOPT_TYPE_GENERAL_UKEY) { ++ // 此处才添加ukey + addOptionButton(itMapDev.key(), devPtr->device_id, BioDevices::bioTypeToString_tr(devPtr->biotype)); +- } ++ } + } + } + } + +- //存在特征但没有插入ukey +- if( !isShowUkey && m_biomericProxy->GetHasUkeyFeature(m_uid)){ +- addOptionButton(LOGINOPT_TYPE_GENERAL_UKEY,-2,BioDevices::bioTypeToString_tr(LOGINOPT_TYPE_GENERAL_UKEY)); ++ // 存在特征但没有插入ukey ++ if (!isShowUkey && m_biomericProxy->GetHasUkeyFeature(m_uid)) { ++ addOptionButton(LOGINOPT_TYPE_GENERAL_UKEY, -2, BioDevices::bioTypeToString_tr(LOGINOPT_TYPE_GENERAL_UKEY)); + isShowUkey = true; + } + +- if (m_mapOptBtns.size() <= 2 && !isShowUkey) { +- //因为默认添加一个密码选项,因此当ukey没有显示出来时,按钮数小于等于2时就隐藏选项界面 +- m_labelOptTitle->hide(); +- QMap<int, QToolButton*>::iterator itMapBtn = m_mapOptBtns.begin(); +- for ( ; itMapBtn != m_mapOptBtns.end(); itMapBtn++) { +- if (itMapBtn.value()) { +- itMapBtn.value()->hide(); +- } +- } +- if (m_mapOptBtns.size() == 0) { +- m_labelFace->hide(); +- m_labelQRCode->hide(); +- } +- } else { +- m_labelOptTitle->show(); +- QMap<int, QToolButton*>::iterator itMapBtn = m_mapOptBtns.begin(); +- for ( ; itMapBtn != m_mapOptBtns.end(); itMapBtn++) { +- if (itMapBtn.value()) { +- itMapBtn.value()->show(); +- } ++ m_labelOptTitle->show(); ++ QMap<int, QToolButton *>::iterator itMapBtn = m_mapOptBtns.begin(); ++ for (; itMapBtn != m_mapOptBtns.end(); itMapBtn++) { ++ if (itMapBtn.value()) { ++ itMapBtn.value()->show(); + } + } +- +- m_mapOptBtns[-1]->hide(); +- if(m_mapOptBtns.size() == 2 && isShowUkey) { +- m_mapOptBtns[-1]->show(); +- } +- +- adjustSize(); + } + + void LoginOptionsWidget::setUser(int uid) +@@ -404,53 +371,49 @@ void LoginOptionsWidget::readDevicesInfo() + DeviceList deviceList = m_bioDevices->GetDevList(); + QStringList listDefDevices = m_bioDevices->getAllDefDevices(); + FeatureMap mapFeatures = m_bioDevices->GetUserFeatures(m_uid); +- qDebug() << m_uid <<",count:"<<mapFeatures.size(); ++ qDebug() << m_uid << ",count:" << mapFeatures.size(); + +- for(auto pDeviceInfo : deviceList) +- { ++ for (auto pDeviceInfo : deviceList) { + int nDevFeatureCount = 0; + if (m_isInAuth && m_curDevInfo && m_curDevInfo->device_id == pDeviceInfo->device_id) { + nDevFeatureCount = 1; + } else { + if (m_uid == -1) { + nDevFeatureCount = 0; +- } else if(mapFeatures.contains(pDeviceInfo->device_shortname)){ ++ } else if (mapFeatures.contains(pDeviceInfo->device_shortname)) { + nDevFeatureCount = mapFeatures[pDeviceInfo->device_shortname].size(); + } + } +- qDebug() << *pDeviceInfo << ",FeatureCount:"<<nDevFeatureCount; +- if(nDevFeatureCount > 0) { ++ qDebug() << *pDeviceInfo << ",FeatureCount:" << nDevFeatureCount; ++ if (nDevFeatureCount > 0) { + if (!isAuthEnable && pDeviceInfo->biotype <= BIOTYPE_VOICEPRINT) + continue; + if (!isQRCodeEnable && pDeviceInfo->biotype == REMOTE_QRCODE_TYPE) + continue; + int nDevType = LOGINOPT_TYPE_OTHERS; + nDevType = convertDeviceType(pDeviceInfo->biotype); +- if (listDefDevices.contains(pDeviceInfo->device_shortname) && +- !m_mapDevices.contains(nDevType)) { ++ if (listDefDevices.contains(pDeviceInfo->device_shortname) && !m_mapDevices.contains(nDevType)) { + m_mapDevices[nDevType].push_back(pDeviceInfo); + } + } + } + updateOptionButtons(); + updateUIStatus(false); +- //Q_EMIT notifyOptionsChange(m_mapDevices.size()); ++ // Q_EMIT notifyOptionsChange(m_mapDevices.size()); + } + + void LoginOptionsWidget::startAuth(DeviceInfoPtr device, int uid) + { +- if(!device || !m_biomericProxy || is_Lock) +- { ++ if (!device || !m_biomericProxy || is_Lock) { + qWarning() << "BiometricProxy doesn't exist."; + return; + } + +- if(m_isInAuth) +- { ++ if (m_isInAuth) { + qDebug() << "Identification is currently under way, stop it"; + stopAuth(); + } +- qDebug()<<"deviceInfo:"<<device->device_id; ++ qDebug() << "deviceInfo:" << device->device_id; + this->m_curDevInfo = device; + this->m_uid = uid; + struct passwd *pwdInfo = getpwuid(uid); +@@ -469,7 +432,7 @@ void LoginOptionsWidget::startAuth(DeviceInfoPtr device, int uid) + void LoginOptionsWidget::setSelectedPassword() + { + if (m_mapOptBtns.contains(-1)) { +- QToolButton* btn = m_mapOptBtns[-1]; ++ QToolButton *btn = m_mapOptBtns[-1]; + if (btn && btn->isVisible()) { + btn->setChecked(true); + } +@@ -480,42 +443,41 @@ void LoginOptionsWidget::setSelectedPassword() + void LoginOptionsWidget::startAuth_() + { + if (!m_curDevInfo) +- return ; ++ return; + qDebug().noquote() << QString("Identify:[drvid: %1, uid: %2]").arg(m_curDevInfo->device_id).arg(m_uid); + + m_isInAuth = true; + m_dupFD = -1; +- if(!w_timer) +- { ++ if (!w_timer) { + w_timer = new QTimer(this); + w_timer->setInterval(150); + connect(w_timer, &QTimer::timeout, this, &LoginOptionsWidget::updatePixmap); + } + m_waitingPixmap = QIcon::fromTheme("ukui-loading-0-symbolic").pixmap(24, 24); +- if(m_curLoginOptType == LOGINOPT_TYPE_QRCODE) { ++ if (m_curLoginOptType == LOGINOPT_TYPE_QRCODE) { + m_labelQRCodeTip->setPixmap(m_waitingPixmap); + m_labelQRCodeTip->show(); + m_labelQRCodeMsg->hide(); +- } else if(m_curLoginOptType == LOGINOPT_TYPE_FACE) { +- m_labelFace->setStyleSheet(QString("border-radius: %1px; border:0px solid white;background-color: rgba(230,230,230,0.39);").arg(77)); ++ } else if (m_curLoginOptType == LOGINOPT_TYPE_FACE) { ++ m_labelFace->setStyleSheet( ++ QString("border-radius: %1px; border:0px solid white;background-color: rgba(230,230,230,0.39);").arg(77)); + m_labelFace->setPixmap(QPixmap("")); + m_labelFaceLoad->setPixmap(m_waitingPixmap); + m_labelFaceLoad->show(); + } + w_timer->start(); +- m_bioDevices->recordAuthDrive("polkit",m_curDevInfo->device_id,true); ++ m_bioDevices->recordAuthDrive("polkit", m_curDevInfo->device_id, true); + m_biomericProxy->startAuth(m_uid, m_curDevInfo); + } + + void LoginOptionsWidget::stopAuth() + { + m_isStopped = true; +- if(!m_isInAuth || !m_curDevInfo) +- { ++ if (!m_isInAuth || !m_curDevInfo) { + return; + } + m_biomericProxy->stopAuth(); +- if(m_retrytimer&&m_retrytimer->isActive()){ ++ if (m_retrytimer && m_retrytimer->isActive()) { + m_retrytimer->stop(); + delete m_retrytimer; + m_retrytimer = nullptr; +@@ -531,27 +493,26 @@ void LoginOptionsWidget::updatePixmap() + QMatrix matrix; + matrix.rotate(90.0); + m_waitingPixmap = m_waitingPixmap.transformed(matrix, Qt::FastTransformation); +- if(m_curLoginOptType == LOGINOPT_TYPE_QRCODE) ++ if (m_curLoginOptType == LOGINOPT_TYPE_QRCODE) + m_labelQRCodeTip->setPixmap(m_waitingPixmap); +- else if(m_curLoginOptType == LOGINOPT_TYPE_FACE) { ++ else if (m_curLoginOptType == LOGINOPT_TYPE_FACE) { + m_labelFaceLoad->setPixmap(m_waitingPixmap); + } + } + + void LoginOptionsWidget::onAuthFinished() + { +- if(m_bioDevices){ +- m_bioDevices->recordAuthDrive("polkit",0,false); ++ if (m_bioDevices) { ++ m_bioDevices->recordAuthDrive("polkit", 0, false); + } + } + + void LoginOptionsWidget::onIdentifyComplete(int uid, bool ret, int retErrNo) + { +- if(m_isStopped == true) +- return ; ++ if (m_isStopped == true) ++ return; + +- if(uid < 0) +- { ++ if (uid < 0) { + readDevicesInfo(); + Q_EMIT authComplete(uid, false, -1); + return; +@@ -559,23 +520,28 @@ void LoginOptionsWidget::onIdentifyComplete(int uid, bool ret, int retErrNo) + qDebug() << retErrNo << uid << m_uid; + + // 特征识别成功,而且用户id匹配 +- if(retErrNo == DBUS_RESULT_SUCCESS && uid == m_uid) { ++ if (retErrNo == DBUS_RESULT_SUCCESS && uid == m_uid) { + qDebug() << "Identify success"; + Q_EMIT authComplete(uid, true, 0); +- } else if(retErrNo == -1) { // 特征识别不匹配 ++ } else if (retErrNo == -1) { // 特征识别不匹配 + qDebug() << "Identify failed"; + Q_EMIT authComplete(uid, false, 2); +- } else if(retErrNo == -2) { //识别发生错误 ++ } else if (retErrNo == -2) { // 识别发生错误 + StatusReslut ret = m_bioDevices->UpdateStatus(m_curDevInfo->device_id); +- qDebug()<<"StatusReslut:"<<ret.result<<","<<ret.enable<<","<<ret.devNum<<"," +- <<ret.devStatus<<","<<ret.opsStatus<<","<<ret.notifyMessageId; +- //识别操作超时 +- if(ret.result == 0 && (ret.opsStatus == 404 || ret.opsStatus == 304 +- || ret.opsStatus == 8)) { // 304认证超时, 8网络异常 ++ qDebug() << "StatusReslut:" << ret.result << "," << ret.enable << "," << ret.devNum << "," << ret.devStatus ++ << "," << ret.opsStatus << "," << ret.notifyMessageId; ++ // 识别操作超时 ++ if (ret.result == 0 && ret.opsStatus == 10) { // 10 当前时间错误导致网络错误 ++ Q_EMIT authComplete(uid, false, -4); ++ } else if ( ++ ret.result == 0 ++ && (ret.opsStatus == 404 || ret.opsStatus == 304 || ret.opsStatus == 8)) { // 304认证超时, 8网络异常 + Q_EMIT authComplete(uid, false, 1); + } else if (ret.opsStatus == OPS_IDENTIFY_STOP_BY_USER || ret.opsStatus == OPS_VERIFY_STOP_BY_USER) { + Q_EMIT authComplete(uid, false, -2); // 主动停止,直接重试 +- } else if (ret.opsStatus == OPS_OPEN_FAIL || ret.opsStatus == OPS_OPEN_ERROR) { // 无法打开设备(设备是坏的/被占用),直接禁用 ++ } else if ( ++ ret.opsStatus == OPS_OPEN_FAIL ++ || ret.opsStatus == OPS_OPEN_ERROR) { // 无法打开设备(设备是坏的/被占用),直接禁用 + Q_EMIT authComplete(uid, false, 5); + } else { + Q_EMIT authComplete(uid, false, 2); +@@ -592,14 +558,14 @@ QPixmap LoginOptionsWidget::PixmapToRound(const QPixmap &src, int radius) + } + + QPixmap pixmapa(src); +- QPixmap pixmap(radius*2,radius*2); ++ QPixmap pixmap(radius * 2, radius * 2); + pixmap.fill(Qt::transparent); + QPainter painter(&pixmap); + painter.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform); + QPainterPath path; +- path.addEllipse(0, 0, radius*2, radius*2); ++ path.addEllipse(0, 0, radius * 2, radius * 2); + painter.setClipPath(path); +- painter.drawPixmap(0, 0, radius*2, radius*2, pixmapa); ++ painter.drawPixmap(0, 0, radius * 2, radius * 2, pixmapa); + return pixmap; + } + +@@ -614,13 +580,13 @@ QPixmap LoginOptionsWidget::PixmapToRound(const QPixmap &src, int radius) + QPixmap LoginOptionsWidget::scaledPixmap(int width, int height, QString url) + { + QFile imgFile(url); +- if(!imgFile.exists()){ +- qDebug()<< "not find the pixmap file"; ++ if (!imgFile.exists()) { ++ qDebug() << "not find the pixmap file"; + return QPixmap(); + } + QImage image(url); + QPixmap pixmap = QPixmap::fromImage(image); +- if(pixmap.isNull()) { ++ if (pixmap.isNull()) { + qDebug() << "pixmap is null"; + QProcess exec; + QString program("file " + url); +@@ -628,7 +594,7 @@ QPixmap LoginOptionsWidget::scaledPixmap(int width, int height, QString url) + exec.waitForFinished(1000); + QString output = exec.readAllStandardOutput(); + qDebug() << output; +- if(output.contains("SVG")){ ++ if (output.contains("SVG")) { + qDebug() << "image format is SVG"; + QSvgRenderer render(url); + QImage image(width, height, QImage::Format_ARGB32); +@@ -636,9 +602,8 @@ QPixmap LoginOptionsWidget::scaledPixmap(int width, int height, QString url) + QPainter painter(&image); + render.render(&painter, image.rect()); + pixmap.convertFromImage(image); +- } else if(output.contains("TIFF")) { ++ } else if (output.contains("TIFF")) { + qDebug() << "image format is TIFF"; +- + } + } + +@@ -647,42 +612,46 @@ QPixmap LoginOptionsWidget::scaledPixmap(int width, int height, QString url) + + void LoginOptionsWidget::onFrameWritten(int drvid) + { +- if(!m_curDevInfo) ++ if (!m_curDevInfo) + return; + +- if (m_curDevInfo && m_curDevInfo->device_id != drvid || !m_isInAuth) { +- return ; ++ if (m_curDevInfo && m_curDevInfo->device_id != drvid || !m_isInAuth) { ++ return; + } + +- if(m_dupFD == -1){ ++ if (m_dupFD == -1) { + m_dupFD = get_server_gvariant_stdout(drvid); + } + +- if(m_dupFD <= 0) +- return ; ++ if (m_dupFD <= 0) ++ return; + + cv::Mat img; + lseek(m_dupFD, 0, SEEK_SET); +- char base64_bufferData[1024*1024]; +- int rc = read(m_dupFD, base64_bufferData, 1024*1024); ++ char base64_bufferData[1024 * 1024]; ++ int rc = read(m_dupFD, base64_bufferData, 1024 * 1024); + Q_UNUSED(rc); + // printf("rc = %d\n", rc); + + cv::Mat mat2(1, sizeof(base64_bufferData), CV_8U, base64_bufferData); + img = cv::imdecode(mat2, cv::IMREAD_COLOR); + if (!img.data) +- return ; +- cv::cvtColor(img,img,cv::COLOR_BGR2RGB); ++ return; ++ cv::cvtColor(img, img, cv::COLOR_BGR2RGB); + +- QImage srcQImage = QImage((uchar*)(img.data), img.cols, img.rows, QImage::Format_RGB888); ++ QImage srcQImage = QImage((uchar *)(img.data), img.cols, img.rows, QImage::Format_RGB888); + if (isAuthenticating()) { + if (m_curLoginOptType == LOGINOPT_TYPE_FACE) { +- m_labelFace->setStyleSheet(QString("border-radius: %1px; border:0px solid white;background-color: rgba(255,255,255,10%);").arg(77)); ++ m_labelFace->setStyleSheet( ++ QString("border-radius: %1px; border:0px solid white;background-color: rgba(255,255,255,10%);") ++ .arg(77)); + setFaceImg(srcQImage); + m_labelFace->show(); + m_labelQRCode->hide(); + } else if (m_curLoginOptType == LOGINOPT_TYPE_QRCODE) { +- m_labelQRCode->setStyleSheet(QString("border-radius: %1px; border:0px solid white;background-color: rgba(255,255,255,100%);").arg(6)); ++ m_labelQRCode->setStyleSheet( ++ QString("border-radius: %1px; border:0px solid white;background-color: rgba(255,255,255,100%);") ++ .arg(6)); + setQRCode(srcQImage); + m_labelQRCode->show(); + m_labelQRCodeTip->hide(); +@@ -695,14 +664,13 @@ void LoginOptionsWidget::onFrameWritten(int drvid) + m_labelFace->hide(); + m_labelQRCode->hide(); + } +- if(w_timer && w_timer->isActive()) +- { ++ if (w_timer && w_timer->isActive()) { + w_timer->stop(); + } + Q_EMIT updateImage(srcQImage); + } + +-void LoginOptionsWidget::setQRCode(QImage& imgQRCode) ++void LoginOptionsWidget::setQRCode(QImage &imgQRCode) + { + if (imgQRCode.isNull()) { + imgQRCode.load(QString("%1/images/ukui-qrcode-null.svg").arg(GET_STR(UKUI_BIOMETRIC))); +@@ -716,41 +684,49 @@ void LoginOptionsWidget::setQRCodeMsg(QString strMsg) + { + if (strMsg.isEmpty()) { + m_labelQRCodeMsg->hide(); +- //m_labelQRCodeTip->hide(); ++ // m_labelQRCodeTip->hide(); + } else { +- //一开始认证时就没有网,直接停止加载状态 +- if(w_timer && w_timer->isActive()) +- { ++ // 一开始认证时就没有网,直接停止加载状态 ++ if (w_timer && w_timer->isActive()) { + w_timer->stop(); + } + m_labelQRCodeMsg->setText(strMsg); + m_labelQRCodeMsg->show(); + m_labelQRCodeTip->show(); +- m_labelQRCodeTip->setPixmap(QIcon::fromTheme("dialog-warning").pixmap(QSize(22,22))); ++ m_labelQRCodeTip->setPixmap(QIcon::fromTheme("dialog-warning").pixmap(QSize(22, 22))); + } + } + +-void LoginOptionsWidget::setFaceImg(QImage& imgFace, int nStatus) ++void LoginOptionsWidget::setFaceImg(QImage &imgFace, int nStatus) + { + QPixmap faceImage; +- m_labelFace->setFixedSize(154,154); +- //如果头像文件不存在,则使用默认头像 +- if(!imgFace.isNull()) { +- faceImage = PixmapToRound(QPixmap::fromImage(imgFace),77); ++ m_labelFace->setFixedSize(154, 154); ++ // 如果头像文件不存在,则使用默认头像 ++ if (!imgFace.isNull()) { ++ faceImage = PixmapToRound(QPixmap::fromImage(imgFace), 77); + } else { +- switch(nStatus) { +- case 1: +- faceImage = loadSvg(QString("%1/images/ukui-loginopt-lose.svg").arg(GET_STR(UKUI_BIOMETRIC)),"black",48); +- m_labelFace->setStyleSheet(QString("border-radius: %1px; border:0px solid white;background-color: rgba(230,230,230,40%);").arg(77)); +- break; +- case 2: +- faceImage = loadSvg(QString("%1/images/ukui-loginopt-smile.svg").arg(GET_STR(UKUI_BIOMETRIC)),"gray",48); +- m_labelFace->setStyleSheet(QString("border-radius: %1px; border:0px solid white;background-color: rgba(230,230,230,100%);").arg(77)); +- break; +- default: +- faceImage = loadSvg(QString("%1/images/ukui-loginopt-smile.svg").arg(GET_STR(UKUI_BIOMETRIC)),"black",48); +- m_labelFace->setStyleSheet(QString("border-radius: %1px; border:0px solid white;background-color: rgba(230,230,230,40%);").arg(77)); +- break; ++ switch (nStatus) { ++ case 1: ++ faceImage ++ = loadSvg(QString("%1/images/ukui-loginopt-lose.svg").arg(GET_STR(UKUI_BIOMETRIC)), "black", 48); ++ m_labelFace->setStyleSheet( ++ QString("border-radius: %1px; border:0px solid white;background-color: rgba(230,230,230,40%);") ++ .arg(77)); ++ break; ++ case 2: ++ faceImage ++ = loadSvg(QString("%1/images/ukui-loginopt-smile.svg").arg(GET_STR(UKUI_BIOMETRIC)), "gray", 48); ++ m_labelFace->setStyleSheet( ++ QString("border-radius: %1px; border:0px solid white;background-color: rgba(230,230,230,100%);") ++ .arg(77)); ++ break; ++ default: ++ faceImage ++ = loadSvg(QString("%1/images/ukui-loginopt-smile.svg").arg(GET_STR(UKUI_BIOMETRIC)), "black", 48); ++ m_labelFace->setStyleSheet( ++ QString("border-radius: %1px; border:0px solid white;background-color: rgba(230,230,230,40%);") ++ .arg(77)); ++ break; + } + } + +@@ -761,22 +737,19 @@ void LoginOptionsWidget::setFaceImg(QImage& imgFace, int nStatus) + + void LoginOptionsWidget::onStatusChanged(int drvid, const QString &message) + { +- if(!m_isInAuth || !m_curDevInfo) +- { ++ if (!m_isInAuth || !m_curDevInfo) { + return; + } +- if(drvid != m_curDevInfo->device_id) +- { ++ if (drvid != m_curDevInfo->device_id) { + return; + } +- //Q_EMIT updateAuthMsg(message); ++ // Q_EMIT updateAuthMsg(message); + } + + void LoginOptionsWidget::setCurrentDevice(int drvid) + { + DeviceInfoPtr pDeviceInfo = findDeviceById(drvid); +- if(pDeviceInfo) +- { ++ if (pDeviceInfo) { + setCurrentDevice(pDeviceInfo); + } + } +@@ -784,8 +757,7 @@ void LoginOptionsWidget::setCurrentDevice(int drvid) + void LoginOptionsWidget::setCurrentDevice(const QString &deviceName) + { + DeviceInfoPtr pDeviceInfo = findDeviceByName(deviceName); +- if(pDeviceInfo) +- { ++ if (pDeviceInfo) { + setCurrentDevice(pDeviceInfo); + } + } +@@ -797,15 +769,11 @@ void LoginOptionsWidget::setCurrentDevice(const DeviceInfoPtr &pDeviceInfo) + + DeviceInfoPtr LoginOptionsWidget::findDeviceById(int drvid) + { +- for(int type : m_mapDevices.keys()) +- { ++ for (int type : m_mapDevices.keys()) { + DeviceList &deviceList = m_mapDevices[type]; +- auto iter = std::find_if(deviceList.begin(), deviceList.end(), +- [&](DeviceInfoPtr ptr){ +- return ptr->device_id == drvid; +- }); +- if(iter != deviceList.end()) +- { ++ auto iter = std::find_if( ++ deviceList.begin(), deviceList.end(), [&](DeviceInfoPtr ptr) { return ptr->device_id == drvid; }); ++ if (iter != deviceList.end()) { + return *iter; + } + } +@@ -814,25 +782,21 @@ DeviceInfoPtr LoginOptionsWidget::findDeviceById(int drvid) + + DeviceInfoPtr LoginOptionsWidget::findDeviceByName(const QString &name) + { +- for(int type : m_mapDevices.keys()) +- { ++ for (int type : m_mapDevices.keys()) { + DeviceList &deviceList = m_mapDevices[type]; +- auto iter = std::find_if(deviceList.begin(), deviceList.end(), +- [&](DeviceInfoPtr ptr){ +- return ptr->device_shortname == name; +- }); +- if(iter != deviceList.end()) +- { ++ auto iter = std::find_if( ++ deviceList.begin(), deviceList.end(), [&](DeviceInfoPtr ptr) { return ptr->device_shortname == name; }); ++ if (iter != deviceList.end()) { + return *iter; + } + } + return DeviceInfoPtr(); + } + +-QString LoginOptionsWidget::GetDefaultDevice(uid_t uid,int bioType) ++QString LoginOptionsWidget::GetDefaultDevice(uid_t uid, int bioType) + { + QString defaultDeviceName = ""; +- DeviceInfoPtr pDeviceInfo = m_bioDevices->getDefaultDevice(uid,bioType); ++ DeviceInfoPtr pDeviceInfo = m_bioDevices->getDefaultDevice(uid, bioType); + if (pDeviceInfo) { + defaultDeviceName = pDeviceInfo->device_shortname; + } +@@ -855,19 +819,19 @@ QString LoginOptionsWidget::GetDefaultDevice(uid_t uid) + + void LoginOptionsWidget::onUSBDeviceCountChange(int newNum) + { +- qDebug()<<"deviceNewNum:"<<newNum; ++ qDebug() << "deviceNewNum:" << newNum; + int savedCount = 0; +- for(int type : m_mapDevices.keys()) ++ for (int type : m_mapDevices.keys()) + savedCount += m_mapDevices.value(type).count(); + + readDevicesInfo(); + + int count = 0; +- for(int type : m_mapDevices.keys()) ++ for (int type : m_mapDevices.keys()) + count += m_mapDevices.value(type).count(); +- +- //设备数量发生了变化 +- if(count != savedCount) { ++ ++ // 设备数量发生了变化 ++ if (count != savedCount) { + updateOptionButtons(); + Q_EMIT notifyOptionsChange(count); + } +@@ -876,40 +840,25 @@ void LoginOptionsWidget::onUSBDeviceCountChange(int newNum) + + void LoginOptionsWidget::updateUkeyUIStatus(int type) + { +- if (type == LOGINOPT_TYPE_FACE) { +- m_labelFace->setStyleSheet(QString("border-radius: %1px; border:0px solid white;background-color: rgba(255,255,255,10%);").arg(77)); +- m_labelFace->show(); +- m_labelQRCode->hide(); +- m_widgetImage->show(); +- } else if (type == LOGINOPT_TYPE_QRCODE) { +- m_labelQRCode->setStyleSheet(QString("border-radius: %1px; border:0px solid white;background-color: rgba(255,255,255,100%);").arg(6)); +- QImage img; +- setQRCode(img); +- m_labelQRCode->show(); +- m_labelFace->hide(); +- m_widgetImage->show(); +- } else { +- m_labelFace->hide(); +- m_labelQRCode->hide(); +- m_widgetImage->hide(); +- } ++ m_labelFace->hide(); ++ m_labelQRCode->hide(); ++ m_widgetImage->hide(); ++ setFixedHeight(m_labelOptTitle->height() + 12 + 36); + +- QTimer::singleShot(0,this,[&,this](){ +- Q_EMIT this->updateWndSize(this->m_curLoginOptType, this->m_mapOptBtns.size()); +- }); ++ Q_EMIT this->updateWndSize(this->m_curLoginOptType, this->m_mapOptBtns.size()); + } + +-void LoginOptionsWidget::updateUIStatus(bool update) ++void LoginOptionsWidget::updateUIStatus(bool update, int nPreOptType /* = -1*/) + { + if (m_mapOptBtns.contains(-1)) { +- QToolButton* btn = m_mapOptBtns[-1]; ++ QToolButton *btn = m_mapOptBtns[-1]; + if (btn && btn->isVisible()) { + btn->setChecked(true); + } + } + if (m_curDevInfo) { + if (m_mapOptBtns.contains(m_curDevInfo->device_id)) { +- QToolButton* btn = m_mapOptBtns[m_curDevInfo->device_id]; ++ QToolButton *btn = m_mapOptBtns[m_curDevInfo->device_id]; + if (btn) { + btn->setChecked(true); + } +@@ -917,27 +866,41 @@ void LoginOptionsWidget::updateUIStatus(bool update) + } + + if (update) { ++ if (nPreOptType != -1) { ++ m_curLoginOptType = nPreOptType; ++ } + if (m_curLoginOptType == LOGINOPT_TYPE_FACE) { +- m_labelFace->setStyleSheet(QString("border-radius: %1px; border:0px solid white;background-color: rgba(255,255,255,10%);").arg(77)); ++ m_labelFace->setStyleSheet( ++ QString("border-radius: %1px; border:0px solid white;background-color: rgba(255,255,255,10%);") ++ .arg(77)); + m_labelFace->show(); + m_labelQRCode->hide(); + m_widgetImage->show(); ++ setFixedHeight(m_labelOptTitle->height() + 12 + 36 + 12 + 154 + 48); + } else if (m_curLoginOptType == LOGINOPT_TYPE_QRCODE) { +- m_labelQRCode->setStyleSheet(QString("border-radius: %1px; border:0px solid white;background-color: rgba(255,255,255,100%);").arg(6)); ++ m_labelQRCode->setStyleSheet( ++ QString("border-radius: %1px; border:0px solid white;background-color: rgba(255,255,255,100%);") ++ .arg(6)); + QImage img; + setQRCode(img); + m_labelQRCode->show(); + m_labelFace->hide(); + m_widgetImage->show(); ++ setFixedHeight(m_labelOptTitle->height() + 12 + 36 + 12 + 154 + 48); + } else { + m_labelFace->hide(); + m_labelQRCode->hide(); +- m_widgetImage->hide(); ++ if (m_curLoginOptType == LOGINOPT_TYPE_FINGERPRINT || m_curLoginOptType == LOGINOPT_TYPE_FINGERVEIN ++ || m_curLoginOptType == LOGINOPT_TYPE_IRIS || m_curLoginOptType == LOGINOPT_TYPE_VOICEPRINT) { ++ m_widgetImage->show(); ++ setFixedHeight(m_labelOptTitle->height() + 12 + 36 + 12 + 154 + 48); ++ } else { ++ m_widgetImage->hide(); ++ setFixedHeight(m_labelOptTitle->height() + 12 + 36 + 24); ++ } + } +- } +- QTimer::singleShot(0,this,[&,this](){ + Q_EMIT this->updateWndSize(this->m_curLoginOptType, this->m_mapOptBtns.size()); +- }); ++ } + } + + void LoginOptionsWidget::onOptionSelected(int nIndex) +@@ -949,17 +912,17 @@ void LoginOptionsWidget::onOptionSelected(int nIndex) + if (info && !isDeviceDisable(info->device_id)) { + Q_EMIT optionSelected(convertDeviceType(info->biotype), info); + this->m_curLoginOptType = convertDeviceType(info->biotype); +- }else if(nIndex == 0 && m_listDriveId[nIndex] == -1){ ++ } else if (nIndex == 0 && m_listDriveId[nIndex] == -1) { + stopAuth(); + m_curDevInfo = nullptr; +- Q_EMIT optionSelected(LOGINOPT_TYPE_PASSWORD,nullptr); ++ Q_EMIT optionSelected(LOGINOPT_TYPE_PASSWORD, nullptr); + this->m_curLoginOptType = LOGINOPT_TYPE_PASSWORD; + +- }else if(m_listDriveId[nIndex] == -2){ +- //存在ukey特征,但未插入ukey ++ } else if (m_listDriveId[nIndex] == -2) { ++ // 存在ukey特征,但未插入ukey + stopAuth(); + m_curDevInfo = nullptr; +- Q_EMIT optionSelected(LOGINOPT_TYPE_GENERAL_UKEY,nullptr); ++ Q_EMIT optionSelected(LOGINOPT_TYPE_GENERAL_UKEY, nullptr); + this->m_curLoginOptType = LOGINOPT_TYPE_GENERAL_UKEY; + } + } +@@ -969,33 +932,33 @@ int LoginOptionsWidget::convertDeviceType(int nDevType) + { + int nLoginOptType = LOGINOPT_TYPE_OTHERS; + switch (nDevType) { +- case BIOTYPE_FINGERPRINT: +- nLoginOptType = LOGINOPT_TYPE_FINGERPRINT; +- break; +- case BIOTYPE_FINGERVEIN: +- nLoginOptType = LOGINOPT_TYPE_FINGERVEIN; +- break; +- case BIOTYPE_IRIS: +- nLoginOptType = LOGINOPT_TYPE_IRIS; +- break; +- case BIOTYPE_FACE: +- nLoginOptType = LOGINOPT_TYPE_FACE; +- break; +- case BIOTYPE_VOICEPRINT: +- nLoginOptType = LOGINOPT_TYPE_VOICEPRINT; +- break; +- case UniT_General_Ukey: +- nLoginOptType = LOGINOPT_TYPE_GENERAL_UKEY; +- break; +- case UniT_Advanced_Ukey: +- nLoginOptType = LOGINOPT_TYPE_ADVANCED_UKEY; +- break; +- case REMOTE_QRCODE_TYPE: +- nLoginOptType = LOGINOPT_TYPE_QRCODE; +- break; +- default: +- nLoginOptType = LOGINOPT_TYPE_OTHERS; +- break; ++ case BIOTYPE_FINGERPRINT: ++ nLoginOptType = LOGINOPT_TYPE_FINGERPRINT; ++ break; ++ case BIOTYPE_FINGERVEIN: ++ nLoginOptType = LOGINOPT_TYPE_FINGERVEIN; ++ break; ++ case BIOTYPE_IRIS: ++ nLoginOptType = LOGINOPT_TYPE_IRIS; ++ break; ++ case BIOTYPE_FACE: ++ nLoginOptType = LOGINOPT_TYPE_FACE; ++ break; ++ case BIOTYPE_VOICEPRINT: ++ nLoginOptType = LOGINOPT_TYPE_VOICEPRINT; ++ break; ++ case UniT_General_Ukey: ++ nLoginOptType = LOGINOPT_TYPE_GENERAL_UKEY; ++ break; ++ case UniT_Advanced_Ukey: ++ nLoginOptType = LOGINOPT_TYPE_ADVANCED_UKEY; ++ break; ++ case REMOTE_QRCODE_TYPE: ++ nLoginOptType = LOGINOPT_TYPE_QRCODE; ++ break; ++ default: ++ nLoginOptType = LOGINOPT_TYPE_OTHERS; ++ break; + } + return nLoginOptType; + } +@@ -1004,8 +967,8 @@ void LoginOptionsWidget::setDeviceDisable(int nDevId, bool bDisable) + { + if (bDisable) { + m_mapDisableDev[m_uid][nDevId] = true; +- QMap<int, QToolButton*>::iterator itMapBtn = m_mapOptBtns.begin(); +- for ( ; itMapBtn != m_mapOptBtns.end(); itMapBtn++) { ++ QMap<int, QToolButton *>::iterator itMapBtn = m_mapOptBtns.begin(); ++ for (; itMapBtn != m_mapOptBtns.end(); itMapBtn++) { + if (itMapBtn.key() == nDevId && itMapBtn.value()) { + itMapBtn.value()->setDisabled(true); + break; +@@ -1013,8 +976,8 @@ void LoginOptionsWidget::setDeviceDisable(int nDevId, bool bDisable) + } + } else { + m_mapDisableDev[m_uid][nDevId] = false; +- QMap<int, QToolButton*>::iterator itMapBtn = m_mapOptBtns.begin(); +- for ( ; itMapBtn != m_mapOptBtns.end(); itMapBtn++) { ++ QMap<int, QToolButton *>::iterator itMapBtn = m_mapOptBtns.begin(); ++ for (; itMapBtn != m_mapOptBtns.end(); itMapBtn++) { + if (itMapBtn.key() == nDevId && itMapBtn.value()) { + itMapBtn.value()->setDisabled(false); + break; +@@ -1023,6 +986,28 @@ void LoginOptionsWidget::setDeviceDisable(int nDevId, bool bDisable) + } + } + ++void LoginOptionsWidget::setAllDeviceDisable(bool bDisable) ++{ ++ if (bDisable) { ++ QMap<int, QToolButton *>::iterator itMapBtn = m_mapOptBtns.begin(); ++ for (; itMapBtn != m_mapOptBtns.end(); itMapBtn++) { ++ ++ m_mapDisableDev[m_uid][itMapBtn.key()] = true; ++ if (itMapBtn.value()) { ++ itMapBtn.value()->setDisabled(true); ++ } ++ } ++ } else { ++ QMap<int, QToolButton *>::iterator itMapBtn = m_mapOptBtns.begin(); ++ for (; itMapBtn != m_mapOptBtns.end(); itMapBtn++) { ++ m_mapDisableDev[m_uid][itMapBtn.key()] = false; ++ if (itMapBtn.value()) { ++ itMapBtn.value()->setDisabled(false); ++ } ++ } ++ } ++} ++ + bool LoginOptionsWidget::isDeviceDisable(int nDevId) + { + if (m_mapDisableDev[m_uid].contains(nDevId)) { +@@ -1033,7 +1018,7 @@ bool LoginOptionsWidget::isDeviceDisable(int nDevId) + + void LoginOptionsWidget::lockStatusChanged(bool locked) + { +- if(locked){ ++ if (locked) { + is_Lock = true; + stopAuth(); + } else { +@@ -1046,7 +1031,7 @@ QPixmap LoginOptionsWidget::loadSvg(QString path, QString color, int size) + { + int origSize = size; + const auto ratio = qApp->devicePixelRatio(); +- if ( 2 == ratio) { ++ if (2 == ratio) { + size += origSize; + } else if (3 == ratio) { + size += origSize; +@@ -1071,22 +1056,22 @@ QPixmap LoginOptionsWidget::drawSymbolicColoredPixmap(QPixmap &source, QString c + for (int y = 0; y < img.height(); y++) { + auto color = img.pixelColor(x, y); + if (color.alpha() > 0) { +- if ( "white" == cgColor) { ++ if ("white" == cgColor) { + color.setRed(255); + color.setGreen(255); + color.setBlue(255); + img.setPixelColor(x, y, color); +- } else if( "black" == cgColor) { ++ } else if ("black" == cgColor) { + color.setRed(0); + color.setGreen(0); + color.setBlue(0); + img.setPixelColor(x, y, color); +- } else if ("gray"== cgColor) { ++ } else if ("gray" == cgColor) { + color.setRed(152); + color.setGreen(163); + color.setBlue(164); + img.setPixelColor(x, y, color); +- } else if ("blue" == cgColor){ ++ } else if ("blue" == cgColor) { + color.setRed(61); + color.setGreen(107); + color.setBlue(229); +@@ -1099,3 +1084,160 @@ QPixmap LoginOptionsWidget::drawSymbolicColoredPixmap(QPixmap &source, QString c + } + return QPixmap::fromImage(img); + } ++ ++QPixmap LoginOptionsWidget::scaledSmoothPixmap(const QPixmap &src, int nWidth, int nHeight) ++{ ++ if (src.isNull()) { ++ return QPixmap(); ++ } ++ ++ QPixmap pixmapa(src); ++ QPixmap pixmap(nWidth, nHeight); ++ pixmap.fill(Qt::transparent); ++ QPainter painter(&pixmap); ++ painter.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform); ++ painter.drawPixmap(0, 0, nWidth, nHeight, pixmapa); ++ return pixmap; ++} ++ ++void LoginOptionsWidget::startBioWaiting(unsigned uCurLoginOptType) ++{ ++ if (uCurLoginOptType == m_nCurBioWaitingType ++ || (uCurLoginOptType != LOGINOPT_TYPE_FINGERPRINT && uCurLoginOptType != LOGINOPT_TYPE_FINGERVEIN ++ && uCurLoginOptType != LOGINOPT_TYPE_IRIS && uCurLoginOptType != LOGINOPT_TYPE_VOICEPRINT)) { ++ return; ++ } ++ m_nCurBioWaitingType = uCurLoginOptType; ++ if (!m_timerBioWaiting) { ++ m_timerBioWaiting = new QTimer(this); ++ m_timerBioWaiting->setInterval(100); ++ } ++ if (m_timerBioWaiting) { ++ if (m_timerBioWaiting->isActive()) { ++ m_timerBioWaiting->stop(); ++ } ++ // 重新连接信号槽 ++ disconnect(m_timerBioWaiting, nullptr, this, nullptr); ++ connect(m_timerBioWaiting, &QTimer::timeout, this, [&, this, uCurLoginOptType]() { ++ m_nBioWaitingFrame += 1; ++ QString strPicName = ""; ++ switch (uCurLoginOptType) { ++ case LOGINOPT_TYPE_FINGERPRINT: { ++ if (m_nBioWaitingFrame >= 15) { ++ m_nBioWaitingFrame = 0; ++ } ++ strPicName = QString(":/image/assets/biowaiting/fingerprint%1.svg").arg(m_nBioWaitingFrame); ++ } break; ++ case LOGINOPT_TYPE_FINGERVEIN: { ++ if (m_nBioWaitingFrame >= 12) { ++ m_nBioWaitingFrame = 0; ++ } ++ strPicName = QString(":/image/assets/biowaiting/fingervein%1.svg").arg(m_nBioWaitingFrame); ++ } break; ++ case LOGINOPT_TYPE_IRIS: { ++ if (m_nBioWaitingFrame >= 12) { ++ m_nBioWaitingFrame = 0; ++ } ++ strPicName = QString(":/image/assets/biowaiting/iris%1.svg").arg(m_nBioWaitingFrame); ++ } break; ++ case LOGINOPT_TYPE_VOICEPRINT: { ++ if (m_nBioWaitingFrame >= 8) { ++ m_nBioWaitingFrame = 0; ++ } ++ strPicName = QString(":/image/assets/biowaiting/voiceprint%1.svg").arg(m_nBioWaitingFrame); ++ } break; ++ default: ++ break; ++ } ++ if (!strPicName.isEmpty()) { ++ QPixmap pixmap; ++ if (QPixmapCache::find(strPicName, &pixmap)) { ++ m_labelBioWaiting->setPixmap(pixmap); ++ } else { ++ pixmap = scaledSmoothPixmap(QPixmap(strPicName), 154, 154); ++ if (!pixmap.isNull()) { ++ QPixmapCache::insert(strPicName, pixmap); ++ m_labelBioWaiting->setPixmap(pixmap); ++ } ++ } ++ m_labelBioWaiting->show(); ++ } ++ }); ++ m_timerBioWaiting->start(); ++ m_nBioWaitingFrame = 0; ++ QString strPicName = ""; ++ switch (uCurLoginOptType) { ++ case LOGINOPT_TYPE_FINGERPRINT: { ++ strPicName = QString(":/image/assets/biowaiting/fingerprint%1.svg").arg(m_nBioWaitingFrame); ++ } break; ++ case LOGINOPT_TYPE_FINGERVEIN: { ++ strPicName = QString(":/image/assets/biowaiting/fingervein%1.svg").arg(m_nBioWaitingFrame); ++ } break; ++ case LOGINOPT_TYPE_IRIS: { ++ strPicName = QString(":/image/assets/biowaiting/iris%1.svg").arg(m_nBioWaitingFrame); ++ } break; ++ case LOGINOPT_TYPE_VOICEPRINT: { ++ strPicName = QString(":/image/assets/biowaiting/voiceprint%1.svg").arg(m_nBioWaitingFrame); ++ } break; ++ default: ++ break; ++ } ++ if (!strPicName.isEmpty()) { ++ QPixmap pixmap; ++ if (QPixmapCache::find(strPicName, &pixmap)) { ++ m_labelBioWaiting->setPixmap(pixmap); ++ } else { ++ pixmap = scaledSmoothPixmap(QPixmap(strPicName), 154, 154); ++ if (!pixmap.isNull()) { ++ QPixmapCache::insert(strPicName, pixmap); ++ m_labelBioWaiting->setPixmap(pixmap); ++ } ++ } ++ m_labelBioWaiting->show(); ++ } ++ } ++} ++ ++void LoginOptionsWidget::stopBioWaiting(bool isDisable /* = false*/) ++{ ++ if (m_timerBioWaiting) { ++ if (m_timerBioWaiting->isActive()) { ++ m_timerBioWaiting->stop(); ++ } ++ } ++ m_nBioWaitingFrame = 0; ++ if (isDisable) { ++ QString strPicName = ""; ++ switch (m_nCurBioWaitingType) { ++ case LOGINOPT_TYPE_FINGERPRINT: { ++ strPicName = QString(":/image/assets/biowaiting/fingerprint%1.svg").arg(m_nBioWaitingFrame); ++ } break; ++ case LOGINOPT_TYPE_FINGERVEIN: { ++ strPicName = QString(":/image/assets/biowaiting/fingervein%1.svg").arg(m_nBioWaitingFrame); ++ } break; ++ case LOGINOPT_TYPE_IRIS: { ++ strPicName = QString(":/image/assets/biowaiting/iris%1.svg").arg(m_nBioWaitingFrame); ++ } break; ++ case LOGINOPT_TYPE_VOICEPRINT: { ++ strPicName = QString(":/image/assets/biowaiting/voiceprint%1.svg").arg(m_nBioWaitingFrame); ++ } break; ++ default: ++ break; ++ } ++ if (!strPicName.isEmpty()) { ++ QPixmap pixmap; ++ if (QPixmapCache::find(strPicName, &pixmap)) { ++ m_labelBioWaiting->setPixmap(pixmap); ++ } else { ++ pixmap = scaledSmoothPixmap(QPixmap(strPicName), 154, 154); ++ if (!pixmap.isNull()) { ++ QPixmapCache::insert(strPicName, pixmap); ++ m_labelBioWaiting->setPixmap(pixmap); ++ } ++ } ++ } ++ } else { ++ m_labelBioWaiting->hide(); ++ } ++ m_nCurBioWaitingType = -1; ++} +diff --git a/pam-biometric/data/org.freedesktop.plicykit.pkexec.bioctl-helper.policy.in b/pam-biometric/data/org.freedesktop.plicykit.pkexec.bioctl-helper.policy.in +index e5601cc..415e7cc 100644 +--- a/pam-biometric/data/org.freedesktop.plicykit.pkexec.bioctl-helper.policy.in ++++ b/pam-biometric/data/org.freedesktop.plicykit.pkexec.bioctl-helper.policy.in +@@ -10,13 +10,17 @@ + <description xml:lang="bo">འཁོར་སྐྱོད་སྐྱེ་དངོས་ཀྱི་ངོས་འཛིན་ཁས་ལེན་ཚོད་འཛིན་ཡོ་བྱད།།</description> + <description xml:lang="mn">ᠠᠵᠢᠯᠯᠠᠭᠠᠨ ᠤ ᠠᠮᠢᠳᠤ ᠪᠣᠳᠠᠰ ᠢ ᠢᠯᠭᠠᠨ ᠲᠠᠨᠢᠵᠤ ᠭᠡᠷᠡᠴᠢᠯᠡᠬᠦ ᠡᠵᠡᠮᠳᠡᠯ ᠦᠨ ᠪᠠᠭᠠᠵᠢ ᠶᠢ ᠢᠯᠭᠠᠨ ᠲᠠᠨᠢᠬᠤ ᠬᠡᠷᠡᠭᠲᠡᠶ ᠃</description> + <description xml:lang="zh_HK">運行生物識別認證控制工具</description> +- <description xml:lang="uy">بىئولوگىيەلىك پەرقلەندۈرۈش ئىسپاتلاش كونترول قىلىش قورالى</description> ++ <description xml:lang="ug">بىئولوگىيەلىك پەرقلەندۈرۈش ئىسپاتلاش كونترول قىلىش قورالى</description> ++ <description xml:lang="kk">بىئولوگىيەلىك پارىقتاندىرۋ سپاتتاۋ مەڭگەرۋ ەتۋ قۇرالى</description> ++ <description xml:lang="ky">بىئولوگىيەلىك ايىرمالاندىرىش ىسپاتتوو تىزگىندۅۅ جاسوو ،اتقارۇۇ قۇرالى</description> + <message>Authentication is required to enable or disable biometric authentication</message> + <message xml:lang="zh_CN">开启或关闭生物识别认证需要进行身份验证</message> + <message xml:lang="bo">སྒོ་རྒྱག་པའམ་ཡང་ན་སྒོ་རྒྱག་པའི་སྐྱེ་དངོས་ངོས་འཛིན་བདེན་དཔངར་སྤྲོད་བྱེད་པར་ཐོབ་ཐང་གི་ཚོད་ལྟསར་སྤྲོད་བྱ་དགོས།</message> + <message xml:lang="mn">ᠠᠮᠢᠳᠤ ᠪᠣᠳᠠᠰ ᠢ ᠢᠯᠭᠠᠨ ᠲᠠᠨᠢᠬᠤ ᠭᠡᠷᠡᠴᠢᠯᠡᠭᠡ ᠶᠢ ᠨᠡᠭᠡᠭᠡᠬᠦ ᠪᠤᠶᠤ ᠬᠠᠭᠠᠬᠤ ᠳᠤ ᠪᠡᠶᠡ ᠶᠢᠨ ᠭᠠᠷᠤᠯ ᠤᠨ ᠭᠡᠷᠡᠴᠢᠯᠡᠯ ᠬᠢᠬᠦ ᠴᠢᠬᠤᠯᠠ ᠲᠠᠶ ᠪᠠᠶᠢᠨᠠ᠃</message> + <message xml:lang="zh_HK">開啟或關閉生物識別認證需要進行身份驗證</message> +- <message xml:lang="uy">بىئولوگىيەلىك پەرقلەندۈرۈش ئىسپاتىنى ئېچىش ياكى تاقاش ئۈچۈن دەلىللەش كېرەك</message> ++ <message xml:lang="ug">بىئولوگىيەلىك پەرقلەندۈرۈش ئىسپاتىنى ئېچىش ياكى تاقاش ئۈچۈن دەلىللەش كېرەك</message> ++ <message xml:lang="kk">بىئولوگىيەلىك پارىقتاندىرۋ سىپاتىن ٸشٸۋ ياكي تاقاۋ ٷشٸن دالەلدەۋ كەرەك</message> ++ <message xml:lang="ky">بىئولوگىيەلىك ايىرمالاندىرىش دالىلىن اچۇۇ كۅرۉنۉشتۅرۉ بەكىتىش ۉچۉن دالىلدۅ كەرەك</message> + <icon_name>stock_person</icon_name> + <defaults> + <allow_any>no</allow_any> +diff --git a/pam-biometric/data/org.freedesktop.plicykit.pkexec.biodrvctl.policy.in b/pam-biometric/data/org.freedesktop.plicykit.pkexec.biodrvctl.policy.in +index 3efa12e..476cb88 100644 +--- a/pam-biometric/data/org.freedesktop.plicykit.pkexec.biodrvctl.policy.in ++++ b/pam-biometric/data/org.freedesktop.plicykit.pkexec.biodrvctl.policy.in +@@ -10,13 +10,17 @@ + <description xml:lang="bo">སྐྱ་དངོས་དབྱེ་འབྱེད་སྒྲག་ཆས་ཀྱི་ཁ་ལོ་བའི་ཚོད་འཛིན་ཡོ་བྱད་</description> + <description xml:lang="mn">ᠠᠮᠢᠳᠤ ᠪᠣᠳᠠᠰ ᠢ ᠢᠯᠭᠠᠨ ᠲᠠᠨᠢᠬᠤ ᠲᠥᠬᠥᠭᠡᠷᠦᠮᠵᠢ ᠪᠡᠷ ᠬᠥᠳᠡᠯᠭᠡᠭᠦᠷ ᠪᠣᠯᠭᠠᠬᠤ ᠡᠵᠡᠮᠳᠡᠯ ᠦᠨ ᠪᠠᠭᠠᠵᠢ ᠶᠢ ᠠᠵᠢᠯᠯᠠᠭᠤᠯᠤᠨᠠ ᠃</description> + <description xml:lang="zh_HK">運行生物識別設備驅動控制工具</description> +- <description xml:lang="uy">بىئولوگىيەلىك پەرقلەندۈرۈش ئۈسكۈنىسىنى قوزغىتىش كونترول قىلىش ئەسۋابىنى يۈرگۈزۈش</description> ++ <description xml:lang="ug">بىئولوگىيەلىك پەرقلەندۈرۈش ئۈسكۈنىسىنى قوزغىتىش كونترول قىلىش ئەسۋابىنى يۈرگۈزۈش</description> ++ <description xml:lang="kk">شايمانىن جۉرگۅزۉ</description> ++ <description xml:lang="ky">شايمانىن جۉرگۅزۉ</description> + <message>Authentication is required to change the status of biometric device's driver</message> + <message xml:lang="zh_CN">改变生物识别设备驱动状态需要进行身份验证</message> + <message xml:lang="bo">སྐྱ་དངོས་དབྱེ་འབྱེད་སྒྲག་ཆས་ཀྱི་ཁ་ལོ་བའི་གནས་ཚུལ་ལ་འགྱུར་ལྡོག་གཏོང་བར་བདེན་དཔང་ར་སྤྲད་བྱ་དགོས།</message> + <message xml:lang="mn">ᠠᠮᠢᠳᠤ ᠪᠣᠳᠠᠰ ᠢ ᠢᠯᠭᠠᠨ ᠲᠠᠨᠢᠬᠤ ᠲᠥᠬᠥᠭᠡᠷᠦᠮᠵᠢ ᠶᠢᠨ ᠬᠥᠳᠡᠯᠭᠡᠭᠦᠷ ᠪᠣᠯᠭᠠᠬᠤ ᠪᠠᠶᠢᠳᠠᠯ ᠢ ᠬᠤᠪᠢᠷᠠᠭᠤᠯᠬᠤ ᠳᠤ ᠪᠡᠶᠡ ᠶᠢᠨ ᠭᠠᠷᠤᠯ ᠤᠨ ᠭᠡᠷᠡᠴᠢᠯᠡᠯ ᠬᠢᠬᠦ ᠴᠢᠬᠤᠯᠠ ᠲᠠᠶ ᠪᠠᠶᠢᠬᠤ ᠬᠡᠷᠡᠭᠲᠡᠶ᠃</message> + <message xml:lang="zh_HK">改變生物識別設備驅動狀態需要進行身份驗證</message> +- <message xml:lang="uy">بىئولوگىيەلىك پەرقلەندۈرۈش ئۈسكۈنىسىنىڭ قوزغىتىش ھالىتىنى ئۆزگەرتىشتە دەلىللەش كېرەك</message> ++ <message xml:lang="ug">بىئولوگىيەلىك پەرقلەندۈرۈش ئۈسكۈنىسىنىڭ قوزغىتىش ھالىتىنى ئۆزگەرتىشتە دەلىللەش كېرەك</message> ++ <message xml:lang="kk">بىئولوگىيەلىك پارىقتاندىرۋ اسپابىنىڭ قوزعالتۋ كۇيىن وزگەتۋگە دالەلدەۋ كەرەك</message> ++ <message xml:lang="ky">بىئولوگىيەلىك ايىرمالاندىرىش شايمانىنىن قوزعوتۇۇ ابالىن ۅزگۅرتۉۉدۅ دالىلدۅ كەرەك</message> + <icon_name>stock_person</icon_name> + <defaults> + <allow_any>auth_admin</allow_any> +diff --git a/pam-biometric/data/org.freedesktop.plicykit.pkexec.biorestart.policy.in b/pam-biometric/data/org.freedesktop.plicykit.pkexec.biorestart.policy.in +index f77a55f..a5f82f3 100644 +--- a/pam-biometric/data/org.freedesktop.plicykit.pkexec.biorestart.policy.in ++++ b/pam-biometric/data/org.freedesktop.plicykit.pkexec.biorestart.policy.in +@@ -11,12 +11,16 @@ + <description xml:lang="mn">ᠠᠮᠢᠳᠤ ᠪᠣᠳᠠᠰ ᠤᠨ ᠣᠨᠴᠠᠯᠢᠭ ᠤᠨ ᠦᠢᠯᠡᠴᠢᠯᠡᠭᠡ ᠶᠢ ᠳᠠᠬᠢᠨ ᠡᠭᠢᠯᠡᠭᠦᠯᠪᠡ᠃</description> + <message>Authentication is required to restart biometric service</message> + <description xml:lang="zh_HK">重啟生物特徵服務</description> +- <description xml:lang="uy">بىئولوگىيەلىك ئالاھىدىلىك مۇلازىمىتىنى قايتىدىن قوزغىتىش</description> ++ <description xml:lang="ug">بىئولوگىيەلىك ئالاھىدىلىك مۇلازىمىتىنى قايتىدىن قوزغىتىش</description> ++ <description xml:lang="kk">بىئولوگىيەلىك ەرەكشەلىك قىزىمەتتى قايتادان قوزعالتۋ</description> ++ <description xml:lang="ky">بىئولوگىيەلىك ۅزگۅچۅلۉك مۇلازىمەتىردى قايتادان قوزعوتۇۇ</description> + <message xml:lang="zh_CN">重启生物特征服务需要身份验证</message> + <message xml:lang="bo">སྐྱ་དངོས་དབྱེ་འབྱེད་ཞབས་ཞུ་སླར་གསོ་བྱེད་པར་བདེན་དཔང་ར་སྤྲད་བྱ་དགོས།</message> + <message xml:lang="mn">ᠠᠮᠢᠳᠤ ᠪᠣᠳᠠᠰ ᠤᠨ ᠣᠨᠴᠠᠯᠢᠭ ᠰᠢᠨᠵᠢ ᠲᠡᠮᠳᠡᠭ ᠦᠨ ᠦᠢᠯᠡᠴᠢᠯᠡᠭᠡ ᠶᠢ ᠳᠠᠬᠢᠨ ᠰᠡᠩᠬᠡᠷᠡᠭᠦᠯᠬᠦ ᠳᠦ ᠪᠡᠶᠡ ᠶᠢᠨ ᠭᠠᠷᠤᠯ ᠢ ᠰᠢᠯᠭᠠᠨ ᠭᠡᠷᠡᠴᠢᠯᠡᠬᠦ ᠴᠢᠬᠤᠯᠠ ᠲᠠᠶ ᠪᠠᠶᠢᠨᠠ ᠃</message> +- <message xml:lang="uy">بىئولوگىيەلىك ئالاھىدىلىك مۇلازىمىتىنى قايتىدىن قوزغىتىش ئۈچۈن دەلىللەش كېرەك </message> ++ <message xml:lang="ug">بىئولوگىيەلىك ئالاھىدىلىك مۇلازىمىتىنى قايتىدىن قوزغىتىش ئۈچۈن دەلىللەش كېرەك </message> + <message xml:lang="zh_HK">重啟生物特徵服務需要身份驗證</message> ++ <message xml:lang="kk">بىئولوگىيەلىك ەرەكشەلىك قىزىمەتتى قايتادان قوزعالتۋ ٷشٸن دالەلدەۋ كەرەك بىئولوگىيەلىك پارىقتاندىرۋ اسبابٸن قوزعالتۋ مەڭگەرۋ ەتۋ اسپاپتى جۇرگىزۋ</message> ++ <message xml:lang="ky">بىئولوگىيەلىك ۅزگۅچۅلۉك مۇلازىمەتىردى قايتادان قوزعوتۇۇ ۉچۉن دالىلدۅ كەرەك بىئولوگىيەلىك ايىرمالاندىرىش جابدۇۇسۇن قوزعوتۇۇ تىزگىندۅۅ جاسوو ،اتقارۇۇ</message> + <icon_name>stock_person</icon_name> + <defaults> + <allow_any>auth_admin</allow_any> +diff --git a/polkit-agent/CMakeLists.txt b/polkit-agent/CMakeLists.txt +index cb8e3e9..2f97cad 100644 +--- a/polkit-agent/CMakeLists.txt ++++ b/polkit-agent/CMakeLists.txt +@@ -3,7 +3,8 @@ project(ukui-polkit-agent) + + pkg_check_modules(QGS REQUIRED gsettings-qt) + pkg_check_modules(KDKINFO REQUIRED kysdk-sysinfo) +-pkg_check_modules(KYSDKWAYLANDHELPER_PKG REQUIRED kysdk-waylandhelper) ++pkg_check_modules(KDKWIDGETS REQUIRED kysdk-qtwidgets) ++pkg_check_modules(KYSDKWAYLANDHELPER REQUIRED kysdk-waylandhelper) + + find_package(PolkitQt5-1 REQUIRED 0.103.0) + find_package(Qt5 COMPONENTS Core Widgets DBus X11Extras Xml Network Svg) +@@ -23,16 +24,22 @@ configure_file( + include_directories( + ${QGS_INCLUDE_DIRS} + ${KDKINFO_INCLUDE_DIRS} ++ ${KDKWIDGETS_INCLUDE_DIRS} ++ ${KYSDKWAYLANDHELPER_INCLUDE_DIRS} + ) + + link_directories( + ${KDKINFO_LIBRARY_DIRS} ++ ${KDKWIDGETS_LIBRARY_DIRS} ++ ${KYSDKWAYLANDHELPER_LIBRARY_DIRS} + ) + + set(EXTRA_LIBS + ${EXTRA_LIBS} + ${QGS_LIBRARIES} + ${KDKINFO_LIBRARIES} ++ ${KDKWIDGETS_LIBRARIES} ++ ${KYSDKWAYLANDHELPER_LIBRARIES} + ) + + include_directories( +@@ -58,17 +65,20 @@ set(polkit_SRCS + src/modeButton.cpp + src/kalabel.cpp + ../common/generic.cpp ++ src/fullscreenbackground.h ++ src/fullscreenbackground.cpp ++ src/usdblockshortcut.h ++ src/usdblockshortcut.cpp + ) + + add_executable(polkit-ukui-authentication-agent-1 ${polkit_SRCS}) +-target_include_directories(polkit-ukui-authentication-agent-1 PRIVATE ${KYSDKWAYLANDHELPER_PKG_INCLUDE_DIRS}) +-target_link_directories(polkit-ukui-authentication-agent-1 PRIVATE ${KYSDKWAYLANDHELPER_PKG_LIBRARY_DIRS}) ++target_include_directories(polkit-ukui-authentication-agent-1 PRIVATE ${KYSDKQTWIDGETS_PKG_INCLUDE_DIRS}) ++target_link_directories(polkit-ukui-authentication-agent-1 PRIVATE ${KYSDKQTWIDGETS_PKG_LIBRARY_DIRS}) + target_link_libraries(polkit-ukui-authentication-agent-1 +- Qt5::Core Qt5::Widgets Qt5::DBus ${EXTRA_LIBS} ++ Qt5::Core Qt5::Widgets Qt5::DBus ${EXTRA_LIBS} KF5::WindowSystem + ${POLKITQT-1_LIBRARIES} +- ${KYSDKWAYLANDHELPER_PKG_LIBRARIES} ++ ${KYSDKQTWIDGETS_PKG_LIBRARIES} + BioAuthWidgets +- KF5::WindowSystem + -lrt + -lukui-log4qt + ) +diff --git a/polkit-agent/assets.qrc b/polkit-agent/assets.qrc +index 6fc96aa..2581d94 100644 +--- a/polkit-agent/assets.qrc ++++ b/polkit-agent/assets.qrc +@@ -4,6 +4,53 @@ + <file>assets/arrow_right.svg</file> + <file>assets/hide-password.png</file> + <file>assets/show-password.png</file> ++ <file>assets/biowaiting/fingerprint0.svg</file> ++ <file>assets/biowaiting/fingerprint1.svg</file> ++ <file>assets/biowaiting/fingerprint2.svg</file> ++ <file>assets/biowaiting/fingerprint3.svg</file> ++ <file>assets/biowaiting/fingerprint4.svg</file> ++ <file>assets/biowaiting/fingerprint5.svg</file> ++ <file>assets/biowaiting/fingerprint6.svg</file> ++ <file>assets/biowaiting/fingerprint7.svg</file> ++ <file>assets/biowaiting/fingerprint8.svg</file> ++ <file>assets/biowaiting/fingerprint9.svg</file> ++ <file>assets/biowaiting/fingerprint10.svg</file> ++ <file>assets/biowaiting/fingerprint11.svg</file> ++ <file>assets/biowaiting/fingerprint12.svg</file> ++ <file>assets/biowaiting/fingerprint13.svg</file> ++ <file>assets/biowaiting/fingerprint14.svg</file> ++ <file>assets/biowaiting/fingervein0.svg</file> ++ <file>assets/biowaiting/fingervein1.svg</file> ++ <file>assets/biowaiting/fingervein2.svg</file> ++ <file>assets/biowaiting/fingervein3.svg</file> ++ <file>assets/biowaiting/fingervein4.svg</file> ++ <file>assets/biowaiting/fingervein5.svg</file> ++ <file>assets/biowaiting/fingervein6.svg</file> ++ <file>assets/biowaiting/fingervein7.svg</file> ++ <file>assets/biowaiting/fingervein8.svg</file> ++ <file>assets/biowaiting/fingervein9.svg</file> ++ <file>assets/biowaiting/fingervein10.svg</file> ++ <file>assets/biowaiting/fingervein11.svg</file> ++ <file>assets/biowaiting/iris0.svg</file> ++ <file>assets/biowaiting/iris1.svg</file> ++ <file>assets/biowaiting/iris2.svg</file> ++ <file>assets/biowaiting/iris3.svg</file> ++ <file>assets/biowaiting/iris4.svg</file> ++ <file>assets/biowaiting/iris5.svg</file> ++ <file>assets/biowaiting/iris6.svg</file> ++ <file>assets/biowaiting/iris7.svg</file> ++ <file>assets/biowaiting/iris8.svg</file> ++ <file>assets/biowaiting/iris9.svg</file> ++ <file>assets/biowaiting/iris10.svg</file> ++ <file>assets/biowaiting/iris11.svg</file> ++ <file>assets/biowaiting/voiceprint0.svg</file> ++ <file>assets/biowaiting/voiceprint1.svg</file> ++ <file>assets/biowaiting/voiceprint2.svg</file> ++ <file>assets/biowaiting/voiceprint3.svg</file> ++ <file>assets/biowaiting/voiceprint4.svg</file> ++ <file>assets/biowaiting/voiceprint5.svg</file> ++ <file>assets/biowaiting/voiceprint6.svg</file> ++ <file>assets/biowaiting/voiceprint7.svg</file> + </qresource> + <qresource prefix="/qss"> + <file>src/main.qss</file> +diff --git a/polkit-agent/assets/biowaiting/fingerprint0.svg b/polkit-agent/assets/biowaiting/fingerprint0.svg +new file mode 100644 +index 0000000..a5e84bd +--- /dev/null ++++ b/polkit-agent/assets/biowaiting/fingerprint0.svg +@@ -0,0 +1 @@ ++<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 160 160"><defs><style>.cls-1{opacity:0.2;}</style></defs><g id="文字标注"><g class="cls-1"><path d="M76.78191,140.809a3.00926,3.00926,0,0,0-4.06694,1.87157l-4.22311,10.29593a2.95177,2.95177,0,0,0,2.34693,4.2097c1.87618,0,2.81427-.62348,3.44061-2.02792q2.35321-4.96514,4.2252-10.13749a3.22339,3.22339,0,0,0-1.72269-4.21179Zm71.02958-38.52241a3.08449,3.08449,0,0,0-3.44119-2.96447,3.01947,3.01947,0,0,0-2.81653,3.276c.15559,5.14854-.15616,10.13768-.31232,15.286,0,2.33947,1.09425,3.58775,2.971,3.74391,1.87844,0,3.28728-1.24829,3.28728-3.58851,0-3.43141.46791-7.01916.31175-10.29517a31.74592,31.74592,0,0,0,0-5.46008ZM42.99058,121.93748a3.19813,3.19813,0,0,0-3.91137,2.18407c-.3125.7804-.4679,1.71618-.7825,2.49562a101.97516,101.97516,0,0,1-5.00713,12.01c-1.09424,2.34022.1554,4.67969,2.66077,4.67969,1.40828.15616,2.34636-.77963,2.97271-2.02772a81.29759,81.29759,0,0,0,6.09985-15.4437,3.0299,3.0299,0,0,0-2.03233-3.898Zm51.78525-7.17321a3.13259,3.13259,0,0,0-3.44346,2.80735,161.02757,161.02757,0,0,1-4.84945,22.9279c-1.25193,4.36718-2.81636,8.73532-4.38079,13.10328a2.97748,2.97748,0,0,0,1.25192,3.898,3.04925,3.04925,0,0,0,3.75521-.3125,5.627,5.627,0,0,0,1.25041-2.33946,128.60479,128.60479,0,0,0,4.85173-14.97123,161.52838,161.52838,0,0,0,4.37926-21.68171,3.2645,3.2645,0,0,0-2.81483-3.43159ZM11.07466,60.17791a3.31205,3.31205,0,0,0-2.19078-4.36738c-1.72059-.46865-3.285.62329-3.91137,2.49561A79.568,79.568,0,0,0,2,80.45155a66.61318,66.61318,0,0,0,.31174,7.6432A76.2778,76.2778,0,0,0,5.91136,104.626,2.67954,2.67954,0,0,0,8.57,106.6545c2.661.15558,3.91289-1.87233,3.13095-4.68045a70.50526,70.50526,0,0,1-.62633-41.79842ZM85.701,104.15584a75.8642,75.8642,0,0,0-.4679-9.98362,114.4834,114.4834,0,0,0-2.19078-14.6595,3.09174,3.09174,0,0,0-3.59962-2.49581,3.03668,3.03668,0,0,0-2.34617,3.90025,116.66849,116.66849,0,0,1,2.34617,18.24725,106.72189,106.72189,0,0,1-2.97252,31.50478c-.46789,2.02773.31174,3.74391,2.03443,4.2118,1.87694.4679,3.44137-.62405,4.06772-2.80812a109.18033,109.18033,0,0,0,3.12867-27.917Zm32.854-36.96258a3.10567,3.10567,0,0,0-3.91136-2.02773,2.97022,2.97022,0,0,0-2.03235,3.90006c2.50253,9.35957,3.44041,19.02707,4.067,28.85281a155.42236,155.42236,0,0,1-5.0079,47.25852c-.46789,2.02792.31232,3.90025,2.03519,4.2118a3.12981,3.12981,0,0,0,4.067-2.65178,158.74287,158.74287,0,0,0,5.31944-41.48688,159.06625,159.06625,0,0,0-2.03234-26.98258,60.29831,60.29831,0,0,0-2.5046-11.07422ZM15.61237,48.32272A67.883,67.883,0,0,1,27.18744,31.633C41.11155,16.81945,58.16452,9.0199,78.66305,8.39586c2.34712,0,3.75521-1.24828,3.75521-3.276C82.416,3.09194,81.00789,2,78.5046,2A77.9438,77.9438,0,0,0,10.13447,45.04442a5.77164,5.77164,0,0,0-.62406,2.18407,2.72436,2.72436,0,0,0,1.56425,2.80736c1.72077.93654,3.59676.31231,4.53771-1.71543ZM58.79086,85.753c-1.25059-7.48553-.31175-14.19161,4.85155-20.11959a2.805,2.805,0,0,0,.62425-1.40368c.15616-1.55983-.15635-2.80812-1.7206-3.43216a2.98066,2.98066,0,0,0-3.91136.93635c-5.63137,6.55146-7.66581,14.19542-6.41388,22.77308a143.77173,143.77173,0,0,1,1.87675,19.65112,84.88938,84.88938,0,0,1-1.87675,19.18379,87.66557,87.66557,0,0,1-7.822,21.36711,4.07667,4.07667,0,0,0-.7827,2.652,2.99418,2.99418,0,0,0,2.34693,2.652c1.72079.31173,2.815-.31251,3.75521-1.87234a90.13491,90.13491,0,0,0,9.69891-29.79089A108.40093,108.40093,0,0,0,58.79315,85.753ZM22.338,94.48834c-1.09423-7.01916-2.03233-13.88368-1.09423-21.05461A59.14015,59.14015,0,0,1,46.11944,31.47686a3.29673,3.29673,0,0,0,1.56444-3.90024c-.78269-2.18389-2.97348-2.65176-5.16425-1.24735A60.84871,60.84871,0,0,0,29.37822,38.49678a64.523,64.523,0,0,0-14.7068,39.7707c-.31174,7.6434,1.72287,15.12892,2.19077,22.61463.31251,4.99219.46791,9.98419-1.09424,14.97429-.4679,1.55983-.93809,3.27525-1.40827,4.52334a3.12377,3.12377,0,0,0,3.12886,3.43008c1.87693,0,2.65868-1.09195,3.285-2.652,3.285-8.57766,2.81711-17.6232,1.56442-26.66951ZM157.0425,67.03786Q147.65477,20.2483,102.12991,5.276A45.00768,45.00768,0,0,0,91.80237,3.09194c-1.87828-.15615-3.12867.78039-3.28426,2.4958a2.87607,2.87607,0,0,0,2.50252,3.58833c.62406.15558,1.2504.15558,1.72059.31175A70.72962,70.72962,0,0,1,133.1047,31.94476a69.18254,69.18254,0,0,1,13.9241,22.61539,74.061,74.061,0,0,1,4.69407,23.23944c.15538,2.33946,1.87825,3.7439,4.06674,3.11986,1.56444-.4679,2.34713-1.71618,2.19077-4.212a41.34713,41.34713,0,0,0-.93788-9.6696ZM115.74016,40.83473a46.09788,46.09788,0,0,0-10.16908-7.17379,3.002,3.002,0,0,0-4.22521,1.09194c-.93885,1.55983-.46866,3.276,1.25193,4.368a3.91752,3.91752,0,0,0,1.09424.62422c10.4837,6.3936,17.83548,15.283,21.27894,27.13666,3.12887,11.38806,3.9108,23.08329,4.22309,34.7806a167.16816,167.16816,0,0,1-2.34692,33.06462c-.31174,2.34023.624,3.7439,2.50251,4.0564,2.03521.31175,3.44347-.78039,3.755-3.11985a162.60561,162.60561,0,0,0,2.34712-27.91913,217.74083,217.74083,0,0,0-2.65869-34.62312c-2.03461-12.79173-7.51041-23.55117-17.053-32.2865ZM89.76794,53.62646a28.15742,28.15742,0,0,0-18.92915-.15615c-2.66077.78037-3.44346,3.58546-1.72059,5.30163,1.24984,1.24809,2.50253,1.09195,3.91061.62406a21.7273,21.7273,0,0,1,28.47246,16.8428,163.57907,163.57907,0,0,1,2.34693,17.31375A137.996,137.996,0,0,1,103.692,118.974a149.65135,149.65135,0,0,1-7.04022,31.97477c-.1554.62405-.4679,1.092-.31155,1.71618a3.009,3.009,0,0,0,2.81483,2.65177,3.073,3.073,0,0,0,3.4427-2.34022,143.91448,143.91448,0,0,0,8.13447-46.946,167.06448,167.06448,0,0,0-2.65867-29.6353c-2.03462-11.07347-7.97831-18.87149-18.30566-22.77079ZM46.431,72.65334C50.03005,55.02805,68.64821,42.7065,86.48292,46.294a35.29014,35.29014,0,0,1,20.18241,11.85368,8.8989,8.8989,0,0,0,1.72,1.71617,3.19219,3.19219,0,0,0,3.755-.93579c1.09424-1.40444.93885-2.80812-.31155-4.5243-7.19867-8.733-16.42891-13.87928-27.84841-14.81508-14.55046-1.2481-26.59781,3.90025-35.82653,15.283A38.57467,38.57467,0,0,0,39.861,85.4407c.7804,5.30373,1.72077,10.45208,1.72077,15.75372,0,3.74391,0,7.488-.31174,11.07347a3.00588,3.00588,0,0,0,2.81408,3.276,3.03818,3.03818,0,0,0,3.44346-2.652,100.85173,100.85173,0,0,0-.15616-20.58748c-.47018-4.21179-1.87827-8.26743-1.56443-12.16769a39.31,39.31,0,0,1,.62406-7.48342Zm97.78146,20.43132a3.18855,3.18855,0,0,0,2.97269-3.43217V88.56056c-.62425-5.92722-1.2506-11.8531-2.19077-17.77879-2.03235-13.10195-7.19563-24.64312-16.1126-34.31273C115.89557,21.96341,99.46894,14.78945,79.91136,14.63329a64.57052,64.57052,0,0,0-25.3436,5.14835,3.233,3.233,0,0,0-2.03462,4.20951,3.15932,3.15932,0,0,0,4.38154,1.56A60.10933,60.10933,0,0,1,85.54483,21.183a57.79887,57.79887,0,0,1,35.04479,15.91007c10.32431,9.82517,16.268,21.835,18.30566,36.02812q1.16919,8.42465,1.876,16.84377c.46789,1.87157,1.72058,3.11966,3.44119,3.11966ZM71.15054,82.94489a11.40154,11.40154,0,0,1,0-5.614,9.11075,9.11075,0,0,1,9.70119-6.55146c4.22292.15558,7.66638,3.2762,8.60218,7.9559a150.63857,150.63857,0,0,1,2.661,26.51468,3.1253,3.1253,0,0,0,3.12887,3.43236c1.879,0,2.97252-1.40367,3.12867-3.276V102.5981h.15635c-.3125-4.05545-.4679-8.11185-.93581-12.16521-.47018-4.05565-1.09653-8.11206-1.72287-12.16541a15.95817,15.95817,0,0,0-17.67931-13.726c-8.13448.93654-14.7068,9.04763-13.45393,17.002.62406,4.83584,1.40809,9.6696,1.876,14.50563a100.76525,100.76525,0,0,1-4.69311,39.77A111.03411,111.03411,0,0,1,55.976,149.85661a3.05946,3.05946,0,0,0,.15616,3.43236,2.84779,2.84779,0,0,0,2.97251,1.24752,3.58665,3.58665,0,0,0,2.815-2.33946C72.715,130.2034,75.21748,107.1224,71.15054,82.94717ZM34.38592,91.52482c-.7825-5.30393-1.565-10.76381-1.09634-16.06545A45.82532,45.82532,0,0,1,49.87465,44.26631a45.38948,45.38948,0,0,1,28.16-10.76171,44.31355,44.31355,0,0,1,12.82985,1.24828,3.86115,3.86115,0,0,0,1.87676.15616,2.85951,2.85951,0,0,0,2.50252-2.80814,3.03932,3.03932,0,0,0-2.34694-3.276,45.9556,45.9556,0,0,0-13.14161-1.55984,34.7057,34.7057,0,0,0-9.6989.93577c-15.801,2.96429-27.84821,11.54421-36.14113,25.42352a50.63513,50.63513,0,0,0-6.56928,32.59653C27.81379,90.589,28.754,94.80084,29.06571,99.169c.62406,10.75944-.78174,21.20867-5.63119,30.87827a3.03324,3.03324,0,0,0-.47019,2.02771,2.85292,2.85292,0,0,0,2.65868,2.652,3.38105,3.38105,0,0,0,3.4427-2.02772c6.57-12.9458,7.51023-26.98125,5.32021-41.17439Zm0,0"/></g></g></svg> +\ No newline at end of file +diff --git a/polkit-agent/assets/biowaiting/fingerprint1.svg b/polkit-agent/assets/biowaiting/fingerprint1.svg +new file mode 100644 +index 0000000..0856372 +--- /dev/null ++++ b/polkit-agent/assets/biowaiting/fingerprint1.svg +@@ -0,0 +1 @@ ++<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 160 160"><defs><style>.cls-1{opacity:0.2;}.cls-2{fill:#3790fa;}</style></defs><g id="文字标注"><g class="cls-1"><path d="M76.78191,140.809a3.00926,3.00926,0,0,0-4.06694,1.87157l-4.22311,10.29593a2.95177,2.95177,0,0,0,2.34693,4.2097c1.87618,0,2.81427-.62348,3.44061-2.02792q2.35321-4.96514,4.2252-10.13749a3.22339,3.22339,0,0,0-1.72269-4.21179Zm71.02958-38.52241a3.08449,3.08449,0,0,0-3.44119-2.96447,3.01947,3.01947,0,0,0-2.81653,3.276c.15559,5.14854-.15616,10.13768-.31232,15.286,0,2.33947,1.09425,3.58775,2.971,3.74391,1.87844,0,3.28728-1.24829,3.28728-3.58851,0-3.43141.46791-7.01916.31175-10.29517a31.74592,31.74592,0,0,0,0-5.46008ZM42.99058,121.93748a3.19813,3.19813,0,0,0-3.91137,2.18407c-.3125.7804-.4679,1.71618-.7825,2.49562a101.97516,101.97516,0,0,1-5.00713,12.01c-1.09424,2.34022.1554,4.67969,2.66077,4.67969,1.40828.15616,2.34636-.77963,2.97271-2.02772a81.29759,81.29759,0,0,0,6.09985-15.4437,3.0299,3.0299,0,0,0-2.03233-3.898Zm51.78525-7.17321a3.13259,3.13259,0,0,0-3.44346,2.80735,161.02757,161.02757,0,0,1-4.84945,22.9279c-1.25193,4.36718-2.81636,8.73532-4.38079,13.10328a2.97748,2.97748,0,0,0,1.25192,3.898,3.04925,3.04925,0,0,0,3.75521-.3125,5.627,5.627,0,0,0,1.25041-2.33946,128.60479,128.60479,0,0,0,4.85173-14.97123,161.52838,161.52838,0,0,0,4.37926-21.68171,3.2645,3.2645,0,0,0-2.81483-3.43159ZM11.07466,60.17791a3.31205,3.31205,0,0,0-2.19078-4.36738c-1.72059-.46865-3.285.62329-3.91137,2.49561A79.568,79.568,0,0,0,2,80.45155a66.61318,66.61318,0,0,0,.31174,7.6432A76.2778,76.2778,0,0,0,5.91136,104.626,2.67954,2.67954,0,0,0,8.57,106.6545c2.661.15558,3.91289-1.87233,3.13095-4.68045a70.50526,70.50526,0,0,1-.62633-41.79842ZM85.701,104.15584a75.8642,75.8642,0,0,0-.4679-9.98362,114.4834,114.4834,0,0,0-2.19078-14.6595,3.09174,3.09174,0,0,0-3.59962-2.49581,3.03668,3.03668,0,0,0-2.34617,3.90025,116.66849,116.66849,0,0,1,2.34617,18.24725,106.72189,106.72189,0,0,1-2.97252,31.50478c-.46789,2.02773.31174,3.74391,2.03443,4.2118,1.87694.4679,3.44137-.62405,4.06772-2.80812a109.18033,109.18033,0,0,0,3.12867-27.917Zm32.854-36.96258a3.10567,3.10567,0,0,0-3.91136-2.02773,2.97022,2.97022,0,0,0-2.03235,3.90006c2.50253,9.35957,3.44041,19.02707,4.067,28.85281a155.42236,155.42236,0,0,1-5.0079,47.25852c-.46789,2.02792.31232,3.90025,2.03519,4.2118a3.12981,3.12981,0,0,0,4.067-2.65178,158.74287,158.74287,0,0,0,5.31944-41.48688,159.06625,159.06625,0,0,0-2.03234-26.98258,60.29831,60.29831,0,0,0-2.5046-11.07422ZM15.61237,48.32272A67.883,67.883,0,0,1,27.18744,31.633C41.11155,16.81945,58.16452,9.0199,78.66305,8.39586c2.34712,0,3.75521-1.24828,3.75521-3.276C82.416,3.09194,81.00789,2,78.5046,2A77.9438,77.9438,0,0,0,10.13447,45.04442a5.77164,5.77164,0,0,0-.62406,2.18407,2.72436,2.72436,0,0,0,1.56425,2.80736c1.72077.93654,3.59676.31231,4.53771-1.71543ZM58.79086,85.753c-1.25059-7.48553-.31175-14.19161,4.85155-20.11959a2.805,2.805,0,0,0,.62425-1.40368c.15616-1.55983-.15635-2.80812-1.7206-3.43216a2.98066,2.98066,0,0,0-3.91136.93635c-5.63137,6.55146-7.66581,14.19542-6.41388,22.77308a143.77173,143.77173,0,0,1,1.87675,19.65112,84.88938,84.88938,0,0,1-1.87675,19.18379,87.66557,87.66557,0,0,1-7.822,21.36711,4.07667,4.07667,0,0,0-.7827,2.652,2.99418,2.99418,0,0,0,2.34693,2.652c1.72079.31173,2.815-.31251,3.75521-1.87234a90.13491,90.13491,0,0,0,9.69891-29.79089A108.40093,108.40093,0,0,0,58.79315,85.753ZM22.338,94.48834c-1.09423-7.01916-2.03233-13.88368-1.09423-21.05461A59.14015,59.14015,0,0,1,46.11944,31.47686a3.29673,3.29673,0,0,0,1.56444-3.90024c-.78269-2.18389-2.97348-2.65176-5.16425-1.24735A60.84871,60.84871,0,0,0,29.37822,38.49678a64.523,64.523,0,0,0-14.7068,39.7707c-.31174,7.6434,1.72287,15.12892,2.19077,22.61463.31251,4.99219.46791,9.98419-1.09424,14.97429-.4679,1.55983-.93809,3.27525-1.40827,4.52334a3.12377,3.12377,0,0,0,3.12886,3.43008c1.87693,0,2.65868-1.09195,3.285-2.652,3.285-8.57766,2.81711-17.6232,1.56442-26.66951ZM157.0425,67.03786Q147.65477,20.2483,102.12991,5.276A45.00768,45.00768,0,0,0,91.80237,3.09194c-1.87828-.15615-3.12867.78039-3.28426,2.4958a2.87607,2.87607,0,0,0,2.50252,3.58833c.62406.15558,1.2504.15558,1.72059.31175A70.72962,70.72962,0,0,1,133.1047,31.94476a69.18254,69.18254,0,0,1,13.9241,22.61539,74.061,74.061,0,0,1,4.69407,23.23944c.15538,2.33946,1.87825,3.7439,4.06674,3.11986,1.56444-.4679,2.34713-1.71618,2.19077-4.212a41.34713,41.34713,0,0,0-.93788-9.6696ZM115.74016,40.83473a46.09788,46.09788,0,0,0-10.16908-7.17379,3.002,3.002,0,0,0-4.22521,1.09194c-.93885,1.55983-.46866,3.276,1.25193,4.368a3.91752,3.91752,0,0,0,1.09424.62422c10.4837,6.3936,17.83548,15.283,21.27894,27.13666,3.12887,11.38806,3.9108,23.08329,4.22309,34.7806a167.16816,167.16816,0,0,1-2.34692,33.06462c-.31174,2.34023.624,3.7439,2.50251,4.0564,2.03521.31175,3.44347-.78039,3.755-3.11985a162.60561,162.60561,0,0,0,2.34712-27.91913,217.74083,217.74083,0,0,0-2.65869-34.62312c-2.03461-12.79173-7.51041-23.55117-17.053-32.2865ZM89.76794,53.62646a28.15742,28.15742,0,0,0-18.92915-.15615c-2.66077.78037-3.44346,3.58546-1.72059,5.30163,1.24984,1.24809,2.50253,1.09195,3.91061.62406a21.7273,21.7273,0,0,1,28.47246,16.8428,163.57907,163.57907,0,0,1,2.34693,17.31375A137.996,137.996,0,0,1,103.692,118.974a149.65135,149.65135,0,0,1-7.04022,31.97477c-.1554.62405-.4679,1.092-.31155,1.71618a3.009,3.009,0,0,0,2.81483,2.65177,3.073,3.073,0,0,0,3.4427-2.34022,143.91448,143.91448,0,0,0,8.13447-46.946,167.06448,167.06448,0,0,0-2.65867-29.6353c-2.03462-11.07347-7.97831-18.87149-18.30566-22.77079ZM46.431,72.65334C50.03005,55.02805,68.64821,42.7065,86.48292,46.294a35.29014,35.29014,0,0,1,20.18241,11.85368,8.8989,8.8989,0,0,0,1.72,1.71617,3.19219,3.19219,0,0,0,3.755-.93579c1.09424-1.40444.93885-2.80812-.31155-4.5243-7.19867-8.733-16.42891-13.87928-27.84841-14.81508-14.55046-1.2481-26.59781,3.90025-35.82653,15.283A38.57467,38.57467,0,0,0,39.861,85.4407c.7804,5.30373,1.72077,10.45208,1.72077,15.75372,0,3.74391,0,7.488-.31174,11.07347a3.00588,3.00588,0,0,0,2.81408,3.276,3.03818,3.03818,0,0,0,3.44346-2.652,100.85173,100.85173,0,0,0-.15616-20.58748c-.47018-4.21179-1.87827-8.26743-1.56443-12.16769a39.31,39.31,0,0,1,.62406-7.48342Zm97.78146,20.43132a3.18855,3.18855,0,0,0,2.97269-3.43217V88.56056c-.62425-5.92722-1.2506-11.8531-2.19077-17.77879-2.03235-13.10195-7.19563-24.64312-16.1126-34.31273C115.89557,21.96341,99.46894,14.78945,79.91136,14.63329a64.57052,64.57052,0,0,0-25.3436,5.14835,3.233,3.233,0,0,0-2.03462,4.20951,3.15932,3.15932,0,0,0,4.38154,1.56A60.10933,60.10933,0,0,1,85.54483,21.183a57.79887,57.79887,0,0,1,35.04479,15.91007c10.32431,9.82517,16.268,21.835,18.30566,36.02812q1.16919,8.42465,1.876,16.84377c.46789,1.87157,1.72058,3.11966,3.44119,3.11966ZM71.15054,82.94489a11.40154,11.40154,0,0,1,0-5.614,9.11075,9.11075,0,0,1,9.70119-6.55146c4.22292.15558,7.66638,3.2762,8.60218,7.9559a150.63857,150.63857,0,0,1,2.661,26.51468,3.1253,3.1253,0,0,0,3.12887,3.43236c1.879,0,2.97252-1.40367,3.12867-3.276V102.5981h.15635c-.3125-4.05545-.4679-8.11185-.93581-12.16521-.47018-4.05565-1.09653-8.11206-1.72287-12.16541a15.95817,15.95817,0,0,0-17.67931-13.726c-8.13448.93654-14.7068,9.04763-13.45393,17.002.62406,4.83584,1.40809,9.6696,1.876,14.50563a100.76525,100.76525,0,0,1-4.69311,39.77A111.03411,111.03411,0,0,1,55.976,149.85661a3.05946,3.05946,0,0,0,.15616,3.43236,2.84779,2.84779,0,0,0,2.97251,1.24752,3.58665,3.58665,0,0,0,2.815-2.33946C72.715,130.2034,75.21748,107.1224,71.15054,82.94717ZM34.38592,91.52482c-.7825-5.30393-1.565-10.76381-1.09634-16.06545A45.82532,45.82532,0,0,1,49.87465,44.26631a45.38948,45.38948,0,0,1,28.16-10.76171,44.31355,44.31355,0,0,1,12.82985,1.24828,3.86115,3.86115,0,0,0,1.87676.15616,2.85951,2.85951,0,0,0,2.50252-2.80814,3.03932,3.03932,0,0,0-2.34694-3.276,45.9556,45.9556,0,0,0-13.14161-1.55984,34.7057,34.7057,0,0,0-9.6989.93577c-15.801,2.96429-27.84821,11.54421-36.14113,25.42352a50.63513,50.63513,0,0,0-6.56928,32.59653C27.81379,90.589,28.754,94.80084,29.06571,99.169c.62406,10.75944-.78174,21.20867-5.63119,30.87827a3.03324,3.03324,0,0,0-.47019,2.02771,2.85292,2.85292,0,0,0,2.65868,2.652,3.38105,3.38105,0,0,0,3.4427-2.02772c6.57-12.9458,7.51023-26.98125,5.32021-41.17439Zm0,0"/></g><path class="cls-2" d="M91.80237,3.09192c-1.8783-.15613-3.12866.78039-3.28424,2.49579A2.876,2.876,0,0,0,91.02063,9.176c.62408.15564,1.25043.15564,1.72058.31176A76.03029,76.03029,0,0,1,102.56085,12h15.351a96.77876,96.77876,0,0,0-15.782-6.724A45.00584,45.00584,0,0,0,91.80237,3.09192Z"/><path class="cls-2" d="M41.63989,12H57.42126A75.41744,75.41744,0,0,1,78.663,8.39581c2.34717,0,3.75525-1.24823,3.75525-3.276C82.416,3.09192,81.00787,2,78.50458,2a77.85348,77.85348,0,0,0-36.29651,9.67188C42.01575,11.77832,41.83093,11.89227,41.63989,12Z"/></g></svg> +\ No newline at end of file +diff --git a/polkit-agent/assets/biowaiting/fingerprint10.svg b/polkit-agent/assets/biowaiting/fingerprint10.svg +new file mode 100644 +index 0000000..315aaf0 +--- /dev/null ++++ b/polkit-agent/assets/biowaiting/fingerprint10.svg +@@ -0,0 +1 @@ ++<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 160 160"><defs><style>.cls-1{opacity:0.2;}.cls-2{fill:#3790fa;}</style></defs><g id="文字标注"><g class="cls-1"><path d="M76.78191,140.809a3.00927,3.00927,0,0,0-4.06695,1.87157l-4.2231,10.29593a2.95177,2.95177,0,0,0,2.34692,4.2097c1.87618,0,2.81427-.62348,3.44061-2.02792q2.35322-4.96514,4.2252-10.13749a3.22338,3.22338,0,0,0-1.72268-4.21179Zm71.02957-38.52241a3.08449,3.08449,0,0,0-3.44119-2.96447,3.01947,3.01947,0,0,0-2.81653,3.276c.15559,5.14854-.15616,10.13768-.31232,15.286,0,2.33947,1.09425,3.58775,2.971,3.74391,1.87844,0,3.28729-1.24829,3.28729-3.58851,0-3.43141.4679-7.01916.31174-10.29517a31.74592,31.74592,0,0,0,0-5.46008ZM42.99057,121.93748a3.19812,3.19812,0,0,0-3.91136,2.18407c-.31251.7804-.4679,1.71618-.7825,2.49562a101.9769,101.9769,0,0,1-5.00714,12.01c-1.09424,2.34022.1554,4.67969,2.66078,4.67969,1.40827.15616,2.34636-.77963,2.9727-2.02772a81.29627,81.29627,0,0,0,6.09985-15.4437,3.02989,3.02989,0,0,0-2.03233-3.898Zm51.78526-7.17321a3.1326,3.1326,0,0,0-3.44347,2.80735,161.02757,161.02757,0,0,1-4.84945,22.9279c-1.25192,4.36718-2.81636,8.73532-4.38079,13.10328a2.97748,2.97748,0,0,0,1.25192,3.898,3.04925,3.04925,0,0,0,3.75521-.3125,5.62684,5.62684,0,0,0,1.25041-2.33946,128.60675,128.60675,0,0,0,4.85174-14.97123,161.5315,161.5315,0,0,0,4.37926-21.68171,3.2645,3.2645,0,0,0-2.81483-3.43159ZM11.07465,60.17791a3.312,3.312,0,0,0-2.19078-4.36738c-1.72059-.46865-3.285.62329-3.91137,2.49561A79.568,79.568,0,0,0,2,80.45155a66.61318,66.61318,0,0,0,.31174,7.6432A76.2778,76.2778,0,0,0,5.91135,104.626,2.67954,2.67954,0,0,0,8.57,106.6545c2.661.15558,3.91289-1.87233,3.131-4.68045a70.50518,70.50518,0,0,1-.62634-41.79842ZM85.701,104.15584a75.86247,75.86247,0,0,0-.4679-9.98362,114.4834,114.4834,0,0,0-2.19078-14.6595,3.09173,3.09173,0,0,0-3.59961-2.49581,3.03667,3.03667,0,0,0-2.34618,3.90025,116.66849,116.66849,0,0,1,2.34618,18.24725,106.72223,106.72223,0,0,1-2.97253,31.50478c-.46789,2.02773.31175,3.74391,2.03443,4.2118,1.87694.4679,3.44137-.62405,4.06772-2.80812a109.17988,109.17988,0,0,0,3.12867-27.917Zm32.854-36.96258a3.10567,3.10567,0,0,0-3.91136-2.02773,2.97022,2.97022,0,0,0-2.03235,3.90006c2.50253,9.35957,3.44042,19.02707,4.067,28.85281a155.422,155.422,0,0,1-5.0079,47.25852c-.46789,2.02792.31232,3.90025,2.0352,4.2118a3.1298,3.1298,0,0,0,4.06695-2.65178,158.74245,158.74245,0,0,0,5.31944-41.48688,159.06625,159.06625,0,0,0-2.03234-26.98258,60.29831,60.29831,0,0,0-2.5046-11.07422ZM15.61236,48.32272A67.88326,67.88326,0,0,1,27.18743,31.633C41.11154,16.81945,58.16451,9.0199,78.663,8.39586c2.34712,0,3.75521-1.24828,3.75521-3.276C82.416,3.09194,81.00788,2,78.50459,2A77.9438,77.9438,0,0,0,10.13446,45.04442a5.77164,5.77164,0,0,0-.62406,2.18407,2.72437,2.72437,0,0,0,1.56425,2.80736c1.72077.93654,3.59676.31231,4.53771-1.71543ZM58.79085,85.753c-1.25058-7.48553-.31174-14.19161,4.85155-20.11959a2.80489,2.80489,0,0,0,.62425-1.40368c.15616-1.55983-.15634-2.80812-1.72059-3.43216a2.98066,2.98066,0,0,0-3.91136.93635c-5.63138,6.55146-7.66581,14.19542-6.41389,22.77308a143.77173,143.77173,0,0,1,1.87675,19.65112,84.8888,84.8888,0,0,1-1.87675,19.18379,87.66557,87.66557,0,0,1-7.822,21.36711,4.07666,4.07666,0,0,0-.78269,2.652,2.99416,2.99416,0,0,0,2.34693,2.652c1.72078.31173,2.815-.31251,3.75521-1.87234a90.1349,90.1349,0,0,0,9.6989-29.79089A108.40061,108.40061,0,0,0,58.79314,85.753ZM22.338,94.48834c-1.09424-7.01916-2.03234-13.88368-1.09424-21.05461A59.14015,59.14015,0,0,1,46.11943,31.47686a3.29673,3.29673,0,0,0,1.56444-3.90024c-.78269-2.18389-2.97347-2.65176-5.16425-1.24735A60.84871,60.84871,0,0,0,29.37821,38.49678a64.52309,64.52309,0,0,0-14.7068,39.7707c-.31174,7.6434,1.72288,15.12892,2.19078,22.61463.3125,4.99219.4679,9.98419-1.09425,14.97429-.4679,1.55983-.93809,3.27525-1.40827,4.52334a3.12377,3.12377,0,0,0,3.12886,3.43008c1.87694,0,2.65868-1.09195,3.285-2.652,3.285-8.57766,2.81712-17.6232,1.56443-26.66951ZM157.04249,67.03786Q147.65476,20.2483,102.1299,5.276A45.00768,45.00768,0,0,0,91.80236,3.09194c-1.87827-.15615-3.12867.78039-3.28426,2.4958a2.87607,2.87607,0,0,0,2.50252,3.58833c.62406.15558,1.25041.15558,1.72059.31175a70.72962,70.72962,0,0,1,40.36348,22.45694A69.18273,69.18273,0,0,1,147.0288,54.56015a74.061,74.061,0,0,1,4.69406,23.23944c.15538,2.33946,1.87825,3.7439,4.06675,3.11986,1.56443-.4679,2.34712-1.71618,2.19076-4.212a41.34713,41.34713,0,0,0-.93788-9.6696ZM115.74016,40.83473a46.09794,46.09794,0,0,0-10.16909-7.17379,3.002,3.002,0,0,0-4.22521,1.09194c-.93885,1.55983-.46866,3.276,1.25194,4.368a3.91739,3.91739,0,0,0,1.09424.62422c10.48369,6.3936,17.83547,15.283,21.27894,27.13666,3.12886,11.38806,3.91079,23.08329,4.22309,34.7806a167.16817,167.16817,0,0,1-2.34693,33.06462c-.31174,2.34023.62405,3.7439,2.50252,4.0564,2.0352.31175,3.44347-.78039,3.755-3.11985a162.60561,162.60561,0,0,0,2.34712-27.91913,217.742,217.742,0,0,0-2.65868-34.62312c-2.03462-12.79173-7.51042-23.55117-17.053-32.2865ZM89.76793,53.62646a28.15742,28.15742,0,0,0-18.92915-.15615c-2.66076.78037-3.44345,3.58546-1.72059,5.30163C70.368,60.02,71.62072,59.86389,73.0288,59.396a21.72731,21.72731,0,0,1,28.47247,16.8428,163.579,163.579,0,0,1,2.34692,17.31375A137.99692,137.99692,0,0,1,103.692,118.974a149.65137,149.65137,0,0,1-7.04023,31.97477c-.1554.62405-.4679,1.092-.31155,1.71618a3.009,3.009,0,0,0,2.81483,2.65177,3.073,3.073,0,0,0,3.44271-2.34022,143.91473,143.91473,0,0,0,8.13446-46.946,167.06542,167.06542,0,0,0-2.65866-29.6353c-2.03463-11.07347-7.97832-18.87149-18.30567-22.77079ZM46.431,72.65334C50.03,55.02805,68.6482,42.7065,86.48291,46.294a35.29014,35.29014,0,0,1,20.18241,11.85368,8.8989,8.8989,0,0,0,1.72,1.71617,3.19219,3.19219,0,0,0,3.755-.93579c1.09424-1.40444.93885-2.80812-.31155-4.5243-7.19867-8.733-16.42891-13.87928-27.84841-14.81508-14.55045-1.2481-26.59781,3.90025-35.82653,15.283A38.57474,38.57474,0,0,0,39.861,85.4407c.7804,5.30373,1.72078,10.45208,1.72078,15.75372,0,3.74391,0,7.488-.31175,11.07347a3.00588,3.00588,0,0,0,2.81408,3.276,3.03818,3.03818,0,0,0,3.44346-2.652,100.85173,100.85173,0,0,0-.15616-20.58748c-.47018-4.21179-1.87827-8.26743-1.56443-12.16769a39.31083,39.31083,0,0,1,.62406-7.48342Zm97.78146,20.43132a3.18855,3.18855,0,0,0,2.97269-3.43217V88.56056c-.62425-5.92722-1.2506-11.8531-2.19077-17.77879-2.03234-13.10195-7.19563-24.64312-16.1126-34.31273C115.89556,21.96341,99.46893,14.78945,79.91135,14.63329a64.57055,64.57055,0,0,0-25.3436,5.14835,3.23306,3.23306,0,0,0-2.03462,4.20951,3.15933,3.15933,0,0,0,4.38155,1.56A60.10931,60.10931,0,0,1,85.54483,21.183a57.79887,57.79887,0,0,1,35.04478,15.91007c10.32431,9.82517,16.268,21.835,18.30566,36.02812q1.16919,8.42465,1.876,16.84377c.46789,1.87157,1.72058,3.11966,3.44119,3.11966ZM71.15053,82.94489a11.40154,11.40154,0,0,1,0-5.614,9.11075,9.11075,0,0,1,9.70119-6.55146c4.22292.15558,7.66638,3.2762,8.60218,7.9559a150.63952,150.63952,0,0,1,2.661,26.51468,3.1253,3.1253,0,0,0,3.12886,3.43236c1.879,0,2.97252-1.40367,3.12867-3.276V102.5981h.15635c-.3125-4.05545-.4679-8.11185-.9358-12.16521-.47019-4.05565-1.09654-8.11206-1.72288-12.16541a15.95817,15.95817,0,0,0-17.67931-13.726c-8.13447.93654-14.7068,9.04763-13.45392,17.002.624,4.83584,1.40808,9.6696,1.876,14.50563a100.76542,100.76542,0,0,1-4.6931,39.77,111.03563,111.03563,0,0,1-5.9437,14.03754,3.0595,3.0595,0,0,0,.15616,3.43236,2.8478,2.8478,0,0,0,2.97252,1.24752,3.58665,3.58665,0,0,0,2.815-2.33946C72.715,130.2034,75.21748,107.1224,71.15053,82.94717ZM34.38591,91.52482c-.7825-5.30393-1.565-10.76381-1.09634-16.06545A45.82536,45.82536,0,0,1,49.87464,44.26631a45.38952,45.38952,0,0,1,28.16-10.76171,44.31362,44.31362,0,0,1,12.82986,1.24828,3.86111,3.86111,0,0,0,1.87675.15616,2.85951,2.85951,0,0,0,2.50252-2.80814,3.03932,3.03932,0,0,0-2.34694-3.276,45.95556,45.95556,0,0,0-13.14161-1.55984,34.70559,34.70559,0,0,0-9.69889.93577C54.25524,31.16513,42.20807,39.74505,33.91516,53.62436a50.635,50.635,0,0,0-6.56928,32.59653c.4679,4.36814,1.40808,8.57995,1.71983,12.94809.62405,10.75944-.78175,21.20867-5.6312,30.87827a3.03318,3.03318,0,0,0-.47018,2.02771,2.8529,2.8529,0,0,0,2.65867,2.652,3.38107,3.38107,0,0,0,3.44271-2.02772c6.57-12.9458,7.51022-26.98125,5.3202-41.17439Zm0,0"/></g><path class="cls-2" d="M33.93249,119a74.46006,74.46006,0,0,0,.45343-27.4751c-.78253-5.304-1.565-10.76391-1.09638-16.06543A45.82521,45.82521,0,0,1,49.87463,44.26636a45.3888,45.3888,0,0,1,28.16-10.76172,44.30565,44.30565,0,0,1,12.82983,1.24829,3.86367,3.86367,0,0,0,1.87677.156,2.85936,2.85936,0,0,0,2.50251-2.80811A3.0391,3.0391,0,0,0,92.89678,28.825a45.94687,45.94687,0,0,0-13.1416-1.55981,34.707,34.707,0,0,0-9.69891.93554C54.25524,31.165,42.20806,39.74512,33.91515,53.62427A50.63525,50.63525,0,0,0,27.34588,86.221c.46789,4.36792,1.40808,8.57983,1.71985,12.948A66.87594,66.87594,0,0,1,27.47662,119Z"/><path class="cls-2" d="M46.431,72.65332C50.03,55.02808,68.64819,42.70654,86.4829,46.294a35.29073,35.29073,0,0,1,20.18244,11.85376,8.89448,8.89448,0,0,0,1.72,1.71606,3.1923,3.1923,0,0,0,3.75506-.93555c1.09424-1.40454.93885-2.80835-.31158-4.52441-7.19867-8.73316-16.4289-13.8794-27.84839-14.81519-14.55048-1.248-26.59784,3.90039-35.82654,15.283A38.57484,38.57484,0,0,0,39.861,85.44067c.7804,5.30371,1.72077,10.45215,1.72077,15.75367,0,3.74389,0,7.488-.31171,11.07348a3.006,3.006,0,0,0,2.814,3.27613,3.03829,3.03829,0,0,0,3.44348-2.6521,100.85037,100.85037,0,0,0-.15613-20.58741c-.47021-4.21167-1.87829-8.26733-1.56445-12.16772A39.31056,39.31056,0,0,1,46.431,72.65332Z"/><path class="cls-2" d="M58.79314,85.75293h-.00232c-1.25054-7.48535-.3117-14.19141,4.85157-20.11963a2.80362,2.80362,0,0,0,.62426-1.40356c.15613-1.55982-.15637-2.80811-1.72058-3.43213a2.98078,2.98078,0,0,0-3.91137.93628c-5.63141,6.55151-7.66584,14.19531-6.41388,22.77319a143.776,143.776,0,0,1,1.87677,19.65112A94.35,94.35,0,0,1,53.06023,119h6.25434c.03076-.218.07361-.43164.10266-.65039A108.40174,108.40174,0,0,0,58.79314,85.75293Z"/><path class="cls-2" d="M78.50457,2A77.94379,77.94379,0,0,0,10.13445,45.04443a5.77193,5.77193,0,0,0-.624,2.18409,2.72441,2.72441,0,0,0,1.56421,2.80737c1.72076.93652,3.5968.31225,4.53772-1.71558v.00244A67.88222,67.88222,0,0,1,27.18743,31.63306C41.11156,16.81934,58.16448,9.02,78.663,8.39575c2.34717,0,3.75525-1.24829,3.75525-3.27588C82.416,3.0918,81.00787,2,78.50457,2Z"/><path class="cls-2" d="M71.15051,82.94727v-.00245a11.40165,11.40165,0,0,1,0-5.61377,9.11078,9.11078,0,0,1,9.70123-6.55151c4.2229.15552,7.66638,3.27612,8.60217,7.95581A150.64126,150.64126,0,0,1,92.11486,105.25a3.12524,3.12524,0,0,0,3.12885,3.43237c1.879,0,2.97253-1.40356,3.12872-3.27612v-2.80811h.15631c-.3125-4.05542-.4679-8.11181-.93579-12.16528-.47022-4.05566-1.09656-8.11206-1.7229-12.16528A15.95811,15.95811,0,0,0,78.19079,64.5415c-8.13452.93653-14.70685,9.04761-13.454,17.002.62408,4.83593,1.40814,9.66967,1.876,14.50561A109.31694,109.31694,0,0,1,65.899,119h6.11938A120.607,120.607,0,0,0,71.15051,82.94727Z"/><path class="cls-2" d="M4.97253,58.30615A79.56579,79.56579,0,0,0,2,80.45166a66.6041,66.6041,0,0,0,.31177,7.64307A76.27289,76.27289,0,0,0,5.91137,104.626a2.67956,2.67956,0,0,0,2.65869,2.02856c2.66095.15552,3.91284-1.87231,3.13092-4.68042a70.50594,70.50594,0,0,1-.62634-41.79858V60.178A3.312,3.312,0,0,0,8.8839,55.81055C7.16326,55.3418,5.59887,56.43384,4.97253,58.30615Z"/><path class="cls-2" d="M54.56774,19.78174a3.233,3.233,0,0,0-2.03461,4.20947,3.15955,3.15955,0,0,0,4.38154,1.56006,60.109,60.109,0,0,1,28.63018-4.36816A57.799,57.799,0,0,1,120.58959,37.093c10.32434,9.82519,16.268,21.8352,18.30567,36.02807q1.16922,8.42505,1.876,16.84375c.4679,1.87159,1.72058,3.11988,3.44123,3.11988a3.18857,3.18857,0,0,0,2.97265-3.43238V88.56055c-.6242-5.92725-1.25055-11.853-2.19073-17.77881-2.03235-13.102-7.19562-24.64307-16.11261-34.31275C115.89556,21.96338,99.46893,14.78955,79.91137,14.6333A64.56588,64.56588,0,0,0,54.56774,19.78174Z"/><path class="cls-2" d="M14.82623,119h6.68389c2.45581-7.93066,1.976-16.22021.82789-24.51172-1.09424-7.019-2.03235-13.88354-1.09424-21.05469A59.14042,59.14042,0,0,1,46.11944,31.47681a3.29665,3.29665,0,0,0,1.56445-3.90015c-.78271-2.18408-2.97351-2.65186-5.16424-1.24731A60.84242,60.84242,0,0,0,29.37823,38.49683,64.52224,64.52224,0,0,0,14.67144,78.26758c-.31177,7.64331,1.72284,15.1289,2.19073,22.6145.3125,4.99219.4679,9.98413-1.09423,14.97437C15.45483,116.90015,15.14068,118.00366,14.82623,119Z"/><path class="cls-2" d="M84.93749,119a109.15166,109.15166,0,0,0,.76349-14.84424,75.85951,75.85951,0,0,0-.46789-9.98364,114.49913,114.49913,0,0,0-2.1908-14.65942,3.09175,3.09175,0,0,0-3.59961-2.49585A3.03673,3.03673,0,0,0,77.09649,80.917a116.673,116.673,0,0,1,2.34619,18.24732A115.89424,115.89424,0,0,1,78.6997,119Z"/><path class="cls-2" d="M147.49975,118.03955c0-3.4314.46789-7.01929.3117-10.29517a31.74131,31.74131,0,0,0,0-5.4602v.00244a3.08448,3.08448,0,0,0-3.44116-2.9646,3.01965,3.01965,0,0,0-2.81653,3.27612c.15558,5.14844-.15618,10.1377-.31231,15.28589A5.85688,5.85688,0,0,0,141.352,119h6.049A4.8957,4.8957,0,0,0,147.49975,118.03955Z"/><path class="cls-2" d="M157.04247,67.03784q-9.38772-46.78967-54.91259-61.762A45.02188,45.02188,0,0,0,91.80236,3.0918c-1.8783-.156-3.12866.78051-3.28424,2.49585A2.8761,2.8761,0,0,0,91.02062,9.176c.62409.15551,1.25043.15551,1.72058.31176a70.72924,70.72924,0,0,1,40.36347,22.457A69.1805,69.1805,0,0,1,147.0288,54.56006a74.06052,74.06052,0,0,1,4.694,23.2395c.1554,2.3396,1.8783,3.7439,4.06677,3.11987,1.56446-.46777,2.34711-1.71631,2.1908-4.21191A41.34673,41.34673,0,0,0,157.04247,67.03784Z"/><path class="cls-2" d="M135.09362,119c.28638-3.91992.42383-7.71533.35822-11.25562a217.74443,217.74443,0,0,0-2.6587-34.62329c-2.0346-12.7915-7.51043-23.551-17.053-32.28637A46.09888,46.09888,0,0,0,105.571,33.66089a3.002,3.002,0,0,0-4.22516,1.092c-.93884,1.55981-.46869,3.27588,1.25189,4.36792a3.92179,3.92179,0,0,0,1.09424.62427c10.4837,6.39355,17.83551,15.283,21.279,27.13672,3.12885,11.38794,3.91077,23.083,4.22308,34.78051A167.89466,167.89466,0,0,1,128.7799,119Z"/><path class="cls-2" d="M97.59063,118.1958a3.26475,3.26475,0,0,0-2.81482-3.43164,3.13267,3.13267,0,0,0-3.44342,2.80737c-.067.4773-.1413.9524-.21179,1.42847H97.481C97.51641,118.73145,97.55682,118.46533,97.59063,118.1958Z"/><path class="cls-2" d="M122.5595,119c.38214-4.52686.58307-9.10278.53247-13.75a159.06937,159.06937,0,0,0-2.03235-26.98242A60.29143,60.29143,0,0,0,118.555,67.19336a3.10573,3.10573,0,0,0-3.91138-2.02783,2.97009,2.97009,0,0,0-2.03229,3.8999c2.5025,9.35986,3.44037,19.02734,4.067,28.853A153.35944,153.35944,0,0,1,116.25793,119Z"/><path class="cls-2" d="M103.689,119h6.40527q.62714-6.47863.638-12.96948A167.06829,167.06829,0,0,0,108.0736,76.395c-2.03461-11.07324-7.97833-18.87134-18.30566-22.77075v.00219a28.15763,28.15763,0,0,0-18.92914-.15625c-2.66077.78052-3.44348,3.58545-1.72058,5.30176,1.24981,1.248,2.5025,1.0918,3.91058.624a21.72717,21.72717,0,0,1,28.47247,16.84277,163.58646,163.58646,0,0,1,2.34693,17.31372,137.99558,137.99558,0,0,1-.15619,25.42139Z"/></g></svg> +\ No newline at end of file +diff --git a/polkit-agent/assets/biowaiting/fingerprint11.svg b/polkit-agent/assets/biowaiting/fingerprint11.svg +new file mode 100644 +index 0000000..73ab76d +--- /dev/null ++++ b/polkit-agent/assets/biowaiting/fingerprint11.svg +@@ -0,0 +1 @@ ++<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 160 160"><defs><style>.cls-1{opacity:0.2;}.cls-2{fill:#3790fa;}</style></defs><g id="文字标注"><g class="cls-1"><path d="M76.78191,140.809a3.00927,3.00927,0,0,0-4.06695,1.87157l-4.2231,10.29593a2.95177,2.95177,0,0,0,2.34692,4.2097c1.87618,0,2.81427-.62348,3.44061-2.02792q2.35322-4.96514,4.2252-10.13749a3.22338,3.22338,0,0,0-1.72268-4.21179Zm71.02957-38.52241a3.08449,3.08449,0,0,0-3.44119-2.96447,3.01947,3.01947,0,0,0-2.81653,3.276c.15559,5.14854-.15616,10.13768-.31232,15.286,0,2.33947,1.09425,3.58775,2.971,3.74391,1.87844,0,3.28729-1.24829,3.28729-3.58851,0-3.43141.4679-7.01916.31174-10.29517a31.74592,31.74592,0,0,0,0-5.46008ZM42.99057,121.93748a3.19812,3.19812,0,0,0-3.91136,2.18407c-.31251.7804-.4679,1.71618-.7825,2.49562a101.9769,101.9769,0,0,1-5.00714,12.01c-1.09424,2.34022.1554,4.67969,2.66078,4.67969,1.40827.15616,2.34636-.77963,2.9727-2.02772a81.29627,81.29627,0,0,0,6.09985-15.4437,3.02989,3.02989,0,0,0-2.03233-3.898Zm51.78526-7.17321a3.1326,3.1326,0,0,0-3.44347,2.80735,161.02757,161.02757,0,0,1-4.84945,22.9279c-1.25192,4.36718-2.81636,8.73532-4.38079,13.10328a2.97748,2.97748,0,0,0,1.25192,3.898,3.04925,3.04925,0,0,0,3.75521-.3125,5.62684,5.62684,0,0,0,1.25041-2.33946,128.60675,128.60675,0,0,0,4.85174-14.97123,161.5315,161.5315,0,0,0,4.37926-21.68171,3.2645,3.2645,0,0,0-2.81483-3.43159ZM11.07465,60.17791a3.312,3.312,0,0,0-2.19078-4.36738c-1.72059-.46865-3.285.62329-3.91137,2.49561A79.568,79.568,0,0,0,2,80.45155a66.61318,66.61318,0,0,0,.31174,7.6432A76.2778,76.2778,0,0,0,5.91135,104.626,2.67954,2.67954,0,0,0,8.57,106.6545c2.661.15558,3.91289-1.87233,3.131-4.68045a70.50518,70.50518,0,0,1-.62634-41.79842ZM85.701,104.15584a75.86247,75.86247,0,0,0-.4679-9.98362,114.4834,114.4834,0,0,0-2.19078-14.6595,3.09173,3.09173,0,0,0-3.59961-2.49581,3.03667,3.03667,0,0,0-2.34618,3.90025,116.66849,116.66849,0,0,1,2.34618,18.24725,106.72223,106.72223,0,0,1-2.97253,31.50478c-.46789,2.02773.31175,3.74391,2.03443,4.2118,1.87694.4679,3.44137-.62405,4.06772-2.80812a109.17988,109.17988,0,0,0,3.12867-27.917Zm32.854-36.96258a3.10567,3.10567,0,0,0-3.91136-2.02773,2.97022,2.97022,0,0,0-2.03235,3.90006c2.50253,9.35957,3.44042,19.02707,4.067,28.85281a155.422,155.422,0,0,1-5.0079,47.25852c-.46789,2.02792.31232,3.90025,2.0352,4.2118a3.1298,3.1298,0,0,0,4.06695-2.65178,158.74245,158.74245,0,0,0,5.31944-41.48688,159.06625,159.06625,0,0,0-2.03234-26.98258,60.29831,60.29831,0,0,0-2.5046-11.07422ZM15.61236,48.32272A67.88326,67.88326,0,0,1,27.18743,31.633C41.11154,16.81945,58.16451,9.0199,78.663,8.39586c2.34712,0,3.75521-1.24828,3.75521-3.276C82.416,3.09194,81.00788,2,78.50459,2A77.9438,77.9438,0,0,0,10.13446,45.04442a5.77164,5.77164,0,0,0-.62406,2.18407,2.72437,2.72437,0,0,0,1.56425,2.80736c1.72077.93654,3.59676.31231,4.53771-1.71543ZM58.79085,85.753c-1.25058-7.48553-.31174-14.19161,4.85155-20.11959a2.80489,2.80489,0,0,0,.62425-1.40368c.15616-1.55983-.15634-2.80812-1.72059-3.43216a2.98066,2.98066,0,0,0-3.91136.93635c-5.63138,6.55146-7.66581,14.19542-6.41389,22.77308a143.77173,143.77173,0,0,1,1.87675,19.65112,84.8888,84.8888,0,0,1-1.87675,19.18379,87.66557,87.66557,0,0,1-7.822,21.36711,4.07666,4.07666,0,0,0-.78269,2.652,2.99416,2.99416,0,0,0,2.34693,2.652c1.72078.31173,2.815-.31251,3.75521-1.87234a90.1349,90.1349,0,0,0,9.6989-29.79089A108.40061,108.40061,0,0,0,58.79314,85.753ZM22.338,94.48834c-1.09424-7.01916-2.03234-13.88368-1.09424-21.05461A59.14015,59.14015,0,0,1,46.11943,31.47686a3.29673,3.29673,0,0,0,1.56444-3.90024c-.78269-2.18389-2.97347-2.65176-5.16425-1.24735A60.84871,60.84871,0,0,0,29.37821,38.49678a64.52309,64.52309,0,0,0-14.7068,39.7707c-.31174,7.6434,1.72288,15.12892,2.19078,22.61463.3125,4.99219.4679,9.98419-1.09425,14.97429-.4679,1.55983-.93809,3.27525-1.40827,4.52334a3.12377,3.12377,0,0,0,3.12886,3.43008c1.87694,0,2.65868-1.09195,3.285-2.652,3.285-8.57766,2.81712-17.6232,1.56443-26.66951ZM157.04249,67.03786Q147.65476,20.2483,102.1299,5.276A45.00768,45.00768,0,0,0,91.80236,3.09194c-1.87827-.15615-3.12867.78039-3.28426,2.4958a2.87607,2.87607,0,0,0,2.50252,3.58833c.62406.15558,1.25041.15558,1.72059.31175a70.72962,70.72962,0,0,1,40.36348,22.45694A69.18273,69.18273,0,0,1,147.0288,54.56015a74.061,74.061,0,0,1,4.69406,23.23944c.15538,2.33946,1.87825,3.7439,4.06675,3.11986,1.56443-.4679,2.34712-1.71618,2.19076-4.212a41.34713,41.34713,0,0,0-.93788-9.6696ZM115.74016,40.83473a46.09794,46.09794,0,0,0-10.16909-7.17379,3.002,3.002,0,0,0-4.22521,1.09194c-.93885,1.55983-.46866,3.276,1.25194,4.368a3.91739,3.91739,0,0,0,1.09424.62422c10.48369,6.3936,17.83547,15.283,21.27894,27.13666,3.12886,11.38806,3.91079,23.08329,4.22309,34.7806a167.16817,167.16817,0,0,1-2.34693,33.06462c-.31174,2.34023.62405,3.7439,2.50252,4.0564,2.0352.31175,3.44347-.78039,3.755-3.11985a162.60561,162.60561,0,0,0,2.34712-27.91913,217.742,217.742,0,0,0-2.65868-34.62312c-2.03462-12.79173-7.51042-23.55117-17.053-32.2865ZM89.76793,53.62646a28.15742,28.15742,0,0,0-18.92915-.15615c-2.66076.78037-3.44345,3.58546-1.72059,5.30163C70.368,60.02,71.62072,59.86389,73.0288,59.396a21.72731,21.72731,0,0,1,28.47247,16.8428,163.579,163.579,0,0,1,2.34692,17.31375A137.99692,137.99692,0,0,1,103.692,118.974a149.65137,149.65137,0,0,1-7.04023,31.97477c-.1554.62405-.4679,1.092-.31155,1.71618a3.009,3.009,0,0,0,2.81483,2.65177,3.073,3.073,0,0,0,3.44271-2.34022,143.91473,143.91473,0,0,0,8.13446-46.946,167.06542,167.06542,0,0,0-2.65866-29.6353c-2.03463-11.07347-7.97832-18.87149-18.30567-22.77079ZM46.431,72.65334C50.03,55.02805,68.6482,42.7065,86.48291,46.294a35.29014,35.29014,0,0,1,20.18241,11.85368,8.8989,8.8989,0,0,0,1.72,1.71617,3.19219,3.19219,0,0,0,3.755-.93579c1.09424-1.40444.93885-2.80812-.31155-4.5243-7.19867-8.733-16.42891-13.87928-27.84841-14.81508-14.55045-1.2481-26.59781,3.90025-35.82653,15.283A38.57474,38.57474,0,0,0,39.861,85.4407c.7804,5.30373,1.72078,10.45208,1.72078,15.75372,0,3.74391,0,7.488-.31175,11.07347a3.00588,3.00588,0,0,0,2.81408,3.276,3.03818,3.03818,0,0,0,3.44346-2.652,100.85173,100.85173,0,0,0-.15616-20.58748c-.47018-4.21179-1.87827-8.26743-1.56443-12.16769a39.31083,39.31083,0,0,1,.62406-7.48342Zm97.78146,20.43132a3.18855,3.18855,0,0,0,2.97269-3.43217V88.56056c-.62425-5.92722-1.2506-11.8531-2.19077-17.77879-2.03234-13.10195-7.19563-24.64312-16.1126-34.31273C115.89556,21.96341,99.46893,14.78945,79.91135,14.63329a64.57055,64.57055,0,0,0-25.3436,5.14835,3.23306,3.23306,0,0,0-2.03462,4.20951,3.15933,3.15933,0,0,0,4.38155,1.56A60.10931,60.10931,0,0,1,85.54483,21.183a57.79887,57.79887,0,0,1,35.04478,15.91007c10.32431,9.82517,16.268,21.835,18.30566,36.02812q1.16919,8.42465,1.876,16.84377c.46789,1.87157,1.72058,3.11966,3.44119,3.11966ZM71.15053,82.94489a11.40154,11.40154,0,0,1,0-5.614,9.11075,9.11075,0,0,1,9.70119-6.55146c4.22292.15558,7.66638,3.2762,8.60218,7.9559a150.63952,150.63952,0,0,1,2.661,26.51468,3.1253,3.1253,0,0,0,3.12886,3.43236c1.879,0,2.97252-1.40367,3.12867-3.276V102.5981h.15635c-.3125-4.05545-.4679-8.11185-.9358-12.16521-.47019-4.05565-1.09654-8.11206-1.72288-12.16541a15.95817,15.95817,0,0,0-17.67931-13.726c-8.13447.93654-14.7068,9.04763-13.45392,17.002.624,4.83584,1.40808,9.6696,1.876,14.50563a100.76542,100.76542,0,0,1-4.6931,39.77,111.03563,111.03563,0,0,1-5.9437,14.03754,3.0595,3.0595,0,0,0,.15616,3.43236,2.8478,2.8478,0,0,0,2.97252,1.24752,3.58665,3.58665,0,0,0,2.815-2.33946C72.715,130.2034,75.21748,107.1224,71.15053,82.94717ZM34.38591,91.52482c-.7825-5.30393-1.565-10.76381-1.09634-16.06545A45.82536,45.82536,0,0,1,49.87464,44.26631a45.38952,45.38952,0,0,1,28.16-10.76171,44.31362,44.31362,0,0,1,12.82986,1.24828,3.86111,3.86111,0,0,0,1.87675.15616,2.85951,2.85951,0,0,0,2.50252-2.80814,3.03932,3.03932,0,0,0-2.34694-3.276,45.95556,45.95556,0,0,0-13.14161-1.55984,34.70559,34.70559,0,0,0-9.69889.93577C54.25524,31.16513,42.20807,39.74505,33.91516,53.62436a50.635,50.635,0,0,0-6.56928,32.59653c.4679,4.36814,1.40808,8.57995,1.71983,12.94809.62405,10.75944-.78175,21.20867-5.6312,30.87827a3.03318,3.03318,0,0,0-.47018,2.02771,2.8529,2.8529,0,0,0,2.65867,2.652,3.38107,3.38107,0,0,0,3.44271-2.02772c6.57-12.9458,7.51022-26.98125,5.3202-41.17439Zm0,0"/></g><path class="cls-2" d="M4.97253,58.30615A79.56579,79.56579,0,0,0,2,80.45166a66.6041,66.6041,0,0,0,.31177,7.64307A76.27289,76.27289,0,0,0,5.91137,104.626a2.67956,2.67956,0,0,0,2.65869,2.02856c2.66095.15552,3.91284-1.87231,3.13092-4.68042a70.50594,70.50594,0,0,1-.62634-41.79858V60.178A3.312,3.312,0,0,0,8.8839,55.81055C7.16326,55.3418,5.59887,56.43384,4.97253,58.30615Z"/><path class="cls-2" d="M30.34148,130c5.40314-12.1875,6.08313-25.26245,4.04444-38.4751-.78253-5.304-1.565-10.76391-1.09638-16.06543A45.82521,45.82521,0,0,1,49.87463,44.26636a45.3888,45.3888,0,0,1,28.16-10.76172,44.30565,44.30565,0,0,1,12.82983,1.24829,3.86367,3.86367,0,0,0,1.87677.156,2.85936,2.85936,0,0,0,2.50251-2.80811A3.0391,3.0391,0,0,0,92.89678,28.825a45.94687,45.94687,0,0,0-13.1416-1.55981,34.707,34.707,0,0,0-9.69891.93554C54.25524,31.165,42.20806,39.74512,33.91515,53.62427A50.63525,50.63525,0,0,0,27.34588,86.221c.46789,4.36792,1.40808,8.57983,1.71985,12.948.623,10.74194-.77826,21.1748-5.60871,30.83105Z"/><path class="cls-2" d="M45.02288,125.83545a3.02982,3.02982,0,0,0-2.03229-3.89795,3.19793,3.19793,0,0,0-3.91137,2.18408c-.3125.78028-.4679,1.71607-.78254,2.49561-.38446,1.1499-.79632,2.27343-1.22418,3.38281h6.6789C44.223,128.62256,44.65173,127.23486,45.02288,125.83545Z"/><path class="cls-2" d="M46.431,72.65332C50.03,55.02808,68.64819,42.70654,86.4829,46.294a35.29073,35.29073,0,0,1,20.18244,11.85376,8.89448,8.89448,0,0,0,1.72,1.71606,3.1923,3.1923,0,0,0,3.75506-.93555c1.09424-1.40454.93885-2.80835-.31158-4.52441-7.19867-8.73316-16.4289-13.8794-27.84839-14.81519-14.55048-1.248-26.59784,3.90039-35.82654,15.283A38.57484,38.57484,0,0,0,39.861,85.44067c.7804,5.30371,1.72077,10.45215,1.72077,15.75367,0,3.74389,0,7.488-.31171,11.07348a3.006,3.006,0,0,0,2.814,3.27613,3.03829,3.03829,0,0,0,3.44348-2.6521,100.85037,100.85037,0,0,0-.15613-20.58741c-.47021-4.21167-1.87829-8.26733-1.56445-12.16772A39.31056,39.31056,0,0,1,46.431,72.65332Z"/><path class="cls-2" d="M29.84612,48.63428A58.71554,58.71554,0,0,1,46.11944,31.47681a3.29665,3.29665,0,0,0,1.56445-3.90015c-.78271-2.18408-2.97351-2.65186-5.16424-1.24731A60.84242,60.84242,0,0,0,29.37823,38.49683,64.52224,64.52224,0,0,0,14.67144,78.26758c-.31177,7.64331,1.72284,15.1289,2.19073,22.6145.3125,4.99219.4679,9.98413-1.09423,14.97437-.4679,1.55981-.93811,3.27514-1.40827,4.52319a3.12376,3.12376,0,0,0,3.12885,3.43017c1.87695,0,2.65869-1.092,3.285-2.6521,3.285-8.57763,2.81714-17.623,1.56446-26.66943-1.09424-7.019-2.03235-13.88354-1.09424-21.05469A58.80522,58.80522,0,0,1,29.84612,48.63428Z"/><path class="cls-2" d="M147.81145,102.28418v.00244a3.08448,3.08448,0,0,0-3.44116-2.9646,3.01965,3.01965,0,0,0-2.81653,3.27612c.15558,5.14844-.15618,10.1377-.31231,15.28589,0,2.3396,1.09424,3.58789,2.971,3.7439,1.87841,0,3.28729-1.24829,3.28729-3.58838,0-3.4314.46789-7.01929.3117-10.29517A31.74131,31.74131,0,0,0,147.81145,102.28418Z"/><path class="cls-2" d="M78.50457,2A77.94379,77.94379,0,0,0,10.13445,45.04443a5.77193,5.77193,0,0,0-.624,2.18409,2.72441,2.72441,0,0,0,1.56421,2.80737c1.72076.93652,3.5968.31225,4.53772-1.71558v.00244A67.88222,67.88222,0,0,1,27.18743,31.63306C41.11156,16.81934,58.16448,9.02,78.663,8.39575c2.34717,0,3.75525-1.24829,3.75525-3.27588C82.416,3.0918,81.00787,2,78.50457,2Z"/><path class="cls-2" d="M128.88177,36.469C115.89556,21.96338,99.46893,14.78955,79.91137,14.6333a64.56588,64.56588,0,0,0-25.34363,5.14844,3.233,3.233,0,0,0-2.03461,4.20947,3.15955,3.15955,0,0,0,4.38154,1.56006,60.109,60.109,0,0,1,28.63018-4.36816A57.799,57.799,0,0,1,120.58959,37.093c10.32434,9.82519,16.268,21.8352,18.30567,36.02807q1.16922,8.42505,1.876,16.84375c.4679,1.87159,1.72058,3.11988,3.44123,3.11988a3.18857,3.18857,0,0,0,2.97265-3.43238V88.56055c-.6242-5.92725-1.25055-11.853-2.19073-17.77881C142.962,57.67969,137.79876,46.13867,128.88177,36.469Z"/><path class="cls-2" d="M50.46655,130h6.53192a82.66267,82.66267,0,0,0,2.41876-11.65039,108.40174,108.40174,0,0,0-.62409-32.59668h-.00232c-1.25054-7.48535-.3117-14.19141,4.85157-20.11963a2.80362,2.80362,0,0,0,.62426-1.40356c.15613-1.55982-.15637-2.80811-1.72058-3.43213a2.98078,2.98078,0,0,0-3.91137.93628c-5.63141,6.55151-7.66584,14.19531-6.41388,22.77319a143.776,143.776,0,0,1,1.87677,19.65112,84.89,84.89,0,0,1-1.87677,19.1836C51.74847,125.60254,51.14989,127.81641,50.46655,130Z"/><path class="cls-2" d="M133.93694,130a150.35686,150.35686,0,0,0,1.5149-22.25562,217.74443,217.74443,0,0,0-2.6587-34.62329c-2.0346-12.7915-7.51043-23.551-17.053-32.28637A46.09888,46.09888,0,0,0,105.571,33.66089a3.002,3.002,0,0,0-4.22516,1.092c-.93884,1.55981-.46869,3.27588,1.25189,4.36792a3.92179,3.92179,0,0,0,1.09424.62427c10.4837,6.39355,17.83551,15.283,21.279,27.13672,3.12885,11.38794,3.91077,23.083,4.22308,34.78051A167.37135,167.37135,0,0,1,127.584,130Z"/><path class="cls-2" d="M157.04247,67.03784q-9.38772-46.78967-54.91259-61.762A45.02188,45.02188,0,0,0,91.80236,3.0918c-1.8783-.156-3.12866.78051-3.28424,2.49585A2.8761,2.8761,0,0,0,91.02062,9.176c.62409.15551,1.25043.15551,1.72058.31176a70.72924,70.72924,0,0,1,40.36347,22.457A69.1805,69.1805,0,0,1,147.0288,54.56006a74.06052,74.06052,0,0,1,4.694,23.2395c.1554,2.3396,1.8783,3.7439,4.06677,3.11987,1.56446-.46777,2.34711-1.71631,2.1908-4.21191A41.34673,41.34673,0,0,0,157.04247,67.03784Z"/><path class="cls-2" d="M121.23455,130a148.83457,148.83457,0,0,0,1.85742-24.75,159.06937,159.06937,0,0,0-2.03235-26.98242A60.29143,60.29143,0,0,0,118.555,67.19336a3.10573,3.10573,0,0,0-3.91138-2.02783,2.97009,2.97009,0,0,0-2.03229,3.8999c2.5025,9.35986,3.44037,19.02734,4.067,28.853A153.35038,153.35038,0,0,1,114.87652,130Z"/><path class="cls-2" d="M97.59063,118.1958a3.26475,3.26475,0,0,0-2.81482-3.43164,3.13267,3.13267,0,0,0-3.44342,2.80737Q90.451,123.85461,89.13329,130h6.44983C96.39861,126.1377,97.08685,122.2124,97.59063,118.1958Z"/><path class="cls-2" d="M85.701,104.15576a75.85951,75.85951,0,0,0-.46789-9.98364,114.49913,114.49913,0,0,0-2.1908-14.65942,3.09175,3.09175,0,0,0-3.59961-2.49585A3.03673,3.03673,0,0,0,77.09649,80.917a116.673,116.673,0,0,1,2.34619,18.24732A107.19115,107.19115,0,0,1,76.62749,130h6.4181A109.166,109.166,0,0,0,85.701,104.15576Z"/><path class="cls-2" d="M102.09509,130h6.49407a137.10134,137.10134,0,0,0,2.14307-23.96948A167.06829,167.06829,0,0,0,108.0736,76.395c-2.03461-11.07324-7.97833-18.87134-18.30566-22.77075v.00219a28.15763,28.15763,0,0,0-18.92914-.15625c-2.66077.78052-3.44348,3.58545-1.72058,5.30176,1.24981,1.248,2.5025,1.0918,3.91058.624a21.72717,21.72717,0,0,1,28.47247,16.84277,163.58646,163.58646,0,0,1,2.34693,17.31372,137.99558,137.99558,0,0,1-.15619,25.42139C103.32018,122.68433,102.7738,126.356,102.09509,130Z"/><path class="cls-2" d="M71.15051,82.94727v-.00245a11.40165,11.40165,0,0,1,0-5.61377,9.11078,9.11078,0,0,1,9.70123-6.55151c4.2229.15552,7.66638,3.27612,8.60217,7.95581A150.64126,150.64126,0,0,1,92.11486,105.25a3.12524,3.12524,0,0,0,3.12885,3.43237c1.879,0,2.97253-1.40356,3.12872-3.27612v-2.80811h.15631c-.3125-4.05542-.4679-8.11181-.93579-12.16528-.47022-4.05566-1.09656-8.11206-1.7229-12.16528A15.95811,15.95811,0,0,0,78.19079,64.5415c-8.13452.93653-14.70685,9.04761-13.454,17.002.62408,4.83593,1.40814,9.66967,1.876,14.50561A103.2327,103.2327,0,0,1,63.66741,130h6.28925C73.633,114.80322,73.87145,99.12134,71.15051,82.94727Z"/></g></svg> +\ No newline at end of file +diff --git a/polkit-agent/assets/biowaiting/fingerprint12.svg b/polkit-agent/assets/biowaiting/fingerprint12.svg +new file mode 100644 +index 0000000..2b0c41e +--- /dev/null ++++ b/polkit-agent/assets/biowaiting/fingerprint12.svg +@@ -0,0 +1 @@ ++<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 160 160"><defs><style>.cls-1{opacity:0.2;}.cls-2{fill:#3790fa;}</style></defs><g id="文字标注"><g class="cls-1"><path d="M76.78191,140.809a3.00927,3.00927,0,0,0-4.06695,1.87157l-4.2231,10.29593a2.95177,2.95177,0,0,0,2.34692,4.2097c1.87618,0,2.81427-.62348,3.44061-2.02792q2.35322-4.96514,4.2252-10.13749a3.22338,3.22338,0,0,0-1.72268-4.21179Zm71.02957-38.52241a3.08449,3.08449,0,0,0-3.44119-2.96447,3.01947,3.01947,0,0,0-2.81653,3.276c.15559,5.14854-.15616,10.13768-.31232,15.286,0,2.33947,1.09425,3.58775,2.971,3.74391,1.87844,0,3.28729-1.24829,3.28729-3.58851,0-3.43141.4679-7.01916.31174-10.29517a31.74592,31.74592,0,0,0,0-5.46008ZM42.99057,121.93748a3.19812,3.19812,0,0,0-3.91136,2.18407c-.31251.7804-.4679,1.71618-.7825,2.49562a101.9769,101.9769,0,0,1-5.00714,12.01c-1.09424,2.34022.1554,4.67969,2.66078,4.67969,1.40827.15616,2.34636-.77963,2.9727-2.02772a81.29627,81.29627,0,0,0,6.09985-15.4437,3.02989,3.02989,0,0,0-2.03233-3.898Zm51.78526-7.17321a3.1326,3.1326,0,0,0-3.44347,2.80735,161.02757,161.02757,0,0,1-4.84945,22.9279c-1.25192,4.36718-2.81636,8.73532-4.38079,13.10328a2.97748,2.97748,0,0,0,1.25192,3.898,3.04925,3.04925,0,0,0,3.75521-.3125,5.62684,5.62684,0,0,0,1.25041-2.33946,128.60675,128.60675,0,0,0,4.85174-14.97123,161.5315,161.5315,0,0,0,4.37926-21.68171,3.2645,3.2645,0,0,0-2.81483-3.43159ZM11.07465,60.17791a3.312,3.312,0,0,0-2.19078-4.36738c-1.72059-.46865-3.285.62329-3.91137,2.49561A79.568,79.568,0,0,0,2,80.45155a66.61318,66.61318,0,0,0,.31174,7.6432A76.2778,76.2778,0,0,0,5.91135,104.626,2.67954,2.67954,0,0,0,8.57,106.6545c2.661.15558,3.91289-1.87233,3.131-4.68045a70.50518,70.50518,0,0,1-.62634-41.79842ZM85.701,104.15584a75.86247,75.86247,0,0,0-.4679-9.98362,114.4834,114.4834,0,0,0-2.19078-14.6595,3.09173,3.09173,0,0,0-3.59961-2.49581,3.03667,3.03667,0,0,0-2.34618,3.90025,116.66849,116.66849,0,0,1,2.34618,18.24725,106.72223,106.72223,0,0,1-2.97253,31.50478c-.46789,2.02773.31175,3.74391,2.03443,4.2118,1.87694.4679,3.44137-.62405,4.06772-2.80812a109.17988,109.17988,0,0,0,3.12867-27.917Zm32.854-36.96258a3.10567,3.10567,0,0,0-3.91136-2.02773,2.97022,2.97022,0,0,0-2.03235,3.90006c2.50253,9.35957,3.44042,19.02707,4.067,28.85281a155.422,155.422,0,0,1-5.0079,47.25852c-.46789,2.02792.31232,3.90025,2.0352,4.2118a3.1298,3.1298,0,0,0,4.06695-2.65178,158.74245,158.74245,0,0,0,5.31944-41.48688,159.06625,159.06625,0,0,0-2.03234-26.98258,60.29831,60.29831,0,0,0-2.5046-11.07422ZM15.61236,48.32272A67.88326,67.88326,0,0,1,27.18743,31.633C41.11154,16.81945,58.16451,9.0199,78.663,8.39586c2.34712,0,3.75521-1.24828,3.75521-3.276C82.416,3.09194,81.00788,2,78.50459,2A77.9438,77.9438,0,0,0,10.13446,45.04442a5.77164,5.77164,0,0,0-.62406,2.18407,2.72437,2.72437,0,0,0,1.56425,2.80736c1.72077.93654,3.59676.31231,4.53771-1.71543ZM58.79085,85.753c-1.25058-7.48553-.31174-14.19161,4.85155-20.11959a2.80489,2.80489,0,0,0,.62425-1.40368c.15616-1.55983-.15634-2.80812-1.72059-3.43216a2.98066,2.98066,0,0,0-3.91136.93635c-5.63138,6.55146-7.66581,14.19542-6.41389,22.77308a143.77173,143.77173,0,0,1,1.87675,19.65112,84.8888,84.8888,0,0,1-1.87675,19.18379,87.66557,87.66557,0,0,1-7.822,21.36711,4.07666,4.07666,0,0,0-.78269,2.652,2.99416,2.99416,0,0,0,2.34693,2.652c1.72078.31173,2.815-.31251,3.75521-1.87234a90.1349,90.1349,0,0,0,9.6989-29.79089A108.40061,108.40061,0,0,0,58.79314,85.753ZM22.338,94.48834c-1.09424-7.01916-2.03234-13.88368-1.09424-21.05461A59.14015,59.14015,0,0,1,46.11943,31.47686a3.29673,3.29673,0,0,0,1.56444-3.90024c-.78269-2.18389-2.97347-2.65176-5.16425-1.24735A60.84871,60.84871,0,0,0,29.37821,38.49678a64.52309,64.52309,0,0,0-14.7068,39.7707c-.31174,7.6434,1.72288,15.12892,2.19078,22.61463.3125,4.99219.4679,9.98419-1.09425,14.97429-.4679,1.55983-.93809,3.27525-1.40827,4.52334a3.12377,3.12377,0,0,0,3.12886,3.43008c1.87694,0,2.65868-1.09195,3.285-2.652,3.285-8.57766,2.81712-17.6232,1.56443-26.66951ZM157.04249,67.03786Q147.65476,20.2483,102.1299,5.276A45.00768,45.00768,0,0,0,91.80236,3.09194c-1.87827-.15615-3.12867.78039-3.28426,2.4958a2.87607,2.87607,0,0,0,2.50252,3.58833c.62406.15558,1.25041.15558,1.72059.31175a70.72962,70.72962,0,0,1,40.36348,22.45694A69.18273,69.18273,0,0,1,147.0288,54.56015a74.061,74.061,0,0,1,4.69406,23.23944c.15538,2.33946,1.87825,3.7439,4.06675,3.11986,1.56443-.4679,2.34712-1.71618,2.19076-4.212a41.34713,41.34713,0,0,0-.93788-9.6696ZM115.74016,40.83473a46.09794,46.09794,0,0,0-10.16909-7.17379,3.002,3.002,0,0,0-4.22521,1.09194c-.93885,1.55983-.46866,3.276,1.25194,4.368a3.91739,3.91739,0,0,0,1.09424.62422c10.48369,6.3936,17.83547,15.283,21.27894,27.13666,3.12886,11.38806,3.91079,23.08329,4.22309,34.7806a167.16817,167.16817,0,0,1-2.34693,33.06462c-.31174,2.34023.62405,3.7439,2.50252,4.0564,2.0352.31175,3.44347-.78039,3.755-3.11985a162.60561,162.60561,0,0,0,2.34712-27.91913,217.742,217.742,0,0,0-2.65868-34.62312c-2.03462-12.79173-7.51042-23.55117-17.053-32.2865ZM89.76793,53.62646a28.15742,28.15742,0,0,0-18.92915-.15615c-2.66076.78037-3.44345,3.58546-1.72059,5.30163C70.368,60.02,71.62072,59.86389,73.0288,59.396a21.72731,21.72731,0,0,1,28.47247,16.8428,163.579,163.579,0,0,1,2.34692,17.31375A137.99692,137.99692,0,0,1,103.692,118.974a149.65137,149.65137,0,0,1-7.04023,31.97477c-.1554.62405-.4679,1.092-.31155,1.71618a3.009,3.009,0,0,0,2.81483,2.65177,3.073,3.073,0,0,0,3.44271-2.34022,143.91473,143.91473,0,0,0,8.13446-46.946,167.06542,167.06542,0,0,0-2.65866-29.6353c-2.03463-11.07347-7.97832-18.87149-18.30567-22.77079ZM46.431,72.65334C50.03,55.02805,68.6482,42.7065,86.48291,46.294a35.29014,35.29014,0,0,1,20.18241,11.85368,8.8989,8.8989,0,0,0,1.72,1.71617,3.19219,3.19219,0,0,0,3.755-.93579c1.09424-1.40444.93885-2.80812-.31155-4.5243-7.19867-8.733-16.42891-13.87928-27.84841-14.81508-14.55045-1.2481-26.59781,3.90025-35.82653,15.283A38.57474,38.57474,0,0,0,39.861,85.4407c.7804,5.30373,1.72078,10.45208,1.72078,15.75372,0,3.74391,0,7.488-.31175,11.07347a3.00588,3.00588,0,0,0,2.81408,3.276,3.03818,3.03818,0,0,0,3.44346-2.652,100.85173,100.85173,0,0,0-.15616-20.58748c-.47018-4.21179-1.87827-8.26743-1.56443-12.16769a39.31083,39.31083,0,0,1,.62406-7.48342Zm97.78146,20.43132a3.18855,3.18855,0,0,0,2.97269-3.43217V88.56056c-.62425-5.92722-1.2506-11.8531-2.19077-17.77879-2.03234-13.10195-7.19563-24.64312-16.1126-34.31273C115.89556,21.96341,99.46893,14.78945,79.91135,14.63329a64.57055,64.57055,0,0,0-25.3436,5.14835,3.23306,3.23306,0,0,0-2.03462,4.20951,3.15933,3.15933,0,0,0,4.38155,1.56A60.10931,60.10931,0,0,1,85.54483,21.183a57.79887,57.79887,0,0,1,35.04478,15.91007c10.32431,9.82517,16.268,21.835,18.30566,36.02812q1.16919,8.42465,1.876,16.84377c.46789,1.87157,1.72058,3.11966,3.44119,3.11966ZM71.15053,82.94489a11.40154,11.40154,0,0,1,0-5.614,9.11075,9.11075,0,0,1,9.70119-6.55146c4.22292.15558,7.66638,3.2762,8.60218,7.9559a150.63952,150.63952,0,0,1,2.661,26.51468,3.1253,3.1253,0,0,0,3.12886,3.43236c1.879,0,2.97252-1.40367,3.12867-3.276V102.5981h.15635c-.3125-4.05545-.4679-8.11185-.9358-12.16521-.47019-4.05565-1.09654-8.11206-1.72288-12.16541a15.95817,15.95817,0,0,0-17.67931-13.726c-8.13447.93654-14.7068,9.04763-13.45392,17.002.624,4.83584,1.40808,9.6696,1.876,14.50563a100.76542,100.76542,0,0,1-4.6931,39.77,111.03563,111.03563,0,0,1-5.9437,14.03754,3.0595,3.0595,0,0,0,.15616,3.43236,2.8478,2.8478,0,0,0,2.97252,1.24752,3.58665,3.58665,0,0,0,2.815-2.33946C72.715,130.2034,75.21748,107.1224,71.15053,82.94717ZM34.38591,91.52482c-.7825-5.30393-1.565-10.76381-1.09634-16.06545A45.82536,45.82536,0,0,1,49.87464,44.26631a45.38952,45.38952,0,0,1,28.16-10.76171,44.31362,44.31362,0,0,1,12.82986,1.24828,3.86111,3.86111,0,0,0,1.87675.15616,2.85951,2.85951,0,0,0,2.50252-2.80814,3.03932,3.03932,0,0,0-2.34694-3.276,45.95556,45.95556,0,0,0-13.14161-1.55984,34.70559,34.70559,0,0,0-9.69889.93577C54.25524,31.16513,42.20807,39.74505,33.91516,53.62436a50.635,50.635,0,0,0-6.56928,32.59653c.4679,4.36814,1.40808,8.57995,1.71983,12.94809.62405,10.75944-.78175,21.20867-5.6312,30.87827a3.03318,3.03318,0,0,0-.47018,2.02771,2.8529,2.8529,0,0,0,2.65867,2.652,3.38107,3.38107,0,0,0,3.44271-2.02772c6.57-12.9458,7.51022-26.98125,5.3202-41.17439Zm0,0"/></g><path class="cls-2" d="M14.35967,120.37964a3.12376,3.12376,0,0,0,3.12885,3.43017c1.87695,0,2.65869-1.092,3.285-2.6521,3.285-8.57763,2.81714-17.623,1.56446-26.66943-1.09424-7.019-2.03235-13.88354-1.09424-21.05469A59.14042,59.14042,0,0,1,46.11944,31.47681a3.29665,3.29665,0,0,0,1.56445-3.90015c-.78271-2.18408-2.97351-2.65186-5.16424-1.24731A60.84242,60.84242,0,0,0,29.37823,38.49683,64.52224,64.52224,0,0,0,14.67144,78.26758c-.31177,7.64331,1.72284,15.1289,2.19073,22.6145.3125,4.99219.4679,9.98413-1.09423,14.97437C15.3,117.41626,14.82983,119.13159,14.35967,120.37964Z"/><path class="cls-2" d="M49.87463,44.26636a45.3888,45.3888,0,0,1,28.16-10.76172,44.30565,44.30565,0,0,1,12.82983,1.24829,3.86367,3.86367,0,0,0,1.87677.156,2.85936,2.85936,0,0,0,2.50251-2.80811A3.0391,3.0391,0,0,0,92.89678,28.825a45.94687,45.94687,0,0,0-13.1416-1.55981,34.707,34.707,0,0,0-9.69891.93554C54.25524,31.165,42.20806,39.74512,33.91515,53.62427A50.63525,50.63525,0,0,0,27.34588,86.221c.46789,4.36792,1.40808,8.57983,1.71985,12.948.624,10.75952-.78174,21.20874-5.63123,30.87841a3.0328,3.0328,0,0,0-.47015,2.02759,2.85307,2.85307,0,0,0,2.65863,2.6521,3.38147,3.38147,0,0,0,3.44275-2.02783c6.57-12.9458,7.51019-26.9812,5.32019-41.17432-.78253-5.304-1.565-10.76391-1.09638-16.06543A45.82521,45.82521,0,0,1,49.87463,44.26636Z"/><path class="cls-2" d="M78.50457,2A77.94379,77.94379,0,0,0,10.13445,45.04443a5.77193,5.77193,0,0,0-.624,2.18409,2.72441,2.72441,0,0,0,1.56421,2.80737c1.72076.93652,3.5968.31225,4.53772-1.71558v.00244A67.88222,67.88222,0,0,1,27.18743,31.63306C41.11156,16.81934,58.16448,9.02,78.663,8.39575c2.34717,0,3.75525-1.24829,3.75525-3.27588C82.416,3.0918,81.00787,2,78.50457,2Z"/><path class="cls-2" d="M147.81145,102.28418v.00244a3.08448,3.08448,0,0,0-3.44116-2.9646,3.01965,3.01965,0,0,0-2.81653,3.27612c.15558,5.14844-.15618,10.1377-.31231,15.28589,0,2.3396,1.09424,3.58789,2.971,3.7439,1.87841,0,3.28729-1.24829,3.28729-3.58838,0-3.4314.46789-7.01929.3117-10.29517A31.74131,31.74131,0,0,0,147.81145,102.28418Z"/><path class="cls-2" d="M4.97253,58.30615A79.56579,79.56579,0,0,0,2,80.45166a66.6041,66.6041,0,0,0,.31177,7.64307A76.27289,76.27289,0,0,0,5.91137,104.626a2.67956,2.67956,0,0,0,2.65869,2.02856c2.66095.15552,3.91284-1.87231,3.13092-4.68042a70.50594,70.50594,0,0,1-.62634-41.79858V60.178A3.312,3.312,0,0,0,8.8839,55.81055C7.16326,55.3418,5.59887,56.43384,4.97253,58.30615Z"/><path class="cls-2" d="M129.34966,138.7832c2.03522.31177,3.44348-.78027,3.755-3.11963a162.6075,162.6075,0,0,0,2.34717-27.91919,217.74443,217.74443,0,0,0-2.6587-34.62329c-2.0346-12.7915-7.51043-23.551-17.053-32.28637A46.09888,46.09888,0,0,0,105.571,33.66089a3.002,3.002,0,0,0-4.22516,1.092c-.93884,1.55981-.46869,3.27588,1.25189,4.36792a3.92179,3.92179,0,0,0,1.09424.62427c10.4837,6.39355,17.83551,15.283,21.279,27.13672,3.12885,11.38794,3.91077,23.083,4.22308,34.78051a167.16955,167.16955,0,0,1-2.34692,33.0647C126.53539,137.06714,127.47118,138.4707,129.34966,138.7832Z"/><path class="cls-2" d="M128.88177,36.469C115.89556,21.96338,99.46893,14.78955,79.91137,14.6333a64.56588,64.56588,0,0,0-25.34363,5.14844,3.233,3.233,0,0,0-2.03461,4.20947,3.15955,3.15955,0,0,0,4.38154,1.56006,60.109,60.109,0,0,1,28.63018-4.36816A57.799,57.799,0,0,1,120.58959,37.093c10.32434,9.82519,16.268,21.8352,18.30567,36.02807q1.16922,8.42505,1.876,16.84375c.4679,1.87159,1.72058,3.11988,3.44123,3.11988a3.18857,3.18857,0,0,0,2.97265-3.43238V88.56055c-.6242-5.92725-1.25055-11.853-2.19073-17.77881C142.962,57.67969,137.79876,46.13867,128.88177,36.469Z"/><path class="cls-2" d="M46.431,72.65332C50.03,55.02808,68.64819,42.70654,86.4829,46.294a35.29073,35.29073,0,0,1,20.18244,11.85376,8.89448,8.89448,0,0,0,1.72,1.71606,3.1923,3.1923,0,0,0,3.75506-.93555c1.09424-1.40454.93885-2.80835-.31158-4.52441-7.19867-8.73316-16.4289-13.8794-27.84839-14.81519-14.55048-1.248-26.59784,3.90039-35.82654,15.283A38.57484,38.57484,0,0,0,39.861,85.44067c.7804,5.30371,1.72077,10.45215,1.72077,15.75367,0,3.74389,0,7.488-.31171,11.07348a3.006,3.006,0,0,0,2.814,3.27613,3.03829,3.03829,0,0,0,3.44348-2.6521,100.85037,100.85037,0,0,0-.15613-20.58741c-.47021-4.21167-1.87829-8.26733-1.56445-12.16772A39.31056,39.31056,0,0,1,46.431,72.65332Z"/><path class="cls-2" d="M119.35662,140a154.2285,154.2285,0,0,0,3.73535-34.75,159.06937,159.06937,0,0,0-2.03235-26.98242A60.29143,60.29143,0,0,0,118.555,67.19336a3.10573,3.10573,0,0,0-3.91138-2.02783,2.97009,2.97009,0,0,0-2.03229,3.8999c2.5025,9.35986,3.44037,19.02734,4.067,28.853A154.445,154.445,0,0,1,112.9295,140Z"/><path class="cls-2" d="M99.86944,140h6.57776a139.82764,139.82764,0,0,0,4.285-33.96948A167.06829,167.06829,0,0,0,108.0736,76.395c-2.03461-11.07324-7.97833-18.87134-18.30566-22.77075v.00219a28.15763,28.15763,0,0,0-18.92914-.15625c-2.66077.78052-3.44348,3.58545-1.72058,5.30176,1.24981,1.248,2.5025,1.0918,3.91058.624a21.72717,21.72717,0,0,1,28.47247,16.84277,163.58646,163.58646,0,0,1,2.34693,17.31372,137.99558,137.99558,0,0,1-.15619,25.42139A139.47424,139.47424,0,0,1,99.86944,140Z"/><path class="cls-2" d="M157.04247,67.03784q-9.38772-46.78967-54.91259-61.762A45.02188,45.02188,0,0,0,91.80236,3.0918c-1.8783-.156-3.12866.78051-3.28424,2.49585A2.8761,2.8761,0,0,0,91.02062,9.176c.62409.15551,1.25043.15551,1.72058.31176a70.72924,70.72924,0,0,1,40.36347,22.457A69.1805,69.1805,0,0,1,147.0288,54.56006a74.06052,74.06052,0,0,1,4.694,23.2395c.1554,2.3396,1.8783,3.7439,4.06677,3.11987,1.56446-.46777,2.34711-1.71631,2.1908-4.21191A41.34673,41.34673,0,0,0,157.04247,67.03784Z"/><path class="cls-2" d="M45.02288,125.83545a3.02982,3.02982,0,0,0-2.03229-3.89795,3.19793,3.19793,0,0,0-3.91137,2.18408c-.3125.78028-.4679,1.71607-.78254,2.49561a101.972,101.972,0,0,1-5.00714,12.01A4.05833,4.05833,0,0,0,32.93041,140h6.62073A78.5383,78.5383,0,0,0,45.02288,125.83545Z"/><path class="cls-2" d="M93.21142,139.87744a161.52283,161.52283,0,0,0,4.37921-21.68164,3.26475,3.26475,0,0,0-2.81482-3.43164,3.13267,3.13267,0,0,0-3.44342,2.80737A161.54006,161.54006,0,0,1,86.62359,140h6.55493C93.18865,139.95874,93.20135,139.919,93.21142,139.87744Z"/><path class="cls-2" d="M59.41723,118.34961a108.40174,108.40174,0,0,0-.62409-32.59668h-.00232c-1.25054-7.48535-.3117-14.19141,4.85157-20.11963a2.80362,2.80362,0,0,0,.62426-1.40356c.15613-1.55982-.15637-2.80811-1.72058-3.43213a2.98078,2.98078,0,0,0-3.91137.93628c-5.63141,6.55151-7.66584,14.19531-6.41388,22.77319a143.776,143.776,0,0,1,1.87677,19.65112,84.89,84.89,0,0,1-1.87677,19.1836A80.92519,80.92519,0,0,1,46.636,140h6.86078A85.938,85.938,0,0,0,59.41723,118.34961Z"/><path class="cls-2" d="M71.15051,82.94727v-.00245a11.40165,11.40165,0,0,1,0-5.61377,9.11078,9.11078,0,0,1,9.70123-6.55151c4.2229.15552,7.66638,3.27612,8.60217,7.95581A150.64126,150.64126,0,0,1,92.11486,105.25a3.12524,3.12524,0,0,0,3.12885,3.43237c1.879,0,2.97253-1.40356,3.12872-3.27612v-2.80811h.15631c-.3125-4.05542-.4679-8.11181-.93579-12.16528-.47022-4.05566-1.09656-8.11206-1.7229-12.16528A15.95811,15.95811,0,0,0,78.19079,64.5415c-8.13452.93653-14.70685,9.04761-13.454,17.002.62408,4.83593,1.40814,9.66967,1.876,14.50561a100.7663,100.7663,0,0,1-4.69312,39.77Q61.168,137.93139,60.36217,140H67.022C73.40533,121.70972,74.47247,102.69385,71.15051,82.94727Z"/><path class="cls-2" d="M85.23309,94.17212a114.49913,114.49913,0,0,0-2.1908-14.65942,3.09175,3.09175,0,0,0-3.59961-2.49585A3.03673,3.03673,0,0,0,77.09649,80.917a116.673,116.673,0,0,1,2.34619,18.24732,106.72018,106.72018,0,0,1-2.97253,31.50488c-.4679,2.02759.31176,3.7439,2.03442,4.21167,1.87695.468,3.44141-.624,4.06775-2.80811a109.18045,109.18045,0,0,0,3.12866-27.917A75.85951,75.85951,0,0,0,85.23309,94.17212Z"/></g></svg> +\ No newline at end of file +diff --git a/polkit-agent/assets/biowaiting/fingerprint13.svg b/polkit-agent/assets/biowaiting/fingerprint13.svg +new file mode 100644 +index 0000000..9f37f06 +--- /dev/null ++++ b/polkit-agent/assets/biowaiting/fingerprint13.svg +@@ -0,0 +1 @@ ++<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 160 160"><defs><style>.cls-1{opacity:0.2;}.cls-2{fill:#3790fa;}</style></defs><g id="文字标注"><g class="cls-1"><path d="M76.78191,140.809a3.00927,3.00927,0,0,0-4.06695,1.87157l-4.2231,10.29593a2.95177,2.95177,0,0,0,2.34692,4.2097c1.87618,0,2.81427-.62348,3.44061-2.02792q2.35322-4.96514,4.2252-10.13749a3.22338,3.22338,0,0,0-1.72268-4.21179Zm71.02957-38.52241a3.08449,3.08449,0,0,0-3.44119-2.96447,3.01947,3.01947,0,0,0-2.81653,3.276c.15559,5.14854-.15616,10.13768-.31232,15.286,0,2.33947,1.09425,3.58775,2.971,3.74391,1.87844,0,3.28729-1.24829,3.28729-3.58851,0-3.43141.4679-7.01916.31174-10.29517a31.74592,31.74592,0,0,0,0-5.46008ZM42.99057,121.93748a3.19812,3.19812,0,0,0-3.91136,2.18407c-.31251.7804-.4679,1.71618-.7825,2.49562a101.9769,101.9769,0,0,1-5.00714,12.01c-1.09424,2.34022.1554,4.67969,2.66078,4.67969,1.40827.15616,2.34636-.77963,2.9727-2.02772a81.29627,81.29627,0,0,0,6.09985-15.4437,3.02989,3.02989,0,0,0-2.03233-3.898Zm51.78526-7.17321a3.1326,3.1326,0,0,0-3.44347,2.80735,161.02757,161.02757,0,0,1-4.84945,22.9279c-1.25192,4.36718-2.81636,8.73532-4.38079,13.10328a2.97748,2.97748,0,0,0,1.25192,3.898,3.04925,3.04925,0,0,0,3.75521-.3125,5.62684,5.62684,0,0,0,1.25041-2.33946,128.60675,128.60675,0,0,0,4.85174-14.97123,161.5315,161.5315,0,0,0,4.37926-21.68171,3.2645,3.2645,0,0,0-2.81483-3.43159ZM11.07465,60.17791a3.312,3.312,0,0,0-2.19078-4.36738c-1.72059-.46865-3.285.62329-3.91137,2.49561A79.568,79.568,0,0,0,2,80.45155a66.61318,66.61318,0,0,0,.31174,7.6432A76.2778,76.2778,0,0,0,5.91135,104.626,2.67954,2.67954,0,0,0,8.57,106.6545c2.661.15558,3.91289-1.87233,3.131-4.68045a70.50518,70.50518,0,0,1-.62634-41.79842ZM85.701,104.15584a75.86247,75.86247,0,0,0-.4679-9.98362,114.4834,114.4834,0,0,0-2.19078-14.6595,3.09173,3.09173,0,0,0-3.59961-2.49581,3.03667,3.03667,0,0,0-2.34618,3.90025,116.66849,116.66849,0,0,1,2.34618,18.24725,106.72223,106.72223,0,0,1-2.97253,31.50478c-.46789,2.02773.31175,3.74391,2.03443,4.2118,1.87694.4679,3.44137-.62405,4.06772-2.80812a109.17988,109.17988,0,0,0,3.12867-27.917Zm32.854-36.96258a3.10567,3.10567,0,0,0-3.91136-2.02773,2.97022,2.97022,0,0,0-2.03235,3.90006c2.50253,9.35957,3.44042,19.02707,4.067,28.85281a155.422,155.422,0,0,1-5.0079,47.25852c-.46789,2.02792.31232,3.90025,2.0352,4.2118a3.1298,3.1298,0,0,0,4.06695-2.65178,158.74245,158.74245,0,0,0,5.31944-41.48688,159.06625,159.06625,0,0,0-2.03234-26.98258,60.29831,60.29831,0,0,0-2.5046-11.07422ZM15.61236,48.32272A67.88326,67.88326,0,0,1,27.18743,31.633C41.11154,16.81945,58.16451,9.0199,78.663,8.39586c2.34712,0,3.75521-1.24828,3.75521-3.276C82.416,3.09194,81.00788,2,78.50459,2A77.9438,77.9438,0,0,0,10.13446,45.04442a5.77164,5.77164,0,0,0-.62406,2.18407,2.72437,2.72437,0,0,0,1.56425,2.80736c1.72077.93654,3.59676.31231,4.53771-1.71543ZM58.79085,85.753c-1.25058-7.48553-.31174-14.19161,4.85155-20.11959a2.80489,2.80489,0,0,0,.62425-1.40368c.15616-1.55983-.15634-2.80812-1.72059-3.43216a2.98066,2.98066,0,0,0-3.91136.93635c-5.63138,6.55146-7.66581,14.19542-6.41389,22.77308a143.77173,143.77173,0,0,1,1.87675,19.65112,84.8888,84.8888,0,0,1-1.87675,19.18379,87.66557,87.66557,0,0,1-7.822,21.36711,4.07666,4.07666,0,0,0-.78269,2.652,2.99416,2.99416,0,0,0,2.34693,2.652c1.72078.31173,2.815-.31251,3.75521-1.87234a90.1349,90.1349,0,0,0,9.6989-29.79089A108.40061,108.40061,0,0,0,58.79314,85.753ZM22.338,94.48834c-1.09424-7.01916-2.03234-13.88368-1.09424-21.05461A59.14015,59.14015,0,0,1,46.11943,31.47686a3.29673,3.29673,0,0,0,1.56444-3.90024c-.78269-2.18389-2.97347-2.65176-5.16425-1.24735A60.84871,60.84871,0,0,0,29.37821,38.49678a64.52309,64.52309,0,0,0-14.7068,39.7707c-.31174,7.6434,1.72288,15.12892,2.19078,22.61463.3125,4.99219.4679,9.98419-1.09425,14.97429-.4679,1.55983-.93809,3.27525-1.40827,4.52334a3.12377,3.12377,0,0,0,3.12886,3.43008c1.87694,0,2.65868-1.09195,3.285-2.652,3.285-8.57766,2.81712-17.6232,1.56443-26.66951ZM157.04249,67.03786Q147.65476,20.2483,102.1299,5.276A45.00768,45.00768,0,0,0,91.80236,3.09194c-1.87827-.15615-3.12867.78039-3.28426,2.4958a2.87607,2.87607,0,0,0,2.50252,3.58833c.62406.15558,1.25041.15558,1.72059.31175a70.72962,70.72962,0,0,1,40.36348,22.45694A69.18273,69.18273,0,0,1,147.0288,54.56015a74.061,74.061,0,0,1,4.69406,23.23944c.15538,2.33946,1.87825,3.7439,4.06675,3.11986,1.56443-.4679,2.34712-1.71618,2.19076-4.212a41.34713,41.34713,0,0,0-.93788-9.6696ZM115.74016,40.83473a46.09794,46.09794,0,0,0-10.16909-7.17379,3.002,3.002,0,0,0-4.22521,1.09194c-.93885,1.55983-.46866,3.276,1.25194,4.368a3.91739,3.91739,0,0,0,1.09424.62422c10.48369,6.3936,17.83547,15.283,21.27894,27.13666,3.12886,11.38806,3.91079,23.08329,4.22309,34.7806a167.16817,167.16817,0,0,1-2.34693,33.06462c-.31174,2.34023.62405,3.7439,2.50252,4.0564,2.0352.31175,3.44347-.78039,3.755-3.11985a162.60561,162.60561,0,0,0,2.34712-27.91913,217.742,217.742,0,0,0-2.65868-34.62312c-2.03462-12.79173-7.51042-23.55117-17.053-32.2865ZM89.76793,53.62646a28.15742,28.15742,0,0,0-18.92915-.15615c-2.66076.78037-3.44345,3.58546-1.72059,5.30163C70.368,60.02,71.62072,59.86389,73.0288,59.396a21.72731,21.72731,0,0,1,28.47247,16.8428,163.579,163.579,0,0,1,2.34692,17.31375A137.99692,137.99692,0,0,1,103.692,118.974a149.65137,149.65137,0,0,1-7.04023,31.97477c-.1554.62405-.4679,1.092-.31155,1.71618a3.009,3.009,0,0,0,2.81483,2.65177,3.073,3.073,0,0,0,3.44271-2.34022,143.91473,143.91473,0,0,0,8.13446-46.946,167.06542,167.06542,0,0,0-2.65866-29.6353c-2.03463-11.07347-7.97832-18.87149-18.30567-22.77079ZM46.431,72.65334C50.03,55.02805,68.6482,42.7065,86.48291,46.294a35.29014,35.29014,0,0,1,20.18241,11.85368,8.8989,8.8989,0,0,0,1.72,1.71617,3.19219,3.19219,0,0,0,3.755-.93579c1.09424-1.40444.93885-2.80812-.31155-4.5243-7.19867-8.733-16.42891-13.87928-27.84841-14.81508-14.55045-1.2481-26.59781,3.90025-35.82653,15.283A38.57474,38.57474,0,0,0,39.861,85.4407c.7804,5.30373,1.72078,10.45208,1.72078,15.75372,0,3.74391,0,7.488-.31175,11.07347a3.00588,3.00588,0,0,0,2.81408,3.276,3.03818,3.03818,0,0,0,3.44346-2.652,100.85173,100.85173,0,0,0-.15616-20.58748c-.47018-4.21179-1.87827-8.26743-1.56443-12.16769a39.31083,39.31083,0,0,1,.62406-7.48342Zm97.78146,20.43132a3.18855,3.18855,0,0,0,2.97269-3.43217V88.56056c-.62425-5.92722-1.2506-11.8531-2.19077-17.77879-2.03234-13.10195-7.19563-24.64312-16.1126-34.31273C115.89556,21.96341,99.46893,14.78945,79.91135,14.63329a64.57055,64.57055,0,0,0-25.3436,5.14835,3.23306,3.23306,0,0,0-2.03462,4.20951,3.15933,3.15933,0,0,0,4.38155,1.56A60.10931,60.10931,0,0,1,85.54483,21.183a57.79887,57.79887,0,0,1,35.04478,15.91007c10.32431,9.82517,16.268,21.835,18.30566,36.02812q1.16919,8.42465,1.876,16.84377c.46789,1.87157,1.72058,3.11966,3.44119,3.11966ZM71.15053,82.94489a11.40154,11.40154,0,0,1,0-5.614,9.11075,9.11075,0,0,1,9.70119-6.55146c4.22292.15558,7.66638,3.2762,8.60218,7.9559a150.63952,150.63952,0,0,1,2.661,26.51468,3.1253,3.1253,0,0,0,3.12886,3.43236c1.879,0,2.97252-1.40367,3.12867-3.276V102.5981h.15635c-.3125-4.05545-.4679-8.11185-.9358-12.16521-.47019-4.05565-1.09654-8.11206-1.72288-12.16541a15.95817,15.95817,0,0,0-17.67931-13.726c-8.13447.93654-14.7068,9.04763-13.45392,17.002.624,4.83584,1.40808,9.6696,1.876,14.50563a100.76542,100.76542,0,0,1-4.6931,39.77,111.03563,111.03563,0,0,1-5.9437,14.03754,3.0595,3.0595,0,0,0,.15616,3.43236,2.8478,2.8478,0,0,0,2.97252,1.24752,3.58665,3.58665,0,0,0,2.815-2.33946C72.715,130.2034,75.21748,107.1224,71.15053,82.94717ZM34.38591,91.52482c-.7825-5.30393-1.565-10.76381-1.09634-16.06545A45.82536,45.82536,0,0,1,49.87464,44.26631a45.38952,45.38952,0,0,1,28.16-10.76171,44.31362,44.31362,0,0,1,12.82986,1.24828,3.86111,3.86111,0,0,0,1.87675.15616,2.85951,2.85951,0,0,0,2.50252-2.80814,3.03932,3.03932,0,0,0-2.34694-3.276,45.95556,45.95556,0,0,0-13.14161-1.55984,34.70559,34.70559,0,0,0-9.69889.93577C54.25524,31.16513,42.20807,39.74505,33.91516,53.62436a50.635,50.635,0,0,0-6.56928,32.59653c.4679,4.36814,1.40808,8.57995,1.71983,12.94809.62405,10.75944-.78175,21.20867-5.6312,30.87827a3.03318,3.03318,0,0,0-.47018,2.02771,2.8529,2.8529,0,0,0,2.65867,2.652,3.38107,3.38107,0,0,0,3.44271-2.02772c6.57-12.9458,7.51022-26.98125,5.3202-41.17439Zm0,0"/></g><path class="cls-2" d="M25.623,134.72705a3.38147,3.38147,0,0,0,3.44275-2.02783c6.57-12.9458,7.51019-26.9812,5.32019-41.17432-.78253-5.304-1.565-10.76391-1.09638-16.06543A45.82521,45.82521,0,0,1,49.87463,44.26636a45.3888,45.3888,0,0,1,28.16-10.76172,44.30565,44.30565,0,0,1,12.82983,1.24829,3.86367,3.86367,0,0,0,1.87677.156,2.85936,2.85936,0,0,0,2.50251-2.80811A3.0391,3.0391,0,0,0,92.89678,28.825a45.94687,45.94687,0,0,0-13.1416-1.55981,34.707,34.707,0,0,0-9.69891.93554C54.25524,31.165,42.20806,39.74512,33.91515,53.62427A50.63525,50.63525,0,0,0,27.34588,86.221c.46789,4.36792,1.40808,8.57983,1.71985,12.948.624,10.75952-.78174,21.20874-5.63123,30.87841a3.0328,3.0328,0,0,0-.47015,2.02759A2.85307,2.85307,0,0,0,25.623,134.72705Z"/><path class="cls-2" d="M113.70556,149.38867a3.12978,3.12978,0,0,0,4.06695-2.65185A158.74374,158.74374,0,0,0,123.092,105.25a159.06937,159.06937,0,0,0-2.03235-26.98242A60.29143,60.29143,0,0,0,118.555,67.19336a3.10573,3.10573,0,0,0-3.91138-2.02783,2.97009,2.97009,0,0,0-2.03229,3.8999c2.5025,9.35986,3.44037,19.02734,4.067,28.853a155.41963,155.41963,0,0,1-5.00794,47.2583C111.20245,147.20483,111.98266,149.07715,113.70556,149.38867Z"/><path class="cls-2" d="M35.95037,143.30688c1.40826.156,2.34631-.77954,2.97266-2.02783a81.2963,81.2963,0,0,0,6.09985-15.4436,3.02982,3.02982,0,0,0-2.03229-3.89795,3.19793,3.19793,0,0,0-3.91137,2.18408c-.3125.78028-.4679,1.71607-.78254,2.49561a101.972,101.972,0,0,1-5.00714,12.01C32.1953,140.96729,33.445,143.30688,35.95037,143.30688Z"/><path class="cls-2" d="M46.431,72.65332C50.03,55.02808,68.64819,42.70654,86.4829,46.294a35.29073,35.29073,0,0,1,20.18244,11.85376,8.89448,8.89448,0,0,0,1.72,1.71606,3.1923,3.1923,0,0,0,3.75506-.93555c1.09424-1.40454.93885-2.80835-.31158-4.52441-7.19867-8.73316-16.4289-13.8794-27.84839-14.81519-14.55048-1.248-26.59784,3.90039-35.82654,15.283A38.57484,38.57484,0,0,0,39.861,85.44067c.7804,5.30371,1.72077,10.45215,1.72077,15.75367,0,3.74389,0,7.488-.31171,11.07348a3.006,3.006,0,0,0,2.814,3.27613,3.03829,3.03829,0,0,0,3.44348-2.6521,100.85037,100.85037,0,0,0-.15613-20.58741c-.47021-4.21167-1.87829-8.26733-1.56445-12.16772A39.31056,39.31056,0,0,1,46.431,72.65332Z"/><path class="cls-2" d="M14.35967,120.37964a3.12376,3.12376,0,0,0,3.12885,3.43017c1.87695,0,2.65869-1.092,3.285-2.6521,3.285-8.57763,2.81714-17.623,1.56446-26.66943-1.09424-7.019-2.03235-13.88354-1.09424-21.05469A59.14042,59.14042,0,0,1,46.11944,31.47681a3.29665,3.29665,0,0,0,1.56445-3.90015c-.78271-2.18408-2.97351-2.65186-5.16424-1.24731A60.84242,60.84242,0,0,0,29.37823,38.49683,64.52224,64.52224,0,0,0,14.67144,78.26758c-.31177,7.64331,1.72284,15.1289,2.19073,22.6145.3125,4.99219.4679,9.98413-1.09423,14.97437C15.3,117.41626,14.82983,119.13159,14.35967,120.37964Z"/><path class="cls-2" d="M147.81145,102.28418v.00244a3.08448,3.08448,0,0,0-3.44116-2.9646,3.01965,3.01965,0,0,0-2.81653,3.27612c.15558,5.14844-.15618,10.1377-.31231,15.28589,0,2.3396,1.09424,3.58789,2.971,3.7439,1.87841,0,3.28729-1.24829,3.28729-3.58838,0-3.4314.46789-7.01929.3117-10.29517A31.74131,31.74131,0,0,0,147.81145,102.28418Z"/><path class="cls-2" d="M129.34966,138.7832c2.03522.31177,3.44348-.78027,3.755-3.11963a162.6075,162.6075,0,0,0,2.34717-27.91919,217.74443,217.74443,0,0,0-2.6587-34.62329c-2.0346-12.7915-7.51043-23.551-17.053-32.28637A46.09888,46.09888,0,0,0,105.571,33.66089a3.002,3.002,0,0,0-4.22516,1.092c-.93884,1.55981-.46869,3.27588,1.25189,4.36792a3.92179,3.92179,0,0,0,1.09424.62427c10.4837,6.39355,17.83551,15.283,21.279,27.13672,3.12885,11.38794,3.91077,23.083,4.22308,34.78051a167.16955,167.16955,0,0,1-2.34692,33.0647C126.53539,137.06714,127.47118,138.4707,129.34966,138.7832Z"/><path class="cls-2" d="M128.88177,36.469C115.89556,21.96338,99.46893,14.78955,79.91137,14.6333a64.56588,64.56588,0,0,0-25.34363,5.14844,3.233,3.233,0,0,0-2.03461,4.20947,3.15955,3.15955,0,0,0,4.38154,1.56006,60.109,60.109,0,0,1,28.63018-4.36816A57.799,57.799,0,0,1,120.58959,37.093c10.32434,9.82519,16.268,21.8352,18.30567,36.02807q1.16922,8.42505,1.876,16.84375c.4679,1.87159,1.72058,3.11988,3.44123,3.11988a3.18857,3.18857,0,0,0,2.97265-3.43238V88.56055c-.6242-5.92725-1.25055-11.853-2.19073-17.77881C142.962,57.67969,137.79876,46.13867,128.88177,36.469Z"/><path class="cls-2" d="M157.04247,67.03784q-9.38772-46.78967-54.91259-61.762A45.02188,45.02188,0,0,0,91.80236,3.0918c-1.8783-.156-3.12866.78051-3.28424,2.49585A2.8761,2.8761,0,0,0,91.02062,9.176c.62409.15551,1.25043.15551,1.72058.31176a70.72924,70.72924,0,0,1,40.36347,22.457A69.1805,69.1805,0,0,1,147.0288,54.56006a74.06052,74.06052,0,0,1,4.694,23.2395c.1554,2.3396,1.8783,3.7439,4.06677,3.11987,1.56446-.46777,2.34711-1.71631,2.1908-4.21191A41.34673,41.34673,0,0,0,157.04247,67.03784Z"/><path class="cls-2" d="M78.50457,145.02075a3.22325,3.22325,0,0,0-1.72266-4.21167,3.00909,3.00909,0,0,0-4.06695,1.87158L69.7127,150h6.85645Q77.59344,147.53321,78.50457,145.02075Z"/><path class="cls-2" d="M93.21142,139.87744a161.52283,161.52283,0,0,0,4.37921-21.68164,3.26475,3.26475,0,0,0-2.81482-3.43164,3.13267,3.13267,0,0,0-3.44342,2.80737,161.03368,161.03368,0,0,1-4.84949,22.928C85.57519,143.666,84.5014,146.833,83.38421,150h6.7409A104.796,104.796,0,0,0,93.21142,139.87744Z"/><path class="cls-2" d="M110.73223,106.03052A167.06829,167.06829,0,0,0,108.0736,76.395c-2.03461-11.07324-7.97833-18.87134-18.30566-22.77075v.00219a28.15763,28.15763,0,0,0-18.92914-.15625c-2.66077.78052-3.44348,3.58545-1.72058,5.30176,1.24981,1.248,2.5025,1.0918,3.91058.624a21.72717,21.72717,0,0,1,28.47247,16.84277,163.58646,163.58646,0,0,1,2.34693,17.31372,137.99558,137.99558,0,0,1-.15619,25.42139A148.68041,148.68041,0,0,1,96.95287,150H103.59A142.91971,142.91971,0,0,0,110.73223,106.03052Z"/><path class="cls-2" d="M85.23309,94.17212a114.49913,114.49913,0,0,0-2.1908-14.65942,3.09175,3.09175,0,0,0-3.59961-2.49585A3.03673,3.03673,0,0,0,77.09649,80.917a116.673,116.673,0,0,1,2.34619,18.24732,106.72018,106.72018,0,0,1-2.97253,31.50488c-.4679,2.02759.31176,3.7439,2.03442,4.21167,1.87695.468,3.44141-.624,4.06775-2.80811a109.18045,109.18045,0,0,0,3.12866-27.917A75.85951,75.85951,0,0,0,85.23309,94.17212Z"/><path class="cls-2" d="M78.50457,2A77.94379,77.94379,0,0,0,10.13445,45.04443a5.77193,5.77193,0,0,0-.624,2.18409,2.72441,2.72441,0,0,0,1.56421,2.80737c1.72076.93652,3.5968.31225,4.53772-1.71558v.00244A67.88222,67.88222,0,0,1,27.18743,31.63306C41.11156,16.81934,58.16448,9.02,78.663,8.39575c2.34717,0,3.75525-1.24829,3.75525-3.27588C82.416,3.0918,81.00787,2,78.50457,2Z"/><path class="cls-2" d="M4.97253,58.30615A79.56579,79.56579,0,0,0,2,80.45166a66.6041,66.6041,0,0,0,.31177,7.64307A76.27289,76.27289,0,0,0,5.91137,104.626a2.67956,2.67956,0,0,0,2.65869,2.02856c2.66095.15552,3.91284-1.87231,3.13092-4.68042a70.50594,70.50594,0,0,1-.62634-41.79858V60.178A3.312,3.312,0,0,0,8.8839,55.81055C7.16326,55.3418,5.59887,56.43384,4.97253,58.30615Z"/><path class="cls-2" d="M49.71832,148.14062a90.13545,90.13545,0,0,0,9.69891-29.791,108.40174,108.40174,0,0,0-.62409-32.59668h-.00232c-1.25054-7.48535-.3117-14.19141,4.85157-20.11963a2.80362,2.80362,0,0,0,.62426-1.40356c.15613-1.55982-.15637-2.80811-1.72058-3.43213a2.98078,2.98078,0,0,0-3.91137.93628c-5.63141,6.55151-7.66584,14.19531-6.41388,22.77319a143.776,143.776,0,0,1,1.87677,19.65112,84.89,84.89,0,0,1-1.87677,19.1836,87.66422,87.66422,0,0,1-7.822,21.36718,4.07726,4.07726,0,0,0-.78272,2.65186A2.99783,2.99783,0,0,0,45.91943,150h1.58313A3.59038,3.59038,0,0,0,49.71832,148.14062Z"/><path class="cls-2" d="M71.15051,82.94727v-.00245a11.40165,11.40165,0,0,1,0-5.61377,9.11078,9.11078,0,0,1,9.70123-6.55151c4.2229.15552,7.66638,3.27612,8.60217,7.95581A150.64126,150.64126,0,0,1,92.11486,105.25a3.12524,3.12524,0,0,0,3.12885,3.43237c1.879,0,2.97253-1.40356,3.12872-3.27612v-2.80811h.15631c-.3125-4.05542-.4679-8.11181-.93579-12.16528-.47022-4.05566-1.09656-8.11206-1.7229-12.16528A15.95811,15.95811,0,0,0,78.19079,64.5415c-8.13452.93653-14.70685,9.04761-13.454,17.002.62408,4.83593,1.40814,9.66967,1.876,14.50561a100.7663,100.7663,0,0,1-4.69312,39.77A111.03121,111.03121,0,0,1,55.976,149.85645c-.027.04711-.046.09594-.07068.14355h7.03808C72.84978,128.6665,75.08245,106.31982,71.15051,82.94727Z"/></g></svg> +\ No newline at end of file +diff --git a/polkit-agent/assets/biowaiting/fingerprint14.svg b/polkit-agent/assets/biowaiting/fingerprint14.svg +new file mode 100644 +index 0000000..c3c6675 +--- /dev/null ++++ b/polkit-agent/assets/biowaiting/fingerprint14.svg +@@ -0,0 +1 @@ ++<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 160 160"><defs><style>.cls-1{fill:#3790fa;}</style></defs><g id="文字标注"><path class="cls-1" d="M76.78191,140.809a3.00926,3.00926,0,0,0-4.06694,1.87157l-4.22311,10.29593a2.95177,2.95177,0,0,0,2.34693,4.2097c1.87618,0,2.81427-.62348,3.44061-2.02792q2.35321-4.96514,4.2252-10.13749a3.22339,3.22339,0,0,0-1.72269-4.21179Zm71.02958-38.52241a3.08449,3.08449,0,0,0-3.44119-2.96447,3.01947,3.01947,0,0,0-2.81653,3.276c.15559,5.14854-.15616,10.13768-.31232,15.286,0,2.33947,1.09425,3.58775,2.971,3.74391,1.87844,0,3.28728-1.24829,3.28728-3.58851,0-3.43141.46791-7.01916.31175-10.29517a31.74592,31.74592,0,0,0,0-5.46008ZM42.99058,121.93748a3.19813,3.19813,0,0,0-3.91137,2.18407c-.3125.7804-.4679,1.71618-.7825,2.49562a101.97516,101.97516,0,0,1-5.00713,12.01c-1.09424,2.34022.1554,4.67969,2.66077,4.67969,1.40828.15616,2.34636-.77963,2.97271-2.02772a81.29759,81.29759,0,0,0,6.09985-15.4437,3.0299,3.0299,0,0,0-2.03233-3.898Zm51.78525-7.17321a3.13259,3.13259,0,0,0-3.44346,2.80735,161.02757,161.02757,0,0,1-4.84945,22.9279c-1.25193,4.36718-2.81636,8.73532-4.38079,13.10328a2.97748,2.97748,0,0,0,1.25192,3.898,3.04925,3.04925,0,0,0,3.75521-.3125,5.627,5.627,0,0,0,1.25041-2.33946,128.60479,128.60479,0,0,0,4.85173-14.97123,161.52838,161.52838,0,0,0,4.37926-21.68171,3.2645,3.2645,0,0,0-2.81483-3.43159ZM11.07466,60.17791a3.31205,3.31205,0,0,0-2.19078-4.36738c-1.72059-.46865-3.285.62329-3.91137,2.49561A79.568,79.568,0,0,0,2,80.45155a66.61318,66.61318,0,0,0,.31174,7.6432A76.2778,76.2778,0,0,0,5.91136,104.626,2.67954,2.67954,0,0,0,8.57,106.6545c2.661.15558,3.91289-1.87233,3.13095-4.68045a70.50526,70.50526,0,0,1-.62633-41.79842ZM85.701,104.15584a75.8642,75.8642,0,0,0-.4679-9.98362,114.4834,114.4834,0,0,0-2.19078-14.6595,3.09174,3.09174,0,0,0-3.59962-2.49581,3.03668,3.03668,0,0,0-2.34617,3.90025,116.66849,116.66849,0,0,1,2.34617,18.24725,106.72189,106.72189,0,0,1-2.97252,31.50478c-.46789,2.02773.31174,3.74391,2.03443,4.2118,1.87694.4679,3.44137-.62405,4.06772-2.80812a109.18033,109.18033,0,0,0,3.12867-27.917Zm32.854-36.96258a3.10567,3.10567,0,0,0-3.91136-2.02773,2.97022,2.97022,0,0,0-2.03235,3.90006c2.50253,9.35957,3.44041,19.02707,4.067,28.85281a155.42236,155.42236,0,0,1-5.0079,47.25852c-.46789,2.02792.31232,3.90025,2.03519,4.2118a3.12981,3.12981,0,0,0,4.067-2.65178,158.74287,158.74287,0,0,0,5.31944-41.48688,159.06625,159.06625,0,0,0-2.03234-26.98258,60.29831,60.29831,0,0,0-2.5046-11.07422ZM15.61237,48.32272A67.883,67.883,0,0,1,27.18744,31.633C41.11155,16.81945,58.16452,9.0199,78.66305,8.39586c2.34712,0,3.75521-1.24828,3.75521-3.276C82.416,3.09194,81.00789,2,78.5046,2A77.9438,77.9438,0,0,0,10.13447,45.04442a5.77164,5.77164,0,0,0-.62406,2.18407,2.72436,2.72436,0,0,0,1.56425,2.80736c1.72077.93654,3.59676.31231,4.53771-1.71543ZM58.79086,85.753c-1.25059-7.48553-.31175-14.19161,4.85155-20.11959a2.805,2.805,0,0,0,.62425-1.40368c.15616-1.55983-.15635-2.80812-1.7206-3.43216a2.98066,2.98066,0,0,0-3.91136.93635c-5.63137,6.55146-7.66581,14.19542-6.41388,22.77308a143.77173,143.77173,0,0,1,1.87675,19.65112,84.88938,84.88938,0,0,1-1.87675,19.18379,87.66557,87.66557,0,0,1-7.822,21.36711,4.07667,4.07667,0,0,0-.7827,2.652,2.99418,2.99418,0,0,0,2.34693,2.652c1.72079.31173,2.815-.31251,3.75521-1.87234a90.13491,90.13491,0,0,0,9.69891-29.79089A108.40093,108.40093,0,0,0,58.79315,85.753ZM22.338,94.48834c-1.09423-7.01916-2.03233-13.88368-1.09423-21.05461A59.14015,59.14015,0,0,1,46.11944,31.47686a3.29673,3.29673,0,0,0,1.56444-3.90024c-.78269-2.18389-2.97348-2.65176-5.16425-1.24735A60.84871,60.84871,0,0,0,29.37822,38.49678a64.523,64.523,0,0,0-14.7068,39.7707c-.31174,7.6434,1.72287,15.12892,2.19077,22.61463.31251,4.99219.46791,9.98419-1.09424,14.97429-.4679,1.55983-.93809,3.27525-1.40827,4.52334a3.12377,3.12377,0,0,0,3.12886,3.43008c1.87693,0,2.65868-1.09195,3.285-2.652,3.285-8.57766,2.81711-17.6232,1.56442-26.66951ZM157.0425,67.03786Q147.65477,20.2483,102.12991,5.276A45.00768,45.00768,0,0,0,91.80237,3.09194c-1.87828-.15615-3.12867.78039-3.28426,2.4958a2.87607,2.87607,0,0,0,2.50252,3.58833c.62406.15558,1.2504.15558,1.72059.31175A70.72962,70.72962,0,0,1,133.1047,31.94476a69.18254,69.18254,0,0,1,13.9241,22.61539,74.061,74.061,0,0,1,4.69407,23.23944c.15538,2.33946,1.87825,3.7439,4.06674,3.11986,1.56444-.4679,2.34713-1.71618,2.19077-4.212a41.34713,41.34713,0,0,0-.93788-9.6696ZM115.74016,40.83473a46.09788,46.09788,0,0,0-10.16908-7.17379,3.002,3.002,0,0,0-4.22521,1.09194c-.93885,1.55983-.46866,3.276,1.25193,4.368a3.91752,3.91752,0,0,0,1.09424.62422c10.4837,6.3936,17.83548,15.283,21.27894,27.13666,3.12887,11.38806,3.9108,23.08329,4.22309,34.7806a167.16816,167.16816,0,0,1-2.34692,33.06462c-.31174,2.34023.624,3.7439,2.50251,4.0564,2.03521.31175,3.44347-.78039,3.755-3.11985a162.60561,162.60561,0,0,0,2.34712-27.91913,217.74083,217.74083,0,0,0-2.65869-34.62312c-2.03461-12.79173-7.51041-23.55117-17.053-32.2865ZM89.76794,53.62646a28.15742,28.15742,0,0,0-18.92915-.15615c-2.66077.78037-3.44346,3.58546-1.72059,5.30163,1.24984,1.24809,2.50253,1.09195,3.91061.62406a21.7273,21.7273,0,0,1,28.47246,16.8428,163.57907,163.57907,0,0,1,2.34693,17.31375A137.996,137.996,0,0,1,103.692,118.974a149.65135,149.65135,0,0,1-7.04022,31.97477c-.1554.62405-.4679,1.092-.31155,1.71618a3.009,3.009,0,0,0,2.81483,2.65177,3.073,3.073,0,0,0,3.4427-2.34022,143.91448,143.91448,0,0,0,8.13447-46.946,167.06448,167.06448,0,0,0-2.65867-29.6353c-2.03462-11.07347-7.97831-18.87149-18.30566-22.77079ZM46.431,72.65334C50.03005,55.02805,68.64821,42.7065,86.48292,46.294a35.29014,35.29014,0,0,1,20.18241,11.85368,8.8989,8.8989,0,0,0,1.72,1.71617,3.19219,3.19219,0,0,0,3.755-.93579c1.09424-1.40444.93885-2.80812-.31155-4.5243-7.19867-8.733-16.42891-13.87928-27.84841-14.81508-14.55046-1.2481-26.59781,3.90025-35.82653,15.283A38.57467,38.57467,0,0,0,39.861,85.4407c.7804,5.30373,1.72077,10.45208,1.72077,15.75372,0,3.74391,0,7.488-.31174,11.07347a3.00588,3.00588,0,0,0,2.81408,3.276,3.03818,3.03818,0,0,0,3.44346-2.652,100.85173,100.85173,0,0,0-.15616-20.58748c-.47018-4.21179-1.87827-8.26743-1.56443-12.16769a39.31,39.31,0,0,1,.62406-7.48342Zm97.78146,20.43132a3.18855,3.18855,0,0,0,2.97269-3.43217V88.56056c-.62425-5.92722-1.2506-11.8531-2.19077-17.77879-2.03235-13.10195-7.19563-24.64312-16.1126-34.31273C115.89557,21.96341,99.46894,14.78945,79.91136,14.63329a64.57052,64.57052,0,0,0-25.3436,5.14835,3.233,3.233,0,0,0-2.03462,4.20951,3.15932,3.15932,0,0,0,4.38154,1.56A60.10933,60.10933,0,0,1,85.54483,21.183a57.79887,57.79887,0,0,1,35.04479,15.91007c10.32431,9.82517,16.268,21.835,18.30566,36.02812q1.16919,8.42465,1.876,16.84377c.46789,1.87157,1.72058,3.11966,3.44119,3.11966ZM71.15054,82.94489a11.40154,11.40154,0,0,1,0-5.614,9.11075,9.11075,0,0,1,9.70119-6.55146c4.22292.15558,7.66638,3.2762,8.60218,7.9559a150.63857,150.63857,0,0,1,2.661,26.51468,3.1253,3.1253,0,0,0,3.12887,3.43236c1.879,0,2.97252-1.40367,3.12867-3.276V102.5981h.15635c-.3125-4.05545-.4679-8.11185-.93581-12.16521-.47018-4.05565-1.09653-8.11206-1.72287-12.16541a15.95817,15.95817,0,0,0-17.67931-13.726c-8.13448.93654-14.7068,9.04763-13.45393,17.002.62406,4.83584,1.40809,9.6696,1.876,14.50563a100.76525,100.76525,0,0,1-4.69311,39.77A111.03411,111.03411,0,0,1,55.976,149.85661a3.05946,3.05946,0,0,0,.15616,3.43236,2.84779,2.84779,0,0,0,2.97251,1.24752,3.58665,3.58665,0,0,0,2.815-2.33946C72.715,130.2034,75.21748,107.1224,71.15054,82.94717ZM34.38592,91.52482c-.7825-5.30393-1.565-10.76381-1.09634-16.06545A45.82532,45.82532,0,0,1,49.87465,44.26631a45.38948,45.38948,0,0,1,28.16-10.76171,44.31355,44.31355,0,0,1,12.82985,1.24828,3.86115,3.86115,0,0,0,1.87676.15616,2.85951,2.85951,0,0,0,2.50252-2.80814,3.03932,3.03932,0,0,0-2.34694-3.276,45.9556,45.9556,0,0,0-13.14161-1.55984,34.7057,34.7057,0,0,0-9.6989.93577c-15.801,2.96429-27.84821,11.54421-36.14113,25.42352a50.63513,50.63513,0,0,0-6.56928,32.59653C27.81379,90.589,28.754,94.80084,29.06571,99.169c.62406,10.75944-.78174,21.20867-5.63119,30.87827a3.03324,3.03324,0,0,0-.47019,2.02771,2.85292,2.85292,0,0,0,2.65868,2.652,3.38105,3.38105,0,0,0,3.4427-2.02772c6.57-12.9458,7.51023-26.98125,5.32021-41.17439Zm0,0"/></g></svg> +\ No newline at end of file +diff --git a/polkit-agent/assets/biowaiting/fingerprint2.svg b/polkit-agent/assets/biowaiting/fingerprint2.svg +new file mode 100644 +index 0000000..ce0a21b +--- /dev/null ++++ b/polkit-agent/assets/biowaiting/fingerprint2.svg +@@ -0,0 +1 @@ ++<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 160 160"><defs><style>.cls-1{opacity:0.2;}.cls-2{fill:#3790fa;}</style></defs><g id="文字标注"><g class="cls-1"><path d="M76.78191,140.809a3.00926,3.00926,0,0,0-4.06694,1.87157l-4.22311,10.29593a2.95177,2.95177,0,0,0,2.34693,4.2097c1.87618,0,2.81427-.62348,3.44061-2.02792q2.35321-4.96514,4.2252-10.13749a3.22339,3.22339,0,0,0-1.72269-4.21179Zm71.02958-38.52241a3.08449,3.08449,0,0,0-3.44119-2.96447,3.01947,3.01947,0,0,0-2.81653,3.276c.15559,5.14854-.15616,10.13768-.31232,15.286,0,2.33947,1.09425,3.58775,2.971,3.74391,1.87844,0,3.28728-1.24829,3.28728-3.58851,0-3.43141.46791-7.01916.31175-10.29517a31.74592,31.74592,0,0,0,0-5.46008ZM42.99058,121.93748a3.19813,3.19813,0,0,0-3.91137,2.18407c-.3125.7804-.4679,1.71618-.7825,2.49562a101.97516,101.97516,0,0,1-5.00713,12.01c-1.09424,2.34022.1554,4.67969,2.66077,4.67969,1.40828.15616,2.34636-.77963,2.97271-2.02772a81.29759,81.29759,0,0,0,6.09985-15.4437,3.0299,3.0299,0,0,0-2.03233-3.898Zm51.78525-7.17321a3.13259,3.13259,0,0,0-3.44346,2.80735,161.02757,161.02757,0,0,1-4.84945,22.9279c-1.25193,4.36718-2.81636,8.73532-4.38079,13.10328a2.97748,2.97748,0,0,0,1.25192,3.898,3.04925,3.04925,0,0,0,3.75521-.3125,5.627,5.627,0,0,0,1.25041-2.33946,128.60479,128.60479,0,0,0,4.85173-14.97123,161.52838,161.52838,0,0,0,4.37926-21.68171,3.2645,3.2645,0,0,0-2.81483-3.43159ZM11.07466,60.17791a3.31205,3.31205,0,0,0-2.19078-4.36738c-1.72059-.46865-3.285.62329-3.91137,2.49561A79.568,79.568,0,0,0,2,80.45155a66.61318,66.61318,0,0,0,.31174,7.6432A76.2778,76.2778,0,0,0,5.91136,104.626,2.67954,2.67954,0,0,0,8.57,106.6545c2.661.15558,3.91289-1.87233,3.13095-4.68045a70.50526,70.50526,0,0,1-.62633-41.79842ZM85.701,104.15584a75.8642,75.8642,0,0,0-.4679-9.98362,114.4834,114.4834,0,0,0-2.19078-14.6595,3.09174,3.09174,0,0,0-3.59962-2.49581,3.03668,3.03668,0,0,0-2.34617,3.90025,116.66849,116.66849,0,0,1,2.34617,18.24725,106.72189,106.72189,0,0,1-2.97252,31.50478c-.46789,2.02773.31174,3.74391,2.03443,4.2118,1.87694.4679,3.44137-.62405,4.06772-2.80812a109.18033,109.18033,0,0,0,3.12867-27.917Zm32.854-36.96258a3.10567,3.10567,0,0,0-3.91136-2.02773,2.97022,2.97022,0,0,0-2.03235,3.90006c2.50253,9.35957,3.44041,19.02707,4.067,28.85281a155.42236,155.42236,0,0,1-5.0079,47.25852c-.46789,2.02792.31232,3.90025,2.03519,4.2118a3.12981,3.12981,0,0,0,4.067-2.65178,158.74287,158.74287,0,0,0,5.31944-41.48688,159.06625,159.06625,0,0,0-2.03234-26.98258,60.29831,60.29831,0,0,0-2.5046-11.07422ZM15.61237,48.32272A67.883,67.883,0,0,1,27.18744,31.633C41.11155,16.81945,58.16452,9.0199,78.66305,8.39586c2.34712,0,3.75521-1.24828,3.75521-3.276C82.416,3.09194,81.00789,2,78.5046,2A77.9438,77.9438,0,0,0,10.13447,45.04442a5.77164,5.77164,0,0,0-.62406,2.18407,2.72436,2.72436,0,0,0,1.56425,2.80736c1.72077.93654,3.59676.31231,4.53771-1.71543ZM58.79086,85.753c-1.25059-7.48553-.31175-14.19161,4.85155-20.11959a2.805,2.805,0,0,0,.62425-1.40368c.15616-1.55983-.15635-2.80812-1.7206-3.43216a2.98066,2.98066,0,0,0-3.91136.93635c-5.63137,6.55146-7.66581,14.19542-6.41388,22.77308a143.77173,143.77173,0,0,1,1.87675,19.65112,84.88938,84.88938,0,0,1-1.87675,19.18379,87.66557,87.66557,0,0,1-7.822,21.36711,4.07667,4.07667,0,0,0-.7827,2.652,2.99418,2.99418,0,0,0,2.34693,2.652c1.72079.31173,2.815-.31251,3.75521-1.87234a90.13491,90.13491,0,0,0,9.69891-29.79089A108.40093,108.40093,0,0,0,58.79315,85.753ZM22.338,94.48834c-1.09423-7.01916-2.03233-13.88368-1.09423-21.05461A59.14015,59.14015,0,0,1,46.11944,31.47686a3.29673,3.29673,0,0,0,1.56444-3.90024c-.78269-2.18389-2.97348-2.65176-5.16425-1.24735A60.84871,60.84871,0,0,0,29.37822,38.49678a64.523,64.523,0,0,0-14.7068,39.7707c-.31174,7.6434,1.72287,15.12892,2.19077,22.61463.31251,4.99219.46791,9.98419-1.09424,14.97429-.4679,1.55983-.93809,3.27525-1.40827,4.52334a3.12377,3.12377,0,0,0,3.12886,3.43008c1.87693,0,2.65868-1.09195,3.285-2.652,3.285-8.57766,2.81711-17.6232,1.56442-26.66951ZM157.0425,67.03786Q147.65477,20.2483,102.12991,5.276A45.00768,45.00768,0,0,0,91.80237,3.09194c-1.87828-.15615-3.12867.78039-3.28426,2.4958a2.87607,2.87607,0,0,0,2.50252,3.58833c.62406.15558,1.2504.15558,1.72059.31175A70.72962,70.72962,0,0,1,133.1047,31.94476a69.18254,69.18254,0,0,1,13.9241,22.61539,74.061,74.061,0,0,1,4.69407,23.23944c.15538,2.33946,1.87825,3.7439,4.06674,3.11986,1.56444-.4679,2.34713-1.71618,2.19077-4.212a41.34713,41.34713,0,0,0-.93788-9.6696ZM115.74016,40.83473a46.09788,46.09788,0,0,0-10.16908-7.17379,3.002,3.002,0,0,0-4.22521,1.09194c-.93885,1.55983-.46866,3.276,1.25193,4.368a3.91752,3.91752,0,0,0,1.09424.62422c10.4837,6.3936,17.83548,15.283,21.27894,27.13666,3.12887,11.38806,3.9108,23.08329,4.22309,34.7806a167.16816,167.16816,0,0,1-2.34692,33.06462c-.31174,2.34023.624,3.7439,2.50251,4.0564,2.03521.31175,3.44347-.78039,3.755-3.11985a162.60561,162.60561,0,0,0,2.34712-27.91913,217.74083,217.74083,0,0,0-2.65869-34.62312c-2.03461-12.79173-7.51041-23.55117-17.053-32.2865ZM89.76794,53.62646a28.15742,28.15742,0,0,0-18.92915-.15615c-2.66077.78037-3.44346,3.58546-1.72059,5.30163,1.24984,1.24809,2.50253,1.09195,3.91061.62406a21.7273,21.7273,0,0,1,28.47246,16.8428,163.57907,163.57907,0,0,1,2.34693,17.31375A137.996,137.996,0,0,1,103.692,118.974a149.65135,149.65135,0,0,1-7.04022,31.97477c-.1554.62405-.4679,1.092-.31155,1.71618a3.009,3.009,0,0,0,2.81483,2.65177,3.073,3.073,0,0,0,3.4427-2.34022,143.91448,143.91448,0,0,0,8.13447-46.946,167.06448,167.06448,0,0,0-2.65867-29.6353c-2.03462-11.07347-7.97831-18.87149-18.30566-22.77079ZM46.431,72.65334C50.03005,55.02805,68.64821,42.7065,86.48292,46.294a35.29014,35.29014,0,0,1,20.18241,11.85368,8.8989,8.8989,0,0,0,1.72,1.71617,3.19219,3.19219,0,0,0,3.755-.93579c1.09424-1.40444.93885-2.80812-.31155-4.5243-7.19867-8.733-16.42891-13.87928-27.84841-14.81508-14.55046-1.2481-26.59781,3.90025-35.82653,15.283A38.57467,38.57467,0,0,0,39.861,85.4407c.7804,5.30373,1.72077,10.45208,1.72077,15.75372,0,3.74391,0,7.488-.31174,11.07347a3.00588,3.00588,0,0,0,2.81408,3.276,3.03818,3.03818,0,0,0,3.44346-2.652,100.85173,100.85173,0,0,0-.15616-20.58748c-.47018-4.21179-1.87827-8.26743-1.56443-12.16769a39.31,39.31,0,0,1,.62406-7.48342Zm97.78146,20.43132a3.18855,3.18855,0,0,0,2.97269-3.43217V88.56056c-.62425-5.92722-1.2506-11.8531-2.19077-17.77879-2.03235-13.10195-7.19563-24.64312-16.1126-34.31273C115.89557,21.96341,99.46894,14.78945,79.91136,14.63329a64.57052,64.57052,0,0,0-25.3436,5.14835,3.233,3.233,0,0,0-2.03462,4.20951,3.15932,3.15932,0,0,0,4.38154,1.56A60.10933,60.10933,0,0,1,85.54483,21.183a57.79887,57.79887,0,0,1,35.04479,15.91007c10.32431,9.82517,16.268,21.835,18.30566,36.02812q1.16919,8.42465,1.876,16.84377c.46789,1.87157,1.72058,3.11966,3.44119,3.11966ZM71.15054,82.94489a11.40154,11.40154,0,0,1,0-5.614,9.11075,9.11075,0,0,1,9.70119-6.55146c4.22292.15558,7.66638,3.2762,8.60218,7.9559a150.63857,150.63857,0,0,1,2.661,26.51468,3.1253,3.1253,0,0,0,3.12887,3.43236c1.879,0,2.97252-1.40367,3.12867-3.276V102.5981h.15635c-.3125-4.05545-.4679-8.11185-.93581-12.16521-.47018-4.05565-1.09653-8.11206-1.72287-12.16541a15.95817,15.95817,0,0,0-17.67931-13.726c-8.13448.93654-14.7068,9.04763-13.45393,17.002.62406,4.83584,1.40809,9.6696,1.876,14.50563a100.76525,100.76525,0,0,1-4.69311,39.77A111.03411,111.03411,0,0,1,55.976,149.85661a3.05946,3.05946,0,0,0,.15616,3.43236,2.84779,2.84779,0,0,0,2.97251,1.24752,3.58665,3.58665,0,0,0,2.815-2.33946C72.715,130.2034,75.21748,107.1224,71.15054,82.94717ZM34.38592,91.52482c-.7825-5.30393-1.565-10.76381-1.09634-16.06545A45.82532,45.82532,0,0,1,49.87465,44.26631a45.38948,45.38948,0,0,1,28.16-10.76171,44.31355,44.31355,0,0,1,12.82985,1.24828,3.86115,3.86115,0,0,0,1.87676.15616,2.85951,2.85951,0,0,0,2.50252-2.80814,3.03932,3.03932,0,0,0-2.34694-3.276,45.9556,45.9556,0,0,0-13.14161-1.55984,34.7057,34.7057,0,0,0-9.6989.93577c-15.801,2.96429-27.84821,11.54421-36.14113,25.42352a50.63513,50.63513,0,0,0-6.56928,32.59653C27.81379,90.589,28.754,94.80084,29.06571,99.169c.62406,10.75944-.78174,21.20867-5.63119,30.87827a3.03324,3.03324,0,0,0-.47019,2.02771,2.85292,2.85292,0,0,0,2.65868,2.652,3.38105,3.38105,0,0,0,3.4427-2.02772c6.57-12.9458,7.51023-26.98125,5.32021-41.17439Zm0,0"/></g><path class="cls-2" d="M54.56775,19.78162A4.3956,4.3956,0,0,0,54.14148,20H106.447a67.23276,67.23276,0,0,0-26.53558-5.3667A64.57,64.57,0,0,0,54.56775,19.78162Z"/><path class="cls-2" d="M78.50458,2a77.85348,77.85348,0,0,0-36.29651,9.67188A78.8284,78.8284,0,0,0,29.98193,20H40.88556C51.89252,12.71936,64.44763,8.82861,78.663,8.39581c2.34717,0,3.75525-1.24823,3.75525-3.276C82.416,3.09192,81.00787,2,78.50458,2Z"/><path class="cls-2" d="M91.80237,3.09192c-1.8783-.15613-3.12866.78039-3.28424,2.49579A2.876,2.876,0,0,0,91.02063,9.176c.62408.15564,1.25043.15564,1.72058.31176A71.20917,71.20917,0,0,1,119.1936,20h10.78968a87.41029,87.41029,0,0,0-27.8534-14.724A45.00584,45.00584,0,0,0,91.80237,3.09192Z"/></g></svg> +\ No newline at end of file +diff --git a/polkit-agent/assets/biowaiting/fingerprint3.svg b/polkit-agent/assets/biowaiting/fingerprint3.svg +new file mode 100644 +index 0000000..3ff19ba +--- /dev/null ++++ b/polkit-agent/assets/biowaiting/fingerprint3.svg +@@ -0,0 +1 @@ ++<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 160 160"><defs><style>.cls-1{opacity:0.2;}.cls-2{fill:#3790fa;}</style></defs><g id="文字标注"><g class="cls-1"><path d="M76.78191,140.809a3.00926,3.00926,0,0,0-4.06694,1.87157l-4.22311,10.29593a2.95177,2.95177,0,0,0,2.34693,4.2097c1.87618,0,2.81427-.62348,3.44061-2.02792q2.35321-4.96514,4.2252-10.13749a3.22339,3.22339,0,0,0-1.72269-4.21179Zm71.02958-38.52241a3.08449,3.08449,0,0,0-3.44119-2.96447,3.01947,3.01947,0,0,0-2.81653,3.276c.15559,5.14854-.15616,10.13768-.31232,15.286,0,2.33947,1.09425,3.58775,2.971,3.74391,1.87844,0,3.28728-1.24829,3.28728-3.58851,0-3.43141.46791-7.01916.31175-10.29517a31.74592,31.74592,0,0,0,0-5.46008ZM42.99058,121.93748a3.19813,3.19813,0,0,0-3.91137,2.18407c-.3125.7804-.4679,1.71618-.7825,2.49562a101.97516,101.97516,0,0,1-5.00713,12.01c-1.09424,2.34022.1554,4.67969,2.66077,4.67969,1.40828.15616,2.34636-.77963,2.97271-2.02772a81.29759,81.29759,0,0,0,6.09985-15.4437,3.0299,3.0299,0,0,0-2.03233-3.898Zm51.78525-7.17321a3.13259,3.13259,0,0,0-3.44346,2.80735,161.02757,161.02757,0,0,1-4.84945,22.9279c-1.25193,4.36718-2.81636,8.73532-4.38079,13.10328a2.97748,2.97748,0,0,0,1.25192,3.898,3.04925,3.04925,0,0,0,3.75521-.3125,5.627,5.627,0,0,0,1.25041-2.33946,128.60479,128.60479,0,0,0,4.85173-14.97123,161.52838,161.52838,0,0,0,4.37926-21.68171,3.2645,3.2645,0,0,0-2.81483-3.43159ZM11.07466,60.17791a3.31205,3.31205,0,0,0-2.19078-4.36738c-1.72059-.46865-3.285.62329-3.91137,2.49561A79.568,79.568,0,0,0,2,80.45155a66.61318,66.61318,0,0,0,.31174,7.6432A76.2778,76.2778,0,0,0,5.91136,104.626,2.67954,2.67954,0,0,0,8.57,106.6545c2.661.15558,3.91289-1.87233,3.13095-4.68045a70.50526,70.50526,0,0,1-.62633-41.79842ZM85.701,104.15584a75.8642,75.8642,0,0,0-.4679-9.98362,114.4834,114.4834,0,0,0-2.19078-14.6595,3.09174,3.09174,0,0,0-3.59962-2.49581,3.03668,3.03668,0,0,0-2.34617,3.90025,116.66849,116.66849,0,0,1,2.34617,18.24725,106.72189,106.72189,0,0,1-2.97252,31.50478c-.46789,2.02773.31174,3.74391,2.03443,4.2118,1.87694.4679,3.44137-.62405,4.06772-2.80812a109.18033,109.18033,0,0,0,3.12867-27.917Zm32.854-36.96258a3.10567,3.10567,0,0,0-3.91136-2.02773,2.97022,2.97022,0,0,0-2.03235,3.90006c2.50253,9.35957,3.44041,19.02707,4.067,28.85281a155.42236,155.42236,0,0,1-5.0079,47.25852c-.46789,2.02792.31232,3.90025,2.03519,4.2118a3.12981,3.12981,0,0,0,4.067-2.65178,158.74287,158.74287,0,0,0,5.31944-41.48688,159.06625,159.06625,0,0,0-2.03234-26.98258,60.29831,60.29831,0,0,0-2.5046-11.07422ZM15.61237,48.32272A67.883,67.883,0,0,1,27.18744,31.633C41.11155,16.81945,58.16452,9.0199,78.66305,8.39586c2.34712,0,3.75521-1.24828,3.75521-3.276C82.416,3.09194,81.00789,2,78.5046,2A77.9438,77.9438,0,0,0,10.13447,45.04442a5.77164,5.77164,0,0,0-.62406,2.18407,2.72436,2.72436,0,0,0,1.56425,2.80736c1.72077.93654,3.59676.31231,4.53771-1.71543ZM58.79086,85.753c-1.25059-7.48553-.31175-14.19161,4.85155-20.11959a2.805,2.805,0,0,0,.62425-1.40368c.15616-1.55983-.15635-2.80812-1.7206-3.43216a2.98066,2.98066,0,0,0-3.91136.93635c-5.63137,6.55146-7.66581,14.19542-6.41388,22.77308a143.77173,143.77173,0,0,1,1.87675,19.65112,84.88938,84.88938,0,0,1-1.87675,19.18379,87.66557,87.66557,0,0,1-7.822,21.36711,4.07667,4.07667,0,0,0-.7827,2.652,2.99418,2.99418,0,0,0,2.34693,2.652c1.72079.31173,2.815-.31251,3.75521-1.87234a90.13491,90.13491,0,0,0,9.69891-29.79089A108.40093,108.40093,0,0,0,58.79315,85.753ZM22.338,94.48834c-1.09423-7.01916-2.03233-13.88368-1.09423-21.05461A59.14015,59.14015,0,0,1,46.11944,31.47686a3.29673,3.29673,0,0,0,1.56444-3.90024c-.78269-2.18389-2.97348-2.65176-5.16425-1.24735A60.84871,60.84871,0,0,0,29.37822,38.49678a64.523,64.523,0,0,0-14.7068,39.7707c-.31174,7.6434,1.72287,15.12892,2.19077,22.61463.31251,4.99219.46791,9.98419-1.09424,14.97429-.4679,1.55983-.93809,3.27525-1.40827,4.52334a3.12377,3.12377,0,0,0,3.12886,3.43008c1.87693,0,2.65868-1.09195,3.285-2.652,3.285-8.57766,2.81711-17.6232,1.56442-26.66951ZM157.0425,67.03786Q147.65477,20.2483,102.12991,5.276A45.00768,45.00768,0,0,0,91.80237,3.09194c-1.87828-.15615-3.12867.78039-3.28426,2.4958a2.87607,2.87607,0,0,0,2.50252,3.58833c.62406.15558,1.2504.15558,1.72059.31175A70.72962,70.72962,0,0,1,133.1047,31.94476a69.18254,69.18254,0,0,1,13.9241,22.61539,74.061,74.061,0,0,1,4.69407,23.23944c.15538,2.33946,1.87825,3.7439,4.06674,3.11986,1.56444-.4679,2.34713-1.71618,2.19077-4.212a41.34713,41.34713,0,0,0-.93788-9.6696ZM115.74016,40.83473a46.09788,46.09788,0,0,0-10.16908-7.17379,3.002,3.002,0,0,0-4.22521,1.09194c-.93885,1.55983-.46866,3.276,1.25193,4.368a3.91752,3.91752,0,0,0,1.09424.62422c10.4837,6.3936,17.83548,15.283,21.27894,27.13666,3.12887,11.38806,3.9108,23.08329,4.22309,34.7806a167.16816,167.16816,0,0,1-2.34692,33.06462c-.31174,2.34023.624,3.7439,2.50251,4.0564,2.03521.31175,3.44347-.78039,3.755-3.11985a162.60561,162.60561,0,0,0,2.34712-27.91913,217.74083,217.74083,0,0,0-2.65869-34.62312c-2.03461-12.79173-7.51041-23.55117-17.053-32.2865ZM89.76794,53.62646a28.15742,28.15742,0,0,0-18.92915-.15615c-2.66077.78037-3.44346,3.58546-1.72059,5.30163,1.24984,1.24809,2.50253,1.09195,3.91061.62406a21.7273,21.7273,0,0,1,28.47246,16.8428,163.57907,163.57907,0,0,1,2.34693,17.31375A137.996,137.996,0,0,1,103.692,118.974a149.65135,149.65135,0,0,1-7.04022,31.97477c-.1554.62405-.4679,1.092-.31155,1.71618a3.009,3.009,0,0,0,2.81483,2.65177,3.073,3.073,0,0,0,3.4427-2.34022,143.91448,143.91448,0,0,0,8.13447-46.946,167.06448,167.06448,0,0,0-2.65867-29.6353c-2.03462-11.07347-7.97831-18.87149-18.30566-22.77079ZM46.431,72.65334C50.03005,55.02805,68.64821,42.7065,86.48292,46.294a35.29014,35.29014,0,0,1,20.18241,11.85368,8.8989,8.8989,0,0,0,1.72,1.71617,3.19219,3.19219,0,0,0,3.755-.93579c1.09424-1.40444.93885-2.80812-.31155-4.5243-7.19867-8.733-16.42891-13.87928-27.84841-14.81508-14.55046-1.2481-26.59781,3.90025-35.82653,15.283A38.57467,38.57467,0,0,0,39.861,85.4407c.7804,5.30373,1.72077,10.45208,1.72077,15.75372,0,3.74391,0,7.488-.31174,11.07347a3.00588,3.00588,0,0,0,2.81408,3.276,3.03818,3.03818,0,0,0,3.44346-2.652,100.85173,100.85173,0,0,0-.15616-20.58748c-.47018-4.21179-1.87827-8.26743-1.56443-12.16769a39.31,39.31,0,0,1,.62406-7.48342Zm97.78146,20.43132a3.18855,3.18855,0,0,0,2.97269-3.43217V88.56056c-.62425-5.92722-1.2506-11.8531-2.19077-17.77879-2.03235-13.10195-7.19563-24.64312-16.1126-34.31273C115.89557,21.96341,99.46894,14.78945,79.91136,14.63329a64.57052,64.57052,0,0,0-25.3436,5.14835,3.233,3.233,0,0,0-2.03462,4.20951,3.15932,3.15932,0,0,0,4.38154,1.56A60.10933,60.10933,0,0,1,85.54483,21.183a57.79887,57.79887,0,0,1,35.04479,15.91007c10.32431,9.82517,16.268,21.835,18.30566,36.02812q1.16919,8.42465,1.876,16.84377c.46789,1.87157,1.72058,3.11966,3.44119,3.11966ZM71.15054,82.94489a11.40154,11.40154,0,0,1,0-5.614,9.11075,9.11075,0,0,1,9.70119-6.55146c4.22292.15558,7.66638,3.2762,8.60218,7.9559a150.63857,150.63857,0,0,1,2.661,26.51468,3.1253,3.1253,0,0,0,3.12887,3.43236c1.879,0,2.97252-1.40367,3.12867-3.276V102.5981h.15635c-.3125-4.05545-.4679-8.11185-.93581-12.16521-.47018-4.05565-1.09653-8.11206-1.72287-12.16541a15.95817,15.95817,0,0,0-17.67931-13.726c-8.13448.93654-14.7068,9.04763-13.45393,17.002.62406,4.83584,1.40809,9.6696,1.876,14.50563a100.76525,100.76525,0,0,1-4.69311,39.77A111.03411,111.03411,0,0,1,55.976,149.85661a3.05946,3.05946,0,0,0,.15616,3.43236,2.84779,2.84779,0,0,0,2.97251,1.24752,3.58665,3.58665,0,0,0,2.815-2.33946C72.715,130.2034,75.21748,107.1224,71.15054,82.94717ZM34.38592,91.52482c-.7825-5.30393-1.565-10.76381-1.09634-16.06545A45.82532,45.82532,0,0,1,49.87465,44.26631a45.38948,45.38948,0,0,1,28.16-10.76171,44.31355,44.31355,0,0,1,12.82985,1.24828,3.86115,3.86115,0,0,0,1.87676.15616,2.85951,2.85951,0,0,0,2.50252-2.80814,3.03932,3.03932,0,0,0-2.34694-3.276,45.9556,45.9556,0,0,0-13.14161-1.55984,34.7057,34.7057,0,0,0-9.6989.93577c-15.801,2.96429-27.84821,11.54421-36.14113,25.42352a50.63513,50.63513,0,0,0-6.56928,32.59653C27.81379,90.589,28.754,94.80084,29.06571,99.169c.62406,10.75944-.78174,21.20867-5.63119,30.87827a3.03324,3.03324,0,0,0-.47019,2.02771,2.85292,2.85292,0,0,0,2.65868,2.652,3.38105,3.38105,0,0,0,3.4427-2.02772c6.57-12.9458,7.51023-26.98125,5.32021-41.17439Zm0,0"/></g><path class="cls-2" d="M42.51965,26.32928C40.848,27.471,39.24213,28.70074,37.69611,30h9.79473a2.9788,2.9788,0,0,0,.19306-2.4234C46.90118,25.3927,44.71039,24.92487,42.51965,26.32928Z"/><path class="cls-2" d="M92.89679,28.82489a45.9554,45.9554,0,0,0-13.1416-1.55981,34.70686,34.70686,0,0,0-9.69892.93573A58.17287,58.17287,0,0,0,62.98737,30H94.66962A3.4225,3.4225,0,0,0,92.89679,28.82489Z"/><path class="cls-2" d="M78.50458,2a77.85348,77.85348,0,0,0-36.29651,9.67188A76.9855,76.9855,0,0,0,20.00146,30h8.79C42.41681,16.25873,58.94067,8.99628,78.663,8.39581c2.34717,0,3.75525-1.24823,3.75525-3.276C82.416,3.09192,81.00787,2,78.50458,2Z"/><path class="cls-2" d="M79.91138,14.6333a64.57,64.57,0,0,0-25.34363,5.14832,3.23308,3.23308,0,0,0-2.03461,4.20953,3.15929,3.15929,0,0,0,4.38153,1.56A60.10983,60.10983,0,0,1,85.54486,21.183,57.00643,57.00643,0,0,1,111.48492,30h10.78821C110.467,19.8385,96.29218,14.7641,79.91138,14.6333Z"/><path class="cls-2" d="M102.12988,5.276A45.00584,45.00584,0,0,0,91.80237,3.09192c-1.8783-.15613-3.12866.78039-3.28424,2.49579A2.876,2.876,0,0,0,91.02063,9.176c.62408.15564,1.25043.15564,1.72058.31176A70.54954,70.54954,0,0,1,131.26257,30H140.16Q126.19251,13.19439,102.12988,5.276Z"/></g></svg> +\ No newline at end of file +diff --git a/polkit-agent/assets/biowaiting/fingerprint4.svg b/polkit-agent/assets/biowaiting/fingerprint4.svg +new file mode 100644 +index 0000000..c3c80d4 +--- /dev/null ++++ b/polkit-agent/assets/biowaiting/fingerprint4.svg +@@ -0,0 +1 @@ ++<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 160 160"><defs><style>.cls-1{opacity:0.2;}.cls-2{fill:#3790fa;}</style></defs><g id="文字标注"><g class="cls-1"><path d="M76.78191,140.809a3.00926,3.00926,0,0,0-4.06694,1.87157l-4.22311,10.29593a2.95177,2.95177,0,0,0,2.34693,4.2097c1.87618,0,2.81427-.62348,3.44061-2.02792q2.35321-4.96514,4.2252-10.13749a3.22339,3.22339,0,0,0-1.72269-4.21179Zm71.02958-38.52241a3.08449,3.08449,0,0,0-3.44119-2.96447,3.01947,3.01947,0,0,0-2.81653,3.276c.15559,5.14854-.15616,10.13768-.31232,15.286,0,2.33947,1.09425,3.58775,2.971,3.74391,1.87844,0,3.28728-1.24829,3.28728-3.58851,0-3.43141.46791-7.01916.31175-10.29517a31.74592,31.74592,0,0,0,0-5.46008ZM42.99058,121.93748a3.19813,3.19813,0,0,0-3.91137,2.18407c-.3125.7804-.4679,1.71618-.7825,2.49562a101.97516,101.97516,0,0,1-5.00713,12.01c-1.09424,2.34022.1554,4.67969,2.66077,4.67969,1.40828.15616,2.34636-.77963,2.97271-2.02772a81.29759,81.29759,0,0,0,6.09985-15.4437,3.0299,3.0299,0,0,0-2.03233-3.898Zm51.78525-7.17321a3.13259,3.13259,0,0,0-3.44346,2.80735,161.02757,161.02757,0,0,1-4.84945,22.9279c-1.25193,4.36718-2.81636,8.73532-4.38079,13.10328a2.97748,2.97748,0,0,0,1.25192,3.898,3.04925,3.04925,0,0,0,3.75521-.3125,5.627,5.627,0,0,0,1.25041-2.33946,128.60479,128.60479,0,0,0,4.85173-14.97123,161.52838,161.52838,0,0,0,4.37926-21.68171,3.2645,3.2645,0,0,0-2.81483-3.43159ZM11.07466,60.17791a3.31205,3.31205,0,0,0-2.19078-4.36738c-1.72059-.46865-3.285.62329-3.91137,2.49561A79.568,79.568,0,0,0,2,80.45155a66.61318,66.61318,0,0,0,.31174,7.6432A76.2778,76.2778,0,0,0,5.91136,104.626,2.67954,2.67954,0,0,0,8.57,106.6545c2.661.15558,3.91289-1.87233,3.13095-4.68045a70.50526,70.50526,0,0,1-.62633-41.79842ZM85.701,104.15584a75.8642,75.8642,0,0,0-.4679-9.98362,114.4834,114.4834,0,0,0-2.19078-14.6595,3.09174,3.09174,0,0,0-3.59962-2.49581,3.03668,3.03668,0,0,0-2.34617,3.90025,116.66849,116.66849,0,0,1,2.34617,18.24725,106.72189,106.72189,0,0,1-2.97252,31.50478c-.46789,2.02773.31174,3.74391,2.03443,4.2118,1.87694.4679,3.44137-.62405,4.06772-2.80812a109.18033,109.18033,0,0,0,3.12867-27.917Zm32.854-36.96258a3.10567,3.10567,0,0,0-3.91136-2.02773,2.97022,2.97022,0,0,0-2.03235,3.90006c2.50253,9.35957,3.44041,19.02707,4.067,28.85281a155.42236,155.42236,0,0,1-5.0079,47.25852c-.46789,2.02792.31232,3.90025,2.03519,4.2118a3.12981,3.12981,0,0,0,4.067-2.65178,158.74287,158.74287,0,0,0,5.31944-41.48688,159.06625,159.06625,0,0,0-2.03234-26.98258,60.29831,60.29831,0,0,0-2.5046-11.07422ZM15.61237,48.32272A67.883,67.883,0,0,1,27.18744,31.633C41.11155,16.81945,58.16452,9.0199,78.66305,8.39586c2.34712,0,3.75521-1.24828,3.75521-3.276C82.416,3.09194,81.00789,2,78.5046,2A77.9438,77.9438,0,0,0,10.13447,45.04442a5.77164,5.77164,0,0,0-.62406,2.18407,2.72436,2.72436,0,0,0,1.56425,2.80736c1.72077.93654,3.59676.31231,4.53771-1.71543ZM58.79086,85.753c-1.25059-7.48553-.31175-14.19161,4.85155-20.11959a2.805,2.805,0,0,0,.62425-1.40368c.15616-1.55983-.15635-2.80812-1.7206-3.43216a2.98066,2.98066,0,0,0-3.91136.93635c-5.63137,6.55146-7.66581,14.19542-6.41388,22.77308a143.77173,143.77173,0,0,1,1.87675,19.65112,84.88938,84.88938,0,0,1-1.87675,19.18379,87.66557,87.66557,0,0,1-7.822,21.36711,4.07667,4.07667,0,0,0-.7827,2.652,2.99418,2.99418,0,0,0,2.34693,2.652c1.72079.31173,2.815-.31251,3.75521-1.87234a90.13491,90.13491,0,0,0,9.69891-29.79089A108.40093,108.40093,0,0,0,58.79315,85.753ZM22.338,94.48834c-1.09423-7.01916-2.03233-13.88368-1.09423-21.05461A59.14015,59.14015,0,0,1,46.11944,31.47686a3.29673,3.29673,0,0,0,1.56444-3.90024c-.78269-2.18389-2.97348-2.65176-5.16425-1.24735A60.84871,60.84871,0,0,0,29.37822,38.49678a64.523,64.523,0,0,0-14.7068,39.7707c-.31174,7.6434,1.72287,15.12892,2.19077,22.61463.31251,4.99219.46791,9.98419-1.09424,14.97429-.4679,1.55983-.93809,3.27525-1.40827,4.52334a3.12377,3.12377,0,0,0,3.12886,3.43008c1.87693,0,2.65868-1.09195,3.285-2.652,3.285-8.57766,2.81711-17.6232,1.56442-26.66951ZM157.0425,67.03786Q147.65477,20.2483,102.12991,5.276A45.00768,45.00768,0,0,0,91.80237,3.09194c-1.87828-.15615-3.12867.78039-3.28426,2.4958a2.87607,2.87607,0,0,0,2.50252,3.58833c.62406.15558,1.2504.15558,1.72059.31175A70.72962,70.72962,0,0,1,133.1047,31.94476a69.18254,69.18254,0,0,1,13.9241,22.61539,74.061,74.061,0,0,1,4.69407,23.23944c.15538,2.33946,1.87825,3.7439,4.06674,3.11986,1.56444-.4679,2.34713-1.71618,2.19077-4.212a41.34713,41.34713,0,0,0-.93788-9.6696ZM115.74016,40.83473a46.09788,46.09788,0,0,0-10.16908-7.17379,3.002,3.002,0,0,0-4.22521,1.09194c-.93885,1.55983-.46866,3.276,1.25193,4.368a3.91752,3.91752,0,0,0,1.09424.62422c10.4837,6.3936,17.83548,15.283,21.27894,27.13666,3.12887,11.38806,3.9108,23.08329,4.22309,34.7806a167.16816,167.16816,0,0,1-2.34692,33.06462c-.31174,2.34023.624,3.7439,2.50251,4.0564,2.03521.31175,3.44347-.78039,3.755-3.11985a162.60561,162.60561,0,0,0,2.34712-27.91913,217.74083,217.74083,0,0,0-2.65869-34.62312c-2.03461-12.79173-7.51041-23.55117-17.053-32.2865ZM89.76794,53.62646a28.15742,28.15742,0,0,0-18.92915-.15615c-2.66077.78037-3.44346,3.58546-1.72059,5.30163,1.24984,1.24809,2.50253,1.09195,3.91061.62406a21.7273,21.7273,0,0,1,28.47246,16.8428,163.57907,163.57907,0,0,1,2.34693,17.31375A137.996,137.996,0,0,1,103.692,118.974a149.65135,149.65135,0,0,1-7.04022,31.97477c-.1554.62405-.4679,1.092-.31155,1.71618a3.009,3.009,0,0,0,2.81483,2.65177,3.073,3.073,0,0,0,3.4427-2.34022,143.91448,143.91448,0,0,0,8.13447-46.946,167.06448,167.06448,0,0,0-2.65867-29.6353c-2.03462-11.07347-7.97831-18.87149-18.30566-22.77079ZM46.431,72.65334C50.03005,55.02805,68.64821,42.7065,86.48292,46.294a35.29014,35.29014,0,0,1,20.18241,11.85368,8.8989,8.8989,0,0,0,1.72,1.71617,3.19219,3.19219,0,0,0,3.755-.93579c1.09424-1.40444.93885-2.80812-.31155-4.5243-7.19867-8.733-16.42891-13.87928-27.84841-14.81508-14.55046-1.2481-26.59781,3.90025-35.82653,15.283A38.57467,38.57467,0,0,0,39.861,85.4407c.7804,5.30373,1.72077,10.45208,1.72077,15.75372,0,3.74391,0,7.488-.31174,11.07347a3.00588,3.00588,0,0,0,2.81408,3.276,3.03818,3.03818,0,0,0,3.44346-2.652,100.85173,100.85173,0,0,0-.15616-20.58748c-.47018-4.21179-1.87827-8.26743-1.56443-12.16769a39.31,39.31,0,0,1,.62406-7.48342Zm97.78146,20.43132a3.18855,3.18855,0,0,0,2.97269-3.43217V88.56056c-.62425-5.92722-1.2506-11.8531-2.19077-17.77879-2.03235-13.10195-7.19563-24.64312-16.1126-34.31273C115.89557,21.96341,99.46894,14.78945,79.91136,14.63329a64.57052,64.57052,0,0,0-25.3436,5.14835,3.233,3.233,0,0,0-2.03462,4.20951,3.15932,3.15932,0,0,0,4.38154,1.56A60.10933,60.10933,0,0,1,85.54483,21.183a57.79887,57.79887,0,0,1,35.04479,15.91007c10.32431,9.82517,16.268,21.835,18.30566,36.02812q1.16919,8.42465,1.876,16.84377c.46789,1.87157,1.72058,3.11966,3.44119,3.11966ZM71.15054,82.94489a11.40154,11.40154,0,0,1,0-5.614,9.11075,9.11075,0,0,1,9.70119-6.55146c4.22292.15558,7.66638,3.2762,8.60218,7.9559a150.63857,150.63857,0,0,1,2.661,26.51468,3.1253,3.1253,0,0,0,3.12887,3.43236c1.879,0,2.97252-1.40367,3.12867-3.276V102.5981h.15635c-.3125-4.05545-.4679-8.11185-.93581-12.16521-.47018-4.05565-1.09653-8.11206-1.72287-12.16541a15.95817,15.95817,0,0,0-17.67931-13.726c-8.13448.93654-14.7068,9.04763-13.45393,17.002.62406,4.83584,1.40809,9.6696,1.876,14.50563a100.76525,100.76525,0,0,1-4.69311,39.77A111.03411,111.03411,0,0,1,55.976,149.85661a3.05946,3.05946,0,0,0,.15616,3.43236,2.84779,2.84779,0,0,0,2.97251,1.24752,3.58665,3.58665,0,0,0,2.815-2.33946C72.715,130.2034,75.21748,107.1224,71.15054,82.94717ZM34.38592,91.52482c-.7825-5.30393-1.565-10.76381-1.09634-16.06545A45.82532,45.82532,0,0,1,49.87465,44.26631a45.38948,45.38948,0,0,1,28.16-10.76171,44.31355,44.31355,0,0,1,12.82985,1.24828,3.86115,3.86115,0,0,0,1.87676.15616,2.85951,2.85951,0,0,0,2.50252-2.80814,3.03932,3.03932,0,0,0-2.34694-3.276,45.9556,45.9556,0,0,0-13.14161-1.55984,34.7057,34.7057,0,0,0-9.6989.93577c-15.801,2.96429-27.84821,11.54421-36.14113,25.42352a50.63513,50.63513,0,0,0-6.56928,32.59653C27.81379,90.589,28.754,94.80084,29.06571,99.169c.62406,10.75944-.78174,21.20867-5.63119,30.87827a3.03324,3.03324,0,0,0-.47019,2.02771,2.85292,2.85292,0,0,0,2.65868,2.652,3.38105,3.38105,0,0,0,3.4427-2.02772c6.57-12.9458,7.51023-26.98125,5.32021-41.17439Zm0,0"/></g><path class="cls-2" d="M105.571,33.661a3.00191,3.00191,0,0,0-4.22515,1.09192c-.93885,1.55981-.46869,3.276,1.25189,4.368a3.91989,3.91989,0,0,0,1.09424.62421c.136.08294.26544.17114.40039.25494h10.69751A44.31528,44.31528,0,0,0,105.571,33.661Z"/><path class="cls-2" d="M46.11945,31.47687A3.29681,3.29681,0,0,0,47.6839,27.5766c-.78272-2.1839-2.97351-2.65173-5.16425-1.24732A60.84768,60.84768,0,0,0,29.37823,38.49677c-.4038.49646-.78784,1.00042-1.17486,1.50323H36.4093A62.09994,62.09994,0,0,1,46.11945,31.47687Z"/><path class="cls-2" d="M78.663,8.39581c2.34717,0,3.75525-1.24823,3.75525-3.276C82.416,3.09192,81.00787,2,78.50458,2A77.81365,77.81365,0,0,0,12.93646,40h7.531a67.905,67.905,0,0,1,6.72-8.367C41.11157,16.81946,58.16449,9.0199,78.663,8.39581Z"/><path class="cls-2" d="M102.12988,5.276A45.00584,45.00584,0,0,0,91.80237,3.09192c-1.8783-.15613-3.12866.78039-3.28424,2.49579A2.876,2.876,0,0,0,91.02063,9.176c.62408.15564,1.25043.15564,1.72058.31176a70.72949,70.72949,0,0,1,40.36347,22.457A73.76489,73.76489,0,0,1,139.47937,40h7.6394Q132.85458,15.39228,102.12988,5.276Z"/><path class="cls-2" d="M72.69672,40H87.29114c-1.08441-.17377-2.18378-.319-3.31073-.41132A44.76672,44.76672,0,0,0,72.69672,40Z"/><path class="cls-2" d="M128.88177,36.46906C115.89557,21.96338,99.46893,14.78943,79.91138,14.6333a64.57,64.57,0,0,0-25.34363,5.14832,3.23308,3.23308,0,0,0-2.03461,4.20953,3.15929,3.15929,0,0,0,4.38153,1.56A60.10983,60.10983,0,0,1,85.54486,21.183a57.79889,57.79889,0,0,1,35.04474,15.91c.99469.94659,1.9361,1.9198,2.84985,2.90692h8.46192Q130.46828,38.19624,128.88177,36.46906Z"/><path class="cls-2" d="M92.89679,28.82489a45.9554,45.9554,0,0,0-13.1416-1.55981,34.70686,34.70686,0,0,0-9.69892.93573A51.56847,51.56847,0,0,0,45.14117,40H55.8147a46.03094,46.03094,0,0,1,22.21991-6.49542,44.314,44.314,0,0,1,12.82983,1.24829,3.86144,3.86144,0,0,0,1.87677.15613,2.8594,2.8594,0,0,0,2.5025-2.80811A3.0393,3.0393,0,0,0,92.89679,28.82489Z"/></g></svg> +\ No newline at end of file +diff --git a/polkit-agent/assets/biowaiting/fingerprint5.svg b/polkit-agent/assets/biowaiting/fingerprint5.svg +new file mode 100644 +index 0000000..fdec768 +--- /dev/null ++++ b/polkit-agent/assets/biowaiting/fingerprint5.svg +@@ -0,0 +1 @@ ++<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 160 160"><defs><style>.cls-1{opacity:0.2;}.cls-2{fill:#3790fa;}</style></defs><g id="文字标注"><g class="cls-1"><path d="M76.78191,140.809a3.00926,3.00926,0,0,0-4.06694,1.87157l-4.22311,10.29593a2.95177,2.95177,0,0,0,2.34693,4.2097c1.87618,0,2.81427-.62348,3.44061-2.02792q2.35321-4.96514,4.2252-10.13749a3.22339,3.22339,0,0,0-1.72269-4.21179Zm71.02958-38.52241a3.08449,3.08449,0,0,0-3.44119-2.96447,3.01947,3.01947,0,0,0-2.81653,3.276c.15559,5.14854-.15616,10.13768-.31232,15.286,0,2.33947,1.09425,3.58775,2.971,3.74391,1.87844,0,3.28728-1.24829,3.28728-3.58851,0-3.43141.46791-7.01916.31175-10.29517a31.74592,31.74592,0,0,0,0-5.46008ZM42.99058,121.93748a3.19813,3.19813,0,0,0-3.91137,2.18407c-.3125.7804-.4679,1.71618-.7825,2.49562a101.97516,101.97516,0,0,1-5.00713,12.01c-1.09424,2.34022.1554,4.67969,2.66077,4.67969,1.40828.15616,2.34636-.77963,2.97271-2.02772a81.29759,81.29759,0,0,0,6.09985-15.4437,3.0299,3.0299,0,0,0-2.03233-3.898Zm51.78525-7.17321a3.13259,3.13259,0,0,0-3.44346,2.80735,161.02757,161.02757,0,0,1-4.84945,22.9279c-1.25193,4.36718-2.81636,8.73532-4.38079,13.10328a2.97748,2.97748,0,0,0,1.25192,3.898,3.04925,3.04925,0,0,0,3.75521-.3125,5.627,5.627,0,0,0,1.25041-2.33946,128.60479,128.60479,0,0,0,4.85173-14.97123,161.52838,161.52838,0,0,0,4.37926-21.68171,3.2645,3.2645,0,0,0-2.81483-3.43159ZM11.07466,60.17791a3.31205,3.31205,0,0,0-2.19078-4.36738c-1.72059-.46865-3.285.62329-3.91137,2.49561A79.568,79.568,0,0,0,2,80.45155a66.61318,66.61318,0,0,0,.31174,7.6432A76.2778,76.2778,0,0,0,5.91136,104.626,2.67954,2.67954,0,0,0,8.57,106.6545c2.661.15558,3.91289-1.87233,3.13095-4.68045a70.50526,70.50526,0,0,1-.62633-41.79842ZM85.701,104.15584a75.8642,75.8642,0,0,0-.4679-9.98362,114.4834,114.4834,0,0,0-2.19078-14.6595,3.09174,3.09174,0,0,0-3.59962-2.49581,3.03668,3.03668,0,0,0-2.34617,3.90025,116.66849,116.66849,0,0,1,2.34617,18.24725,106.72189,106.72189,0,0,1-2.97252,31.50478c-.46789,2.02773.31174,3.74391,2.03443,4.2118,1.87694.4679,3.44137-.62405,4.06772-2.80812a109.18033,109.18033,0,0,0,3.12867-27.917Zm32.854-36.96258a3.10567,3.10567,0,0,0-3.91136-2.02773,2.97022,2.97022,0,0,0-2.03235,3.90006c2.50253,9.35957,3.44041,19.02707,4.067,28.85281a155.42236,155.42236,0,0,1-5.0079,47.25852c-.46789,2.02792.31232,3.90025,2.03519,4.2118a3.12981,3.12981,0,0,0,4.067-2.65178,158.74287,158.74287,0,0,0,5.31944-41.48688,159.06625,159.06625,0,0,0-2.03234-26.98258,60.29831,60.29831,0,0,0-2.5046-11.07422ZM15.61237,48.32272A67.883,67.883,0,0,1,27.18744,31.633C41.11155,16.81945,58.16452,9.0199,78.66305,8.39586c2.34712,0,3.75521-1.24828,3.75521-3.276C82.416,3.09194,81.00789,2,78.5046,2A77.9438,77.9438,0,0,0,10.13447,45.04442a5.77164,5.77164,0,0,0-.62406,2.18407,2.72436,2.72436,0,0,0,1.56425,2.80736c1.72077.93654,3.59676.31231,4.53771-1.71543ZM58.79086,85.753c-1.25059-7.48553-.31175-14.19161,4.85155-20.11959a2.805,2.805,0,0,0,.62425-1.40368c.15616-1.55983-.15635-2.80812-1.7206-3.43216a2.98066,2.98066,0,0,0-3.91136.93635c-5.63137,6.55146-7.66581,14.19542-6.41388,22.77308a143.77173,143.77173,0,0,1,1.87675,19.65112,84.88938,84.88938,0,0,1-1.87675,19.18379,87.66557,87.66557,0,0,1-7.822,21.36711,4.07667,4.07667,0,0,0-.7827,2.652,2.99418,2.99418,0,0,0,2.34693,2.652c1.72079.31173,2.815-.31251,3.75521-1.87234a90.13491,90.13491,0,0,0,9.69891-29.79089A108.40093,108.40093,0,0,0,58.79315,85.753ZM22.338,94.48834c-1.09423-7.01916-2.03233-13.88368-1.09423-21.05461A59.14015,59.14015,0,0,1,46.11944,31.47686a3.29673,3.29673,0,0,0,1.56444-3.90024c-.78269-2.18389-2.97348-2.65176-5.16425-1.24735A60.84871,60.84871,0,0,0,29.37822,38.49678a64.523,64.523,0,0,0-14.7068,39.7707c-.31174,7.6434,1.72287,15.12892,2.19077,22.61463.31251,4.99219.46791,9.98419-1.09424,14.97429-.4679,1.55983-.93809,3.27525-1.40827,4.52334a3.12377,3.12377,0,0,0,3.12886,3.43008c1.87693,0,2.65868-1.09195,3.285-2.652,3.285-8.57766,2.81711-17.6232,1.56442-26.66951ZM157.0425,67.03786Q147.65477,20.2483,102.12991,5.276A45.00768,45.00768,0,0,0,91.80237,3.09194c-1.87828-.15615-3.12867.78039-3.28426,2.4958a2.87607,2.87607,0,0,0,2.50252,3.58833c.62406.15558,1.2504.15558,1.72059.31175A70.72962,70.72962,0,0,1,133.1047,31.94476a69.18254,69.18254,0,0,1,13.9241,22.61539,74.061,74.061,0,0,1,4.69407,23.23944c.15538,2.33946,1.87825,3.7439,4.06674,3.11986,1.56444-.4679,2.34713-1.71618,2.19077-4.212a41.34713,41.34713,0,0,0-.93788-9.6696ZM115.74016,40.83473a46.09788,46.09788,0,0,0-10.16908-7.17379,3.002,3.002,0,0,0-4.22521,1.09194c-.93885,1.55983-.46866,3.276,1.25193,4.368a3.91752,3.91752,0,0,0,1.09424.62422c10.4837,6.3936,17.83548,15.283,21.27894,27.13666,3.12887,11.38806,3.9108,23.08329,4.22309,34.7806a167.16816,167.16816,0,0,1-2.34692,33.06462c-.31174,2.34023.624,3.7439,2.50251,4.0564,2.03521.31175,3.44347-.78039,3.755-3.11985a162.60561,162.60561,0,0,0,2.34712-27.91913,217.74083,217.74083,0,0,0-2.65869-34.62312c-2.03461-12.79173-7.51041-23.55117-17.053-32.2865ZM89.76794,53.62646a28.15742,28.15742,0,0,0-18.92915-.15615c-2.66077.78037-3.44346,3.58546-1.72059,5.30163,1.24984,1.24809,2.50253,1.09195,3.91061.62406a21.7273,21.7273,0,0,1,28.47246,16.8428,163.57907,163.57907,0,0,1,2.34693,17.31375A137.996,137.996,0,0,1,103.692,118.974a149.65135,149.65135,0,0,1-7.04022,31.97477c-.1554.62405-.4679,1.092-.31155,1.71618a3.009,3.009,0,0,0,2.81483,2.65177,3.073,3.073,0,0,0,3.4427-2.34022,143.91448,143.91448,0,0,0,8.13447-46.946,167.06448,167.06448,0,0,0-2.65867-29.6353c-2.03462-11.07347-7.97831-18.87149-18.30566-22.77079ZM46.431,72.65334C50.03005,55.02805,68.64821,42.7065,86.48292,46.294a35.29014,35.29014,0,0,1,20.18241,11.85368,8.8989,8.8989,0,0,0,1.72,1.71617,3.19219,3.19219,0,0,0,3.755-.93579c1.09424-1.40444.93885-2.80812-.31155-4.5243-7.19867-8.733-16.42891-13.87928-27.84841-14.81508-14.55046-1.2481-26.59781,3.90025-35.82653,15.283A38.57467,38.57467,0,0,0,39.861,85.4407c.7804,5.30373,1.72077,10.45208,1.72077,15.75372,0,3.74391,0,7.488-.31174,11.07347a3.00588,3.00588,0,0,0,2.81408,3.276,3.03818,3.03818,0,0,0,3.44346-2.652,100.85173,100.85173,0,0,0-.15616-20.58748c-.47018-4.21179-1.87827-8.26743-1.56443-12.16769a39.31,39.31,0,0,1,.62406-7.48342Zm97.78146,20.43132a3.18855,3.18855,0,0,0,2.97269-3.43217V88.56056c-.62425-5.92722-1.2506-11.8531-2.19077-17.77879-2.03235-13.10195-7.19563-24.64312-16.1126-34.31273C115.89557,21.96341,99.46894,14.78945,79.91136,14.63329a64.57052,64.57052,0,0,0-25.3436,5.14835,3.233,3.233,0,0,0-2.03462,4.20951,3.15932,3.15932,0,0,0,4.38154,1.56A60.10933,60.10933,0,0,1,85.54483,21.183a57.79887,57.79887,0,0,1,35.04479,15.91007c10.32431,9.82517,16.268,21.835,18.30566,36.02812q1.16919,8.42465,1.876,16.84377c.46789,1.87157,1.72058,3.11966,3.44119,3.11966ZM71.15054,82.94489a11.40154,11.40154,0,0,1,0-5.614,9.11075,9.11075,0,0,1,9.70119-6.55146c4.22292.15558,7.66638,3.2762,8.60218,7.9559a150.63857,150.63857,0,0,1,2.661,26.51468,3.1253,3.1253,0,0,0,3.12887,3.43236c1.879,0,2.97252-1.40367,3.12867-3.276V102.5981h.15635c-.3125-4.05545-.4679-8.11185-.93581-12.16521-.47018-4.05565-1.09653-8.11206-1.72287-12.16541a15.95817,15.95817,0,0,0-17.67931-13.726c-8.13448.93654-14.7068,9.04763-13.45393,17.002.62406,4.83584,1.40809,9.6696,1.876,14.50563a100.76525,100.76525,0,0,1-4.69311,39.77A111.03411,111.03411,0,0,1,55.976,149.85661a3.05946,3.05946,0,0,0,.15616,3.43236,2.84779,2.84779,0,0,0,2.97251,1.24752,3.58665,3.58665,0,0,0,2.815-2.33946C72.715,130.2034,75.21748,107.1224,71.15054,82.94717ZM34.38592,91.52482c-.7825-5.30393-1.565-10.76381-1.09634-16.06545A45.82532,45.82532,0,0,1,49.87465,44.26631a45.38948,45.38948,0,0,1,28.16-10.76171,44.31355,44.31355,0,0,1,12.82985,1.24828,3.86115,3.86115,0,0,0,1.87676.15616,2.85951,2.85951,0,0,0,2.50252-2.80814,3.03932,3.03932,0,0,0-2.34694-3.276,45.9556,45.9556,0,0,0-13.14161-1.55984,34.7057,34.7057,0,0,0-9.6989.93577c-15.801,2.96429-27.84821,11.54421-36.14113,25.42352a50.63513,50.63513,0,0,0-6.56928,32.59653C27.81379,90.589,28.754,94.80084,29.06571,99.169c.62406,10.75944-.78174,21.20867-5.63119,30.87827a3.03324,3.03324,0,0,0-.47019,2.02771,2.85292,2.85292,0,0,0,2.65868,2.652,3.38105,3.38105,0,0,0,3.4427-2.02772c6.57-12.9458,7.51023-26.98125,5.32021-41.17439Zm0,0"/></g><path class="cls-2" d="M52.70563,50H63.65228a33.76275,33.76275,0,0,1,22.83063-3.706A37.323,37.323,0,0,1,96.63849,50H107.6944a38.44086,38.44086,0,0,0-23.714-10.41138C71.70941,38.53613,61.22681,42.05127,52.70563,50Z"/><path class="cls-2" d="M15.61237,48.32043v.00232A67.882,67.882,0,0,1,27.18744,31.63306C41.11157,16.81946,58.16449,9.0199,78.663,8.39575c2.34717,0,3.75525-1.24817,3.75525-3.27588C82.416,3.09192,81.00787,2,78.50458,2A77.94379,77.94379,0,0,0,10.13446,45.04443a5.77132,5.77132,0,0,0-.624,2.18409A2.7058,2.7058,0,0,0,11.01868,50h3.1997A3.89256,3.89256,0,0,0,15.61237,48.32043Z"/><path class="cls-2" d="M29.84613,48.63428A58.71554,58.71554,0,0,1,46.11945,31.47681a3.29665,3.29665,0,0,0,1.56445-3.90015c-.78272-2.184-2.97351-2.65186-5.16425-1.24731A60.84289,60.84289,0,0,0,29.37823,38.49683,66.78172,66.78172,0,0,0,21.813,50H29.0545C29.31915,49.54492,29.56952,49.085,29.84613,48.63428Z"/><path class="cls-2" d="M92.89679,28.825a45.94691,45.94691,0,0,0-13.1416-1.55981,34.70234,34.70234,0,0,0-9.69892.93567A51.16784,51.16784,0,0,0,36.27124,50h7.79443a49.27766,49.27766,0,0,1,5.809-5.73364,45.38883,45.38883,0,0,1,28.16-10.76172,44.30568,44.30568,0,0,1,12.82983,1.24829,3.86211,3.86211,0,0,0,1.87677.156,2.85935,2.85935,0,0,0,2.5025-2.80811A3.03909,3.03909,0,0,0,92.89679,28.825Z"/><path class="cls-2" d="M102.12988,5.276A45.009,45.009,0,0,0,91.80237,3.09192c-1.8783-.15613-3.12866.78039-3.28424,2.49573A2.876,2.876,0,0,0,91.02063,9.176c.62408.15564,1.25043.15564,1.72058.31176a70.72924,70.72924,0,0,1,40.36347,22.457A70.09713,70.09713,0,0,1,145.11847,50h6.87982Q138.76745,17.33435,102.12988,5.276Z"/><path class="cls-2" d="M115.74017,40.83472A46.09864,46.09864,0,0,0,105.571,33.66089a3.0019,3.0019,0,0,0-4.22515,1.092c-.93885,1.55981-.46869,3.27588,1.25189,4.36792a3.92165,3.92165,0,0,0,1.09424.62427A50.65843,50.65843,0,0,1,115.91486,50h7.85681A54.40942,54.40942,0,0,0,115.74017,40.83472Z"/><path class="cls-2" d="M128.88177,36.469C115.89557,21.96338,99.46893,14.78943,79.91138,14.6333a64.57,64.57,0,0,0-25.34363,5.14832,3.2331,3.2331,0,0,0-2.03461,4.20959,3.1594,3.1594,0,0,0,4.38153,1.55994,60.1104,60.1104,0,0,1,28.63019-4.368A57.799,57.799,0,0,1,120.5896,37.093,60.2336,60.2336,0,0,1,130.93127,50h7.43866A61.47308,61.47308,0,0,0,128.88177,36.469Z"/></g></svg> +\ No newline at end of file +diff --git a/polkit-agent/assets/biowaiting/fingerprint6.svg b/polkit-agent/assets/biowaiting/fingerprint6.svg +new file mode 100644 +index 0000000..e682cb6 +--- /dev/null ++++ b/polkit-agent/assets/biowaiting/fingerprint6.svg +@@ -0,0 +1 @@ ++<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 160 160"><defs><style>.cls-1{opacity:0.2;}.cls-2{fill:#3790fa;}</style></defs><g id="文字标注"><g class="cls-1"><path d="M76.78191,140.809a3.00926,3.00926,0,0,0-4.06694,1.87157l-4.22311,10.29593a2.95177,2.95177,0,0,0,2.34693,4.2097c1.87618,0,2.81427-.62348,3.44061-2.02792q2.35321-4.96514,4.2252-10.13749a3.22339,3.22339,0,0,0-1.72269-4.21179Zm71.02958-38.52241a3.08449,3.08449,0,0,0-3.44119-2.96447,3.01947,3.01947,0,0,0-2.81653,3.276c.15559,5.14854-.15616,10.13768-.31232,15.286,0,2.33947,1.09425,3.58775,2.971,3.74391,1.87844,0,3.28728-1.24829,3.28728-3.58851,0-3.43141.46791-7.01916.31175-10.29517a31.74592,31.74592,0,0,0,0-5.46008ZM42.99058,121.93748a3.19813,3.19813,0,0,0-3.91137,2.18407c-.3125.7804-.4679,1.71618-.7825,2.49562a101.97516,101.97516,0,0,1-5.00713,12.01c-1.09424,2.34022.1554,4.67969,2.66077,4.67969,1.40828.15616,2.34636-.77963,2.97271-2.02772a81.29759,81.29759,0,0,0,6.09985-15.4437,3.0299,3.0299,0,0,0-2.03233-3.898Zm51.78525-7.17321a3.13259,3.13259,0,0,0-3.44346,2.80735,161.02757,161.02757,0,0,1-4.84945,22.9279c-1.25193,4.36718-2.81636,8.73532-4.38079,13.10328a2.97748,2.97748,0,0,0,1.25192,3.898,3.04925,3.04925,0,0,0,3.75521-.3125,5.627,5.627,0,0,0,1.25041-2.33946,128.60479,128.60479,0,0,0,4.85173-14.97123,161.52838,161.52838,0,0,0,4.37926-21.68171,3.2645,3.2645,0,0,0-2.81483-3.43159ZM11.07466,60.17791a3.31205,3.31205,0,0,0-2.19078-4.36738c-1.72059-.46865-3.285.62329-3.91137,2.49561A79.568,79.568,0,0,0,2,80.45155a66.61318,66.61318,0,0,0,.31174,7.6432A76.2778,76.2778,0,0,0,5.91136,104.626,2.67954,2.67954,0,0,0,8.57,106.6545c2.661.15558,3.91289-1.87233,3.13095-4.68045a70.50526,70.50526,0,0,1-.62633-41.79842ZM85.701,104.15584a75.8642,75.8642,0,0,0-.4679-9.98362,114.4834,114.4834,0,0,0-2.19078-14.6595,3.09174,3.09174,0,0,0-3.59962-2.49581,3.03668,3.03668,0,0,0-2.34617,3.90025,116.66849,116.66849,0,0,1,2.34617,18.24725,106.72189,106.72189,0,0,1-2.97252,31.50478c-.46789,2.02773.31174,3.74391,2.03443,4.2118,1.87694.4679,3.44137-.62405,4.06772-2.80812a109.18033,109.18033,0,0,0,3.12867-27.917Zm32.854-36.96258a3.10567,3.10567,0,0,0-3.91136-2.02773,2.97022,2.97022,0,0,0-2.03235,3.90006c2.50253,9.35957,3.44041,19.02707,4.067,28.85281a155.42236,155.42236,0,0,1-5.0079,47.25852c-.46789,2.02792.31232,3.90025,2.03519,4.2118a3.12981,3.12981,0,0,0,4.067-2.65178,158.74287,158.74287,0,0,0,5.31944-41.48688,159.06625,159.06625,0,0,0-2.03234-26.98258,60.29831,60.29831,0,0,0-2.5046-11.07422ZM15.61237,48.32272A67.883,67.883,0,0,1,27.18744,31.633C41.11155,16.81945,58.16452,9.0199,78.66305,8.39586c2.34712,0,3.75521-1.24828,3.75521-3.276C82.416,3.09194,81.00789,2,78.5046,2A77.9438,77.9438,0,0,0,10.13447,45.04442a5.77164,5.77164,0,0,0-.62406,2.18407,2.72436,2.72436,0,0,0,1.56425,2.80736c1.72077.93654,3.59676.31231,4.53771-1.71543ZM58.79086,85.753c-1.25059-7.48553-.31175-14.19161,4.85155-20.11959a2.805,2.805,0,0,0,.62425-1.40368c.15616-1.55983-.15635-2.80812-1.7206-3.43216a2.98066,2.98066,0,0,0-3.91136.93635c-5.63137,6.55146-7.66581,14.19542-6.41388,22.77308a143.77173,143.77173,0,0,1,1.87675,19.65112,84.88938,84.88938,0,0,1-1.87675,19.18379,87.66557,87.66557,0,0,1-7.822,21.36711,4.07667,4.07667,0,0,0-.7827,2.652,2.99418,2.99418,0,0,0,2.34693,2.652c1.72079.31173,2.815-.31251,3.75521-1.87234a90.13491,90.13491,0,0,0,9.69891-29.79089A108.40093,108.40093,0,0,0,58.79315,85.753ZM22.338,94.48834c-1.09423-7.01916-2.03233-13.88368-1.09423-21.05461A59.14015,59.14015,0,0,1,46.11944,31.47686a3.29673,3.29673,0,0,0,1.56444-3.90024c-.78269-2.18389-2.97348-2.65176-5.16425-1.24735A60.84871,60.84871,0,0,0,29.37822,38.49678a64.523,64.523,0,0,0-14.7068,39.7707c-.31174,7.6434,1.72287,15.12892,2.19077,22.61463.31251,4.99219.46791,9.98419-1.09424,14.97429-.4679,1.55983-.93809,3.27525-1.40827,4.52334a3.12377,3.12377,0,0,0,3.12886,3.43008c1.87693,0,2.65868-1.09195,3.285-2.652,3.285-8.57766,2.81711-17.6232,1.56442-26.66951ZM157.0425,67.03786Q147.65477,20.2483,102.12991,5.276A45.00768,45.00768,0,0,0,91.80237,3.09194c-1.87828-.15615-3.12867.78039-3.28426,2.4958a2.87607,2.87607,0,0,0,2.50252,3.58833c.62406.15558,1.2504.15558,1.72059.31175A70.72962,70.72962,0,0,1,133.1047,31.94476a69.18254,69.18254,0,0,1,13.9241,22.61539,74.061,74.061,0,0,1,4.69407,23.23944c.15538,2.33946,1.87825,3.7439,4.06674,3.11986,1.56444-.4679,2.34713-1.71618,2.19077-4.212a41.34713,41.34713,0,0,0-.93788-9.6696ZM115.74016,40.83473a46.09788,46.09788,0,0,0-10.16908-7.17379,3.002,3.002,0,0,0-4.22521,1.09194c-.93885,1.55983-.46866,3.276,1.25193,4.368a3.91752,3.91752,0,0,0,1.09424.62422c10.4837,6.3936,17.83548,15.283,21.27894,27.13666,3.12887,11.38806,3.9108,23.08329,4.22309,34.7806a167.16816,167.16816,0,0,1-2.34692,33.06462c-.31174,2.34023.624,3.7439,2.50251,4.0564,2.03521.31175,3.44347-.78039,3.755-3.11985a162.60561,162.60561,0,0,0,2.34712-27.91913,217.74083,217.74083,0,0,0-2.65869-34.62312c-2.03461-12.79173-7.51041-23.55117-17.053-32.2865ZM89.76794,53.62646a28.15742,28.15742,0,0,0-18.92915-.15615c-2.66077.78037-3.44346,3.58546-1.72059,5.30163,1.24984,1.24809,2.50253,1.09195,3.91061.62406a21.7273,21.7273,0,0,1,28.47246,16.8428,163.57907,163.57907,0,0,1,2.34693,17.31375A137.996,137.996,0,0,1,103.692,118.974a149.65135,149.65135,0,0,1-7.04022,31.97477c-.1554.62405-.4679,1.092-.31155,1.71618a3.009,3.009,0,0,0,2.81483,2.65177,3.073,3.073,0,0,0,3.4427-2.34022,143.91448,143.91448,0,0,0,8.13447-46.946,167.06448,167.06448,0,0,0-2.65867-29.6353c-2.03462-11.07347-7.97831-18.87149-18.30566-22.77079ZM46.431,72.65334C50.03005,55.02805,68.64821,42.7065,86.48292,46.294a35.29014,35.29014,0,0,1,20.18241,11.85368,8.8989,8.8989,0,0,0,1.72,1.71617,3.19219,3.19219,0,0,0,3.755-.93579c1.09424-1.40444.93885-2.80812-.31155-4.5243-7.19867-8.733-16.42891-13.87928-27.84841-14.81508-14.55046-1.2481-26.59781,3.90025-35.82653,15.283A38.57467,38.57467,0,0,0,39.861,85.4407c.7804,5.30373,1.72077,10.45208,1.72077,15.75372,0,3.74391,0,7.488-.31174,11.07347a3.00588,3.00588,0,0,0,2.81408,3.276,3.03818,3.03818,0,0,0,3.44346-2.652,100.85173,100.85173,0,0,0-.15616-20.58748c-.47018-4.21179-1.87827-8.26743-1.56443-12.16769a39.31,39.31,0,0,1,.62406-7.48342Zm97.78146,20.43132a3.18855,3.18855,0,0,0,2.97269-3.43217V88.56056c-.62425-5.92722-1.2506-11.8531-2.19077-17.77879-2.03235-13.10195-7.19563-24.64312-16.1126-34.31273C115.89557,21.96341,99.46894,14.78945,79.91136,14.63329a64.57052,64.57052,0,0,0-25.3436,5.14835,3.233,3.233,0,0,0-2.03462,4.20951,3.15932,3.15932,0,0,0,4.38154,1.56A60.10933,60.10933,0,0,1,85.54483,21.183a57.79887,57.79887,0,0,1,35.04479,15.91007c10.32431,9.82517,16.268,21.835,18.30566,36.02812q1.16919,8.42465,1.876,16.84377c.46789,1.87157,1.72058,3.11966,3.44119,3.11966ZM71.15054,82.94489a11.40154,11.40154,0,0,1,0-5.614,9.11075,9.11075,0,0,1,9.70119-6.55146c4.22292.15558,7.66638,3.2762,8.60218,7.9559a150.63857,150.63857,0,0,1,2.661,26.51468,3.1253,3.1253,0,0,0,3.12887,3.43236c1.879,0,2.97252-1.40367,3.12867-3.276V102.5981h.15635c-.3125-4.05545-.4679-8.11185-.93581-12.16521-.47018-4.05565-1.09653-8.11206-1.72287-12.16541a15.95817,15.95817,0,0,0-17.67931-13.726c-8.13448.93654-14.7068,9.04763-13.45393,17.002.62406,4.83584,1.40809,9.6696,1.876,14.50563a100.76525,100.76525,0,0,1-4.69311,39.77A111.03411,111.03411,0,0,1,55.976,149.85661a3.05946,3.05946,0,0,0,.15616,3.43236,2.84779,2.84779,0,0,0,2.97251,1.24752,3.58665,3.58665,0,0,0,2.815-2.33946C72.715,130.2034,75.21748,107.1224,71.15054,82.94717ZM34.38592,91.52482c-.7825-5.30393-1.565-10.76381-1.09634-16.06545A45.82532,45.82532,0,0,1,49.87465,44.26631a45.38948,45.38948,0,0,1,28.16-10.76171,44.31355,44.31355,0,0,1,12.82985,1.24828,3.86115,3.86115,0,0,0,1.87676.15616,2.85951,2.85951,0,0,0,2.50252-2.80814,3.03932,3.03932,0,0,0-2.34694-3.276,45.9556,45.9556,0,0,0-13.14161-1.55984,34.7057,34.7057,0,0,0-9.6989.93577c-15.801,2.96429-27.84821,11.54421-36.14113,25.42352a50.63513,50.63513,0,0,0-6.56928,32.59653C27.81379,90.589,28.754,94.80084,29.06571,99.169c.62406,10.75944-.78174,21.20867-5.63119,30.87827a3.03324,3.03324,0,0,0-.47019,2.02771,2.85292,2.85292,0,0,0,2.65868,2.652,3.38105,3.38105,0,0,0,3.4427-2.02772c6.57-12.9458,7.51023-26.98125,5.32021-41.17439Zm0,0"/></g><path class="cls-2" d="M27.18744,31.63306C41.11157,16.81946,58.16449,9.0199,78.663,8.39575c2.34717,0,3.75525-1.24817,3.75525-3.27588C82.416,3.09192,81.00787,2,78.50458,2A77.94379,77.94379,0,0,0,10.13446,45.04443a5.77132,5.77132,0,0,0-.624,2.18409,2.7244,2.7244,0,0,0,1.56421,2.80737c1.72076.93652,3.5968.31225,4.53772-1.71546v.00232A67.882,67.882,0,0,1,27.18744,31.63306Z"/><path class="cls-2" d="M79.91138,14.6333a64.57,64.57,0,0,0-25.34363,5.14832,3.2331,3.2331,0,0,0-2.03461,4.20959,3.1594,3.1594,0,0,0,4.38153,1.55994,60.1104,60.1104,0,0,1,28.63019-4.368A57.799,57.799,0,0,1,120.5896,37.093,58.88274,58.88274,0,0,1,135.65485,60h6.82385a61.76983,61.76983,0,0,0-13.59693-23.531C115.89557,21.96338,99.46893,14.78943,79.91138,14.6333Z"/><path class="cls-2" d="M89.76794,53.62427v.00219a28.1576,28.1576,0,0,0-18.92913-.15625c-2.66077.78052-3.44349,3.58558-1.72058,5.30176,1.24981,1.248,2.5025,1.09192,3.91058.624A22.13267,22.13267,0,0,1,88.68811,60H99.93243A28.63882,28.63882,0,0,0,89.76794,53.62427Z"/><path class="cls-2" d="M8.88391,55.81055c-1.72064-.46875-3.285.62329-3.91138,2.4956C4.81232,58.87061,4.67078,59.4353,4.52411,60H11.1134A3.28977,3.28977,0,0,0,8.88391,55.81055Z"/><path class="cls-2" d="M29.84613,48.63428A58.71554,58.71554,0,0,1,46.11945,31.47681a3.29665,3.29665,0,0,0,1.56445-3.90015c-.78272-2.184-2.97351-2.65186-5.16425-1.24731A60.84289,60.84289,0,0,0,29.37823,38.49683,64.50631,64.50631,0,0,0,17.69727,60h6.65606A62.03815,62.03815,0,0,1,29.84613,48.63428Z"/><path class="cls-2" d="M102.12988,5.276A45.009,45.009,0,0,0,91.80237,3.09192c-1.8783-.15613-3.12866.78039-3.28424,2.49573A2.876,2.876,0,0,0,91.02063,9.176c.62408.15564,1.25043.15564,1.72058.31176a70.72924,70.72924,0,0,1,40.36347,22.457,69.1805,69.1805,0,0,1,13.92413,22.61524Q148.0401,57.24658,148.83527,60h6.53057Q144.12574,19.09863,102.12988,5.276Z"/><path class="cls-2" d="M115.74017,40.83472A46.09864,46.09864,0,0,0,105.571,33.66089a3.0019,3.0019,0,0,0-4.22515,1.092c-.93885,1.55981-.46869,3.27588,1.25189,4.36792a3.92165,3.92165,0,0,0,1.09424.62427A46.95911,46.95911,0,0,1,122.37378,60h6.80768A52.617,52.617,0,0,0,115.74017,40.83472Z"/><path class="cls-2" d="M112.14038,58.9281c1.09424-1.40442.93884-2.80823-.31158-4.52429-7.19867-8.73316-16.4289-13.8794-27.84839-14.81519C69.42993,38.34058,57.38257,43.489,48.15387,54.8717A41.09643,41.09643,0,0,0,44.60156,60h7.54022c7.67536-10.36462,21.2165-16.34607,34.34113-13.706a35.2907,35.2907,0,0,1,20.18243,11.85376,8.899,8.899,0,0,0,1.72,1.71618A2.60451,2.60451,0,0,0,108.74268,60h1.75146A3.53427,3.53427,0,0,0,112.14038,58.9281Z"/><path class="cls-2" d="M49.87463,44.26636a45.38883,45.38883,0,0,1,28.16-10.76172,44.30568,44.30568,0,0,1,12.82983,1.24829,3.86211,3.86211,0,0,0,1.87677.156,2.85935,2.85935,0,0,0,2.5025-2.80811A3.03909,3.03909,0,0,0,92.89679,28.825a45.94691,45.94691,0,0,0-13.1416-1.55981,34.70234,34.70234,0,0,0-9.69892.93567c-15.801,2.96423-27.8482,11.54431-36.14111,25.42346A52.36716,52.36716,0,0,0,30.74011,60h6.81983A45.95626,45.95626,0,0,1,49.87463,44.26636Z"/></g></svg> +\ No newline at end of file +diff --git a/polkit-agent/assets/biowaiting/fingerprint7.svg b/polkit-agent/assets/biowaiting/fingerprint7.svg +new file mode 100644 +index 0000000..b63d893 +--- /dev/null ++++ b/polkit-agent/assets/biowaiting/fingerprint7.svg +@@ -0,0 +1 @@ ++<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 160 160"><defs><style>.cls-1{opacity:0.2;}.cls-2{fill:#3790fa;}</style></defs><g id="文字标注"><g class="cls-1"><path d="M76.78191,140.809a3.00926,3.00926,0,0,0-4.06694,1.87157l-4.22311,10.29593a2.95177,2.95177,0,0,0,2.34693,4.2097c1.87618,0,2.81427-.62348,3.44061-2.02792q2.35321-4.96514,4.2252-10.13749a3.22339,3.22339,0,0,0-1.72269-4.21179Zm71.02958-38.52241a3.08449,3.08449,0,0,0-3.44119-2.96447,3.01947,3.01947,0,0,0-2.81653,3.276c.15559,5.14854-.15616,10.13768-.31232,15.286,0,2.33947,1.09425,3.58775,2.971,3.74391,1.87844,0,3.28728-1.24829,3.28728-3.58851,0-3.43141.46791-7.01916.31175-10.29517a31.74592,31.74592,0,0,0,0-5.46008ZM42.99058,121.93748a3.19813,3.19813,0,0,0-3.91137,2.18407c-.3125.7804-.4679,1.71618-.7825,2.49562a101.97516,101.97516,0,0,1-5.00713,12.01c-1.09424,2.34022.1554,4.67969,2.66077,4.67969,1.40828.15616,2.34636-.77963,2.97271-2.02772a81.29759,81.29759,0,0,0,6.09985-15.4437,3.0299,3.0299,0,0,0-2.03233-3.898Zm51.78525-7.17321a3.13259,3.13259,0,0,0-3.44346,2.80735,161.02757,161.02757,0,0,1-4.84945,22.9279c-1.25193,4.36718-2.81636,8.73532-4.38079,13.10328a2.97748,2.97748,0,0,0,1.25192,3.898,3.04925,3.04925,0,0,0,3.75521-.3125,5.627,5.627,0,0,0,1.25041-2.33946,128.60479,128.60479,0,0,0,4.85173-14.97123,161.52838,161.52838,0,0,0,4.37926-21.68171,3.2645,3.2645,0,0,0-2.81483-3.43159ZM11.07466,60.17791a3.31205,3.31205,0,0,0-2.19078-4.36738c-1.72059-.46865-3.285.62329-3.91137,2.49561A79.568,79.568,0,0,0,2,80.45155a66.61318,66.61318,0,0,0,.31174,7.6432A76.2778,76.2778,0,0,0,5.91136,104.626,2.67954,2.67954,0,0,0,8.57,106.6545c2.661.15558,3.91289-1.87233,3.13095-4.68045a70.50526,70.50526,0,0,1-.62633-41.79842ZM85.701,104.15584a75.8642,75.8642,0,0,0-.4679-9.98362,114.4834,114.4834,0,0,0-2.19078-14.6595,3.09174,3.09174,0,0,0-3.59962-2.49581,3.03668,3.03668,0,0,0-2.34617,3.90025,116.66849,116.66849,0,0,1,2.34617,18.24725,106.72189,106.72189,0,0,1-2.97252,31.50478c-.46789,2.02773.31174,3.74391,2.03443,4.2118,1.87694.4679,3.44137-.62405,4.06772-2.80812a109.18033,109.18033,0,0,0,3.12867-27.917Zm32.854-36.96258a3.10567,3.10567,0,0,0-3.91136-2.02773,2.97022,2.97022,0,0,0-2.03235,3.90006c2.50253,9.35957,3.44041,19.02707,4.067,28.85281a155.42236,155.42236,0,0,1-5.0079,47.25852c-.46789,2.02792.31232,3.90025,2.03519,4.2118a3.12981,3.12981,0,0,0,4.067-2.65178,158.74287,158.74287,0,0,0,5.31944-41.48688,159.06625,159.06625,0,0,0-2.03234-26.98258,60.29831,60.29831,0,0,0-2.5046-11.07422ZM15.61237,48.32272A67.883,67.883,0,0,1,27.18744,31.633C41.11155,16.81945,58.16452,9.0199,78.66305,8.39586c2.34712,0,3.75521-1.24828,3.75521-3.276C82.416,3.09194,81.00789,2,78.5046,2A77.9438,77.9438,0,0,0,10.13447,45.04442a5.77164,5.77164,0,0,0-.62406,2.18407,2.72436,2.72436,0,0,0,1.56425,2.80736c1.72077.93654,3.59676.31231,4.53771-1.71543ZM58.79086,85.753c-1.25059-7.48553-.31175-14.19161,4.85155-20.11959a2.805,2.805,0,0,0,.62425-1.40368c.15616-1.55983-.15635-2.80812-1.7206-3.43216a2.98066,2.98066,0,0,0-3.91136.93635c-5.63137,6.55146-7.66581,14.19542-6.41388,22.77308a143.77173,143.77173,0,0,1,1.87675,19.65112,84.88938,84.88938,0,0,1-1.87675,19.18379,87.66557,87.66557,0,0,1-7.822,21.36711,4.07667,4.07667,0,0,0-.7827,2.652,2.99418,2.99418,0,0,0,2.34693,2.652c1.72079.31173,2.815-.31251,3.75521-1.87234a90.13491,90.13491,0,0,0,9.69891-29.79089A108.40093,108.40093,0,0,0,58.79315,85.753ZM22.338,94.48834c-1.09423-7.01916-2.03233-13.88368-1.09423-21.05461A59.14015,59.14015,0,0,1,46.11944,31.47686a3.29673,3.29673,0,0,0,1.56444-3.90024c-.78269-2.18389-2.97348-2.65176-5.16425-1.24735A60.84871,60.84871,0,0,0,29.37822,38.49678a64.523,64.523,0,0,0-14.7068,39.7707c-.31174,7.6434,1.72287,15.12892,2.19077,22.61463.31251,4.99219.46791,9.98419-1.09424,14.97429-.4679,1.55983-.93809,3.27525-1.40827,4.52334a3.12377,3.12377,0,0,0,3.12886,3.43008c1.87693,0,2.65868-1.09195,3.285-2.652,3.285-8.57766,2.81711-17.6232,1.56442-26.66951ZM157.0425,67.03786Q147.65477,20.2483,102.12991,5.276A45.00768,45.00768,0,0,0,91.80237,3.09194c-1.87828-.15615-3.12867.78039-3.28426,2.4958a2.87607,2.87607,0,0,0,2.50252,3.58833c.62406.15558,1.2504.15558,1.72059.31175A70.72962,70.72962,0,0,1,133.1047,31.94476a69.18254,69.18254,0,0,1,13.9241,22.61539,74.061,74.061,0,0,1,4.69407,23.23944c.15538,2.33946,1.87825,3.7439,4.06674,3.11986,1.56444-.4679,2.34713-1.71618,2.19077-4.212a41.34713,41.34713,0,0,0-.93788-9.6696ZM115.74016,40.83473a46.09788,46.09788,0,0,0-10.16908-7.17379,3.002,3.002,0,0,0-4.22521,1.09194c-.93885,1.55983-.46866,3.276,1.25193,4.368a3.91752,3.91752,0,0,0,1.09424.62422c10.4837,6.3936,17.83548,15.283,21.27894,27.13666,3.12887,11.38806,3.9108,23.08329,4.22309,34.7806a167.16816,167.16816,0,0,1-2.34692,33.06462c-.31174,2.34023.624,3.7439,2.50251,4.0564,2.03521.31175,3.44347-.78039,3.755-3.11985a162.60561,162.60561,0,0,0,2.34712-27.91913,217.74083,217.74083,0,0,0-2.65869-34.62312c-2.03461-12.79173-7.51041-23.55117-17.053-32.2865ZM89.76794,53.62646a28.15742,28.15742,0,0,0-18.92915-.15615c-2.66077.78037-3.44346,3.58546-1.72059,5.30163,1.24984,1.24809,2.50253,1.09195,3.91061.62406a21.7273,21.7273,0,0,1,28.47246,16.8428,163.57907,163.57907,0,0,1,2.34693,17.31375A137.996,137.996,0,0,1,103.692,118.974a149.65135,149.65135,0,0,1-7.04022,31.97477c-.1554.62405-.4679,1.092-.31155,1.71618a3.009,3.009,0,0,0,2.81483,2.65177,3.073,3.073,0,0,0,3.4427-2.34022,143.91448,143.91448,0,0,0,8.13447-46.946,167.06448,167.06448,0,0,0-2.65867-29.6353c-2.03462-11.07347-7.97831-18.87149-18.30566-22.77079ZM46.431,72.65334C50.03005,55.02805,68.64821,42.7065,86.48292,46.294a35.29014,35.29014,0,0,1,20.18241,11.85368,8.8989,8.8989,0,0,0,1.72,1.71617,3.19219,3.19219,0,0,0,3.755-.93579c1.09424-1.40444.93885-2.80812-.31155-4.5243-7.19867-8.733-16.42891-13.87928-27.84841-14.81508-14.55046-1.2481-26.59781,3.90025-35.82653,15.283A38.57467,38.57467,0,0,0,39.861,85.4407c.7804,5.30373,1.72077,10.45208,1.72077,15.75372,0,3.74391,0,7.488-.31174,11.07347a3.00588,3.00588,0,0,0,2.81408,3.276,3.03818,3.03818,0,0,0,3.44346-2.652,100.85173,100.85173,0,0,0-.15616-20.58748c-.47018-4.21179-1.87827-8.26743-1.56443-12.16769a39.31,39.31,0,0,1,.62406-7.48342Zm97.78146,20.43132a3.18855,3.18855,0,0,0,2.97269-3.43217V88.56056c-.62425-5.92722-1.2506-11.8531-2.19077-17.77879-2.03235-13.10195-7.19563-24.64312-16.1126-34.31273C115.89557,21.96341,99.46894,14.78945,79.91136,14.63329a64.57052,64.57052,0,0,0-25.3436,5.14835,3.233,3.233,0,0,0-2.03462,4.20951,3.15932,3.15932,0,0,0,4.38154,1.56A60.10933,60.10933,0,0,1,85.54483,21.183a57.79887,57.79887,0,0,1,35.04479,15.91007c10.32431,9.82517,16.268,21.835,18.30566,36.02812q1.16919,8.42465,1.876,16.84377c.46789,1.87157,1.72058,3.11966,3.44119,3.11966ZM71.15054,82.94489a11.40154,11.40154,0,0,1,0-5.614,9.11075,9.11075,0,0,1,9.70119-6.55146c4.22292.15558,7.66638,3.2762,8.60218,7.9559a150.63857,150.63857,0,0,1,2.661,26.51468,3.1253,3.1253,0,0,0,3.12887,3.43236c1.879,0,2.97252-1.40367,3.12867-3.276V102.5981h.15635c-.3125-4.05545-.4679-8.11185-.93581-12.16521-.47018-4.05565-1.09653-8.11206-1.72287-12.16541a15.95817,15.95817,0,0,0-17.67931-13.726c-8.13448.93654-14.7068,9.04763-13.45393,17.002.62406,4.83584,1.40809,9.6696,1.876,14.50563a100.76525,100.76525,0,0,1-4.69311,39.77A111.03411,111.03411,0,0,1,55.976,149.85661a3.05946,3.05946,0,0,0,.15616,3.43236,2.84779,2.84779,0,0,0,2.97251,1.24752,3.58665,3.58665,0,0,0,2.815-2.33946C72.715,130.2034,75.21748,107.1224,71.15054,82.94717ZM34.38592,91.52482c-.7825-5.30393-1.565-10.76381-1.09634-16.06545A45.82532,45.82532,0,0,1,49.87465,44.26631a45.38948,45.38948,0,0,1,28.16-10.76171,44.31355,44.31355,0,0,1,12.82985,1.24828,3.86115,3.86115,0,0,0,1.87676.15616,2.85951,2.85951,0,0,0,2.50252-2.80814,3.03932,3.03932,0,0,0-2.34694-3.276,45.9556,45.9556,0,0,0-13.14161-1.55984,34.7057,34.7057,0,0,0-9.6989.93577c-15.801,2.96429-27.84821,11.54421-36.14113,25.42352a50.63513,50.63513,0,0,0-6.56928,32.59653C27.81379,90.589,28.754,94.80084,29.06571,99.169c.62406,10.75944-.78174,21.20867-5.63119,30.87827a3.03324,3.03324,0,0,0-.47019,2.02771,2.85292,2.85292,0,0,0,2.65868,2.652,3.38105,3.38105,0,0,0,3.4427-2.02772c6.57-12.9458,7.51023-26.98125,5.32021-41.17439Zm0,0"/></g><path class="cls-2" d="M27.18744,31.63306C41.11157,16.81946,58.16449,9.0199,78.663,8.39575c2.34717,0,3.75525-1.24817,3.75525-3.27588C82.416,3.09192,81.00787,2,78.50458,2A77.94379,77.94379,0,0,0,10.13446,45.04443a5.77132,5.77132,0,0,0-.624,2.18409,2.7244,2.7244,0,0,0,1.56421,2.80737c1.72076.93652,3.5968.31225,4.53772-1.71546v.00232A67.882,67.882,0,0,1,27.18744,31.63306Z"/><path class="cls-2" d="M21.24377,73.43372A59.1404,59.1404,0,0,1,46.11945,31.47681a3.29665,3.29665,0,0,0,1.56445-3.90015c-.78272-2.184-2.97351-2.65186-5.16425-1.24731A60.84289,60.84289,0,0,0,29.37823,38.49683,64.52222,64.52222,0,0,0,14.67145,78.26746c-.02362.579-.01044,1.15539-.00885,1.73254h6.21386A47.4584,47.4584,0,0,1,21.24377,73.43372Z"/><path class="cls-2" d="M11.07465,60.178a3.312,3.312,0,0,0-2.19074-4.36743c-1.72064-.46875-3.285.62329-3.91138,2.4956A79.36971,79.36971,0,0,0,2.0069,80H8.22131a70.73238,70.73238,0,0,1,2.85334-19.82446Z"/><path class="cls-2" d="M62.54608,60.79761a2.98066,2.98066,0,0,0-3.91138.93628A26.8757,26.8757,0,0,0,51.871,80h6.43A21.1615,21.1615,0,0,1,63.6424,65.63342a2.80487,2.80487,0,0,0,.62426-1.40368C64.42279,62.66992,64.11029,61.42163,62.54608,60.79761Z"/><path class="cls-2" d="M157.04248,67.03784Q147.65476,20.24817,102.12988,5.276A45.009,45.009,0,0,0,91.80237,3.09192c-1.8783-.15613-3.12866.78039-3.28424,2.49573A2.876,2.876,0,0,0,91.02063,9.176c.62408.15564,1.25043.15564,1.72058.31176a70.72924,70.72924,0,0,1,40.36347,22.457,69.1805,69.1805,0,0,1,13.92413,22.61524,74.06108,74.06108,0,0,1,4.694,23.2395A3.86858,3.86858,0,0,0,152.52161,80h4.71673a4.58878,4.58878,0,0,0,.74207-3.29248A41.3474,41.3474,0,0,0,157.04248,67.03784Z"/><path class="cls-2" d="M128.88177,36.469C115.89557,21.96338,99.46893,14.78943,79.91138,14.6333a64.57,64.57,0,0,0-25.34363,5.14832,3.2331,3.2331,0,0,0-2.03461,4.20959,3.1594,3.1594,0,0,0,4.38153,1.55994,60.1104,60.1104,0,0,1,28.63019-4.368A57.799,57.799,0,0,1,120.5896,37.093c10.32434,9.82519,16.268,21.83508,18.30566,36.0282.3183,2.29333.60431,4.58618.87134,6.87878h6.47894c-.36224-3.07288-.76367-6.14563-1.25116-9.21826C142.962,57.67981,137.79877,46.13867,128.88177,36.469Z"/><path class="cls-2" d="M78.1908,64.5415c-7.60834.876-13.847,8.02832-13.59766,15.4585h6.20538a7.61429,7.61429,0,0,1,.352-2.66907,9.1107,9.1107,0,0,1,9.70124-6.55139c4.2229.15552,7.66638,3.27612,8.60217,7.95581.08295.42066.1535.84326.23212,1.26465h6.45031q-.13311-.86626-.26629-1.73254A15.95811,15.95811,0,0,0,78.1908,64.5415Z"/><path class="cls-2" d="M121.05963,78.26746A60.2951,60.2951,0,0,0,118.555,67.19324a3.10565,3.10565,0,0,0-3.91137-2.02771,2.97016,2.97016,0,0,0-2.03229,3.9A103.82461,103.82461,0,0,1,114.87317,80h6.44037C121.22894,79.42236,121.14935,78.844,121.05963,78.26746Z"/><path class="cls-2" d="M86.48291,46.294a35.2907,35.2907,0,0,1,20.18243,11.85376,8.899,8.899,0,0,0,1.72,1.71618,3.1924,3.1924,0,0,0,3.75507-.93579c1.09424-1.40442.93884-2.80823-.31158-4.52429-7.19867-8.73316-16.4289-13.8794-27.84839-14.81519C69.42993,38.34058,57.38257,43.489,48.15387,54.8717A38.07922,38.07922,0,0,0,39.44556,80H45.8092a39.08563,39.08563,0,0,1,.62177-7.34668C50.03,55.02808,68.64819,42.70654,86.48291,46.294Z"/><path class="cls-2" d="M132.79315,73.12122c-2.03461-12.79175-7.51044-23.55115-17.053-32.2865A46.09864,46.09864,0,0,0,105.571,33.66089a3.0019,3.0019,0,0,0-4.22515,1.092c-.93885,1.55981-.46869,3.27588,1.25189,4.36792a3.92165,3.92165,0,0,0,1.09424.62427c10.4837,6.39355,17.83551,15.283,21.279,27.13659A103.2,103.2,0,0,1,127.62378,80H133.759C133.46936,77.69324,133.15253,75.40161,132.79315,73.12122Z"/><path class="cls-2" d="M108.07361,76.39514c-2.03461-11.07348-7.97833-18.87146-18.30567-22.77087v.00219a28.1576,28.1576,0,0,0-18.92913-.15625c-2.66077.78052-3.44349,3.58558-1.72058,5.30176,1.24981,1.248,2.5025,1.09192,3.91058.624a21.72724,21.72724,0,0,1,28.47247,16.84277c.23816,1.25378.45477,2.50757.66333,3.76123H108.678Q108.39414,78.19642,108.07361,76.39514Z"/><path class="cls-2" d="M92.89679,28.825a45.94691,45.94691,0,0,0-13.1416-1.55981,34.70234,34.70234,0,0,0-9.69892.93567c-15.801,2.96423-27.8482,11.54431-36.14111,25.42346A49.96274,49.96274,0,0,0,26.92523,80h6.24695a39.78137,39.78137,0,0,1,.11737-4.54065,45.82518,45.82518,0,0,1,16.58508-31.193,45.38883,45.38883,0,0,1,28.16-10.76172,44.30568,44.30568,0,0,1,12.82983,1.24829,3.86211,3.86211,0,0,0,1.87677.156,2.85935,2.85935,0,0,0,2.5025-2.80811A3.03909,3.03909,0,0,0,92.89679,28.825Z"/><path class="cls-2" d="M83.0423,79.5127a3.09175,3.09175,0,0,0-3.59961-2.49585A2.99226,2.99226,0,0,0,76.99078,80h6.15058C83.10565,79.83765,83.079,79.67505,83.0423,79.5127Z"/></g></svg> +\ No newline at end of file +diff --git a/polkit-agent/assets/biowaiting/fingerprint8.svg b/polkit-agent/assets/biowaiting/fingerprint8.svg +new file mode 100644 +index 0000000..a9023c0 +--- /dev/null ++++ b/polkit-agent/assets/biowaiting/fingerprint8.svg +@@ -0,0 +1 @@ ++<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 160 160"><defs><style>.cls-1{opacity:0.2;}.cls-2{fill:#3790fa;}</style></defs><g id="文字标注"><g class="cls-1"><path d="M76.78191,140.809a3.00927,3.00927,0,0,0-4.06695,1.87157l-4.2231,10.29593a2.95177,2.95177,0,0,0,2.34692,4.2097c1.87618,0,2.81427-.62348,3.44061-2.02792q2.35322-4.96514,4.2252-10.13749a3.22338,3.22338,0,0,0-1.72268-4.21179Zm71.02957-38.52241a3.08449,3.08449,0,0,0-3.44119-2.96447,3.01947,3.01947,0,0,0-2.81653,3.276c.15559,5.14854-.15616,10.13768-.31232,15.286,0,2.33947,1.09425,3.58775,2.971,3.74391,1.87844,0,3.28729-1.24829,3.28729-3.58851,0-3.43141.4679-7.01916.31174-10.29517a31.74592,31.74592,0,0,0,0-5.46008ZM42.99057,121.93748a3.19812,3.19812,0,0,0-3.91136,2.18407c-.31251.7804-.4679,1.71618-.7825,2.49562a101.9769,101.9769,0,0,1-5.00714,12.01c-1.09424,2.34022.1554,4.67969,2.66078,4.67969,1.40827.15616,2.34636-.77963,2.9727-2.02772a81.29627,81.29627,0,0,0,6.09985-15.4437,3.02989,3.02989,0,0,0-2.03233-3.898Zm51.78526-7.17321a3.1326,3.1326,0,0,0-3.44347,2.80735,161.02757,161.02757,0,0,1-4.84945,22.9279c-1.25192,4.36718-2.81636,8.73532-4.38079,13.10328a2.97748,2.97748,0,0,0,1.25192,3.898,3.04925,3.04925,0,0,0,3.75521-.3125,5.62684,5.62684,0,0,0,1.25041-2.33946,128.60675,128.60675,0,0,0,4.85174-14.97123,161.5315,161.5315,0,0,0,4.37926-21.68171,3.2645,3.2645,0,0,0-2.81483-3.43159ZM11.07465,60.17791a3.312,3.312,0,0,0-2.19078-4.36738c-1.72059-.46865-3.285.62329-3.91137,2.49561A79.568,79.568,0,0,0,2,80.45155a66.61318,66.61318,0,0,0,.31174,7.6432A76.2778,76.2778,0,0,0,5.91135,104.626,2.67954,2.67954,0,0,0,8.57,106.6545c2.661.15558,3.91289-1.87233,3.131-4.68045a70.50518,70.50518,0,0,1-.62634-41.79842ZM85.701,104.15584a75.86247,75.86247,0,0,0-.4679-9.98362,114.4834,114.4834,0,0,0-2.19078-14.6595,3.09173,3.09173,0,0,0-3.59961-2.49581,3.03667,3.03667,0,0,0-2.34618,3.90025,116.66849,116.66849,0,0,1,2.34618,18.24725,106.72223,106.72223,0,0,1-2.97253,31.50478c-.46789,2.02773.31175,3.74391,2.03443,4.2118,1.87694.4679,3.44137-.62405,4.06772-2.80812a109.17988,109.17988,0,0,0,3.12867-27.917Zm32.854-36.96258a3.10567,3.10567,0,0,0-3.91136-2.02773,2.97022,2.97022,0,0,0-2.03235,3.90006c2.50253,9.35957,3.44042,19.02707,4.067,28.85281a155.422,155.422,0,0,1-5.0079,47.25852c-.46789,2.02792.31232,3.90025,2.0352,4.2118a3.1298,3.1298,0,0,0,4.06695-2.65178,158.74245,158.74245,0,0,0,5.31944-41.48688,159.06625,159.06625,0,0,0-2.03234-26.98258,60.29831,60.29831,0,0,0-2.5046-11.07422ZM15.61236,48.32272A67.88326,67.88326,0,0,1,27.18743,31.633C41.11154,16.81945,58.16451,9.0199,78.663,8.39586c2.34712,0,3.75521-1.24828,3.75521-3.276C82.416,3.09194,81.00788,2,78.50459,2A77.9438,77.9438,0,0,0,10.13446,45.04442a5.77164,5.77164,0,0,0-.62406,2.18407,2.72437,2.72437,0,0,0,1.56425,2.80736c1.72077.93654,3.59676.31231,4.53771-1.71543ZM58.79085,85.753c-1.25058-7.48553-.31174-14.19161,4.85155-20.11959a2.80489,2.80489,0,0,0,.62425-1.40368c.15616-1.55983-.15634-2.80812-1.72059-3.43216a2.98066,2.98066,0,0,0-3.91136.93635c-5.63138,6.55146-7.66581,14.19542-6.41389,22.77308a143.77173,143.77173,0,0,1,1.87675,19.65112,84.8888,84.8888,0,0,1-1.87675,19.18379,87.66557,87.66557,0,0,1-7.822,21.36711,4.07666,4.07666,0,0,0-.78269,2.652,2.99416,2.99416,0,0,0,2.34693,2.652c1.72078.31173,2.815-.31251,3.75521-1.87234a90.1349,90.1349,0,0,0,9.6989-29.79089A108.40061,108.40061,0,0,0,58.79314,85.753ZM22.338,94.48834c-1.09424-7.01916-2.03234-13.88368-1.09424-21.05461A59.14015,59.14015,0,0,1,46.11943,31.47686a3.29673,3.29673,0,0,0,1.56444-3.90024c-.78269-2.18389-2.97347-2.65176-5.16425-1.24735A60.84871,60.84871,0,0,0,29.37821,38.49678a64.52309,64.52309,0,0,0-14.7068,39.7707c-.31174,7.6434,1.72288,15.12892,2.19078,22.61463.3125,4.99219.4679,9.98419-1.09425,14.97429-.4679,1.55983-.93809,3.27525-1.40827,4.52334a3.12377,3.12377,0,0,0,3.12886,3.43008c1.87694,0,2.65868-1.09195,3.285-2.652,3.285-8.57766,2.81712-17.6232,1.56443-26.66951ZM157.04249,67.03786Q147.65476,20.2483,102.1299,5.276A45.00768,45.00768,0,0,0,91.80236,3.09194c-1.87827-.15615-3.12867.78039-3.28426,2.4958a2.87607,2.87607,0,0,0,2.50252,3.58833c.62406.15558,1.25041.15558,1.72059.31175a70.72962,70.72962,0,0,1,40.36348,22.45694A69.18273,69.18273,0,0,1,147.0288,54.56015a74.061,74.061,0,0,1,4.69406,23.23944c.15538,2.33946,1.87825,3.7439,4.06675,3.11986,1.56443-.4679,2.34712-1.71618,2.19076-4.212a41.34713,41.34713,0,0,0-.93788-9.6696ZM115.74016,40.83473a46.09794,46.09794,0,0,0-10.16909-7.17379,3.002,3.002,0,0,0-4.22521,1.09194c-.93885,1.55983-.46866,3.276,1.25194,4.368a3.91739,3.91739,0,0,0,1.09424.62422c10.48369,6.3936,17.83547,15.283,21.27894,27.13666,3.12886,11.38806,3.91079,23.08329,4.22309,34.7806a167.16817,167.16817,0,0,1-2.34693,33.06462c-.31174,2.34023.62405,3.7439,2.50252,4.0564,2.0352.31175,3.44347-.78039,3.755-3.11985a162.60561,162.60561,0,0,0,2.34712-27.91913,217.742,217.742,0,0,0-2.65868-34.62312c-2.03462-12.79173-7.51042-23.55117-17.053-32.2865ZM89.76793,53.62646a28.15742,28.15742,0,0,0-18.92915-.15615c-2.66076.78037-3.44345,3.58546-1.72059,5.30163C70.368,60.02,71.62072,59.86389,73.0288,59.396a21.72731,21.72731,0,0,1,28.47247,16.8428,163.579,163.579,0,0,1,2.34692,17.31375A137.99692,137.99692,0,0,1,103.692,118.974a149.65137,149.65137,0,0,1-7.04023,31.97477c-.1554.62405-.4679,1.092-.31155,1.71618a3.009,3.009,0,0,0,2.81483,2.65177,3.073,3.073,0,0,0,3.44271-2.34022,143.91473,143.91473,0,0,0,8.13446-46.946,167.06542,167.06542,0,0,0-2.65866-29.6353c-2.03463-11.07347-7.97832-18.87149-18.30567-22.77079ZM46.431,72.65334C50.03,55.02805,68.6482,42.7065,86.48291,46.294a35.29014,35.29014,0,0,1,20.18241,11.85368,8.8989,8.8989,0,0,0,1.72,1.71617,3.19219,3.19219,0,0,0,3.755-.93579c1.09424-1.40444.93885-2.80812-.31155-4.5243-7.19867-8.733-16.42891-13.87928-27.84841-14.81508-14.55045-1.2481-26.59781,3.90025-35.82653,15.283A38.57474,38.57474,0,0,0,39.861,85.4407c.7804,5.30373,1.72078,10.45208,1.72078,15.75372,0,3.74391,0,7.488-.31175,11.07347a3.00588,3.00588,0,0,0,2.81408,3.276,3.03818,3.03818,0,0,0,3.44346-2.652,100.85173,100.85173,0,0,0-.15616-20.58748c-.47018-4.21179-1.87827-8.26743-1.56443-12.16769a39.31083,39.31083,0,0,1,.62406-7.48342Zm97.78146,20.43132a3.18855,3.18855,0,0,0,2.97269-3.43217V88.56056c-.62425-5.92722-1.2506-11.8531-2.19077-17.77879-2.03234-13.10195-7.19563-24.64312-16.1126-34.31273C115.89556,21.96341,99.46893,14.78945,79.91135,14.63329a64.57055,64.57055,0,0,0-25.3436,5.14835,3.23306,3.23306,0,0,0-2.03462,4.20951,3.15933,3.15933,0,0,0,4.38155,1.56A60.10931,60.10931,0,0,1,85.54483,21.183a57.79887,57.79887,0,0,1,35.04478,15.91007c10.32431,9.82517,16.268,21.835,18.30566,36.02812q1.16919,8.42465,1.876,16.84377c.46789,1.87157,1.72058,3.11966,3.44119,3.11966ZM71.15053,82.94489a11.40154,11.40154,0,0,1,0-5.614,9.11075,9.11075,0,0,1,9.70119-6.55146c4.22292.15558,7.66638,3.2762,8.60218,7.9559a150.63952,150.63952,0,0,1,2.661,26.51468,3.1253,3.1253,0,0,0,3.12886,3.43236c1.879,0,2.97252-1.40367,3.12867-3.276V102.5981h.15635c-.3125-4.05545-.4679-8.11185-.9358-12.16521-.47019-4.05565-1.09654-8.11206-1.72288-12.16541a15.95817,15.95817,0,0,0-17.67931-13.726c-8.13447.93654-14.7068,9.04763-13.45392,17.002.624,4.83584,1.40808,9.6696,1.876,14.50563a100.76542,100.76542,0,0,1-4.6931,39.77,111.03563,111.03563,0,0,1-5.9437,14.03754,3.0595,3.0595,0,0,0,.15616,3.43236,2.8478,2.8478,0,0,0,2.97252,1.24752,3.58665,3.58665,0,0,0,2.815-2.33946C72.715,130.2034,75.21748,107.1224,71.15053,82.94717ZM34.38591,91.52482c-.7825-5.30393-1.565-10.76381-1.09634-16.06545A45.82536,45.82536,0,0,1,49.87464,44.26631a45.38952,45.38952,0,0,1,28.16-10.76171,44.31362,44.31362,0,0,1,12.82986,1.24828,3.86111,3.86111,0,0,0,1.87675.15616,2.85951,2.85951,0,0,0,2.50252-2.80814,3.03932,3.03932,0,0,0-2.34694-3.276,45.95556,45.95556,0,0,0-13.14161-1.55984,34.70559,34.70559,0,0,0-9.69889.93577C54.25524,31.16513,42.20807,39.74505,33.91516,53.62436a50.635,50.635,0,0,0-6.56928,32.59653c.4679,4.36814,1.40808,8.57995,1.71983,12.94809.62405,10.75944-.78175,21.20867-5.6312,30.87827a3.03318,3.03318,0,0,0-.47018,2.02771,2.8529,2.8529,0,0,0,2.65867,2.652,3.38107,3.38107,0,0,0,3.44271-2.02772c6.57-12.9458,7.51022-26.98125,5.3202-41.17439Zm0,0"/></g><path class="cls-2" d="M78.50457,2A77.94379,77.94379,0,0,0,10.13445,45.04443a5.77132,5.77132,0,0,0-.624,2.18409,2.72441,2.72441,0,0,0,1.56421,2.80737c1.72076.93652,3.5968.31225,4.53772-1.71546v.00232A67.88222,67.88222,0,0,1,27.18743,31.63306C41.11156,16.81946,58.16448,9.0199,78.663,8.39575c2.34717,0,3.75525-1.24817,3.75525-3.27588C82.416,3.09192,81.00787,2,78.50457,2Z"/><path class="cls-2" d="M138.89526,73.12122q1.16922,8.42468,1.876,16.84375c.4679,1.87158,1.72058,3.11975,3.44123,3.11975a3.1886,3.1886,0,0,0,2.97265-3.43225V88.56055c-.6242-5.92725-1.25055-11.853-2.19073-17.77881C142.962,57.67981,137.79876,46.13867,128.88177,36.469,115.89556,21.96338,99.46893,14.78943,79.91137,14.6333a64.57,64.57,0,0,0-25.34363,5.14832,3.2331,3.2331,0,0,0-2.03461,4.20959,3.15941,3.15941,0,0,0,4.38154,1.55994,60.11034,60.11034,0,0,1,28.63018-4.368A57.799,57.799,0,0,1,120.58959,37.093C130.91393,46.91821,136.8576,58.9281,138.89526,73.12122Z"/><path class="cls-2" d="M92.89678,28.825a45.94687,45.94687,0,0,0-13.1416-1.55981,34.70227,34.70227,0,0,0-9.69891.93567C54.25524,31.165,42.20806,39.74512,33.91515,53.62427A50.63525,50.63525,0,0,0,27.34588,86.221c.46789,4.368,1.40808,8.57983,1.71985,12.948.01611.27758.025.554.03833.83105h6.19269q-.25169-4.22094-.91083-8.47522c-.78253-5.30383-1.565-10.76379-1.09638-16.06543a45.82519,45.82519,0,0,1,16.58509-31.193,45.3888,45.3888,0,0,1,28.16-10.76172,44.30565,44.30565,0,0,1,12.82983,1.24829,3.86211,3.86211,0,0,0,1.87677.156,2.85936,2.85936,0,0,0,2.50251-2.80811A3.0391,3.0391,0,0,0,92.89678,28.825Z"/><path class="cls-2" d="M86.4829,46.294a35.29073,35.29073,0,0,1,20.18244,11.85376,8.89847,8.89847,0,0,0,1.72,1.71618,3.19239,3.19239,0,0,0,3.75506-.93579c1.09424-1.40442.93885-2.80823-.31158-4.52429-7.19867-8.73316-16.4289-13.8794-27.84839-14.81519C69.42992,38.34058,57.38256,43.489,48.15386,54.8717a38.57458,38.57458,0,0,0-8.29291,30.569A121.534,121.534,0,0,1,41.55645,100h6.37079q-.12268-3.84779-.55585-7.69556c-.47021-4.21179-1.87829-8.26745-1.56445-12.16772a39.31138,39.31138,0,0,1,.624-7.4834C50.03,55.02808,68.64819,42.70654,86.4829,46.294Z"/><path class="cls-2" d="M11.07464,60.17554V60.178A3.312,3.312,0,0,0,8.8839,55.81055c-1.72064-.46875-3.285.62329-3.91137,2.4956A79.56615,79.56615,0,0,0,2,80.45154a66.60613,66.60613,0,0,0,.31177,7.64319A80.489,80.489,0,0,0,4.508,100h6.60614A70.25859,70.25859,0,0,1,11.07464,60.17554Z"/><path class="cls-2" d="M58.79314,85.75293h-.00232c-1.25054-7.48547-.3117-14.19153,4.85157-20.11951a2.80487,2.80487,0,0,0,.62426-1.40368c.15613-1.55982-.15637-2.80811-1.72058-3.43213a2.98064,2.98064,0,0,0-3.91137.93628c-5.63141,6.55151-7.66584,14.19543-6.41388,22.77319A146.55217,146.55217,0,0,1,53.92071,100h6.34271A105.137,105.137,0,0,0,58.79314,85.75293Z"/><path class="cls-2" d="M95.87005,78.26746a15.95811,15.95811,0,0,0-17.67926-13.726c-8.13452.93653-14.70685,9.04761-13.454,17.002.62408,4.83593,1.40814,9.66967,1.876,14.50561.09155,1.32031.15576,2.6366.20489,3.95093h6.08338a130.92316,130.92316,0,0,0-1.75061-17.05286v-.00232a11.40213,11.40213,0,0,1,0-5.61389,9.11068,9.11068,0,0,1,9.70123-6.55139c4.2229.15552,7.66638,3.27612,8.60217,7.95581A144.72222,144.72222,0,0,1,91.93957,100H98.3474c-.20983-3.1897-.38647-6.37939-.75445-9.56714C97.12273,86.3772,96.49639,82.3208,95.87005,78.26746Z"/><path class="cls-2" d="M121.05962,78.26746A60.29592,60.29592,0,0,0,118.555,67.19324a3.10566,3.10566,0,0,0-3.91138-2.02771,2.97017,2.97017,0,0,0-2.03229,3.9c2.5025,9.35962,3.44037,19.0271,4.067,28.85291.03375.69507.05664,1.38818.08105,2.08154h6.30756A167.10732,167.10732,0,0,0,121.05962,78.26746Z"/><path class="cls-2" d="M144.37029,99.322a3.09491,3.09491,0,0,0-1.71808.678h4.02131A3.14786,3.14786,0,0,0,144.37029,99.322Z"/><path class="cls-2" d="M157.04247,67.03784Q147.65475,20.24817,102.12988,5.276A45.0092,45.0092,0,0,0,91.80236,3.09192c-1.8783-.15613-3.12866.78039-3.28424,2.49573A2.876,2.876,0,0,0,91.02062,9.176c.62409.15564,1.25043.15564,1.72058.31176a70.72924,70.72924,0,0,1,40.36347,22.457A69.1805,69.1805,0,0,1,147.0288,54.56006a74.06052,74.06052,0,0,1,4.694,23.2395c.1554,2.33948,1.8783,3.7439,4.06677,3.11987,1.56446-.46789,2.34711-1.71618,2.1908-4.21191A41.3474,41.3474,0,0,0,157.04247,67.03784Z"/><path class="cls-2" d="M132.79314,73.12122c-2.0346-12.79175-7.51043-23.55115-17.053-32.2865A46.09888,46.09888,0,0,0,105.571,33.66089a3.00191,3.00191,0,0,0-4.22516,1.092c-.93884,1.55981-.46869,3.27588,1.25189,4.36792a3.92179,3.92179,0,0,0,1.09424.62427c10.4837,6.39355,17.83551,15.283,21.279,27.13659C127.95159,77.73022,128.796,88.85767,129.14,100h6.18017A214.67391,214.67391,0,0,0,132.79314,73.12122Z"/><path class="cls-2" d="M22.338,94.48828c-1.09424-7.019-2.03235-13.88354-1.09424-21.05456A59.14035,59.14035,0,0,1,46.11944,31.47681a3.29665,3.29665,0,0,0,1.56445-3.90015c-.78271-2.184-2.97351-2.65186-5.16424-1.24731A60.84242,60.84242,0,0,0,29.37823,38.49683,64.52217,64.52217,0,0,0,14.67144,78.26746c-.2995,7.34326,1.553,14.54065,2.11493,21.73254h6.19012C22.81164,98.16528,22.59258,96.3269,22.338,94.48828Z"/><path class="cls-2" d="M85.23309,94.17212a114.49913,114.49913,0,0,0-2.1908-14.65942,3.09175,3.09175,0,0,0-3.59961-2.49585,3.03675,3.03675,0,0,0-2.34619,3.90026,116.66963,116.66963,0,0,1,2.34619,18.2472c.01233.27868.01379.55713.02435.83569h6.19886C85.57342,98.13928,85.40807,96.18628,85.23309,94.17212Z"/><path class="cls-2" d="M108.0736,76.39514c-2.03461-11.07348-7.97833-18.87146-18.30566-22.77087v.00219a28.15763,28.15763,0,0,0-18.92914-.15625c-2.66077.78052-3.44348,3.58558-1.72058,5.30176,1.24981,1.248,2.5025,1.09192,3.91058.624a21.72724,21.72724,0,0,1,28.47247,16.84277,163.59068,163.59068,0,0,1,2.34693,17.31372q.29818,3.2113.41839,6.44751h6.34656A168.52224,168.52224,0,0,0,108.0736,76.39514Z"/></g></svg> +\ No newline at end of file +diff --git a/polkit-agent/assets/biowaiting/fingerprint9.svg b/polkit-agent/assets/biowaiting/fingerprint9.svg +new file mode 100644 +index 0000000..4c0be88 +--- /dev/null ++++ b/polkit-agent/assets/biowaiting/fingerprint9.svg +@@ -0,0 +1 @@ ++<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 160 160"><defs><style>.cls-1{opacity:0.2;}.cls-2{fill:#3790fa;}</style></defs><g id="文字标注"><g class="cls-1"><path d="M76.78191,140.809a3.00927,3.00927,0,0,0-4.06695,1.87157l-4.2231,10.29593a2.95177,2.95177,0,0,0,2.34692,4.2097c1.87618,0,2.81427-.62348,3.44061-2.02792q2.35322-4.96514,4.2252-10.13749a3.22338,3.22338,0,0,0-1.72268-4.21179Zm71.02957-38.52241a3.08449,3.08449,0,0,0-3.44119-2.96447,3.01947,3.01947,0,0,0-2.81653,3.276c.15559,5.14854-.15616,10.13768-.31232,15.286,0,2.33947,1.09425,3.58775,2.971,3.74391,1.87844,0,3.28729-1.24829,3.28729-3.58851,0-3.43141.4679-7.01916.31174-10.29517a31.74592,31.74592,0,0,0,0-5.46008ZM42.99057,121.93748a3.19812,3.19812,0,0,0-3.91136,2.18407c-.31251.7804-.4679,1.71618-.7825,2.49562a101.9769,101.9769,0,0,1-5.00714,12.01c-1.09424,2.34022.1554,4.67969,2.66078,4.67969,1.40827.15616,2.34636-.77963,2.9727-2.02772a81.29627,81.29627,0,0,0,6.09985-15.4437,3.02989,3.02989,0,0,0-2.03233-3.898Zm51.78526-7.17321a3.1326,3.1326,0,0,0-3.44347,2.80735,161.02757,161.02757,0,0,1-4.84945,22.9279c-1.25192,4.36718-2.81636,8.73532-4.38079,13.10328a2.97748,2.97748,0,0,0,1.25192,3.898,3.04925,3.04925,0,0,0,3.75521-.3125,5.62684,5.62684,0,0,0,1.25041-2.33946,128.60675,128.60675,0,0,0,4.85174-14.97123,161.5315,161.5315,0,0,0,4.37926-21.68171,3.2645,3.2645,0,0,0-2.81483-3.43159ZM11.07465,60.17791a3.312,3.312,0,0,0-2.19078-4.36738c-1.72059-.46865-3.285.62329-3.91137,2.49561A79.568,79.568,0,0,0,2,80.45155a66.61318,66.61318,0,0,0,.31174,7.6432A76.2778,76.2778,0,0,0,5.91135,104.626,2.67954,2.67954,0,0,0,8.57,106.6545c2.661.15558,3.91289-1.87233,3.131-4.68045a70.50518,70.50518,0,0,1-.62634-41.79842ZM85.701,104.15584a75.86247,75.86247,0,0,0-.4679-9.98362,114.4834,114.4834,0,0,0-2.19078-14.6595,3.09173,3.09173,0,0,0-3.59961-2.49581,3.03667,3.03667,0,0,0-2.34618,3.90025,116.66849,116.66849,0,0,1,2.34618,18.24725,106.72223,106.72223,0,0,1-2.97253,31.50478c-.46789,2.02773.31175,3.74391,2.03443,4.2118,1.87694.4679,3.44137-.62405,4.06772-2.80812a109.17988,109.17988,0,0,0,3.12867-27.917Zm32.854-36.96258a3.10567,3.10567,0,0,0-3.91136-2.02773,2.97022,2.97022,0,0,0-2.03235,3.90006c2.50253,9.35957,3.44042,19.02707,4.067,28.85281a155.422,155.422,0,0,1-5.0079,47.25852c-.46789,2.02792.31232,3.90025,2.0352,4.2118a3.1298,3.1298,0,0,0,4.06695-2.65178,158.74245,158.74245,0,0,0,5.31944-41.48688,159.06625,159.06625,0,0,0-2.03234-26.98258,60.29831,60.29831,0,0,0-2.5046-11.07422ZM15.61236,48.32272A67.88326,67.88326,0,0,1,27.18743,31.633C41.11154,16.81945,58.16451,9.0199,78.663,8.39586c2.34712,0,3.75521-1.24828,3.75521-3.276C82.416,3.09194,81.00788,2,78.50459,2A77.9438,77.9438,0,0,0,10.13446,45.04442a5.77164,5.77164,0,0,0-.62406,2.18407,2.72437,2.72437,0,0,0,1.56425,2.80736c1.72077.93654,3.59676.31231,4.53771-1.71543ZM58.79085,85.753c-1.25058-7.48553-.31174-14.19161,4.85155-20.11959a2.80489,2.80489,0,0,0,.62425-1.40368c.15616-1.55983-.15634-2.80812-1.72059-3.43216a2.98066,2.98066,0,0,0-3.91136.93635c-5.63138,6.55146-7.66581,14.19542-6.41389,22.77308a143.77173,143.77173,0,0,1,1.87675,19.65112,84.8888,84.8888,0,0,1-1.87675,19.18379,87.66557,87.66557,0,0,1-7.822,21.36711,4.07666,4.07666,0,0,0-.78269,2.652,2.99416,2.99416,0,0,0,2.34693,2.652c1.72078.31173,2.815-.31251,3.75521-1.87234a90.1349,90.1349,0,0,0,9.6989-29.79089A108.40061,108.40061,0,0,0,58.79314,85.753ZM22.338,94.48834c-1.09424-7.01916-2.03234-13.88368-1.09424-21.05461A59.14015,59.14015,0,0,1,46.11943,31.47686a3.29673,3.29673,0,0,0,1.56444-3.90024c-.78269-2.18389-2.97347-2.65176-5.16425-1.24735A60.84871,60.84871,0,0,0,29.37821,38.49678a64.52309,64.52309,0,0,0-14.7068,39.7707c-.31174,7.6434,1.72288,15.12892,2.19078,22.61463.3125,4.99219.4679,9.98419-1.09425,14.97429-.4679,1.55983-.93809,3.27525-1.40827,4.52334a3.12377,3.12377,0,0,0,3.12886,3.43008c1.87694,0,2.65868-1.09195,3.285-2.652,3.285-8.57766,2.81712-17.6232,1.56443-26.66951ZM157.04249,67.03786Q147.65476,20.2483,102.1299,5.276A45.00768,45.00768,0,0,0,91.80236,3.09194c-1.87827-.15615-3.12867.78039-3.28426,2.4958a2.87607,2.87607,0,0,0,2.50252,3.58833c.62406.15558,1.25041.15558,1.72059.31175a70.72962,70.72962,0,0,1,40.36348,22.45694A69.18273,69.18273,0,0,1,147.0288,54.56015a74.061,74.061,0,0,1,4.69406,23.23944c.15538,2.33946,1.87825,3.7439,4.06675,3.11986,1.56443-.4679,2.34712-1.71618,2.19076-4.212a41.34713,41.34713,0,0,0-.93788-9.6696ZM115.74016,40.83473a46.09794,46.09794,0,0,0-10.16909-7.17379,3.002,3.002,0,0,0-4.22521,1.09194c-.93885,1.55983-.46866,3.276,1.25194,4.368a3.91739,3.91739,0,0,0,1.09424.62422c10.48369,6.3936,17.83547,15.283,21.27894,27.13666,3.12886,11.38806,3.91079,23.08329,4.22309,34.7806a167.16817,167.16817,0,0,1-2.34693,33.06462c-.31174,2.34023.62405,3.7439,2.50252,4.0564,2.0352.31175,3.44347-.78039,3.755-3.11985a162.60561,162.60561,0,0,0,2.34712-27.91913,217.742,217.742,0,0,0-2.65868-34.62312c-2.03462-12.79173-7.51042-23.55117-17.053-32.2865ZM89.76793,53.62646a28.15742,28.15742,0,0,0-18.92915-.15615c-2.66076.78037-3.44345,3.58546-1.72059,5.30163C70.368,60.02,71.62072,59.86389,73.0288,59.396a21.72731,21.72731,0,0,1,28.47247,16.8428,163.579,163.579,0,0,1,2.34692,17.31375A137.99692,137.99692,0,0,1,103.692,118.974a149.65137,149.65137,0,0,1-7.04023,31.97477c-.1554.62405-.4679,1.092-.31155,1.71618a3.009,3.009,0,0,0,2.81483,2.65177,3.073,3.073,0,0,0,3.44271-2.34022,143.91473,143.91473,0,0,0,8.13446-46.946,167.06542,167.06542,0,0,0-2.65866-29.6353c-2.03463-11.07347-7.97832-18.87149-18.30567-22.77079ZM46.431,72.65334C50.03,55.02805,68.6482,42.7065,86.48291,46.294a35.29014,35.29014,0,0,1,20.18241,11.85368,8.8989,8.8989,0,0,0,1.72,1.71617,3.19219,3.19219,0,0,0,3.755-.93579c1.09424-1.40444.93885-2.80812-.31155-4.5243-7.19867-8.733-16.42891-13.87928-27.84841-14.81508-14.55045-1.2481-26.59781,3.90025-35.82653,15.283A38.57474,38.57474,0,0,0,39.861,85.4407c.7804,5.30373,1.72078,10.45208,1.72078,15.75372,0,3.74391,0,7.488-.31175,11.07347a3.00588,3.00588,0,0,0,2.81408,3.276,3.03818,3.03818,0,0,0,3.44346-2.652,100.85173,100.85173,0,0,0-.15616-20.58748c-.47018-4.21179-1.87827-8.26743-1.56443-12.16769a39.31083,39.31083,0,0,1,.62406-7.48342Zm97.78146,20.43132a3.18855,3.18855,0,0,0,2.97269-3.43217V88.56056c-.62425-5.92722-1.2506-11.8531-2.19077-17.77879-2.03234-13.10195-7.19563-24.64312-16.1126-34.31273C115.89556,21.96341,99.46893,14.78945,79.91135,14.63329a64.57055,64.57055,0,0,0-25.3436,5.14835,3.23306,3.23306,0,0,0-2.03462,4.20951,3.15933,3.15933,0,0,0,4.38155,1.56A60.10931,60.10931,0,0,1,85.54483,21.183a57.79887,57.79887,0,0,1,35.04478,15.91007c10.32431,9.82517,16.268,21.835,18.30566,36.02812q1.16919,8.42465,1.876,16.84377c.46789,1.87157,1.72058,3.11966,3.44119,3.11966ZM71.15053,82.94489a11.40154,11.40154,0,0,1,0-5.614,9.11075,9.11075,0,0,1,9.70119-6.55146c4.22292.15558,7.66638,3.2762,8.60218,7.9559a150.63952,150.63952,0,0,1,2.661,26.51468,3.1253,3.1253,0,0,0,3.12886,3.43236c1.879,0,2.97252-1.40367,3.12867-3.276V102.5981h.15635c-.3125-4.05545-.4679-8.11185-.9358-12.16521-.47019-4.05565-1.09654-8.11206-1.72288-12.16541a15.95817,15.95817,0,0,0-17.67931-13.726c-8.13447.93654-14.7068,9.04763-13.45392,17.002.624,4.83584,1.40808,9.6696,1.876,14.50563a100.76542,100.76542,0,0,1-4.6931,39.77,111.03563,111.03563,0,0,1-5.9437,14.03754,3.0595,3.0595,0,0,0,.15616,3.43236,2.8478,2.8478,0,0,0,2.97252,1.24752,3.58665,3.58665,0,0,0,2.815-2.33946C72.715,130.2034,75.21748,107.1224,71.15053,82.94717ZM34.38591,91.52482c-.7825-5.30393-1.565-10.76381-1.09634-16.06545A45.82536,45.82536,0,0,1,49.87464,44.26631a45.38952,45.38952,0,0,1,28.16-10.76171,44.31362,44.31362,0,0,1,12.82986,1.24828,3.86111,3.86111,0,0,0,1.87675.15616,2.85951,2.85951,0,0,0,2.50252-2.80814,3.03932,3.03932,0,0,0-2.34694-3.276,45.95556,45.95556,0,0,0-13.14161-1.55984,34.70559,34.70559,0,0,0-9.69889.93577C54.25524,31.16513,42.20807,39.74505,33.91516,53.62436a50.635,50.635,0,0,0-6.56928,32.59653c.4679,4.36814,1.40808,8.57995,1.71983,12.94809.62405,10.75944-.78175,21.20867-5.6312,30.87827a3.03318,3.03318,0,0,0-.47018,2.02771,2.8529,2.8529,0,0,0,2.65867,2.652,3.38107,3.38107,0,0,0,3.44271-2.02772c6.57-12.9458,7.51022-26.98125,5.3202-41.17439Zm0,0"/></g><path class="cls-2" d="M62.54607,60.79761a2.98064,2.98064,0,0,0-3.91137.93628c-5.63141,6.55151-7.66584,14.19543-6.41388,22.77319a143.776,143.776,0,0,1,1.87677,19.65112q0,2.96339-.14044,5.8418h6.22674a106.70743,106.70743,0,0,0-1.39075-24.24707h-.00232c-1.25054-7.48547-.3117-14.19153,4.85157-20.11951a2.80487,2.80487,0,0,0,.62426-1.40368C64.42278,62.66992,64.11028,61.42163,62.54607,60.79761Z"/><path class="cls-2" d="M86.4829,46.294a35.29073,35.29073,0,0,1,20.18244,11.85376,8.89847,8.89847,0,0,0,1.72,1.71618,3.19239,3.19239,0,0,0,3.75506-.93579c1.09424-1.40442.93885-2.80823-.31158-4.52429-7.19867-8.73316-16.4289-13.8794-27.84839-14.81519C69.42992,38.34058,57.38256,43.489,48.15386,54.8717a38.57458,38.57458,0,0,0-8.29291,30.569c.7804,5.30371,1.72077,10.45215,1.72077,15.75367,0,2.96252-.00678,5.92163-.16126,8.80566h6.32941a99.29774,99.29774,0,0,0-.37848-17.69556c-.47021-4.21179-1.87829-8.26745-1.56445-12.16772a39.31138,39.31138,0,0,1,.624-7.4834C50.03,55.02808,68.64819,42.70654,86.4829,46.294Z"/><path class="cls-2" d="M35.25219,110a81.58384,81.58384,0,0,0-.86627-18.47522c-.78253-5.30383-1.565-10.76379-1.09638-16.06543a45.82519,45.82519,0,0,1,16.58509-31.193,45.3888,45.3888,0,0,1,28.16-10.76172,44.30565,44.30565,0,0,1,12.82983,1.24829,3.86211,3.86211,0,0,0,1.87677.156,2.85936,2.85936,0,0,0,2.50251-2.80811A3.0391,3.0391,0,0,0,92.89678,28.825a45.94687,45.94687,0,0,0-13.1416-1.55981,34.70227,34.70227,0,0,0-9.69891.93567C54.25524,31.165,42.20806,39.74512,33.91515,53.62427A50.63525,50.63525,0,0,0,27.34588,86.221c.46789,4.368,1.40808,8.57983,1.71985,12.948A74.7003,74.7003,0,0,1,28.93688,110Z"/><path class="cls-2" d="M78.50457,2A77.94379,77.94379,0,0,0,10.13445,45.04443a5.77132,5.77132,0,0,0-.624,2.18409,2.72441,2.72441,0,0,0,1.56421,2.80737c1.72076.93652,3.5968.31225,4.53772-1.71546v.00232A67.88222,67.88222,0,0,1,27.18743,31.63306C41.11156,16.81946,58.16448,9.0199,78.663,8.39575c2.34717,0,3.75525-1.24817,3.75525-3.27588C82.416,3.09192,81.00787,2,78.50457,2Z"/><path class="cls-2" d="M54.56774,19.78162a3.2331,3.2331,0,0,0-2.03461,4.20959,3.15941,3.15941,0,0,0,4.38154,1.55994,60.11034,60.11034,0,0,1,28.63018-4.368A57.799,57.799,0,0,1,120.58959,37.093c10.32434,9.82519,16.268,21.83508,18.30567,36.0282q1.16922,8.42468,1.876,16.84375c.4679,1.87158,1.72058,3.11975,3.44123,3.11975a3.1886,3.1886,0,0,0,2.97265-3.43225V88.56055c-.6242-5.92725-1.25055-11.853-2.19073-17.77881C142.962,57.67981,137.79876,46.13867,128.88177,36.469,115.89556,21.96338,99.46893,14.78943,79.91137,14.6333A64.57,64.57,0,0,0,54.56774,19.78162Z"/><path class="cls-2" d="M4.97253,58.30615A79.56615,79.56615,0,0,0,2,80.45154a66.60613,66.60613,0,0,0,.31177,7.64319A76.27443,76.27443,0,0,0,5.91137,104.626a2.67956,2.67956,0,0,0,2.65869,2.02856c2.66095.15552,3.91284-1.87231,3.13092-4.68042a70.50594,70.50594,0,0,1-.62634-41.79858V60.178A3.312,3.312,0,0,0,8.8839,55.81055C7.16326,55.3418,5.59887,56.43384,4.97253,58.30615Z"/><path class="cls-2" d="M23.15173,110A74.91063,74.91063,0,0,0,22.338,94.48828c-1.09424-7.019-2.03235-13.88354-1.09424-21.05456A59.14035,59.14035,0,0,1,46.11944,31.47681a3.29665,3.29665,0,0,0,1.56445-3.90015c-.78271-2.184-2.97351-2.65186-5.16424-1.24731A60.84242,60.84242,0,0,0,29.37823,38.49683,64.52217,64.52217,0,0,0,14.67144,78.26746c-.31177,7.64343,1.72284,15.1289,2.19073,22.61462A59.2241,59.2241,0,0,1,16.90051,110Z"/><path class="cls-2" d="M147.83147,110c.01563-.76367.01514-1.51831-.02-2.25562a31.74131,31.74131,0,0,0,0-5.4602v.00244a3.08455,3.08455,0,0,0-3.44116-2.9646,3.01957,3.01957,0,0,0-2.81653,3.27612c.07532,2.49268.03876,4.94776-.0343,7.40186Z"/><path class="cls-2" d="M135.45751,110c.00281-.75769.008-1.51831-.00567-2.25562a217.74154,217.74154,0,0,0-2.6587-34.62316c-2.0346-12.79175-7.51043-23.55115-17.053-32.2865A46.09888,46.09888,0,0,0,105.571,33.66089a3.00191,3.00191,0,0,0-4.22516,1.092c-.93884,1.55981-.46869,3.27588,1.25189,4.36792a3.92179,3.92179,0,0,0,1.09424.62427c10.4837,6.39355,17.83551,15.283,21.279,27.13659,3.12885,11.38807,3.91077,23.08326,4.22308,34.78064q.11738,4.17.0279,8.33765Z"/><path class="cls-2" d="M71.15051,82.94714v-.00232a11.40213,11.40213,0,0,1,0-5.61389,9.11068,9.11068,0,0,1,9.70123-6.55139c4.2229.15552,7.66638,3.27612,8.60217,7.95581A150.64126,150.64126,0,0,1,92.11486,105.25a3.12524,3.12524,0,0,0,3.12885,3.43237c1.879,0,2.97253-1.40356,3.12872-3.276v-2.80823h.15631c-.3125-4.05542-.4679-8.11193-.93579-12.16528-.47022-4.05566-1.09656-8.11206-1.7229-12.1654a15.95811,15.95811,0,0,0-17.67926-13.726c-8.13452.93653-14.70685,9.04761-13.454,17.002.62408,4.83593,1.40814,9.66967,1.876,14.50561A115.64049,115.64049,0,0,1,66.75665,110h6.08563A125.08914,125.08914,0,0,0,71.15051,82.94714Z"/><path class="cls-2" d="M157.04247,67.03784Q147.65475,20.24817,102.12988,5.276A45.0092,45.0092,0,0,0,91.80236,3.09192c-1.8783-.15613-3.12866.78039-3.28424,2.49573A2.876,2.876,0,0,0,91.02062,9.176c.62409.15564,1.25043.15564,1.72058.31176a70.72924,70.72924,0,0,1,40.36347,22.457A69.1805,69.1805,0,0,1,147.0288,54.56006a74.06052,74.06052,0,0,1,4.694,23.2395c.1554,2.33948,1.8783,3.7439,4.06677,3.11987,1.56446-.46789,2.34711-1.71618,2.1908-4.21191A41.3474,41.3474,0,0,0,157.04247,67.03784Z"/><path class="cls-2" d="M85.63354,110c.07037-1.946.10138-3.89441.06744-5.84424a75.85951,75.85951,0,0,0-.46789-9.98364,114.49913,114.49913,0,0,0-2.1908-14.65942,3.09175,3.09175,0,0,0-3.59961-2.49585,3.03675,3.03675,0,0,0-2.34619,3.90026,116.66963,116.66963,0,0,1,2.34619,18.2472q.23969,5.425.00525,10.83569Z"/><path class="cls-2" d="M123.05425,110c.03546-1.5769.05506-3.1582.03772-4.75a159.07167,159.07167,0,0,0-2.03235-26.98254A60.29592,60.29592,0,0,0,118.555,67.19324a3.10566,3.10566,0,0,0-3.91138-2.02771,2.97017,2.97017,0,0,0-2.03229,3.9c2.5025,9.35962,3.44037,19.0271,4.067,28.85291q.29535,6.08184.11456,12.08154Z"/><path class="cls-2" d="M108.0736,76.39514c-2.03461-11.07348-7.97833-18.87146-18.30566-22.77087v.00219a28.15763,28.15763,0,0,0-18.92914-.15625c-2.66077.78052-3.44348,3.58558-1.72058,5.30176,1.24981,1.248,2.5025,1.09192,3.91058.624a21.72724,21.72724,0,0,1,28.47247,16.84277,163.59068,163.59068,0,0,1,2.34693,17.31372,128.85744,128.85744,0,0,1,.42,16.44751h6.39728c.03955-1.323.06677-2.64624.06677-3.96948A167.06591,167.06591,0,0,0,108.0736,76.39514Z"/></g></svg> +\ No newline at end of file +diff --git a/polkit-agent/assets/biowaiting/fingervein0.svg b/polkit-agent/assets/biowaiting/fingervein0.svg +new file mode 100644 +index 0000000..746aba7 +--- /dev/null ++++ b/polkit-agent/assets/biowaiting/fingervein0.svg +@@ -0,0 +1 @@ ++<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 160 160"><defs><style>.cls-1{opacity:0.2;}.cls-2{fill:#3790fa;}</style></defs><g id="文字标注"><g class="cls-1"><path d="M114.27147,96.46253a2.28536,2.28536,0,0,0-2.28534,2.28534v14.1233a2.28534,2.28534,0,1,0,4.57068,0V98.74787A2.28536,2.28536,0,0,0,114.27147,96.46253Z"/><path d="M65.6855,39.7409a33.36686,33.36686,0,0,1,14.30613-3.15372l.03571-.00119a30.94322,30.94322,0,0,1,31.95879,29.89309v22.6704a2.29317,2.29317,0,1,0,4.57068-.2742v-22.579A35.514,35.514,0,0,0,79.99163,32.0165a37.88963,37.88963,0,0,0-16.22581,3.56516A2.29044,2.29044,0,1,0,65.6855,39.7409Z"/><path d="M56.72706,42.9404a2.295,2.295,0,0,0-3.24518-.04578A33.09153,33.09153,0,0,0,43.42645,66.47908v47.21479a2.2853,2.2853,0,1,0,4.57059,0V66.47908a28.567,28.567,0,0,1,8.68424-20.29359A2.29484,2.29484,0,0,0,56.72706,42.9404Z"/><path d="M86.80188,42.84894a27.92679,27.92679,0,0,0-12.29509-.2742A27.14962,27.14962,0,0,0,52.56772,68.90157v53.11088a2.28534,2.28534,0,1,0,4.57068,0V93.63914a17.4489,17.4489,0,0,0,2.97089,4.19458,20.85342,20.85342,0,0,1,6.17039,11.86918v6.78754a2.25125,2.25125,0,0,0,0,.24985v8.97437a2.2853,2.2853,0,1,0,4.57059,0v-8.773a25.4804,25.4804,0,0,0,.30615-5.15689c.59317-6.03013,2.33194-16.46175,7.41825-23.59508,6.51407-9.13551,6.12479-15.36586,5.911-17.32271h4.63651a55.70992,55.70992,0,0,0,.01071,6.69315v48.15458a2.28535,2.28535,0,0,0,4.57069,0V94.87812a25.77379,25.77379,0,0,0,1.554,2.45288,45.685,45.685,0,0,1,7.58726,21.88753v2.79392a2.2853,2.2853,0,1,0,4.57059,0V68.90157A27.05818,27.05818,0,0,0,86.80188,42.84894ZM66.27968,97.80616a25.48236,25.48236,0,0,0-2.97089-3.40036c-5.02772-5.25632-6.17039-18.694-6.17039-23.53887h9.14128Zm8.59278-12.26743a36.49909,36.49909,0,0,0-4.02219,7.30536V70.86693h9.09742a2.31209,2.31209,0,0,0,.04394.5485C79.99163,71.46111,81.1343,76.763,74.87246,85.53873Zm27.9724,16.12006a49.905,49.905,0,0,0-3.885-6.97879c-6.49036-9.09559-5.11917-23.58455-5.11917-23.58455l.00229-.02271c.00659-.06985-.00156-.137-.00119-.20581h9.00312ZM57.36573,66.29625A22.52238,22.52238,0,0,1,75.37526,47.28247a23.67615,23.67615,0,0,1,10.284,0,22.431,22.431,0,0,1,16.99293,19.01378Z"/><path d="M82.27688,91.43482a2.28527,2.28527,0,0,0-2.28525,2.28534v31.9945a2.2853,2.2853,0,1,0,4.57059,0V93.72016A2.28535,2.28535,0,0,0,82.27688,91.43482Z"/></g><path class="cls-2" d="M154,52h-8V35a21.0239,21.0239,0,0,0-21-21H108V6h17a29.03307,29.03307,0,0,1,29,29Z"/><path class="cls-2" d="M125,154H108v-8h17a21.02422,21.02422,0,0,0,21-21V108h8v17A29.03339,29.03339,0,0,1,125,154Z"/><path class="cls-2" d="M52,154H35A29.03339,29.03339,0,0,1,6,125V108h8v17a21.02422,21.02422,0,0,0,21,21H52Z"/><path class="cls-2" d="M14,52H6V35A29.03307,29.03307,0,0,1,35,6H52v8H35A21.0239,21.0239,0,0,0,14,35Z"/></g></svg> +\ No newline at end of file +diff --git a/polkit-agent/assets/biowaiting/fingervein1.svg b/polkit-agent/assets/biowaiting/fingervein1.svg +new file mode 100644 +index 0000000..cda8446 +--- /dev/null ++++ b/polkit-agent/assets/biowaiting/fingervein1.svg +@@ -0,0 +1 @@ ++<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 160 160"><defs><style>.cls-1{opacity:0.2;}.cls-2{fill:#3790fa;}.cls-3{fill:url(#未命名的渐变_8);}</style><linearGradient id="未命名的渐变_8" x1="80" y1="27" x2="80" y2="11" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#3790fa"/><stop offset="1" stop-color="#3790fa" stop-opacity="0"/></linearGradient></defs><g id="文字标注"><g class="cls-1"><path d="M114.27147,96.46253a2.28536,2.28536,0,0,0-2.28534,2.28534v14.1233a2.28534,2.28534,0,1,0,4.57068,0V98.74787A2.28536,2.28536,0,0,0,114.27147,96.46253Z"/><path d="M65.6855,39.7409a33.36686,33.36686,0,0,1,14.30613-3.15372l.03571-.00119a30.94322,30.94322,0,0,1,31.95879,29.89309v22.6704a2.29317,2.29317,0,1,0,4.57068-.2742v-22.579A35.514,35.514,0,0,0,79.99163,32.0165a37.88963,37.88963,0,0,0-16.22581,3.56516A2.29044,2.29044,0,1,0,65.6855,39.7409Z"/><path d="M56.72706,42.9404a2.295,2.295,0,0,0-3.24518-.04578A33.09153,33.09153,0,0,0,43.42645,66.47908v47.21479a2.2853,2.2853,0,1,0,4.57059,0V66.47908a28.567,28.567,0,0,1,8.68424-20.29359A2.29484,2.29484,0,0,0,56.72706,42.9404Z"/><path d="M86.80188,42.84894a27.92679,27.92679,0,0,0-12.29509-.2742A27.14962,27.14962,0,0,0,52.56772,68.90157v53.11088a2.28534,2.28534,0,1,0,4.57068,0V93.63914a17.4489,17.4489,0,0,0,2.97089,4.19458,20.85342,20.85342,0,0,1,6.17039,11.86918v6.78754a2.25125,2.25125,0,0,0,0,.24985v8.97437a2.2853,2.2853,0,1,0,4.57059,0v-8.773a25.4804,25.4804,0,0,0,.30615-5.15689c.59317-6.03013,2.33194-16.46175,7.41825-23.59508,6.51407-9.13551,6.12479-15.36586,5.911-17.32271h4.63651a55.70992,55.70992,0,0,0,.01071,6.69315v48.15458a2.28535,2.28535,0,0,0,4.57069,0V94.87812a25.77379,25.77379,0,0,0,1.554,2.45288,45.685,45.685,0,0,1,7.58726,21.88753v2.79392a2.2853,2.2853,0,1,0,4.57059,0V68.90157A27.05818,27.05818,0,0,0,86.80188,42.84894ZM66.27968,97.80616a25.48236,25.48236,0,0,0-2.97089-3.40036c-5.02772-5.25632-6.17039-18.694-6.17039-23.53887h9.14128Zm8.59278-12.26743a36.49909,36.49909,0,0,0-4.02219,7.30536V70.86693h9.09742a2.31209,2.31209,0,0,0,.04394.5485C79.99163,71.46111,81.1343,76.763,74.87246,85.53873Zm27.9724,16.12006a49.905,49.905,0,0,0-3.885-6.97879c-6.49036-9.09559-5.11917-23.58455-5.11917-23.58455l.00229-.02271c.00659-.06985-.00156-.137-.00119-.20581h9.00312ZM57.36573,66.29625A22.52238,22.52238,0,0,1,75.37526,47.28247a23.67615,23.67615,0,0,1,10.284,0,22.431,22.431,0,0,1,16.99293,19.01378Z"/><path d="M82.27688,91.43482a2.28527,2.28527,0,0,0-2.28525,2.28534v31.9945a2.2853,2.2853,0,1,0,4.57059,0V93.72016A2.28535,2.28535,0,0,0,82.27688,91.43482Z"/></g><path class="cls-2" d="M154,52h-8V35a21.0239,21.0239,0,0,0-21-21H108V6h17a29.03307,29.03307,0,0,1,29,29Z"/><path class="cls-2" d="M125,154H108v-8h17a21.02422,21.02422,0,0,0,21-21V108h8v17A29.03339,29.03339,0,0,1,125,154Z"/><path class="cls-2" d="M52,154H35A29.03339,29.03339,0,0,1,6,125V108h8v17a21.02422,21.02422,0,0,0,21,21H52Z"/><path class="cls-2" d="M14,52H6V35A29.03307,29.03307,0,0,1,35,6H52v8H35A21.0239,21.0239,0,0,0,14,35Z"/><rect class="cls-3" x="22" y="11" width="116" height="16"/><rect class="cls-2" x="22" y="24" width="116" height="4"/></g></svg> +\ No newline at end of file +diff --git a/polkit-agent/assets/biowaiting/fingervein10.svg b/polkit-agent/assets/biowaiting/fingervein10.svg +new file mode 100644 +index 0000000..ecc78f5 +--- /dev/null ++++ b/polkit-agent/assets/biowaiting/fingervein10.svg +@@ -0,0 +1 @@ ++<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 160 160"><defs><style>.cls-1{opacity:0.2;}.cls-2{fill:#3790fa;}.cls-3{fill:url(#未命名的渐变_8);}</style><linearGradient id="未命名的渐变_8" x1="80" y1="126" x2="80" y2="11" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#3790fa"/><stop offset="1" stop-color="#3790fa" stop-opacity="0"/></linearGradient></defs><g id="文字标注"><g class="cls-1"><path d="M114.27147,96.46253a2.28536,2.28536,0,0,0-2.28534,2.28534v14.1233a2.28534,2.28534,0,1,0,4.57068,0V98.74787A2.28536,2.28536,0,0,0,114.27147,96.46253Z"/><path d="M65.6855,39.7409a33.36686,33.36686,0,0,1,14.30613-3.15372l.03571-.00119a30.94322,30.94322,0,0,1,31.95879,29.89309v22.6704a2.29317,2.29317,0,1,0,4.57068-.2742v-22.579A35.514,35.514,0,0,0,79.99163,32.0165a37.88963,37.88963,0,0,0-16.22581,3.56516A2.29044,2.29044,0,1,0,65.6855,39.7409Z"/><path d="M56.72706,42.9404a2.295,2.295,0,0,0-3.24518-.04578A33.09153,33.09153,0,0,0,43.42645,66.47908v47.21479a2.2853,2.2853,0,1,0,4.57059,0V66.47908a28.567,28.567,0,0,1,8.68424-20.29359A2.29484,2.29484,0,0,0,56.72706,42.9404Z"/><path d="M86.80188,42.84894a27.92679,27.92679,0,0,0-12.29509-.2742A27.14962,27.14962,0,0,0,52.56772,68.90157v53.11088a2.28534,2.28534,0,1,0,4.57068,0V93.63914a17.4489,17.4489,0,0,0,2.97089,4.19458,20.85342,20.85342,0,0,1,6.17039,11.86918v6.78754a2.25125,2.25125,0,0,0,0,.24985v8.97437a2.2853,2.2853,0,1,0,4.57059,0v-8.773a25.4804,25.4804,0,0,0,.30615-5.15689c.59317-6.03013,2.33194-16.46175,7.41825-23.59508,6.51407-9.13551,6.12479-15.36586,5.911-17.32271h4.63651a55.70992,55.70992,0,0,0,.01071,6.69315v48.15458a2.28535,2.28535,0,0,0,4.57069,0V94.87812a25.77379,25.77379,0,0,0,1.554,2.45288,45.685,45.685,0,0,1,7.58726,21.88753v2.79392a2.2853,2.2853,0,1,0,4.57059,0V68.90157A27.05818,27.05818,0,0,0,86.80188,42.84894ZM66.27968,97.80616a25.48236,25.48236,0,0,0-2.97089-3.40036c-5.02772-5.25632-6.17039-18.694-6.17039-23.53887h9.14128Zm8.59278-12.26743a36.49909,36.49909,0,0,0-4.02219,7.30536V70.86693h9.09742a2.31209,2.31209,0,0,0,.04394.5485C79.99163,71.46111,81.1343,76.763,74.87246,85.53873Zm27.9724,16.12006a49.905,49.905,0,0,0-3.885-6.97879c-6.49036-9.09559-5.11917-23.58455-5.11917-23.58455l.00229-.02271c.00659-.06985-.00156-.137-.00119-.20581h9.00312ZM57.36573,66.29625A22.52238,22.52238,0,0,1,75.37526,47.28247a23.67615,23.67615,0,0,1,10.284,0,22.431,22.431,0,0,1,16.99293,19.01378Z"/><path d="M82.27688,91.43482a2.28527,2.28527,0,0,0-2.28525,2.28534v31.9945a2.2853,2.2853,0,1,0,4.57059,0V93.72016A2.28535,2.28535,0,0,0,82.27688,91.43482Z"/></g><path class="cls-2" d="M154,52h-8V35a21.0239,21.0239,0,0,0-21-21H108V6h17a29.03307,29.03307,0,0,1,29,29Z"/><path class="cls-2" d="M125,154H108v-8h17a21.02422,21.02422,0,0,0,21-21V108h8v17A29.03339,29.03339,0,0,1,125,154Z"/><path class="cls-2" d="M52,154H35A29.03339,29.03339,0,0,1,6,125V108h8v17a21.02422,21.02422,0,0,0,21,21H52Z"/><path class="cls-2" d="M14,52H6V35A29.03307,29.03307,0,0,1,35,6H52v8H35A21.0239,21.0239,0,0,0,14,35Z"/><rect class="cls-3" x="22" y="11" width="116" height="115"/><rect class="cls-2" x="22" y="123" width="116" height="4"/></g></svg> +\ No newline at end of file +diff --git a/polkit-agent/assets/biowaiting/fingervein11.svg b/polkit-agent/assets/biowaiting/fingervein11.svg +new file mode 100644 +index 0000000..478d000 +--- /dev/null ++++ b/polkit-agent/assets/biowaiting/fingervein11.svg +@@ -0,0 +1 @@ ++<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 160 160"><defs><style>.cls-1{opacity:0.2;}.cls-2{fill:#3790fa;}.cls-3{fill:url(#未命名的渐变_8);}</style><linearGradient id="未命名的渐变_8" x1="80" y1="137" x2="80" y2="11" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#3790fa"/><stop offset="1" stop-color="#3790fa" stop-opacity="0"/></linearGradient></defs><g id="文字标注"><g class="cls-1"><path d="M114.27147,96.46253a2.28536,2.28536,0,0,0-2.28534,2.28534v14.1233a2.28534,2.28534,0,1,0,4.57068,0V98.74787A2.28536,2.28536,0,0,0,114.27147,96.46253Z"/><path d="M65.6855,39.7409a33.36686,33.36686,0,0,1,14.30613-3.15372l.03571-.00119a30.94322,30.94322,0,0,1,31.95879,29.89309v22.6704a2.29317,2.29317,0,1,0,4.57068-.2742v-22.579A35.514,35.514,0,0,0,79.99163,32.0165a37.88963,37.88963,0,0,0-16.22581,3.56516A2.29044,2.29044,0,1,0,65.6855,39.7409Z"/><path d="M56.72706,42.9404a2.295,2.295,0,0,0-3.24518-.04578A33.09153,33.09153,0,0,0,43.42645,66.47908v47.21479a2.2853,2.2853,0,1,0,4.57059,0V66.47908a28.567,28.567,0,0,1,8.68424-20.29359A2.29484,2.29484,0,0,0,56.72706,42.9404Z"/><path d="M86.80188,42.84894a27.92679,27.92679,0,0,0-12.29509-.2742A27.14962,27.14962,0,0,0,52.56772,68.90157v53.11088a2.28534,2.28534,0,1,0,4.57068,0V93.63914a17.4489,17.4489,0,0,0,2.97089,4.19458,20.85342,20.85342,0,0,1,6.17039,11.86918v6.78754a2.25125,2.25125,0,0,0,0,.24985v8.97437a2.2853,2.2853,0,1,0,4.57059,0v-8.773a25.4804,25.4804,0,0,0,.30615-5.15689c.59317-6.03013,2.33194-16.46175,7.41825-23.59508,6.51407-9.13551,6.12479-15.36586,5.911-17.32271h4.63651a55.70992,55.70992,0,0,0,.01071,6.69315v48.15458a2.28535,2.28535,0,0,0,4.57069,0V94.87812a25.77379,25.77379,0,0,0,1.554,2.45288,45.685,45.685,0,0,1,7.58726,21.88753v2.79392a2.2853,2.2853,0,1,0,4.57059,0V68.90157A27.05818,27.05818,0,0,0,86.80188,42.84894ZM66.27968,97.80616a25.48236,25.48236,0,0,0-2.97089-3.40036c-5.02772-5.25632-6.17039-18.694-6.17039-23.53887h9.14128Zm8.59278-12.26743a36.49909,36.49909,0,0,0-4.02219,7.30536V70.86693h9.09742a2.31209,2.31209,0,0,0,.04394.5485C79.99163,71.46111,81.1343,76.763,74.87246,85.53873Zm27.9724,16.12006a49.905,49.905,0,0,0-3.885-6.97879c-6.49036-9.09559-5.11917-23.58455-5.11917-23.58455l.00229-.02271c.00659-.06985-.00156-.137-.00119-.20581h9.00312ZM57.36573,66.29625A22.52238,22.52238,0,0,1,75.37526,47.28247a23.67615,23.67615,0,0,1,10.284,0,22.431,22.431,0,0,1,16.99293,19.01378Z"/><path d="M82.27688,91.43482a2.28527,2.28527,0,0,0-2.28525,2.28534v31.9945a2.2853,2.2853,0,1,0,4.57059,0V93.72016A2.28535,2.28535,0,0,0,82.27688,91.43482Z"/></g><path class="cls-2" d="M154,52h-8V35a21.0239,21.0239,0,0,0-21-21H108V6h17a29.03307,29.03307,0,0,1,29,29Z"/><path class="cls-2" d="M125,154H108v-8h17a21.02422,21.02422,0,0,0,21-21V108h8v17A29.03339,29.03339,0,0,1,125,154Z"/><path class="cls-2" d="M52,154H35A29.03339,29.03339,0,0,1,6,125V108h8v17a21.02422,21.02422,0,0,0,21,21H52Z"/><path class="cls-2" d="M14,52H6V35A29.03307,29.03307,0,0,1,35,6H52v8H35A21.0239,21.0239,0,0,0,14,35Z"/><rect class="cls-3" x="22" y="11" width="116" height="126"/><rect class="cls-2" x="22" y="134" width="116" height="4"/></g></svg> +\ No newline at end of file +diff --git a/polkit-agent/assets/biowaiting/fingervein2.svg b/polkit-agent/assets/biowaiting/fingervein2.svg +new file mode 100644 +index 0000000..b04c496 +--- /dev/null ++++ b/polkit-agent/assets/biowaiting/fingervein2.svg +@@ -0,0 +1 @@ ++<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 160 160"><defs><style>.cls-1{opacity:0.2;}.cls-2{fill:#3790fa;}.cls-3{fill:url(#未命名的渐变_8);}</style><linearGradient id="未命名的渐变_8" x1="80" y1="38" x2="80" y2="11" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#3790fa"/><stop offset="1" stop-color="#3790fa" stop-opacity="0"/></linearGradient></defs><g id="文字标注"><g class="cls-1"><path d="M114.27147,96.46253a2.28536,2.28536,0,0,0-2.28534,2.28534v14.1233a2.28534,2.28534,0,1,0,4.57068,0V98.74787A2.28536,2.28536,0,0,0,114.27147,96.46253Z"/><path d="M65.6855,39.7409a33.36686,33.36686,0,0,1,14.30613-3.15372l.03571-.00119a30.94322,30.94322,0,0,1,31.95879,29.89309v22.6704a2.29317,2.29317,0,1,0,4.57068-.2742v-22.579A35.514,35.514,0,0,0,79.99163,32.0165a37.88963,37.88963,0,0,0-16.22581,3.56516A2.29044,2.29044,0,1,0,65.6855,39.7409Z"/><path d="M56.72706,42.9404a2.295,2.295,0,0,0-3.24518-.04578A33.09153,33.09153,0,0,0,43.42645,66.47908v47.21479a2.2853,2.2853,0,1,0,4.57059,0V66.47908a28.567,28.567,0,0,1,8.68424-20.29359A2.29484,2.29484,0,0,0,56.72706,42.9404Z"/><path d="M86.80188,42.84894a27.92679,27.92679,0,0,0-12.29509-.2742A27.14962,27.14962,0,0,0,52.56772,68.90157v53.11088a2.28534,2.28534,0,1,0,4.57068,0V93.63914a17.4489,17.4489,0,0,0,2.97089,4.19458,20.85342,20.85342,0,0,1,6.17039,11.86918v6.78754a2.25125,2.25125,0,0,0,0,.24985v8.97437a2.2853,2.2853,0,1,0,4.57059,0v-8.773a25.4804,25.4804,0,0,0,.30615-5.15689c.59317-6.03013,2.33194-16.46175,7.41825-23.59508,6.51407-9.13551,6.12479-15.36586,5.911-17.32271h4.63651a55.70992,55.70992,0,0,0,.01071,6.69315v48.15458a2.28535,2.28535,0,0,0,4.57069,0V94.87812a25.77379,25.77379,0,0,0,1.554,2.45288,45.685,45.685,0,0,1,7.58726,21.88753v2.79392a2.2853,2.2853,0,1,0,4.57059,0V68.90157A27.05818,27.05818,0,0,0,86.80188,42.84894ZM66.27968,97.80616a25.48236,25.48236,0,0,0-2.97089-3.40036c-5.02772-5.25632-6.17039-18.694-6.17039-23.53887h9.14128Zm8.59278-12.26743a36.49909,36.49909,0,0,0-4.02219,7.30536V70.86693h9.09742a2.31209,2.31209,0,0,0,.04394.5485C79.99163,71.46111,81.1343,76.763,74.87246,85.53873Zm27.9724,16.12006a49.905,49.905,0,0,0-3.885-6.97879c-6.49036-9.09559-5.11917-23.58455-5.11917-23.58455l.00229-.02271c.00659-.06985-.00156-.137-.00119-.20581h9.00312ZM57.36573,66.29625A22.52238,22.52238,0,0,1,75.37526,47.28247a23.67615,23.67615,0,0,1,10.284,0,22.431,22.431,0,0,1,16.99293,19.01378Z"/><path d="M82.27688,91.43482a2.28527,2.28527,0,0,0-2.28525,2.28534v31.9945a2.2853,2.2853,0,1,0,4.57059,0V93.72016A2.28535,2.28535,0,0,0,82.27688,91.43482Z"/></g><path class="cls-2" d="M154,52h-8V35a21.0239,21.0239,0,0,0-21-21H108V6h17a29.03307,29.03307,0,0,1,29,29Z"/><path class="cls-2" d="M125,154H108v-8h17a21.02422,21.02422,0,0,0,21-21V108h8v17A29.03339,29.03339,0,0,1,125,154Z"/><path class="cls-2" d="M52,154H35A29.03339,29.03339,0,0,1,6,125V108h8v17a21.02422,21.02422,0,0,0,21,21H52Z"/><path class="cls-2" d="M14,52H6V35A29.03307,29.03307,0,0,1,35,6H52v8H35A21.0239,21.0239,0,0,0,14,35Z"/><rect class="cls-3" x="22" y="11" width="116" height="27"/><rect class="cls-2" x="22" y="35" width="116" height="4"/></g></svg> +\ No newline at end of file +diff --git a/polkit-agent/assets/biowaiting/fingervein3.svg b/polkit-agent/assets/biowaiting/fingervein3.svg +new file mode 100644 +index 0000000..7217db0 +--- /dev/null ++++ b/polkit-agent/assets/biowaiting/fingervein3.svg +@@ -0,0 +1 @@ ++<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 160 160"><defs><style>.cls-1{opacity:0.2;}.cls-2{fill:#3790fa;}.cls-3{fill:url(#未命名的渐变_8);}</style><linearGradient id="未命名的渐变_8" x1="80" y1="49" x2="80" y2="11" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#3790fa"/><stop offset="1" stop-color="#3790fa" stop-opacity="0"/></linearGradient></defs><g id="文字标注"><g class="cls-1"><path d="M114.27147,96.46253a2.28536,2.28536,0,0,0-2.28534,2.28534v14.1233a2.28534,2.28534,0,1,0,4.57068,0V98.74787A2.28536,2.28536,0,0,0,114.27147,96.46253Z"/><path d="M65.6855,39.7409a33.36686,33.36686,0,0,1,14.30613-3.15372l.03571-.00119a30.94322,30.94322,0,0,1,31.95879,29.89309v22.6704a2.29317,2.29317,0,1,0,4.57068-.2742v-22.579A35.514,35.514,0,0,0,79.99163,32.0165a37.88963,37.88963,0,0,0-16.22581,3.56516A2.29044,2.29044,0,1,0,65.6855,39.7409Z"/><path d="M56.72706,42.9404a2.295,2.295,0,0,0-3.24518-.04578A33.09153,33.09153,0,0,0,43.42645,66.47908v47.21479a2.2853,2.2853,0,1,0,4.57059,0V66.47908a28.567,28.567,0,0,1,8.68424-20.29359A2.29484,2.29484,0,0,0,56.72706,42.9404Z"/><path d="M86.80188,42.84894a27.92679,27.92679,0,0,0-12.29509-.2742A27.14962,27.14962,0,0,0,52.56772,68.90157v53.11088a2.28534,2.28534,0,1,0,4.57068,0V93.63914a17.4489,17.4489,0,0,0,2.97089,4.19458,20.85342,20.85342,0,0,1,6.17039,11.86918v6.78754a2.25125,2.25125,0,0,0,0,.24985v8.97437a2.2853,2.2853,0,1,0,4.57059,0v-8.773a25.4804,25.4804,0,0,0,.30615-5.15689c.59317-6.03013,2.33194-16.46175,7.41825-23.59508,6.51407-9.13551,6.12479-15.36586,5.911-17.32271h4.63651a55.70992,55.70992,0,0,0,.01071,6.69315v48.15458a2.28535,2.28535,0,0,0,4.57069,0V94.87812a25.77379,25.77379,0,0,0,1.554,2.45288,45.685,45.685,0,0,1,7.58726,21.88753v2.79392a2.2853,2.2853,0,1,0,4.57059,0V68.90157A27.05818,27.05818,0,0,0,86.80188,42.84894ZM66.27968,97.80616a25.48236,25.48236,0,0,0-2.97089-3.40036c-5.02772-5.25632-6.17039-18.694-6.17039-23.53887h9.14128Zm8.59278-12.26743a36.49909,36.49909,0,0,0-4.02219,7.30536V70.86693h9.09742a2.31209,2.31209,0,0,0,.04394.5485C79.99163,71.46111,81.1343,76.763,74.87246,85.53873Zm27.9724,16.12006a49.905,49.905,0,0,0-3.885-6.97879c-6.49036-9.09559-5.11917-23.58455-5.11917-23.58455l.00229-.02271c.00659-.06985-.00156-.137-.00119-.20581h9.00312ZM57.36573,66.29625A22.52238,22.52238,0,0,1,75.37526,47.28247a23.67615,23.67615,0,0,1,10.284,0,22.431,22.431,0,0,1,16.99293,19.01378Z"/><path d="M82.27688,91.43482a2.28527,2.28527,0,0,0-2.28525,2.28534v31.9945a2.2853,2.2853,0,1,0,4.57059,0V93.72016A2.28535,2.28535,0,0,0,82.27688,91.43482Z"/></g><path class="cls-2" d="M154,52h-8V35a21.0239,21.0239,0,0,0-21-21H108V6h17a29.03307,29.03307,0,0,1,29,29Z"/><path class="cls-2" d="M125,154H108v-8h17a21.02422,21.02422,0,0,0,21-21V108h8v17A29.03339,29.03339,0,0,1,125,154Z"/><path class="cls-2" d="M52,154H35A29.03339,29.03339,0,0,1,6,125V108h8v17a21.02422,21.02422,0,0,0,21,21H52Z"/><path class="cls-2" d="M14,52H6V35A29.03307,29.03307,0,0,1,35,6H52v8H35A21.0239,21.0239,0,0,0,14,35Z"/><rect class="cls-3" x="22" y="11" width="116" height="38"/><rect class="cls-2" x="22" y="46" width="116" height="4"/></g></svg> +\ No newline at end of file +diff --git a/polkit-agent/assets/biowaiting/fingervein4.svg b/polkit-agent/assets/biowaiting/fingervein4.svg +new file mode 100644 +index 0000000..92d47ea +--- /dev/null ++++ b/polkit-agent/assets/biowaiting/fingervein4.svg +@@ -0,0 +1 @@ ++<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 160 160"><defs><style>.cls-1{opacity:0.2;}.cls-2{fill:#3790fa;}.cls-3{fill:url(#未命名的渐变_8);}</style><linearGradient id="未命名的渐变_8" x1="80" y1="60" x2="80" y2="11" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#3790fa"/><stop offset="1" stop-color="#3790fa" stop-opacity="0"/></linearGradient></defs><g id="文字标注"><g class="cls-1"><path d="M114.27147,96.46253a2.28536,2.28536,0,0,0-2.28534,2.28534v14.1233a2.28534,2.28534,0,1,0,4.57068,0V98.74787A2.28536,2.28536,0,0,0,114.27147,96.46253Z"/><path d="M65.6855,39.7409a33.36686,33.36686,0,0,1,14.30613-3.15372l.03571-.00119a30.94322,30.94322,0,0,1,31.95879,29.89309v22.6704a2.29317,2.29317,0,1,0,4.57068-.2742v-22.579A35.514,35.514,0,0,0,79.99163,32.0165a37.88963,37.88963,0,0,0-16.22581,3.56516A2.29044,2.29044,0,1,0,65.6855,39.7409Z"/><path d="M56.72706,42.9404a2.295,2.295,0,0,0-3.24518-.04578A33.09153,33.09153,0,0,0,43.42645,66.47908v47.21479a2.2853,2.2853,0,1,0,4.57059,0V66.47908a28.567,28.567,0,0,1,8.68424-20.29359A2.29484,2.29484,0,0,0,56.72706,42.9404Z"/><path d="M86.80188,42.84894a27.92679,27.92679,0,0,0-12.29509-.2742A27.14962,27.14962,0,0,0,52.56772,68.90157v53.11088a2.28534,2.28534,0,1,0,4.57068,0V93.63914a17.4489,17.4489,0,0,0,2.97089,4.19458,20.85342,20.85342,0,0,1,6.17039,11.86918v6.78754a2.25125,2.25125,0,0,0,0,.24985v8.97437a2.2853,2.2853,0,1,0,4.57059,0v-8.773a25.4804,25.4804,0,0,0,.30615-5.15689c.59317-6.03013,2.33194-16.46175,7.41825-23.59508,6.51407-9.13551,6.12479-15.36586,5.911-17.32271h4.63651a55.70992,55.70992,0,0,0,.01071,6.69315v48.15458a2.28535,2.28535,0,0,0,4.57069,0V94.87812a25.77379,25.77379,0,0,0,1.554,2.45288,45.685,45.685,0,0,1,7.58726,21.88753v2.79392a2.2853,2.2853,0,1,0,4.57059,0V68.90157A27.05818,27.05818,0,0,0,86.80188,42.84894ZM66.27968,97.80616a25.48236,25.48236,0,0,0-2.97089-3.40036c-5.02772-5.25632-6.17039-18.694-6.17039-23.53887h9.14128Zm8.59278-12.26743a36.49909,36.49909,0,0,0-4.02219,7.30536V70.86693h9.09742a2.31209,2.31209,0,0,0,.04394.5485C79.99163,71.46111,81.1343,76.763,74.87246,85.53873Zm27.9724,16.12006a49.905,49.905,0,0,0-3.885-6.97879c-6.49036-9.09559-5.11917-23.58455-5.11917-23.58455l.00229-.02271c.00659-.06985-.00156-.137-.00119-.20581h9.00312ZM57.36573,66.29625A22.52238,22.52238,0,0,1,75.37526,47.28247a23.67615,23.67615,0,0,1,10.284,0,22.431,22.431,0,0,1,16.99293,19.01378Z"/><path d="M82.27688,91.43482a2.28527,2.28527,0,0,0-2.28525,2.28534v31.9945a2.2853,2.2853,0,1,0,4.57059,0V93.72016A2.28535,2.28535,0,0,0,82.27688,91.43482Z"/></g><path class="cls-2" d="M154,52h-8V35a21.0239,21.0239,0,0,0-21-21H108V6h17a29.03307,29.03307,0,0,1,29,29Z"/><path class="cls-2" d="M125,154H108v-8h17a21.02422,21.02422,0,0,0,21-21V108h8v17A29.03339,29.03339,0,0,1,125,154Z"/><path class="cls-2" d="M52,154H35A29.03339,29.03339,0,0,1,6,125V108h8v17a21.02422,21.02422,0,0,0,21,21H52Z"/><path class="cls-2" d="M14,52H6V35A29.03307,29.03307,0,0,1,35,6H52v8H35A21.0239,21.0239,0,0,0,14,35Z"/><rect class="cls-3" x="22" y="11" width="116" height="49"/><rect class="cls-2" x="22" y="57" width="116" height="4"/></g></svg> +\ No newline at end of file +diff --git a/polkit-agent/assets/biowaiting/fingervein5.svg b/polkit-agent/assets/biowaiting/fingervein5.svg +new file mode 100644 +index 0000000..7f53c6c +--- /dev/null ++++ b/polkit-agent/assets/biowaiting/fingervein5.svg +@@ -0,0 +1 @@ ++<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 160 160"><defs><style>.cls-1{opacity:0.2;}.cls-2{fill:#3790fa;}.cls-3{fill:url(#未命名的渐变_8);}</style><linearGradient id="未命名的渐变_8" x1="80" y1="71" x2="80" y2="11" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#3790fa"/><stop offset="1" stop-color="#3790fa" stop-opacity="0"/></linearGradient></defs><g id="文字标注"><g class="cls-1"><path d="M114.27147,96.46253a2.28536,2.28536,0,0,0-2.28534,2.28534v14.1233a2.28534,2.28534,0,1,0,4.57068,0V98.74787A2.28536,2.28536,0,0,0,114.27147,96.46253Z"/><path d="M65.6855,39.7409a33.36686,33.36686,0,0,1,14.30613-3.15372l.03571-.00119a30.94322,30.94322,0,0,1,31.95879,29.89309v22.6704a2.29317,2.29317,0,1,0,4.57068-.2742v-22.579A35.514,35.514,0,0,0,79.99163,32.0165a37.88963,37.88963,0,0,0-16.22581,3.56516A2.29044,2.29044,0,1,0,65.6855,39.7409Z"/><path d="M56.72706,42.9404a2.295,2.295,0,0,0-3.24518-.04578A33.09153,33.09153,0,0,0,43.42645,66.47908v47.21479a2.2853,2.2853,0,1,0,4.57059,0V66.47908a28.567,28.567,0,0,1,8.68424-20.29359A2.29484,2.29484,0,0,0,56.72706,42.9404Z"/><path d="M86.80188,42.84894a27.92679,27.92679,0,0,0-12.29509-.2742A27.14962,27.14962,0,0,0,52.56772,68.90157v53.11088a2.28534,2.28534,0,1,0,4.57068,0V93.63914a17.4489,17.4489,0,0,0,2.97089,4.19458,20.85342,20.85342,0,0,1,6.17039,11.86918v6.78754a2.25125,2.25125,0,0,0,0,.24985v8.97437a2.2853,2.2853,0,1,0,4.57059,0v-8.773a25.4804,25.4804,0,0,0,.30615-5.15689c.59317-6.03013,2.33194-16.46175,7.41825-23.59508,6.51407-9.13551,6.12479-15.36586,5.911-17.32271h4.63651a55.70992,55.70992,0,0,0,.01071,6.69315v48.15458a2.28535,2.28535,0,0,0,4.57069,0V94.87812a25.77379,25.77379,0,0,0,1.554,2.45288,45.685,45.685,0,0,1,7.58726,21.88753v2.79392a2.2853,2.2853,0,1,0,4.57059,0V68.90157A27.05818,27.05818,0,0,0,86.80188,42.84894ZM66.27968,97.80616a25.48236,25.48236,0,0,0-2.97089-3.40036c-5.02772-5.25632-6.17039-18.694-6.17039-23.53887h9.14128Zm8.59278-12.26743a36.49909,36.49909,0,0,0-4.02219,7.30536V70.86693h9.09742a2.31209,2.31209,0,0,0,.04394.5485C79.99163,71.46111,81.1343,76.763,74.87246,85.53873Zm27.9724,16.12006a49.905,49.905,0,0,0-3.885-6.97879c-6.49036-9.09559-5.11917-23.58455-5.11917-23.58455l.00229-.02271c.00659-.06985-.00156-.137-.00119-.20581h9.00312ZM57.36573,66.29625A22.52238,22.52238,0,0,1,75.37526,47.28247a23.67615,23.67615,0,0,1,10.284,0,22.431,22.431,0,0,1,16.99293,19.01378Z"/><path d="M82.27688,91.43482a2.28527,2.28527,0,0,0-2.28525,2.28534v31.9945a2.2853,2.2853,0,1,0,4.57059,0V93.72016A2.28535,2.28535,0,0,0,82.27688,91.43482Z"/></g><path class="cls-2" d="M154,52h-8V35a21.0239,21.0239,0,0,0-21-21H108V6h17a29.03307,29.03307,0,0,1,29,29Z"/><path class="cls-2" d="M125,154H108v-8h17a21.02422,21.02422,0,0,0,21-21V108h8v17A29.03339,29.03339,0,0,1,125,154Z"/><path class="cls-2" d="M52,154H35A29.03339,29.03339,0,0,1,6,125V108h8v17a21.02422,21.02422,0,0,0,21,21H52Z"/><path class="cls-2" d="M14,52H6V35A29.03307,29.03307,0,0,1,35,6H52v8H35A21.0239,21.0239,0,0,0,14,35Z"/><rect class="cls-3" x="22" y="11" width="116" height="60"/><rect class="cls-2" x="22" y="68" width="116" height="4"/></g></svg> +\ No newline at end of file +diff --git a/polkit-agent/assets/biowaiting/fingervein6.svg b/polkit-agent/assets/biowaiting/fingervein6.svg +new file mode 100644 +index 0000000..4a6776e +--- /dev/null ++++ b/polkit-agent/assets/biowaiting/fingervein6.svg +@@ -0,0 +1 @@ ++<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 160 160"><defs><style>.cls-1{opacity:0.2;}.cls-2{fill:#3790fa;}.cls-3{fill:url(#未命名的渐变_8);}</style><linearGradient id="未命名的渐变_8" x1="80" y1="82" x2="80" y2="11" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#3790fa"/><stop offset="1" stop-color="#3790fa" stop-opacity="0"/></linearGradient></defs><g id="文字标注"><g class="cls-1"><path d="M114.27147,96.46253a2.28536,2.28536,0,0,0-2.28534,2.28534v14.1233a2.28534,2.28534,0,1,0,4.57068,0V98.74787A2.28536,2.28536,0,0,0,114.27147,96.46253Z"/><path d="M65.6855,39.7409a33.36686,33.36686,0,0,1,14.30613-3.15372l.03571-.00119a30.94322,30.94322,0,0,1,31.95879,29.89309v22.6704a2.29317,2.29317,0,1,0,4.57068-.2742v-22.579A35.514,35.514,0,0,0,79.99163,32.0165a37.88963,37.88963,0,0,0-16.22581,3.56516A2.29044,2.29044,0,1,0,65.6855,39.7409Z"/><path d="M56.72706,42.9404a2.295,2.295,0,0,0-3.24518-.04578A33.09153,33.09153,0,0,0,43.42645,66.47908v47.21479a2.2853,2.2853,0,1,0,4.57059,0V66.47908a28.567,28.567,0,0,1,8.68424-20.29359A2.29484,2.29484,0,0,0,56.72706,42.9404Z"/><path d="M86.80188,42.84894a27.92679,27.92679,0,0,0-12.29509-.2742A27.14962,27.14962,0,0,0,52.56772,68.90157v53.11088a2.28534,2.28534,0,1,0,4.57068,0V93.63914a17.4489,17.4489,0,0,0,2.97089,4.19458,20.85342,20.85342,0,0,1,6.17039,11.86918v6.78754a2.25125,2.25125,0,0,0,0,.24985v8.97437a2.2853,2.2853,0,1,0,4.57059,0v-8.773a25.4804,25.4804,0,0,0,.30615-5.15689c.59317-6.03013,2.33194-16.46175,7.41825-23.59508,6.51407-9.13551,6.12479-15.36586,5.911-17.32271h4.63651a55.70992,55.70992,0,0,0,.01071,6.69315v48.15458a2.28535,2.28535,0,0,0,4.57069,0V94.87812a25.77379,25.77379,0,0,0,1.554,2.45288,45.685,45.685,0,0,1,7.58726,21.88753v2.79392a2.2853,2.2853,0,1,0,4.57059,0V68.90157A27.05818,27.05818,0,0,0,86.80188,42.84894ZM66.27968,97.80616a25.48236,25.48236,0,0,0-2.97089-3.40036c-5.02772-5.25632-6.17039-18.694-6.17039-23.53887h9.14128Zm8.59278-12.26743a36.49909,36.49909,0,0,0-4.02219,7.30536V70.86693h9.09742a2.31209,2.31209,0,0,0,.04394.5485C79.99163,71.46111,81.1343,76.763,74.87246,85.53873Zm27.9724,16.12006a49.905,49.905,0,0,0-3.885-6.97879c-6.49036-9.09559-5.11917-23.58455-5.11917-23.58455l.00229-.02271c.00659-.06985-.00156-.137-.00119-.20581h9.00312ZM57.36573,66.29625A22.52238,22.52238,0,0,1,75.37526,47.28247a23.67615,23.67615,0,0,1,10.284,0,22.431,22.431,0,0,1,16.99293,19.01378Z"/><path d="M82.27688,91.43482a2.28527,2.28527,0,0,0-2.28525,2.28534v31.9945a2.2853,2.2853,0,1,0,4.57059,0V93.72016A2.28535,2.28535,0,0,0,82.27688,91.43482Z"/></g><path class="cls-2" d="M154,52h-8V35a21.0239,21.0239,0,0,0-21-21H108V6h17a29.03307,29.03307,0,0,1,29,29Z"/><path class="cls-2" d="M125,154H108v-8h17a21.02422,21.02422,0,0,0,21-21V108h8v17A29.03339,29.03339,0,0,1,125,154Z"/><path class="cls-2" d="M52,154H35A29.03339,29.03339,0,0,1,6,125V108h8v17a21.02422,21.02422,0,0,0,21,21H52Z"/><path class="cls-2" d="M14,52H6V35A29.03307,29.03307,0,0,1,35,6H52v8H35A21.0239,21.0239,0,0,0,14,35Z"/><rect class="cls-3" x="22" y="11" width="116" height="71"/><rect class="cls-2" x="22" y="79" width="116" height="4"/></g></svg> +\ No newline at end of file +diff --git a/polkit-agent/assets/biowaiting/fingervein7.svg b/polkit-agent/assets/biowaiting/fingervein7.svg +new file mode 100644 +index 0000000..f7adf46 +--- /dev/null ++++ b/polkit-agent/assets/biowaiting/fingervein7.svg +@@ -0,0 +1 @@ ++<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 160 160"><defs><style>.cls-1{opacity:0.2;}.cls-2{fill:#3790fa;}.cls-3{fill:url(#未命名的渐变_8);}</style><linearGradient id="未命名的渐变_8" x1="80" y1="93" x2="80" y2="11" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#3790fa"/><stop offset="1" stop-color="#3790fa" stop-opacity="0"/></linearGradient></defs><g id="文字标注"><g class="cls-1"><path d="M114.27147,96.46253a2.28536,2.28536,0,0,0-2.28534,2.28534v14.1233a2.28534,2.28534,0,1,0,4.57068,0V98.74787A2.28536,2.28536,0,0,0,114.27147,96.46253Z"/><path d="M65.6855,39.7409a33.36686,33.36686,0,0,1,14.30613-3.15372l.03571-.00119a30.94322,30.94322,0,0,1,31.95879,29.89309v22.6704a2.29317,2.29317,0,1,0,4.57068-.2742v-22.579A35.514,35.514,0,0,0,79.99163,32.0165a37.88963,37.88963,0,0,0-16.22581,3.56516A2.29044,2.29044,0,1,0,65.6855,39.7409Z"/><path d="M56.72706,42.9404a2.295,2.295,0,0,0-3.24518-.04578A33.09153,33.09153,0,0,0,43.42645,66.47908v47.21479a2.2853,2.2853,0,1,0,4.57059,0V66.47908a28.567,28.567,0,0,1,8.68424-20.29359A2.29484,2.29484,0,0,0,56.72706,42.9404Z"/><path d="M86.80188,42.84894a27.92679,27.92679,0,0,0-12.29509-.2742A27.14962,27.14962,0,0,0,52.56772,68.90157v53.11088a2.28534,2.28534,0,1,0,4.57068,0V93.63914a17.4489,17.4489,0,0,0,2.97089,4.19458,20.85342,20.85342,0,0,1,6.17039,11.86918v6.78754a2.25125,2.25125,0,0,0,0,.24985v8.97437a2.2853,2.2853,0,1,0,4.57059,0v-8.773a25.4804,25.4804,0,0,0,.30615-5.15689c.59317-6.03013,2.33194-16.46175,7.41825-23.59508,6.51407-9.13551,6.12479-15.36586,5.911-17.32271h4.63651a55.70992,55.70992,0,0,0,.01071,6.69315v48.15458a2.28535,2.28535,0,0,0,4.57069,0V94.87812a25.77379,25.77379,0,0,0,1.554,2.45288,45.685,45.685,0,0,1,7.58726,21.88753v2.79392a2.2853,2.2853,0,1,0,4.57059,0V68.90157A27.05818,27.05818,0,0,0,86.80188,42.84894ZM66.27968,97.80616a25.48236,25.48236,0,0,0-2.97089-3.40036c-5.02772-5.25632-6.17039-18.694-6.17039-23.53887h9.14128Zm8.59278-12.26743a36.49909,36.49909,0,0,0-4.02219,7.30536V70.86693h9.09742a2.31209,2.31209,0,0,0,.04394.5485C79.99163,71.46111,81.1343,76.763,74.87246,85.53873Zm27.9724,16.12006a49.905,49.905,0,0,0-3.885-6.97879c-6.49036-9.09559-5.11917-23.58455-5.11917-23.58455l.00229-.02271c.00659-.06985-.00156-.137-.00119-.20581h9.00312ZM57.36573,66.29625A22.52238,22.52238,0,0,1,75.37526,47.28247a23.67615,23.67615,0,0,1,10.284,0,22.431,22.431,0,0,1,16.99293,19.01378Z"/><path d="M82.27688,91.43482a2.28527,2.28527,0,0,0-2.28525,2.28534v31.9945a2.2853,2.2853,0,1,0,4.57059,0V93.72016A2.28535,2.28535,0,0,0,82.27688,91.43482Z"/></g><path class="cls-2" d="M154,52h-8V35a21.0239,21.0239,0,0,0-21-21H108V6h17a29.03307,29.03307,0,0,1,29,29Z"/><path class="cls-2" d="M125,154H108v-8h17a21.02422,21.02422,0,0,0,21-21V108h8v17A29.03339,29.03339,0,0,1,125,154Z"/><path class="cls-2" d="M52,154H35A29.03339,29.03339,0,0,1,6,125V108h8v17a21.02422,21.02422,0,0,0,21,21H52Z"/><path class="cls-2" d="M14,52H6V35A29.03307,29.03307,0,0,1,35,6H52v8H35A21.0239,21.0239,0,0,0,14,35Z"/><rect class="cls-3" x="22" y="11" width="116" height="82"/><rect class="cls-2" x="22" y="90" width="116" height="4"/></g></svg> +\ No newline at end of file +diff --git a/polkit-agent/assets/biowaiting/fingervein8.svg b/polkit-agent/assets/biowaiting/fingervein8.svg +new file mode 100644 +index 0000000..1ea6843 +--- /dev/null ++++ b/polkit-agent/assets/biowaiting/fingervein8.svg +@@ -0,0 +1 @@ ++<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 160 160"><defs><style>.cls-1{opacity:0.2;}.cls-2{fill:#3790fa;}.cls-3{fill:url(#未命名的渐变_8);}</style><linearGradient id="未命名的渐变_8" x1="80" y1="104" x2="80" y2="11" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#3790fa"/><stop offset="1" stop-color="#3790fa" stop-opacity="0"/></linearGradient></defs><g id="文字标注"><g class="cls-1"><path d="M114.27147,96.46253a2.28536,2.28536,0,0,0-2.28534,2.28534v14.1233a2.28534,2.28534,0,1,0,4.57068,0V98.74787A2.28536,2.28536,0,0,0,114.27147,96.46253Z"/><path d="M65.6855,39.7409a33.36686,33.36686,0,0,1,14.30613-3.15372l.03571-.00119a30.94322,30.94322,0,0,1,31.95879,29.89309v22.6704a2.29317,2.29317,0,1,0,4.57068-.2742v-22.579A35.514,35.514,0,0,0,79.99163,32.0165a37.88963,37.88963,0,0,0-16.22581,3.56516A2.29044,2.29044,0,1,0,65.6855,39.7409Z"/><path d="M56.72706,42.9404a2.295,2.295,0,0,0-3.24518-.04578A33.09153,33.09153,0,0,0,43.42645,66.47908v47.21479a2.2853,2.2853,0,1,0,4.57059,0V66.47908a28.567,28.567,0,0,1,8.68424-20.29359A2.29484,2.29484,0,0,0,56.72706,42.9404Z"/><path d="M86.80188,42.84894a27.92679,27.92679,0,0,0-12.29509-.2742A27.14962,27.14962,0,0,0,52.56772,68.90157v53.11088a2.28534,2.28534,0,1,0,4.57068,0V93.63914a17.4489,17.4489,0,0,0,2.97089,4.19458,20.85342,20.85342,0,0,1,6.17039,11.86918v6.78754a2.25125,2.25125,0,0,0,0,.24985v8.97437a2.2853,2.2853,0,1,0,4.57059,0v-8.773a25.4804,25.4804,0,0,0,.30615-5.15689c.59317-6.03013,2.33194-16.46175,7.41825-23.59508,6.51407-9.13551,6.12479-15.36586,5.911-17.32271h4.63651a55.70992,55.70992,0,0,0,.01071,6.69315v48.15458a2.28535,2.28535,0,0,0,4.57069,0V94.87812a25.77379,25.77379,0,0,0,1.554,2.45288,45.685,45.685,0,0,1,7.58726,21.88753v2.79392a2.2853,2.2853,0,1,0,4.57059,0V68.90157A27.05818,27.05818,0,0,0,86.80188,42.84894ZM66.27968,97.80616a25.48236,25.48236,0,0,0-2.97089-3.40036c-5.02772-5.25632-6.17039-18.694-6.17039-23.53887h9.14128Zm8.59278-12.26743a36.49909,36.49909,0,0,0-4.02219,7.30536V70.86693h9.09742a2.31209,2.31209,0,0,0,.04394.5485C79.99163,71.46111,81.1343,76.763,74.87246,85.53873Zm27.9724,16.12006a49.905,49.905,0,0,0-3.885-6.97879c-6.49036-9.09559-5.11917-23.58455-5.11917-23.58455l.00229-.02271c.00659-.06985-.00156-.137-.00119-.20581h9.00312ZM57.36573,66.29625A22.52238,22.52238,0,0,1,75.37526,47.28247a23.67615,23.67615,0,0,1,10.284,0,22.431,22.431,0,0,1,16.99293,19.01378Z"/><path d="M82.27688,91.43482a2.28527,2.28527,0,0,0-2.28525,2.28534v31.9945a2.2853,2.2853,0,1,0,4.57059,0V93.72016A2.28535,2.28535,0,0,0,82.27688,91.43482Z"/></g><path class="cls-2" d="M154,52h-8V35a21.0239,21.0239,0,0,0-21-21H108V6h17a29.03307,29.03307,0,0,1,29,29Z"/><path class="cls-2" d="M125,154H108v-8h17a21.02422,21.02422,0,0,0,21-21V108h8v17A29.03339,29.03339,0,0,1,125,154Z"/><path class="cls-2" d="M52,154H35A29.03339,29.03339,0,0,1,6,125V108h8v17a21.02422,21.02422,0,0,0,21,21H52Z"/><path class="cls-2" d="M14,52H6V35A29.03307,29.03307,0,0,1,35,6H52v8H35A21.0239,21.0239,0,0,0,14,35Z"/><rect class="cls-3" x="22" y="11" width="116" height="93"/><rect class="cls-2" x="22" y="101" width="116" height="4"/></g></svg> +\ No newline at end of file +diff --git a/polkit-agent/assets/biowaiting/fingervein9.svg b/polkit-agent/assets/biowaiting/fingervein9.svg +new file mode 100644 +index 0000000..6e00868 +--- /dev/null ++++ b/polkit-agent/assets/biowaiting/fingervein9.svg +@@ -0,0 +1 @@ ++<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 160 160"><defs><style>.cls-1{opacity:0.2;}.cls-2{fill:#3790fa;}.cls-3{fill:url(#未命名的渐变_8);}</style><linearGradient id="未命名的渐变_8" x1="80" y1="116" x2="80" y2="12" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#3790fa"/><stop offset="1" stop-color="#3790fa" stop-opacity="0"/></linearGradient></defs><g id="文字标注"><g class="cls-1"><path d="M114.27147,96.46253a2.28536,2.28536,0,0,0-2.28534,2.28534v14.1233a2.28534,2.28534,0,1,0,4.57068,0V98.74787A2.28536,2.28536,0,0,0,114.27147,96.46253Z"/><path d="M65.6855,39.7409a33.36686,33.36686,0,0,1,14.30613-3.15372l.03571-.00119a30.94322,30.94322,0,0,1,31.95879,29.89309v22.6704a2.29317,2.29317,0,1,0,4.57068-.2742v-22.579A35.514,35.514,0,0,0,79.99163,32.0165a37.88963,37.88963,0,0,0-16.22581,3.56516A2.29044,2.29044,0,1,0,65.6855,39.7409Z"/><path d="M56.72706,42.9404a2.295,2.295,0,0,0-3.24518-.04578A33.09153,33.09153,0,0,0,43.42645,66.47908v47.21479a2.2853,2.2853,0,1,0,4.57059,0V66.47908a28.567,28.567,0,0,1,8.68424-20.29359A2.29484,2.29484,0,0,0,56.72706,42.9404Z"/><path d="M86.80188,42.84894a27.92679,27.92679,0,0,0-12.29509-.2742A27.14962,27.14962,0,0,0,52.56772,68.90157v53.11088a2.28534,2.28534,0,1,0,4.57068,0V93.63914a17.4489,17.4489,0,0,0,2.97089,4.19458,20.85342,20.85342,0,0,1,6.17039,11.86918v6.78754a2.25125,2.25125,0,0,0,0,.24985v8.97437a2.2853,2.2853,0,1,0,4.57059,0v-8.773a25.4804,25.4804,0,0,0,.30615-5.15689c.59317-6.03013,2.33194-16.46175,7.41825-23.59508,6.51407-9.13551,6.12479-15.36586,5.911-17.32271h4.63651a55.70992,55.70992,0,0,0,.01071,6.69315v48.15458a2.28535,2.28535,0,0,0,4.57069,0V94.87812a25.77379,25.77379,0,0,0,1.554,2.45288,45.685,45.685,0,0,1,7.58726,21.88753v2.79392a2.2853,2.2853,0,1,0,4.57059,0V68.90157A27.05818,27.05818,0,0,0,86.80188,42.84894ZM66.27968,97.80616a25.48236,25.48236,0,0,0-2.97089-3.40036c-5.02772-5.25632-6.17039-18.694-6.17039-23.53887h9.14128Zm8.59278-12.26743a36.49909,36.49909,0,0,0-4.02219,7.30536V70.86693h9.09742a2.31209,2.31209,0,0,0,.04394.5485C79.99163,71.46111,81.1343,76.763,74.87246,85.53873Zm27.9724,16.12006a49.905,49.905,0,0,0-3.885-6.97879c-6.49036-9.09559-5.11917-23.58455-5.11917-23.58455l.00229-.02271c.00659-.06985-.00156-.137-.00119-.20581h9.00312ZM57.36573,66.29625A22.52238,22.52238,0,0,1,75.37526,47.28247a23.67615,23.67615,0,0,1,10.284,0,22.431,22.431,0,0,1,16.99293,19.01378Z"/><path d="M82.27688,91.43482a2.28527,2.28527,0,0,0-2.28525,2.28534v31.9945a2.2853,2.2853,0,1,0,4.57059,0V93.72016A2.28535,2.28535,0,0,0,82.27688,91.43482Z"/></g><path class="cls-2" d="M154,52h-8V35a21.0239,21.0239,0,0,0-21-21H108V6h17a29.03307,29.03307,0,0,1,29,29Z"/><path class="cls-2" d="M125,154H108v-8h17a21.02422,21.02422,0,0,0,21-21V108h8v17A29.03339,29.03339,0,0,1,125,154Z"/><path class="cls-2" d="M52,154H35A29.03339,29.03339,0,0,1,6,125V108h8v17a21.02422,21.02422,0,0,0,21,21H52Z"/><path class="cls-2" d="M14,52H6V35A29.03307,29.03307,0,0,1,35,6H52v8H35A21.0239,21.0239,0,0,0,14,35Z"/><rect class="cls-3" x="22" y="12" width="116" height="104"/><rect class="cls-2" x="22" y="112" width="116" height="4"/></g></svg> +\ No newline at end of file +diff --git a/polkit-agent/assets/biowaiting/iris0.svg b/polkit-agent/assets/biowaiting/iris0.svg +new file mode 100644 +index 0000000..6fb8a60 +--- /dev/null ++++ b/polkit-agent/assets/biowaiting/iris0.svg +@@ -0,0 +1 @@ ++<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 160 160"><defs><style>.cls-1{fill:#3790fa;}.cls-2{opacity:0.2;}</style></defs><g id="文字标注"><path class="cls-1" d="M154,52h-8V35a21.0239,21.0239,0,0,0-21-21H108V6h17a29.03307,29.03307,0,0,1,29,29Z"/><path class="cls-1" d="M125,154H108v-8h17a21.02422,21.02422,0,0,0,21-21V108h8v17A29.03339,29.03339,0,0,1,125,154Z"/><path class="cls-1" d="M52,154H35A29.03339,29.03339,0,0,1,6,125V108h8v17a21.02422,21.02422,0,0,0,21,21H52Z"/><path class="cls-1" d="M14,52H6V35A29.03307,29.03307,0,0,1,35,6H52v8H35A21.0239,21.0239,0,0,0,14,35Z"/><g class="cls-2"><path d="M80,112c-28.1582,0-50.24707-28.35742-51.17285-29.56445L26.958,80l1.86914-2.43555C29.75293,76.35742,51.8418,48,80,48s50.24707,28.35742,51.17285,29.56445L133.042,80l-1.86914,2.43555C130.24707,83.64258,108.1582,112,80,112ZM37.22266,80C42.99512,86.54346,60.249,104,80,104s37.00391-17.45508,42.77734-24C117.00391,73.45508,99.751,56,80,56S42.99609,73.45508,37.22266,80Z"/></g><g class="cls-2"><circle cx="80" cy="80" r="18"/></g></g></svg> +\ No newline at end of file +diff --git a/polkit-agent/assets/biowaiting/iris1.svg b/polkit-agent/assets/biowaiting/iris1.svg +new file mode 100644 +index 0000000..052eefb +--- /dev/null ++++ b/polkit-agent/assets/biowaiting/iris1.svg +@@ -0,0 +1 @@ ++<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 160 160"><defs><style>.cls-1{fill:#3790fa;}.cls-2{opacity:0.2;}.cls-3{fill:url(#未命名的渐变_8);}</style><linearGradient id="未命名的渐变_8" x1="80" y1="27" x2="80" y2="11" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#3790fa"/><stop offset="1" stop-color="#3790fa" stop-opacity="0"/></linearGradient></defs><g id="文字标注"><path class="cls-1" d="M154,52h-8V35a21.0239,21.0239,0,0,0-21-21H108V6h17a29.03307,29.03307,0,0,1,29,29Z"/><path class="cls-1" d="M125,154H108v-8h17a21.02422,21.02422,0,0,0,21-21V108h8v17A29.03339,29.03339,0,0,1,125,154Z"/><path class="cls-1" d="M52,154H35A29.03339,29.03339,0,0,1,6,125V108h8v17a21.02422,21.02422,0,0,0,21,21H52Z"/><path class="cls-1" d="M14,52H6V35A29.03307,29.03307,0,0,1,35,6H52v8H35A21.0239,21.0239,0,0,0,14,35Z"/><g class="cls-2"><path d="M80,112c-28.1582,0-50.24707-28.35742-51.17285-29.56445L26.958,80l1.86914-2.43555C29.75293,76.35742,51.8418,48,80,48s50.24707,28.35742,51.17285,29.56445L133.042,80l-1.86914,2.43555C130.24707,83.64258,108.1582,112,80,112ZM37.22266,80C42.99512,86.54346,60.249,104,80,104s37.00391-17.45508,42.77734-24C117.00391,73.45508,99.751,56,80,56S42.99609,73.45508,37.22266,80Z"/></g><g class="cls-2"><circle cx="80" cy="80" r="18"/></g><rect class="cls-3" x="22" y="11" width="116" height="16"/><rect class="cls-1" x="22" y="24" width="116" height="4"/></g></svg> +\ No newline at end of file +diff --git a/polkit-agent/assets/biowaiting/iris10.svg b/polkit-agent/assets/biowaiting/iris10.svg +new file mode 100644 +index 0000000..0df7826 +--- /dev/null ++++ b/polkit-agent/assets/biowaiting/iris10.svg +@@ -0,0 +1 @@ ++<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 160 160"><defs><style>.cls-1{fill:#3790fa;}.cls-2{opacity:0.2;}.cls-3{fill:url(#未命名的渐变_8);}</style><linearGradient id="未命名的渐变_8" x1="80" y1="126" x2="80" y2="11" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#3790fa"/><stop offset="1" stop-color="#3790fa" stop-opacity="0"/></linearGradient></defs><g id="文字标注"><path class="cls-1" d="M154,52h-8V35a21.0239,21.0239,0,0,0-21-21H108V6h17a29.03307,29.03307,0,0,1,29,29Z"/><path class="cls-1" d="M125,154H108v-8h17a21.02422,21.02422,0,0,0,21-21V108h8v17A29.03339,29.03339,0,0,1,125,154Z"/><path class="cls-1" d="M52,154H35A29.03339,29.03339,0,0,1,6,125V108h8v17a21.02422,21.02422,0,0,0,21,21H52Z"/><path class="cls-1" d="M14,52H6V35A29.03307,29.03307,0,0,1,35,6H52v8H35A21.0239,21.0239,0,0,0,14,35Z"/><g class="cls-2"><path d="M80,112c-28.1582,0-50.24707-28.35742-51.17285-29.56445L26.958,80l1.86914-2.43555C29.75293,76.35742,51.8418,48,80,48s50.24707,28.35742,51.17285,29.56445L133.042,80l-1.86914,2.43555C130.24707,83.64258,108.1582,112,80,112ZM37.22266,80C42.99512,86.54346,60.249,104,80,104s37.00391-17.45508,42.77734-24C117.00391,73.45508,99.751,56,80,56S42.99609,73.45508,37.22266,80Z"/></g><g class="cls-2"><circle cx="80" cy="80" r="18"/></g><rect class="cls-3" x="22" y="11" width="116" height="115"/><rect class="cls-1" x="22" y="123" width="116" height="4"/></g></svg> +\ No newline at end of file +diff --git a/polkit-agent/assets/biowaiting/iris11.svg b/polkit-agent/assets/biowaiting/iris11.svg +new file mode 100644 +index 0000000..8ab52bd +--- /dev/null ++++ b/polkit-agent/assets/biowaiting/iris11.svg +@@ -0,0 +1 @@ ++<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 160 160"><defs><style>.cls-1{fill:#3790fa;}.cls-2{opacity:0.2;}.cls-3{fill:url(#未命名的渐变_8);}</style><linearGradient id="未命名的渐变_8" x1="80" y1="137" x2="80" y2="11" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#3790fa"/><stop offset="1" stop-color="#3790fa" stop-opacity="0"/></linearGradient></defs><g id="文字标注"><path class="cls-1" d="M154,52h-8V35a21.0239,21.0239,0,0,0-21-21H108V6h17a29.03307,29.03307,0,0,1,29,29Z"/><path class="cls-1" d="M125,154H108v-8h17a21.02422,21.02422,0,0,0,21-21V108h8v17A29.03339,29.03339,0,0,1,125,154Z"/><path class="cls-1" d="M52,154H35A29.03339,29.03339,0,0,1,6,125V108h8v17a21.02422,21.02422,0,0,0,21,21H52Z"/><path class="cls-1" d="M14,52H6V35A29.03307,29.03307,0,0,1,35,6H52v8H35A21.0239,21.0239,0,0,0,14,35Z"/><g class="cls-2"><path d="M80,112c-28.1582,0-50.24707-28.35742-51.17285-29.56445L26.958,80l1.86914-2.43555C29.75293,76.35742,51.8418,48,80,48s50.24707,28.35742,51.17285,29.56445L133.042,80l-1.86914,2.43555C130.24707,83.64258,108.1582,112,80,112ZM37.22266,80C42.99512,86.54346,60.249,104,80,104s37.00391-17.45508,42.77734-24C117.00391,73.45508,99.751,56,80,56S42.99609,73.45508,37.22266,80Z"/></g><g class="cls-2"><circle cx="80" cy="80" r="18"/></g><rect class="cls-3" x="22" y="11" width="116" height="126"/><rect class="cls-1" x="22" y="134" width="116" height="4"/></g></svg> +\ No newline at end of file +diff --git a/polkit-agent/assets/biowaiting/iris2.svg b/polkit-agent/assets/biowaiting/iris2.svg +new file mode 100644 +index 0000000..68c4479 +--- /dev/null ++++ b/polkit-agent/assets/biowaiting/iris2.svg +@@ -0,0 +1 @@ ++<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 160 160"><defs><style>.cls-1{fill:#3790fa;}.cls-2{opacity:0.2;}.cls-3{fill:url(#未命名的渐变_8);}</style><linearGradient id="未命名的渐变_8" x1="80" y1="38" x2="80" y2="11" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#3790fa"/><stop offset="1" stop-color="#3790fa" stop-opacity="0"/></linearGradient></defs><g id="文字标注"><path class="cls-1" d="M154,52h-8V35a21.0239,21.0239,0,0,0-21-21H108V6h17a29.03307,29.03307,0,0,1,29,29Z"/><path class="cls-1" d="M125,154H108v-8h17a21.02422,21.02422,0,0,0,21-21V108h8v17A29.03339,29.03339,0,0,1,125,154Z"/><path class="cls-1" d="M52,154H35A29.03339,29.03339,0,0,1,6,125V108h8v17a21.02422,21.02422,0,0,0,21,21H52Z"/><path class="cls-1" d="M14,52H6V35A29.03307,29.03307,0,0,1,35,6H52v8H35A21.0239,21.0239,0,0,0,14,35Z"/><g class="cls-2"><path d="M80,112c-28.1582,0-50.24707-28.35742-51.17285-29.56445L26.958,80l1.86914-2.43555C29.75293,76.35742,51.8418,48,80,48s50.24707,28.35742,51.17285,29.56445L133.042,80l-1.86914,2.43555C130.24707,83.64258,108.1582,112,80,112ZM37.22266,80C42.99512,86.54346,60.249,104,80,104s37.00391-17.45508,42.77734-24C117.00391,73.45508,99.751,56,80,56S42.99609,73.45508,37.22266,80Z"/></g><g class="cls-2"><circle cx="80" cy="80" r="18"/></g><rect class="cls-3" x="22" y="11" width="116" height="27"/><rect class="cls-1" x="22" y="35" width="116" height="4"/></g></svg> +\ No newline at end of file +diff --git a/polkit-agent/assets/biowaiting/iris3.svg b/polkit-agent/assets/biowaiting/iris3.svg +new file mode 100644 +index 0000000..b750b2e +--- /dev/null ++++ b/polkit-agent/assets/biowaiting/iris3.svg +@@ -0,0 +1 @@ ++<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 160 160"><defs><style>.cls-1{fill:#3790fa;}.cls-2{opacity:0.2;}.cls-3{fill:url(#未命名的渐变_8);}</style><linearGradient id="未命名的渐变_8" x1="80" y1="49" x2="80" y2="11" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#3790fa"/><stop offset="1" stop-color="#3790fa" stop-opacity="0"/></linearGradient></defs><g id="文字标注"><path class="cls-1" d="M154,52h-8V35a21.0239,21.0239,0,0,0-21-21H108V6h17a29.03307,29.03307,0,0,1,29,29Z"/><path class="cls-1" d="M125,154H108v-8h17a21.02422,21.02422,0,0,0,21-21V108h8v17A29.03339,29.03339,0,0,1,125,154Z"/><path class="cls-1" d="M52,154H35A29.03339,29.03339,0,0,1,6,125V108h8v17a21.02422,21.02422,0,0,0,21,21H52Z"/><path class="cls-1" d="M14,52H6V35A29.03307,29.03307,0,0,1,35,6H52v8H35A21.0239,21.0239,0,0,0,14,35Z"/><g class="cls-2"><path d="M80,112c-28.1582,0-50.24707-28.35742-51.17285-29.56445L26.958,80l1.86914-2.43555C29.75293,76.35742,51.8418,48,80,48s50.24707,28.35742,51.17285,29.56445L133.042,80l-1.86914,2.43555C130.24707,83.64258,108.1582,112,80,112ZM37.22266,80C42.99512,86.54346,60.249,104,80,104s37.00391-17.45508,42.77734-24C117.00391,73.45508,99.751,56,80,56S42.99609,73.45508,37.22266,80Z"/></g><g class="cls-2"><circle cx="80" cy="80" r="18"/></g><rect class="cls-3" x="22" y="11" width="116" height="38"/><rect class="cls-1" x="22" y="46" width="116" height="4"/></g></svg> +\ No newline at end of file +diff --git a/polkit-agent/assets/biowaiting/iris4.svg b/polkit-agent/assets/biowaiting/iris4.svg +new file mode 100644 +index 0000000..141450c +--- /dev/null ++++ b/polkit-agent/assets/biowaiting/iris4.svg +@@ -0,0 +1 @@ ++<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 160 160"><defs><style>.cls-1{fill:#3790fa;}.cls-2{opacity:0.2;}.cls-3{fill:url(#未命名的渐变_8);}</style><linearGradient id="未命名的渐变_8" x1="80" y1="60" x2="80" y2="11" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#3790fa"/><stop offset="1" stop-color="#3790fa" stop-opacity="0"/></linearGradient></defs><g id="文字标注"><path class="cls-1" d="M154,52h-8V35a21.0239,21.0239,0,0,0-21-21H108V6h17a29.03307,29.03307,0,0,1,29,29Z"/><path class="cls-1" d="M125,154H108v-8h17a21.02422,21.02422,0,0,0,21-21V108h8v17A29.03339,29.03339,0,0,1,125,154Z"/><path class="cls-1" d="M52,154H35A29.03339,29.03339,0,0,1,6,125V108h8v17a21.02422,21.02422,0,0,0,21,21H52Z"/><path class="cls-1" d="M14,52H6V35A29.03307,29.03307,0,0,1,35,6H52v8H35A21.0239,21.0239,0,0,0,14,35Z"/><g class="cls-2"><path d="M80,112c-28.1582,0-50.24707-28.35742-51.17285-29.56445L26.958,80l1.86914-2.43555C29.75293,76.35742,51.8418,48,80,48s50.24707,28.35742,51.17285,29.56445L133.042,80l-1.86914,2.43555C130.24707,83.64258,108.1582,112,80,112ZM37.22266,80C42.99512,86.54346,60.249,104,80,104s37.00391-17.45508,42.77734-24C117.00391,73.45508,99.751,56,80,56S42.99609,73.45508,37.22266,80Z"/></g><g class="cls-2"><circle cx="80" cy="80" r="18"/></g><rect class="cls-3" x="22" y="11" width="116" height="49"/><rect class="cls-1" x="22" y="57" width="116" height="4"/></g></svg> +\ No newline at end of file +diff --git a/polkit-agent/assets/biowaiting/iris5.svg b/polkit-agent/assets/biowaiting/iris5.svg +new file mode 100644 +index 0000000..e879021 +--- /dev/null ++++ b/polkit-agent/assets/biowaiting/iris5.svg +@@ -0,0 +1 @@ ++<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 160 160"><defs><style>.cls-1{fill:#3790fa;}.cls-2{opacity:0.2;}.cls-3{fill:url(#未命名的渐变_8);}</style><linearGradient id="未命名的渐变_8" x1="80" y1="71" x2="80" y2="11" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#3790fa"/><stop offset="1" stop-color="#3790fa" stop-opacity="0"/></linearGradient></defs><g id="文字标注"><path class="cls-1" d="M154,52h-8V35a21.0239,21.0239,0,0,0-21-21H108V6h17a29.03307,29.03307,0,0,1,29,29Z"/><path class="cls-1" d="M125,154H108v-8h17a21.02422,21.02422,0,0,0,21-21V108h8v17A29.03339,29.03339,0,0,1,125,154Z"/><path class="cls-1" d="M52,154H35A29.03339,29.03339,0,0,1,6,125V108h8v17a21.02422,21.02422,0,0,0,21,21H52Z"/><path class="cls-1" d="M14,52H6V35A29.03307,29.03307,0,0,1,35,6H52v8H35A21.0239,21.0239,0,0,0,14,35Z"/><g class="cls-2"><path d="M80,112c-28.1582,0-50.24707-28.35742-51.17285-29.56445L26.958,80l1.86914-2.43555C29.75293,76.35742,51.8418,48,80,48s50.24707,28.35742,51.17285,29.56445L133.042,80l-1.86914,2.43555C130.24707,83.64258,108.1582,112,80,112ZM37.22266,80C42.99512,86.54346,60.249,104,80,104s37.00391-17.45508,42.77734-24C117.00391,73.45508,99.751,56,80,56S42.99609,73.45508,37.22266,80Z"/></g><g class="cls-2"><circle cx="80" cy="80" r="18"/></g><rect class="cls-3" x="22" y="11" width="116" height="60"/><rect class="cls-1" x="22" y="68" width="116" height="4"/></g></svg> +\ No newline at end of file +diff --git a/polkit-agent/assets/biowaiting/iris6.svg b/polkit-agent/assets/biowaiting/iris6.svg +new file mode 100644 +index 0000000..f4e971d +--- /dev/null ++++ b/polkit-agent/assets/biowaiting/iris6.svg +@@ -0,0 +1 @@ ++<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 160 160"><defs><style>.cls-1{fill:#3790fa;}.cls-2{opacity:0.2;}.cls-3{fill:url(#未命名的渐变_8);}</style><linearGradient id="未命名的渐变_8" x1="80" y1="82" x2="80" y2="11" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#3790fa"/><stop offset="1" stop-color="#3790fa" stop-opacity="0"/></linearGradient></defs><g id="文字标注"><path class="cls-1" d="M154,52h-8V35a21.0239,21.0239,0,0,0-21-21H108V6h17a29.03307,29.03307,0,0,1,29,29Z"/><path class="cls-1" d="M125,154H108v-8h17a21.02422,21.02422,0,0,0,21-21V108h8v17A29.03339,29.03339,0,0,1,125,154Z"/><path class="cls-1" d="M52,154H35A29.03339,29.03339,0,0,1,6,125V108h8v17a21.02422,21.02422,0,0,0,21,21H52Z"/><path class="cls-1" d="M14,52H6V35A29.03307,29.03307,0,0,1,35,6H52v8H35A21.0239,21.0239,0,0,0,14,35Z"/><g class="cls-2"><path d="M80,112c-28.1582,0-50.24707-28.35742-51.17285-29.56445L26.958,80l1.86914-2.43555C29.75293,76.35742,51.8418,48,80,48s50.24707,28.35742,51.17285,29.56445L133.042,80l-1.86914,2.43555C130.24707,83.64258,108.1582,112,80,112ZM37.22266,80C42.99512,86.54346,60.249,104,80,104s37.00391-17.45508,42.77734-24C117.00391,73.45508,99.751,56,80,56S42.99609,73.45508,37.22266,80Z"/></g><g class="cls-2"><circle cx="80" cy="80" r="18"/></g><rect class="cls-3" x="22" y="11" width="116" height="71"/><rect class="cls-1" x="22" y="79" width="116" height="4"/></g></svg> +\ No newline at end of file +diff --git a/polkit-agent/assets/biowaiting/iris7.svg b/polkit-agent/assets/biowaiting/iris7.svg +new file mode 100644 +index 0000000..9cf5557 +--- /dev/null ++++ b/polkit-agent/assets/biowaiting/iris7.svg +@@ -0,0 +1 @@ ++<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 160 160"><defs><style>.cls-1{fill:#3790fa;}.cls-2{opacity:0.2;}.cls-3{fill:url(#未命名的渐变_8);}</style><linearGradient id="未命名的渐变_8" x1="80" y1="93" x2="80" y2="11" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#3790fa"/><stop offset="1" stop-color="#3790fa" stop-opacity="0"/></linearGradient></defs><g id="文字标注"><path class="cls-1" d="M154,52h-8V35a21.0239,21.0239,0,0,0-21-21H108V6h17a29.03307,29.03307,0,0,1,29,29Z"/><path class="cls-1" d="M125,154H108v-8h17a21.02422,21.02422,0,0,0,21-21V108h8v17A29.03339,29.03339,0,0,1,125,154Z"/><path class="cls-1" d="M52,154H35A29.03339,29.03339,0,0,1,6,125V108h8v17a21.02422,21.02422,0,0,0,21,21H52Z"/><path class="cls-1" d="M14,52H6V35A29.03307,29.03307,0,0,1,35,6H52v8H35A21.0239,21.0239,0,0,0,14,35Z"/><g class="cls-2"><path d="M80,112c-28.1582,0-50.24707-28.35742-51.17285-29.56445L26.958,80l1.86914-2.43555C29.75293,76.35742,51.8418,48,80,48s50.24707,28.35742,51.17285,29.56445L133.042,80l-1.86914,2.43555C130.24707,83.64258,108.1582,112,80,112ZM37.22266,80C42.99512,86.54346,60.249,104,80,104s37.00391-17.45508,42.77734-24C117.00391,73.45508,99.751,56,80,56S42.99609,73.45508,37.22266,80Z"/></g><g class="cls-2"><circle cx="80" cy="80" r="18"/></g><rect class="cls-3" x="22" y="11" width="116" height="82"/><rect class="cls-1" x="22" y="90" width="116" height="4"/></g></svg> +\ No newline at end of file +diff --git a/polkit-agent/assets/biowaiting/iris8.svg b/polkit-agent/assets/biowaiting/iris8.svg +new file mode 100644 +index 0000000..551dddd +--- /dev/null ++++ b/polkit-agent/assets/biowaiting/iris8.svg +@@ -0,0 +1 @@ ++<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 160 160"><defs><style>.cls-1{fill:#3790fa;}.cls-2{opacity:0.2;}.cls-3{fill:url(#未命名的渐变_8);}</style><linearGradient id="未命名的渐变_8" x1="80" y1="104" x2="80" y2="11" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#3790fa"/><stop offset="1" stop-color="#3790fa" stop-opacity="0"/></linearGradient></defs><g id="文字标注"><path class="cls-1" d="M154,52h-8V35a21.0239,21.0239,0,0,0-21-21H108V6h17a29.03307,29.03307,0,0,1,29,29Z"/><path class="cls-1" d="M125,154H108v-8h17a21.02422,21.02422,0,0,0,21-21V108h8v17A29.03339,29.03339,0,0,1,125,154Z"/><path class="cls-1" d="M52,154H35A29.03339,29.03339,0,0,1,6,125V108h8v17a21.02422,21.02422,0,0,0,21,21H52Z"/><path class="cls-1" d="M14,52H6V35A29.03307,29.03307,0,0,1,35,6H52v8H35A21.0239,21.0239,0,0,0,14,35Z"/><g class="cls-2"><path d="M80,112c-28.1582,0-50.24707-28.35742-51.17285-29.56445L26.958,80l1.86914-2.43555C29.75293,76.35742,51.8418,48,80,48s50.24707,28.35742,51.17285,29.56445L133.042,80l-1.86914,2.43555C130.24707,83.64258,108.1582,112,80,112ZM37.22266,80C42.99512,86.54346,60.249,104,80,104s37.00391-17.45508,42.77734-24C117.00391,73.45508,99.751,56,80,56S42.99609,73.45508,37.22266,80Z"/></g><g class="cls-2"><circle cx="80" cy="80" r="18"/></g><rect class="cls-3" x="22" y="11" width="116" height="93"/><rect class="cls-1" x="22" y="101" width="116" height="4"/></g></svg> +\ No newline at end of file +diff --git a/polkit-agent/assets/biowaiting/iris9.svg b/polkit-agent/assets/biowaiting/iris9.svg +new file mode 100644 +index 0000000..4304442 +--- /dev/null ++++ b/polkit-agent/assets/biowaiting/iris9.svg +@@ -0,0 +1 @@ ++<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 160 160"><defs><style>.cls-1{fill:#3790fa;}.cls-2{opacity:0.2;}.cls-3{fill:url(#未命名的渐变_8);}</style><linearGradient id="未命名的渐变_8" x1="80" y1="115" x2="80" y2="11" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#3790fa"/><stop offset="1" stop-color="#3790fa" stop-opacity="0"/></linearGradient></defs><g id="文字标注"><path class="cls-1" d="M154,52h-8V35a21.0239,21.0239,0,0,0-21-21H108V6h17a29.03307,29.03307,0,0,1,29,29Z"/><path class="cls-1" d="M125,154H108v-8h17a21.02422,21.02422,0,0,0,21-21V108h8v17A29.03339,29.03339,0,0,1,125,154Z"/><path class="cls-1" d="M52,154H35A29.03339,29.03339,0,0,1,6,125V108h8v17a21.02422,21.02422,0,0,0,21,21H52Z"/><path class="cls-1" d="M14,52H6V35A29.03307,29.03307,0,0,1,35,6H52v8H35A21.0239,21.0239,0,0,0,14,35Z"/><g class="cls-2"><path d="M80,112c-28.1582,0-50.24707-28.35742-51.17285-29.56445L26.958,80l1.86914-2.43555C29.75293,76.35742,51.8418,48,80,48s50.24707,28.35742,51.17285,29.56445L133.042,80l-1.86914,2.43555C130.24707,83.64258,108.1582,112,80,112ZM37.22266,80C42.99512,86.54346,60.249,104,80,104s37.00391-17.45508,42.77734-24C117.00391,73.45508,99.751,56,80,56S42.99609,73.45508,37.22266,80Z"/></g><g class="cls-2"><circle cx="80" cy="80" r="18"/></g><rect class="cls-3" x="22" y="11" width="116" height="104"/><rect class="cls-1" x="22" y="112" width="116" height="4"/></g></svg> +\ No newline at end of file +diff --git a/polkit-agent/assets/biowaiting/voiceprint0.svg b/polkit-agent/assets/biowaiting/voiceprint0.svg +new file mode 100644 +index 0000000..73e5a92 +--- /dev/null ++++ b/polkit-agent/assets/biowaiting/voiceprint0.svg +@@ -0,0 +1 @@ ++<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="160" height="160" viewBox="0 0 160 160"><defs><clipPath id="master_svg0_137_7562"><rect x="0" y="0" width="160" height="160" rx="0"/></clipPath></defs><g clip-path="url(#master_svg0_137_7562)"><g><g><g><path d="M39.1124,148.054703125C38.3444,148.057703125,37.5922,147.836703125,36.9481,147.418703125C13.901,132.702703125,-0.0330976,107.240403125,0.0000590405,79.902203125C0.0332156,52.564003125,14.029,27.135703125,37.1117,12.475633125C38.975,11.285731125,41.4504,11.831117025,42.6407,13.693793125C43.831,15.556463125,43.2855,18.031063125,41.4222,19.220963125C20.6552,32.425603124999995,8.06623,55.312603125,8.03676,79.916303125C8.00729,104.520003125,20.5414,127.436703125,41.2767,140.691703125C42.7693,141.651703125,43.4507,143.479703125,42.9503,145.182703125C42.4499,146.884703125,40.8874,148.054703125,39.1124,148.054703125C39.1124,148.054703125,39.1124,148.054703125,39.1124,148.054703125Z" fill="#FFFFFF" fill-opacity="0.6000000238418579"/></g></g><g><path d="M54.426225703125,155.8C62.681345703125004,158.59,71.33814570312501,160.009,80.052345703125,160C111.653345703125,159.969,140.27674570312502,141.35,153.106345703125,112.48C165.936345703125,83.6103,160.569345703125,49.8964,139.409045703125,26.4337C118.248745703125,2.97097,85.25804570312499,-5.84615,55.208285703125,3.93015C53.103925703125,4.61296,51.951713703125,6.87185,52.634750703125,8.97552C53.317795703125,11.0792,55.577425703125,12.231,57.681785703125,11.5482C74.305345703125,6.12797,91.821545703125,7.05037,107.241245703125,13.3413C104.384245703125,18.2636,102.508145703125,24.9989,100.931645703125,30.675C100.222345703125,33.2932,99.604045703125,35.4568,99.022045703125,36.9295C97.858045703125,40.1658,91.747045703125,41.8567,86.290745703125,43.3475C83.87184570312499,44.0203,81.507445703125,44.6748,79.43404570312501,45.4566C76.981445703125,46.4019,75.100245703125,48.4228,74.333145703125,50.9362C73.566045703125,53.4496,73.998445703125,56.1761,75.505545703125,58.3291C77.248545703125,61.0296,79.239545703125,63.5617,81.452845703125,65.8926C81.64074570312499,66.1836,81.724145703125,66.5298,81.689345703125,66.8744C81.69724570312499,67.3998,81.501745703125,67.9079,81.143745703125,68.2925C78.030645703125,70.5412,75.901445703125,73.9,75.196345703125,77.6742C74.915645703125,79.7922,75.580745703125,81.9265,77.015145703125,83.5104C77.480045703125,84.0259,78.005145703125,84.4837,78.579245703125,84.874C77.672745703125,85.892,76.941445703125,87.0532,76.414945703125,88.3103C74.619145703125,92.3514,75.88354570312501,97.0974,79.452245703125,99.7101C80.798145703125,100.765,80.961845703125,101.31,80.961845703125,101.31C80.461645703125,102.431,79.772645703125,103.458,78.924845703125,104.346L78.921645703125,104.35C76.847845703125,106.914,73.378945703125,111.203,75.905745703125,116.419C80.543545703125,125.928,95.439045703125,123.31,107.406445703125,121.201C110.573145703125,120.664,113.766745703125,120.3,116.973045703125,120.11C118.773645703125,122.492,112.789945703125,137.655,105.223945703125,145.237C104.505245703125,145.97,104.121245703125,146.909,104.071845703125,147.862C89.216745703125,153.122,72.674945703125,153.508,56.990645703125,148.218C54.896325703125,147.51,52.624489703125,148.634,51.916344703125,150.727C51.208198703125,152.821,52.331908703125,155.092,54.426225703125,155.8ZM118.214745703125,141.04C125.744545703125,136.334,132.481545703125,130.184,137.979745703125,122.731C156.564345703125,97.5395,156.73734570312502,63.2309,138.408945703125,37.8528C131.961945703125,28.926,123.745345703125,21.8237,114.506145703125,16.7893C112.015545703125,20.7283,110.012045703125,27.868,108.55224570312501,32.8205C107.751945703125,35.6931,107.042645703125,38.184,106.387945703125,39.8567C103.659845703125,46.802,95.47544570312499,49.0565,88.200445703125,51.0565C86.036145703125,51.6565,83.908245703125,52.2383,82.05304570312501,52.8746L81.834845703125,53.6928C83.269445703125,55.936,84.90064570312501,58.0473,86.709045703125,60.0018C88.579145703125,61.8519,89.571445703125,64.4113,89.437145703125,67.038C89.380645703125,69.8333,88.145345703125,72.4746,86.036145703125,74.3106C83.380745703125,76.5287,82.944245703125,77.9469,82.889745703125,78.5105C84.961245703125,79.2751,87.13984570312499,79.7107,89.34624570312499,79.8014C90.336245703125,79.7545,91.328445703125,79.7971,92.310845703125,79.9287C94.381045703125,80.2054,95.890145703125,82.0273,95.775845703125,84.1122C95.661645703125,86.197,93.962445703125,87.8433,91.874345703125,87.8922L89.309845703125,87.8922C86.925045703125,87.9384,84.74394570312501,89.2466,83.580845703125,91.3285C83.192945703125,92.0487,83.441545703125,92.9464,84.14464570312501,93.3648C86.572445703125,94.9684,88.220545703125,97.5122,88.691545703125,100.383C89.128045703125,104.183,86.87274570312499,107.055,84.926745703125,109.364C83.326245703125,111.31,82.616845703125,112.346,82.889745703125,112.874C84.872145703125,116.964,98.494545703125,114.583,105.80594570312499,113.292C109.114045703125,112.596,112.470145703125,112.152,115.845445703125,111.964C119.436245703125,111.744,122.778145703125,113.803,124.193545703125,117.11C126.866245703125,123.257,122.894845703125,133.21,118.214745703125,141.04Z" fill-rule="evenodd" fill="#FFFFFF" fill-opacity="0.6000000238418579"/></g></g><g><g><rect x="63" y="70" width="8" height="20" rx="4" fill="#3790FA" fill-opacity="1"/></g><g><rect x="15" y="70" width="8" height="20" rx="4" fill="#3790FA" fill-opacity="1"/></g><g><rect x="51" y="60" width="8" height="40" rx="4" fill="#3790FA" fill-opacity="1"/></g><g><rect x="27" y="60" width="8" height="40" rx="4" fill="#3790FA" fill-opacity="1"/></g><g><rect x="39" y="50" width="8" height="60" rx="4" fill="#3790FA" fill-opacity="1"/></g></g></g></svg> +\ No newline at end of file +diff --git a/polkit-agent/assets/biowaiting/voiceprint1.svg b/polkit-agent/assets/biowaiting/voiceprint1.svg +new file mode 100644 +index 0000000..083798e +--- /dev/null ++++ b/polkit-agent/assets/biowaiting/voiceprint1.svg +@@ -0,0 +1 @@ ++<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="160" height="160" viewBox="0 0 160 160"><defs><clipPath id="master_svg0_137_7581"><rect x="0" y="0" width="160" height="160" rx="0"/></clipPath></defs><g clip-path="url(#master_svg0_137_7581)"><g><g><rect x="63" y="68" width="8" height="24" rx="4" fill="#3790FA" fill-opacity="1"/></g><g><rect x="15" y="68" width="8" height="24" rx="4" fill="#3790FA" fill-opacity="1"/></g><g><rect x="51" y="65" width="8" height="30" rx="4" fill="#3790FA" fill-opacity="1"/></g><g><rect x="27" y="65" width="8" height="30" rx="4" fill="#3790FA" fill-opacity="1"/></g><g><rect x="39" y="56" width="8" height="48" rx="4" fill="#3790FA" fill-opacity="1"/></g></g><g><g><g><path d="M39.1124,148.054703125C38.3444,148.057703125,37.5922,147.836703125,36.9481,147.418703125C13.901,132.702703125,-0.0330976,107.240403125,0.0000590405,79.902203125C0.0332156,52.564003125,14.029,27.135703125,37.1117,12.475633125C38.975,11.285731125,41.4504,11.831117025,42.6407,13.693793125C43.831,15.556463125,43.2855,18.031063125,41.4222,19.220963125C20.6552,32.425603124999995,8.06623,55.312603125,8.03676,79.916303125C8.00729,104.520003125,20.5414,127.436703125,41.2767,140.691703125C42.7693,141.651703125,43.4507,143.479703125,42.9503,145.182703125C42.4499,146.884703125,40.8874,148.054703125,39.1124,148.054703125C39.1124,148.054703125,39.1124,148.054703125,39.1124,148.054703125Z" fill="#FFFFFF" fill-opacity="0.6000000238418579"/></g></g><g><path d="M54.426225703125,155.8C62.681345703125004,158.59,71.33814570312501,160.009,80.052345703125,160C111.653345703125,159.969,140.27674570312502,141.35,153.106345703125,112.48C165.936345703125,83.6103,160.569345703125,49.8964,139.409045703125,26.4337C118.248745703125,2.97097,85.25804570312499,-5.84615,55.208285703125,3.93015C53.103925703125,4.61296,51.951713703125,6.87185,52.634750703125,8.97552C53.317795703125,11.0792,55.577425703125,12.231,57.681785703125,11.5482C74.305345703125,6.12797,91.821545703125,7.05037,107.241245703125,13.3413C104.384245703125,18.2636,102.508145703125,24.9989,100.931645703125,30.675C100.222345703125,33.2932,99.604045703125,35.4568,99.022045703125,36.9295C97.858045703125,40.1658,91.747045703125,41.8567,86.290745703125,43.3475C83.87184570312499,44.0203,81.507445703125,44.6748,79.43404570312501,45.4566C76.981445703125,46.4019,75.100245703125,48.4228,74.333145703125,50.9362C73.566045703125,53.4496,73.998445703125,56.1761,75.505545703125,58.3291C77.248545703125,61.0296,79.239545703125,63.5617,81.452845703125,65.8926C81.64074570312499,66.1836,81.724145703125,66.5298,81.689345703125,66.8744C81.69724570312499,67.3998,81.501745703125,67.9079,81.143745703125,68.2925C78.030645703125,70.5412,75.901445703125,73.9,75.196345703125,77.6742C74.915645703125,79.7922,75.580745703125,81.9265,77.015145703125,83.5104C77.480045703125,84.0259,78.005145703125,84.4837,78.579245703125,84.874C77.672745703125,85.892,76.941445703125,87.0532,76.414945703125,88.3103C74.619145703125,92.3514,75.88354570312501,97.0974,79.452245703125,99.7101C80.798145703125,100.765,80.961845703125,101.31,80.961845703125,101.31C80.461645703125,102.431,79.772645703125,103.458,78.924845703125,104.346L78.921645703125,104.35C76.847845703125,106.914,73.378945703125,111.203,75.905745703125,116.419C80.543545703125,125.928,95.439045703125,123.31,107.406445703125,121.201C110.573145703125,120.664,113.766745703125,120.3,116.973045703125,120.11C118.773645703125,122.492,112.789945703125,137.655,105.223945703125,145.237C104.505245703125,145.97,104.121245703125,146.909,104.071845703125,147.862C89.216745703125,153.122,72.674945703125,153.508,56.990645703125,148.218C54.896325703125,147.51,52.624489703125,148.634,51.916344703125,150.727C51.208198703125,152.821,52.331908703125,155.092,54.426225703125,155.8ZM118.214745703125,141.04C125.744545703125,136.334,132.481545703125,130.184,137.979745703125,122.731C156.564345703125,97.5395,156.73734570312502,63.2309,138.408945703125,37.8528C131.961945703125,28.926,123.745345703125,21.8237,114.506145703125,16.7893C112.015545703125,20.7283,110.012045703125,27.868,108.55224570312501,32.8205C107.751945703125,35.6931,107.042645703125,38.184,106.387945703125,39.8567C103.659845703125,46.802,95.47544570312499,49.0565,88.200445703125,51.0565C86.036145703125,51.6565,83.908245703125,52.2383,82.05304570312501,52.8746L81.834845703125,53.6928C83.269445703125,55.936,84.90064570312501,58.0473,86.709045703125,60.0018C88.579145703125,61.8519,89.571445703125,64.4113,89.437145703125,67.038C89.380645703125,69.8333,88.145345703125,72.4746,86.036145703125,74.3106C83.380745703125,76.5287,82.944245703125,77.9469,82.889745703125,78.5105C84.961245703125,79.2751,87.13984570312499,79.7107,89.34624570312499,79.8014C90.336245703125,79.7545,91.328445703125,79.7971,92.310845703125,79.9287C94.381045703125,80.2054,95.890145703125,82.0273,95.775845703125,84.1122C95.661645703125,86.197,93.962445703125,87.8433,91.874345703125,87.8922L89.309845703125,87.8922C86.925045703125,87.9384,84.74394570312501,89.2466,83.580845703125,91.3285C83.192945703125,92.0487,83.441545703125,92.9464,84.14464570312501,93.3648C86.572445703125,94.9684,88.220545703125,97.5122,88.691545703125,100.383C89.128045703125,104.183,86.87274570312499,107.055,84.926745703125,109.364C83.326245703125,111.31,82.616845703125,112.346,82.889745703125,112.874C84.872145703125,116.964,98.494545703125,114.583,105.80594570312499,113.292C109.114045703125,112.596,112.470145703125,112.152,115.845445703125,111.964C119.436245703125,111.744,122.778145703125,113.803,124.193545703125,117.11C126.866245703125,123.257,122.894845703125,133.21,118.214745703125,141.04Z" fill-rule="evenodd" fill="#FFFFFF" fill-opacity="0.6000000238418579"/></g></g></g></svg> +\ No newline at end of file +diff --git a/polkit-agent/assets/biowaiting/voiceprint2.svg b/polkit-agent/assets/biowaiting/voiceprint2.svg +new file mode 100644 +index 0000000..16883e1 +--- /dev/null ++++ b/polkit-agent/assets/biowaiting/voiceprint2.svg +@@ -0,0 +1 @@ ++<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="160" height="160" viewBox="0 0 160 160"><defs><clipPath id="master_svg0_137_7619"><rect x="0" y="0" width="160" height="160" rx="0"/></clipPath></defs><g clip-path="url(#master_svg0_137_7619)"><g><g><rect x="63" y="65" width="8" height="30" rx="4" fill="#3790FA" fill-opacity="1"/></g><g><rect x="15" y="65" width="8" height="30" rx="4" fill="#3790FA" fill-opacity="1"/></g><g><rect x="51" y="68" width="8" height="24" rx="4" fill="#3790FA" fill-opacity="1"/></g><g><rect x="27" y="68" width="8" height="24" rx="4" fill="#3790FA" fill-opacity="1"/></g><g><rect x="39" y="62" width="8" height="36" rx="4" fill="#3790FA" fill-opacity="1"/></g></g><g><g><g><path d="M39.1124,148.054703125C38.3444,148.057703125,37.5922,147.836703125,36.9481,147.418703125C13.901,132.702703125,-0.0330976,107.240403125,0.0000590405,79.902203125C0.0332156,52.564003125,14.029,27.135703125,37.1117,12.475633125C38.975,11.285731125,41.4504,11.831117025,42.6407,13.693793125C43.831,15.556463125,43.2855,18.031063125,41.4222,19.220963125C20.6552,32.425603124999995,8.06623,55.312603125,8.03676,79.916303125C8.00729,104.520003125,20.5414,127.436703125,41.2767,140.691703125C42.7693,141.651703125,43.4507,143.479703125,42.9503,145.182703125C42.4499,146.884703125,40.8874,148.054703125,39.1124,148.054703125C39.1124,148.054703125,39.1124,148.054703125,39.1124,148.054703125Z" fill="#FFFFFF" fill-opacity="0.6000000238418579"/></g></g><g><path d="M54.426225703125,155.8C62.681345703125004,158.59,71.33814570312501,160.009,80.052345703125,160C111.653345703125,159.969,140.27674570312502,141.35,153.106345703125,112.48C165.936345703125,83.6103,160.569345703125,49.8964,139.409045703125,26.4337C118.248745703125,2.97097,85.25804570312499,-5.84615,55.208285703125,3.93015C53.103925703125,4.61296,51.951713703125,6.87185,52.634750703125,8.97552C53.317795703125,11.0792,55.577425703125,12.231,57.681785703125,11.5482C74.305345703125,6.12797,91.821545703125,7.05037,107.241245703125,13.3413C104.384245703125,18.2636,102.508145703125,24.9989,100.931645703125,30.675C100.222345703125,33.2932,99.604045703125,35.4568,99.022045703125,36.9295C97.858045703125,40.1658,91.747045703125,41.8567,86.290745703125,43.3475C83.87184570312499,44.0203,81.507445703125,44.6748,79.43404570312501,45.4566C76.981445703125,46.4019,75.100245703125,48.4228,74.333145703125,50.9362C73.566045703125,53.4496,73.998445703125,56.1761,75.505545703125,58.3291C77.248545703125,61.0296,79.239545703125,63.5617,81.452845703125,65.8926C81.64074570312499,66.1836,81.724145703125,66.5298,81.689345703125,66.8744C81.69724570312499,67.3998,81.501745703125,67.9079,81.143745703125,68.2925C78.030645703125,70.5412,75.901445703125,73.9,75.196345703125,77.6742C74.915645703125,79.7922,75.580745703125,81.9265,77.015145703125,83.5104C77.480045703125,84.0259,78.005145703125,84.4837,78.579245703125,84.874C77.672745703125,85.892,76.941445703125,87.0532,76.414945703125,88.3103C74.619145703125,92.3514,75.88354570312501,97.0974,79.452245703125,99.7101C80.798145703125,100.765,80.961845703125,101.31,80.961845703125,101.31C80.461645703125,102.431,79.772645703125,103.458,78.924845703125,104.346L78.921645703125,104.35C76.847845703125,106.914,73.378945703125,111.203,75.905745703125,116.419C80.543545703125,125.928,95.439045703125,123.31,107.406445703125,121.201C110.573145703125,120.664,113.766745703125,120.3,116.973045703125,120.11C118.773645703125,122.492,112.789945703125,137.655,105.223945703125,145.237C104.505245703125,145.97,104.121245703125,146.909,104.071845703125,147.862C89.216745703125,153.122,72.674945703125,153.508,56.990645703125,148.218C54.896325703125,147.51,52.624489703125,148.634,51.916344703125,150.727C51.208198703125,152.821,52.331908703125,155.092,54.426225703125,155.8ZM118.214745703125,141.04C125.744545703125,136.334,132.481545703125,130.184,137.979745703125,122.731C156.564345703125,97.5395,156.73734570312502,63.2309,138.408945703125,37.8528C131.961945703125,28.926,123.745345703125,21.8237,114.506145703125,16.7893C112.015545703125,20.7283,110.012045703125,27.868,108.55224570312501,32.8205C107.751945703125,35.6931,107.042645703125,38.184,106.387945703125,39.8567C103.659845703125,46.802,95.47544570312499,49.0565,88.200445703125,51.0565C86.036145703125,51.6565,83.908245703125,52.2383,82.05304570312501,52.8746L81.834845703125,53.6928C83.269445703125,55.936,84.90064570312501,58.0473,86.709045703125,60.0018C88.579145703125,61.8519,89.571445703125,64.4113,89.437145703125,67.038C89.380645703125,69.8333,88.145345703125,72.4746,86.036145703125,74.3106C83.380745703125,76.5287,82.944245703125,77.9469,82.889745703125,78.5105C84.961245703125,79.2751,87.13984570312499,79.7107,89.34624570312499,79.8014C90.336245703125,79.7545,91.328445703125,79.7971,92.310845703125,79.9287C94.381045703125,80.2054,95.890145703125,82.0273,95.775845703125,84.1122C95.661645703125,86.197,93.962445703125,87.8433,91.874345703125,87.8922L89.309845703125,87.8922C86.925045703125,87.9384,84.74394570312501,89.2466,83.580845703125,91.3285C83.192945703125,92.0487,83.441545703125,92.9464,84.14464570312501,93.3648C86.572445703125,94.9684,88.220545703125,97.5122,88.691545703125,100.383C89.128045703125,104.183,86.87274570312499,107.055,84.926745703125,109.364C83.326245703125,111.31,82.616845703125,112.346,82.889745703125,112.874C84.872145703125,116.964,98.494545703125,114.583,105.80594570312499,113.292C109.114045703125,112.596,112.470145703125,112.152,115.845445703125,111.964C119.436245703125,111.744,122.778145703125,113.803,124.193545703125,117.11C126.866245703125,123.257,122.894845703125,133.21,118.214745703125,141.04Z" fill-rule="evenodd" fill="#FFFFFF" fill-opacity="0.6000000238418579"/></g></g></g></svg> +\ No newline at end of file +diff --git a/polkit-agent/assets/biowaiting/voiceprint3.svg b/polkit-agent/assets/biowaiting/voiceprint3.svg +new file mode 100644 +index 0000000..509ceae +--- /dev/null ++++ b/polkit-agent/assets/biowaiting/voiceprint3.svg +@@ -0,0 +1 @@ ++<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="160" height="160" viewBox="0 0 160 160"><defs><clipPath id="master_svg0_137_7657"><rect x="0" y="0" width="160" height="160" rx="0"/></clipPath></defs><g clip-path="url(#master_svg0_137_7657)"><g><g><rect x="63" y="60" width="8" height="40" rx="4" fill="#3790FA" fill-opacity="1"/></g><g><rect x="15" y="60" width="8" height="40" rx="4" fill="#3790FA" fill-opacity="1"/></g><g><rect x="51" y="72" width="8" height="16" rx="4" fill="#3790FA" fill-opacity="1"/></g><g><rect x="27" y="72" width="8" height="16" rx="4" fill="#3790FA" fill-opacity="1"/></g><g><rect x="39" y="66" width="8" height="28" rx="4" fill="#3790FA" fill-opacity="1"/></g></g><g><g><g><path d="M39.1124,148.054703125C38.3444,148.057703125,37.5922,147.836703125,36.9481,147.418703125C13.901,132.702703125,-0.0330976,107.240403125,0.0000590405,79.902203125C0.0332156,52.564003125,14.029,27.135703125,37.1117,12.475633125C38.975,11.285731125,41.4504,11.831117025,42.6407,13.693793125C43.831,15.556463125,43.2855,18.031063125,41.4222,19.220963125C20.6552,32.425603124999995,8.06623,55.312603125,8.03676,79.916303125C8.00729,104.520003125,20.5414,127.436703125,41.2767,140.691703125C42.7693,141.651703125,43.4507,143.479703125,42.9503,145.182703125C42.4499,146.884703125,40.8874,148.054703125,39.1124,148.054703125C39.1124,148.054703125,39.1124,148.054703125,39.1124,148.054703125Z" fill="#FFFFFF" fill-opacity="0.6000000238418579"/></g></g><g><path d="M54.426225703125,155.8C62.681345703125004,158.59,71.33814570312501,160.009,80.052345703125,160C111.653345703125,159.969,140.27674570312502,141.35,153.106345703125,112.48C165.936345703125,83.6103,160.569345703125,49.8964,139.409045703125,26.4337C118.248745703125,2.97097,85.25804570312499,-5.84615,55.208285703125,3.93015C53.103925703125,4.61296,51.951713703125,6.87185,52.634750703125,8.97552C53.317795703125,11.0792,55.577425703125,12.231,57.681785703125,11.5482C74.305345703125,6.12797,91.821545703125,7.05037,107.241245703125,13.3413C104.384245703125,18.2636,102.508145703125,24.9989,100.931645703125,30.675C100.222345703125,33.2932,99.604045703125,35.4568,99.022045703125,36.9295C97.858045703125,40.1658,91.747045703125,41.8567,86.290745703125,43.3475C83.87184570312499,44.0203,81.507445703125,44.6748,79.43404570312501,45.4566C76.981445703125,46.4019,75.100245703125,48.4228,74.333145703125,50.9362C73.566045703125,53.4496,73.998445703125,56.1761,75.505545703125,58.3291C77.248545703125,61.0296,79.239545703125,63.5617,81.452845703125,65.8926C81.64074570312499,66.1836,81.724145703125,66.5298,81.689345703125,66.8744C81.69724570312499,67.3998,81.501745703125,67.9079,81.143745703125,68.2925C78.030645703125,70.5412,75.901445703125,73.9,75.196345703125,77.6742C74.915645703125,79.7922,75.580745703125,81.9265,77.015145703125,83.5104C77.480045703125,84.0259,78.005145703125,84.4837,78.579245703125,84.874C77.672745703125,85.892,76.941445703125,87.0532,76.414945703125,88.3103C74.619145703125,92.3514,75.88354570312501,97.0974,79.452245703125,99.7101C80.798145703125,100.765,80.961845703125,101.31,80.961845703125,101.31C80.461645703125,102.431,79.772645703125,103.458,78.924845703125,104.346L78.921645703125,104.35C76.847845703125,106.914,73.378945703125,111.203,75.905745703125,116.419C80.543545703125,125.928,95.439045703125,123.31,107.406445703125,121.201C110.573145703125,120.664,113.766745703125,120.3,116.973045703125,120.11C118.773645703125,122.492,112.789945703125,137.655,105.223945703125,145.237C104.505245703125,145.97,104.121245703125,146.909,104.071845703125,147.862C89.216745703125,153.122,72.674945703125,153.508,56.990645703125,148.218C54.896325703125,147.51,52.624489703125,148.634,51.916344703125,150.727C51.208198703125,152.821,52.331908703125,155.092,54.426225703125,155.8ZM118.214745703125,141.04C125.744545703125,136.334,132.481545703125,130.184,137.979745703125,122.731C156.564345703125,97.5395,156.73734570312502,63.2309,138.408945703125,37.8528C131.961945703125,28.926,123.745345703125,21.8237,114.506145703125,16.7893C112.015545703125,20.7283,110.012045703125,27.868,108.55224570312501,32.8205C107.751945703125,35.6931,107.042645703125,38.184,106.387945703125,39.8567C103.659845703125,46.802,95.47544570312499,49.0565,88.200445703125,51.0565C86.036145703125,51.6565,83.908245703125,52.2383,82.05304570312501,52.8746L81.834845703125,53.6928C83.269445703125,55.936,84.90064570312501,58.0473,86.709045703125,60.0018C88.579145703125,61.8519,89.571445703125,64.4113,89.437145703125,67.038C89.380645703125,69.8333,88.145345703125,72.4746,86.036145703125,74.3106C83.380745703125,76.5287,82.944245703125,77.9469,82.889745703125,78.5105C84.961245703125,79.2751,87.13984570312499,79.7107,89.34624570312499,79.8014C90.336245703125,79.7545,91.328445703125,79.7971,92.310845703125,79.9287C94.381045703125,80.2054,95.890145703125,82.0273,95.775845703125,84.1122C95.661645703125,86.197,93.962445703125,87.8433,91.874345703125,87.8922L89.309845703125,87.8922C86.925045703125,87.9384,84.74394570312501,89.2466,83.580845703125,91.3285C83.192945703125,92.0487,83.441545703125,92.9464,84.14464570312501,93.3648C86.572445703125,94.9684,88.220545703125,97.5122,88.691545703125,100.383C89.128045703125,104.183,86.87274570312499,107.055,84.926745703125,109.364C83.326245703125,111.31,82.616845703125,112.346,82.889745703125,112.874C84.872145703125,116.964,98.494545703125,114.583,105.80594570312499,113.292C109.114045703125,112.596,112.470145703125,112.152,115.845445703125,111.964C119.436245703125,111.744,122.778145703125,113.803,124.193545703125,117.11C126.866245703125,123.257,122.894845703125,133.21,118.214745703125,141.04Z" fill-rule="evenodd" fill="#FFFFFF" fill-opacity="0.6000000238418579"/></g></g></g></svg> +\ No newline at end of file +diff --git a/polkit-agent/assets/biowaiting/voiceprint4.svg b/polkit-agent/assets/biowaiting/voiceprint4.svg +new file mode 100644 +index 0000000..5208d79 +--- /dev/null ++++ b/polkit-agent/assets/biowaiting/voiceprint4.svg +@@ -0,0 +1 @@ ++<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="160" height="160" viewBox="0 0 160 160"><defs><clipPath id="master_svg0_137_7695"><rect x="0" y="0" width="160" height="160" rx="0"/></clipPath></defs><g clip-path="url(#master_svg0_137_7695)"><g><g><rect x="63" y="64" width="8" height="32" rx="4" fill="#3790FA" fill-opacity="1"/></g><g><rect x="15" y="64" width="8" height="32" rx="4" fill="#3790FA" fill-opacity="1"/></g><g><rect x="51" y="68" width="8" height="24" rx="4" fill="#3790FA" fill-opacity="1"/></g><g><rect x="27" y="68" width="8" height="24" rx="4" fill="#3790FA" fill-opacity="1"/></g><g><rect x="39" y="72" width="8" height="16" rx="4" fill="#3790FA" fill-opacity="1"/></g></g><g><g><g><path d="M39.1124,148.054703125C38.3444,148.057703125,37.5922,147.836703125,36.9481,147.418703125C13.901,132.702703125,-0.0330976,107.240403125,0.0000590405,79.902203125C0.0332156,52.564003125,14.029,27.135703125,37.1117,12.475633125C38.975,11.285731125,41.4504,11.831117025,42.6407,13.693793125C43.831,15.556463125,43.2855,18.031063125,41.4222,19.220963125C20.6552,32.425603124999995,8.06623,55.312603125,8.03676,79.916303125C8.00729,104.520003125,20.5414,127.436703125,41.2767,140.691703125C42.7693,141.651703125,43.4507,143.479703125,42.9503,145.182703125C42.4499,146.884703125,40.8874,148.054703125,39.1124,148.054703125C39.1124,148.054703125,39.1124,148.054703125,39.1124,148.054703125Z" fill="#FFFFFF" fill-opacity="0.6000000238418579"/></g></g><g><path d="M54.426225703125,155.8C62.681345703125004,158.59,71.33814570312501,160.009,80.052345703125,160C111.653345703125,159.969,140.27674570312502,141.35,153.106345703125,112.48C165.936345703125,83.6103,160.569345703125,49.8964,139.409045703125,26.4337C118.248745703125,2.97097,85.25804570312499,-5.84615,55.208285703125,3.93015C53.103925703125,4.61296,51.951713703125,6.87185,52.634750703125,8.97552C53.317795703125,11.0792,55.577425703125,12.231,57.681785703125,11.5482C74.305345703125,6.12797,91.821545703125,7.05037,107.241245703125,13.3413C104.384245703125,18.2636,102.508145703125,24.9989,100.931645703125,30.675C100.222345703125,33.2932,99.604045703125,35.4568,99.022045703125,36.9295C97.858045703125,40.1658,91.747045703125,41.8567,86.290745703125,43.3475C83.87184570312499,44.0203,81.507445703125,44.6748,79.43404570312501,45.4566C76.981445703125,46.4019,75.100245703125,48.4228,74.333145703125,50.9362C73.566045703125,53.4496,73.998445703125,56.1761,75.505545703125,58.3291C77.248545703125,61.0296,79.239545703125,63.5617,81.452845703125,65.8926C81.64074570312499,66.1836,81.724145703125,66.5298,81.689345703125,66.8744C81.69724570312499,67.3998,81.501745703125,67.9079,81.143745703125,68.2925C78.030645703125,70.5412,75.901445703125,73.9,75.196345703125,77.6742C74.915645703125,79.7922,75.580745703125,81.9265,77.015145703125,83.5104C77.480045703125,84.0259,78.005145703125,84.4837,78.579245703125,84.874C77.672745703125,85.892,76.941445703125,87.0532,76.414945703125,88.3103C74.619145703125,92.3514,75.88354570312501,97.0974,79.452245703125,99.7101C80.798145703125,100.765,80.961845703125,101.31,80.961845703125,101.31C80.461645703125,102.431,79.772645703125,103.458,78.924845703125,104.346L78.921645703125,104.35C76.847845703125,106.914,73.378945703125,111.203,75.905745703125,116.419C80.543545703125,125.928,95.439045703125,123.31,107.406445703125,121.201C110.573145703125,120.664,113.766745703125,120.3,116.973045703125,120.11C118.773645703125,122.492,112.789945703125,137.655,105.223945703125,145.237C104.505245703125,145.97,104.121245703125,146.909,104.071845703125,147.862C89.216745703125,153.122,72.674945703125,153.508,56.990645703125,148.218C54.896325703125,147.51,52.624489703125,148.634,51.916344703125,150.727C51.208198703125,152.821,52.331908703125,155.092,54.426225703125,155.8ZM118.214745703125,141.04C125.744545703125,136.334,132.481545703125,130.184,137.979745703125,122.731C156.564345703125,97.5395,156.73734570312502,63.2309,138.408945703125,37.8528C131.961945703125,28.926,123.745345703125,21.8237,114.506145703125,16.7893C112.015545703125,20.7283,110.012045703125,27.868,108.55224570312501,32.8205C107.751945703125,35.6931,107.042645703125,38.184,106.387945703125,39.8567C103.659845703125,46.802,95.47544570312499,49.0565,88.200445703125,51.0565C86.036145703125,51.6565,83.908245703125,52.2383,82.05304570312501,52.8746L81.834845703125,53.6928C83.269445703125,55.936,84.90064570312501,58.0473,86.709045703125,60.0018C88.579145703125,61.8519,89.571445703125,64.4113,89.437145703125,67.038C89.380645703125,69.8333,88.145345703125,72.4746,86.036145703125,74.3106C83.380745703125,76.5287,82.944245703125,77.9469,82.889745703125,78.5105C84.961245703125,79.2751,87.13984570312499,79.7107,89.34624570312499,79.8014C90.336245703125,79.7545,91.328445703125,79.7971,92.310845703125,79.9287C94.381045703125,80.2054,95.890145703125,82.0273,95.775845703125,84.1122C95.661645703125,86.197,93.962445703125,87.8433,91.874345703125,87.8922L89.309845703125,87.8922C86.925045703125,87.9384,84.74394570312501,89.2466,83.580845703125,91.3285C83.192945703125,92.0487,83.441545703125,92.9464,84.14464570312501,93.3648C86.572445703125,94.9684,88.220545703125,97.5122,88.691545703125,100.383C89.128045703125,104.183,86.87274570312499,107.055,84.926745703125,109.364C83.326245703125,111.31,82.616845703125,112.346,82.889745703125,112.874C84.872145703125,116.964,98.494545703125,114.583,105.80594570312499,113.292C109.114045703125,112.596,112.470145703125,112.152,115.845445703125,111.964C119.436245703125,111.744,122.778145703125,113.803,124.193545703125,117.11C126.866245703125,123.257,122.894845703125,133.21,118.214745703125,141.04Z" fill-rule="evenodd" fill="#FFFFFF" fill-opacity="0.6000000238418579"/></g></g></g></svg> +\ No newline at end of file +diff --git a/polkit-agent/assets/biowaiting/voiceprint5.svg b/polkit-agent/assets/biowaiting/voiceprint5.svg +new file mode 100644 +index 0000000..19be4b0 +--- /dev/null ++++ b/polkit-agent/assets/biowaiting/voiceprint5.svg +@@ -0,0 +1 @@ ++<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="160" height="160" viewBox="0 0 160 160"><defs><clipPath id="master_svg0_137_7676"><rect x="0" y="0" width="160" height="160" rx="0"/></clipPath></defs><g clip-path="url(#master_svg0_137_7676)"><g><g><rect x="63" y="60" width="8" height="40" rx="4" fill="#3790FA" fill-opacity="1"/></g><g><rect x="15" y="60" width="8" height="40" rx="4" fill="#3790FA" fill-opacity="1"/></g><g><rect x="51" y="72" width="8" height="16" rx="4" fill="#3790FA" fill-opacity="1"/></g><g><rect x="27" y="72" width="8" height="16" rx="4" fill="#3790FA" fill-opacity="1"/></g><g><rect x="39" y="66" width="8" height="28" rx="4" fill="#3790FA" fill-opacity="1"/></g></g><g><g><g><path d="M39.1124,148.054703125C38.3444,148.057703125,37.5922,147.836703125,36.9481,147.418703125C13.901,132.702703125,-0.0330976,107.240403125,0.0000590405,79.902203125C0.0332156,52.564003125,14.029,27.135703125,37.1117,12.475633125C38.975,11.285731125,41.4504,11.831117025,42.6407,13.693793125C43.831,15.556463125,43.2855,18.031063125,41.4222,19.220963125C20.6552,32.425603124999995,8.06623,55.312603125,8.03676,79.916303125C8.00729,104.520003125,20.5414,127.436703125,41.2767,140.691703125C42.7693,141.651703125,43.4507,143.479703125,42.9503,145.182703125C42.4499,146.884703125,40.8874,148.054703125,39.1124,148.054703125C39.1124,148.054703125,39.1124,148.054703125,39.1124,148.054703125Z" fill="#FFFFFF" fill-opacity="0.6000000238418579"/></g></g><g><path d="M54.426225703125,155.8C62.681345703125004,158.59,71.33814570312501,160.009,80.052345703125,160C111.653345703125,159.969,140.27674570312502,141.35,153.106345703125,112.48C165.936345703125,83.6103,160.569345703125,49.8964,139.409045703125,26.4337C118.248745703125,2.97097,85.25804570312499,-5.84615,55.208285703125,3.93015C53.103925703125,4.61296,51.951713703125,6.87185,52.634750703125,8.97552C53.317795703125,11.0792,55.577425703125,12.231,57.681785703125,11.5482C74.305345703125,6.12797,91.821545703125,7.05037,107.241245703125,13.3413C104.384245703125,18.2636,102.508145703125,24.9989,100.931645703125,30.675C100.222345703125,33.2932,99.604045703125,35.4568,99.022045703125,36.9295C97.858045703125,40.1658,91.747045703125,41.8567,86.290745703125,43.3475C83.87184570312499,44.0203,81.507445703125,44.6748,79.43404570312501,45.4566C76.981445703125,46.4019,75.100245703125,48.4228,74.333145703125,50.9362C73.566045703125,53.4496,73.998445703125,56.1761,75.505545703125,58.3291C77.248545703125,61.0296,79.239545703125,63.5617,81.452845703125,65.8926C81.64074570312499,66.1836,81.724145703125,66.5298,81.689345703125,66.8744C81.69724570312499,67.3998,81.501745703125,67.9079,81.143745703125,68.2925C78.030645703125,70.5412,75.901445703125,73.9,75.196345703125,77.6742C74.915645703125,79.7922,75.580745703125,81.9265,77.015145703125,83.5104C77.480045703125,84.0259,78.005145703125,84.4837,78.579245703125,84.874C77.672745703125,85.892,76.941445703125,87.0532,76.414945703125,88.3103C74.619145703125,92.3514,75.88354570312501,97.0974,79.452245703125,99.7101C80.798145703125,100.765,80.961845703125,101.31,80.961845703125,101.31C80.461645703125,102.431,79.772645703125,103.458,78.924845703125,104.346L78.921645703125,104.35C76.847845703125,106.914,73.378945703125,111.203,75.905745703125,116.419C80.543545703125,125.928,95.439045703125,123.31,107.406445703125,121.201C110.573145703125,120.664,113.766745703125,120.3,116.973045703125,120.11C118.773645703125,122.492,112.789945703125,137.655,105.223945703125,145.237C104.505245703125,145.97,104.121245703125,146.909,104.071845703125,147.862C89.216745703125,153.122,72.674945703125,153.508,56.990645703125,148.218C54.896325703125,147.51,52.624489703125,148.634,51.916344703125,150.727C51.208198703125,152.821,52.331908703125,155.092,54.426225703125,155.8ZM118.214745703125,141.04C125.744545703125,136.334,132.481545703125,130.184,137.979745703125,122.731C156.564345703125,97.5395,156.73734570312502,63.2309,138.408945703125,37.8528C131.961945703125,28.926,123.745345703125,21.8237,114.506145703125,16.7893C112.015545703125,20.7283,110.012045703125,27.868,108.55224570312501,32.8205C107.751945703125,35.6931,107.042645703125,38.184,106.387945703125,39.8567C103.659845703125,46.802,95.47544570312499,49.0565,88.200445703125,51.0565C86.036145703125,51.6565,83.908245703125,52.2383,82.05304570312501,52.8746L81.834845703125,53.6928C83.269445703125,55.936,84.90064570312501,58.0473,86.709045703125,60.0018C88.579145703125,61.8519,89.571445703125,64.4113,89.437145703125,67.038C89.380645703125,69.8333,88.145345703125,72.4746,86.036145703125,74.3106C83.380745703125,76.5287,82.944245703125,77.9469,82.889745703125,78.5105C84.961245703125,79.2751,87.13984570312499,79.7107,89.34624570312499,79.8014C90.336245703125,79.7545,91.328445703125,79.7971,92.310845703125,79.9287C94.381045703125,80.2054,95.890145703125,82.0273,95.775845703125,84.1122C95.661645703125,86.197,93.962445703125,87.8433,91.874345703125,87.8922L89.309845703125,87.8922C86.925045703125,87.9384,84.74394570312501,89.2466,83.580845703125,91.3285C83.192945703125,92.0487,83.441545703125,92.9464,84.14464570312501,93.3648C86.572445703125,94.9684,88.220545703125,97.5122,88.691545703125,100.383C89.128045703125,104.183,86.87274570312499,107.055,84.926745703125,109.364C83.326245703125,111.31,82.616845703125,112.346,82.889745703125,112.874C84.872145703125,116.964,98.494545703125,114.583,105.80594570312499,113.292C109.114045703125,112.596,112.470145703125,112.152,115.845445703125,111.964C119.436245703125,111.744,122.778145703125,113.803,124.193545703125,117.11C126.866245703125,123.257,122.894845703125,133.21,118.214745703125,141.04Z" fill-rule="evenodd" fill="#FFFFFF" fill-opacity="0.6000000238418579"/></g></g></g></svg> +\ No newline at end of file +diff --git a/polkit-agent/assets/biowaiting/voiceprint6.svg b/polkit-agent/assets/biowaiting/voiceprint6.svg +new file mode 100644 +index 0000000..9304c58 +--- /dev/null ++++ b/polkit-agent/assets/biowaiting/voiceprint6.svg +@@ -0,0 +1 @@ ++<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="160" height="160" viewBox="0 0 160 160"><defs><clipPath id="master_svg0_137_7638"><rect x="0" y="0" width="160" height="160" rx="0"/></clipPath></defs><g clip-path="url(#master_svg0_137_7638)"><g><g><rect x="63" y="65" width="8" height="30" rx="4" fill="#3790FA" fill-opacity="1"/></g><g><rect x="15" y="65" width="8" height="30" rx="4" fill="#3790FA" fill-opacity="1"/></g><g><rect x="51" y="68" width="8" height="24" rx="4" fill="#3790FA" fill-opacity="1"/></g><g><rect x="27" y="68" width="8" height="24" rx="4" fill="#3790FA" fill-opacity="1"/></g><g><rect x="39" y="62" width="8" height="36" rx="4" fill="#3790FA" fill-opacity="1"/></g></g><g><g><g><path d="M39.1124,148.054703125C38.3444,148.057703125,37.5922,147.836703125,36.9481,147.418703125C13.901,132.702703125,-0.0330976,107.240403125,0.0000590405,79.902203125C0.0332156,52.564003125,14.029,27.135703125,37.1117,12.475633125C38.975,11.285731125,41.4504,11.831117025,42.6407,13.693793125C43.831,15.556463125,43.2855,18.031063125,41.4222,19.220963125C20.6552,32.425603124999995,8.06623,55.312603125,8.03676,79.916303125C8.00729,104.520003125,20.5414,127.436703125,41.2767,140.691703125C42.7693,141.651703125,43.4507,143.479703125,42.9503,145.182703125C42.4499,146.884703125,40.8874,148.054703125,39.1124,148.054703125C39.1124,148.054703125,39.1124,148.054703125,39.1124,148.054703125Z" fill="#FFFFFF" fill-opacity="0.6000000238418579"/></g></g><g><path d="M54.426225703125,155.8C62.681345703125004,158.59,71.33814570312501,160.009,80.052345703125,160C111.653345703125,159.969,140.27674570312502,141.35,153.106345703125,112.48C165.936345703125,83.6103,160.569345703125,49.8964,139.409045703125,26.4337C118.248745703125,2.97097,85.25804570312499,-5.84615,55.208285703125,3.93015C53.103925703125,4.61296,51.951713703125,6.87185,52.634750703125,8.97552C53.317795703125,11.0792,55.577425703125,12.231,57.681785703125,11.5482C74.305345703125,6.12797,91.821545703125,7.05037,107.241245703125,13.3413C104.384245703125,18.2636,102.508145703125,24.9989,100.931645703125,30.675C100.222345703125,33.2932,99.604045703125,35.4568,99.022045703125,36.9295C97.858045703125,40.1658,91.747045703125,41.8567,86.290745703125,43.3475C83.87184570312499,44.0203,81.507445703125,44.6748,79.43404570312501,45.4566C76.981445703125,46.4019,75.100245703125,48.4228,74.333145703125,50.9362C73.566045703125,53.4496,73.998445703125,56.1761,75.505545703125,58.3291C77.248545703125,61.0296,79.239545703125,63.5617,81.452845703125,65.8926C81.64074570312499,66.1836,81.724145703125,66.5298,81.689345703125,66.8744C81.69724570312499,67.3998,81.501745703125,67.9079,81.143745703125,68.2925C78.030645703125,70.5412,75.901445703125,73.9,75.196345703125,77.6742C74.915645703125,79.7922,75.580745703125,81.9265,77.015145703125,83.5104C77.480045703125,84.0259,78.005145703125,84.4837,78.579245703125,84.874C77.672745703125,85.892,76.941445703125,87.0532,76.414945703125,88.3103C74.619145703125,92.3514,75.88354570312501,97.0974,79.452245703125,99.7101C80.798145703125,100.765,80.961845703125,101.31,80.961845703125,101.31C80.461645703125,102.431,79.772645703125,103.458,78.924845703125,104.346L78.921645703125,104.35C76.847845703125,106.914,73.378945703125,111.203,75.905745703125,116.419C80.543545703125,125.928,95.439045703125,123.31,107.406445703125,121.201C110.573145703125,120.664,113.766745703125,120.3,116.973045703125,120.11C118.773645703125,122.492,112.789945703125,137.655,105.223945703125,145.237C104.505245703125,145.97,104.121245703125,146.909,104.071845703125,147.862C89.216745703125,153.122,72.674945703125,153.508,56.990645703125,148.218C54.896325703125,147.51,52.624489703125,148.634,51.916344703125,150.727C51.208198703125,152.821,52.331908703125,155.092,54.426225703125,155.8ZM118.214745703125,141.04C125.744545703125,136.334,132.481545703125,130.184,137.979745703125,122.731C156.564345703125,97.5395,156.73734570312502,63.2309,138.408945703125,37.8528C131.961945703125,28.926,123.745345703125,21.8237,114.506145703125,16.7893C112.015545703125,20.7283,110.012045703125,27.868,108.55224570312501,32.8205C107.751945703125,35.6931,107.042645703125,38.184,106.387945703125,39.8567C103.659845703125,46.802,95.47544570312499,49.0565,88.200445703125,51.0565C86.036145703125,51.6565,83.908245703125,52.2383,82.05304570312501,52.8746L81.834845703125,53.6928C83.269445703125,55.936,84.90064570312501,58.0473,86.709045703125,60.0018C88.579145703125,61.8519,89.571445703125,64.4113,89.437145703125,67.038C89.380645703125,69.8333,88.145345703125,72.4746,86.036145703125,74.3106C83.380745703125,76.5287,82.944245703125,77.9469,82.889745703125,78.5105C84.961245703125,79.2751,87.13984570312499,79.7107,89.34624570312499,79.8014C90.336245703125,79.7545,91.328445703125,79.7971,92.310845703125,79.9287C94.381045703125,80.2054,95.890145703125,82.0273,95.775845703125,84.1122C95.661645703125,86.197,93.962445703125,87.8433,91.874345703125,87.8922L89.309845703125,87.8922C86.925045703125,87.9384,84.74394570312501,89.2466,83.580845703125,91.3285C83.192945703125,92.0487,83.441545703125,92.9464,84.14464570312501,93.3648C86.572445703125,94.9684,88.220545703125,97.5122,88.691545703125,100.383C89.128045703125,104.183,86.87274570312499,107.055,84.926745703125,109.364C83.326245703125,111.31,82.616845703125,112.346,82.889745703125,112.874C84.872145703125,116.964,98.494545703125,114.583,105.80594570312499,113.292C109.114045703125,112.596,112.470145703125,112.152,115.845445703125,111.964C119.436245703125,111.744,122.778145703125,113.803,124.193545703125,117.11C126.866245703125,123.257,122.894845703125,133.21,118.214745703125,141.04Z" fill-rule="evenodd" fill="#FFFFFF" fill-opacity="0.6000000238418579"/></g></g></g></svg> +\ No newline at end of file +diff --git a/polkit-agent/assets/biowaiting/voiceprint7.svg b/polkit-agent/assets/biowaiting/voiceprint7.svg +new file mode 100644 +index 0000000..dc96601 +--- /dev/null ++++ b/polkit-agent/assets/biowaiting/voiceprint7.svg +@@ -0,0 +1 @@ ++<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="160" height="160" viewBox="0 0 160 160"><defs><clipPath id="master_svg0_137_7600"><rect x="0" y="0" width="160" height="160" rx="0"/></clipPath></defs><g clip-path="url(#master_svg0_137_7600)"><g><g><rect x="63" y="68" width="8" height="24" rx="4" fill="#3790FA" fill-opacity="1"/></g><g><rect x="15" y="68" width="8" height="24" rx="4" fill="#3790FA" fill-opacity="1"/></g><g><rect x="51" y="65" width="8" height="30" rx="4" fill="#3790FA" fill-opacity="1"/></g><g><rect x="27" y="65" width="8" height="30" rx="4" fill="#3790FA" fill-opacity="1"/></g><g><rect x="39" y="56" width="8" height="48" rx="4" fill="#3790FA" fill-opacity="1"/></g></g><g><g><g><path d="M39.1124,148.054703125C38.3444,148.057703125,37.5922,147.836703125,36.9481,147.418703125C13.901,132.702703125,-0.0330976,107.240403125,0.0000590405,79.902203125C0.0332156,52.564003125,14.029,27.135703125,37.1117,12.475633125C38.975,11.285731125,41.4504,11.831117025,42.6407,13.693793125C43.831,15.556463125,43.2855,18.031063125,41.4222,19.220963125C20.6552,32.425603124999995,8.06623,55.312603125,8.03676,79.916303125C8.00729,104.520003125,20.5414,127.436703125,41.2767,140.691703125C42.7693,141.651703125,43.4507,143.479703125,42.9503,145.182703125C42.4499,146.884703125,40.8874,148.054703125,39.1124,148.054703125C39.1124,148.054703125,39.1124,148.054703125,39.1124,148.054703125Z" fill="#FFFFFF" fill-opacity="0.6000000238418579"/></g></g><g><path d="M54.426225703125,155.8C62.681345703125004,158.59,71.33814570312501,160.009,80.052345703125,160C111.653345703125,159.969,140.27674570312502,141.35,153.106345703125,112.48C165.936345703125,83.6103,160.569345703125,49.8964,139.409045703125,26.4337C118.248745703125,2.97097,85.25804570312499,-5.84615,55.208285703125,3.93015C53.103925703125,4.61296,51.951713703125,6.87185,52.634750703125,8.97552C53.317795703125,11.0792,55.577425703125,12.231,57.681785703125,11.5482C74.305345703125,6.12797,91.821545703125,7.05037,107.241245703125,13.3413C104.384245703125,18.2636,102.508145703125,24.9989,100.931645703125,30.675C100.222345703125,33.2932,99.604045703125,35.4568,99.022045703125,36.9295C97.858045703125,40.1658,91.747045703125,41.8567,86.290745703125,43.3475C83.87184570312499,44.0203,81.507445703125,44.6748,79.43404570312501,45.4566C76.981445703125,46.4019,75.100245703125,48.4228,74.333145703125,50.9362C73.566045703125,53.4496,73.998445703125,56.1761,75.505545703125,58.3291C77.248545703125,61.0296,79.239545703125,63.5617,81.452845703125,65.8926C81.64074570312499,66.1836,81.724145703125,66.5298,81.689345703125,66.8744C81.69724570312499,67.3998,81.501745703125,67.9079,81.143745703125,68.2925C78.030645703125,70.5412,75.901445703125,73.9,75.196345703125,77.6742C74.915645703125,79.7922,75.580745703125,81.9265,77.015145703125,83.5104C77.480045703125,84.0259,78.005145703125,84.4837,78.579245703125,84.874C77.672745703125,85.892,76.941445703125,87.0532,76.414945703125,88.3103C74.619145703125,92.3514,75.88354570312501,97.0974,79.452245703125,99.7101C80.798145703125,100.765,80.961845703125,101.31,80.961845703125,101.31C80.461645703125,102.431,79.772645703125,103.458,78.924845703125,104.346L78.921645703125,104.35C76.847845703125,106.914,73.378945703125,111.203,75.905745703125,116.419C80.543545703125,125.928,95.439045703125,123.31,107.406445703125,121.201C110.573145703125,120.664,113.766745703125,120.3,116.973045703125,120.11C118.773645703125,122.492,112.789945703125,137.655,105.223945703125,145.237C104.505245703125,145.97,104.121245703125,146.909,104.071845703125,147.862C89.216745703125,153.122,72.674945703125,153.508,56.990645703125,148.218C54.896325703125,147.51,52.624489703125,148.634,51.916344703125,150.727C51.208198703125,152.821,52.331908703125,155.092,54.426225703125,155.8ZM118.214745703125,141.04C125.744545703125,136.334,132.481545703125,130.184,137.979745703125,122.731C156.564345703125,97.5395,156.73734570312502,63.2309,138.408945703125,37.8528C131.961945703125,28.926,123.745345703125,21.8237,114.506145703125,16.7893C112.015545703125,20.7283,110.012045703125,27.868,108.55224570312501,32.8205C107.751945703125,35.6931,107.042645703125,38.184,106.387945703125,39.8567C103.659845703125,46.802,95.47544570312499,49.0565,88.200445703125,51.0565C86.036145703125,51.6565,83.908245703125,52.2383,82.05304570312501,52.8746L81.834845703125,53.6928C83.269445703125,55.936,84.90064570312501,58.0473,86.709045703125,60.0018C88.579145703125,61.8519,89.571445703125,64.4113,89.437145703125,67.038C89.380645703125,69.8333,88.145345703125,72.4746,86.036145703125,74.3106C83.380745703125,76.5287,82.944245703125,77.9469,82.889745703125,78.5105C84.961245703125,79.2751,87.13984570312499,79.7107,89.34624570312499,79.8014C90.336245703125,79.7545,91.328445703125,79.7971,92.310845703125,79.9287C94.381045703125,80.2054,95.890145703125,82.0273,95.775845703125,84.1122C95.661645703125,86.197,93.962445703125,87.8433,91.874345703125,87.8922L89.309845703125,87.8922C86.925045703125,87.9384,84.74394570312501,89.2466,83.580845703125,91.3285C83.192945703125,92.0487,83.441545703125,92.9464,84.14464570312501,93.3648C86.572445703125,94.9684,88.220545703125,97.5122,88.691545703125,100.383C89.128045703125,104.183,86.87274570312499,107.055,84.926745703125,109.364C83.326245703125,111.31,82.616845703125,112.346,82.889745703125,112.874C84.872145703125,116.964,98.494545703125,114.583,105.80594570312499,113.292C109.114045703125,112.596,112.470145703125,112.152,115.845445703125,111.964C119.436245703125,111.744,122.778145703125,113.803,124.193545703125,117.11C126.866245703125,123.257,122.894845703125,133.21,118.214745703125,141.04Z" fill-rule="evenodd" fill="#FFFFFF" fill-opacity="0.6000000238418579"/></g></g></g></svg> +\ No newline at end of file +diff --git a/polkit-agent/i18n_ts/bo.ts b/polkit-agent/i18n_ts/bo.ts +index 50e8ba8..bc85390 100644 +--- a/polkit-agent/i18n_ts/bo.ts ++++ b/polkit-agent/i18n_ts/bo.ts +@@ -1,6 +1,15 @@ + <?xml version="1.0" encoding="utf-8"?> + <!DOCTYPE TS> + <TS version="2.1"> ++<context> ++ <name>FullScreenBackground</name> ++ <message> ++ <location filename="../src/fullscreenbackground.cpp" line="75"/> ++ <location filename="../src/fullscreenbackground.cpp" line="104"/> ++ <source>Authentication</source> ++ <translation type="unfinished"></translation> ++ </message> ++</context> + <context> + <name>MainWindow</name> + <message> +@@ -9,205 +18,210 @@ + <translation type="unfinished"></translation> + </message> + <message> +- <location filename="../src/mainwindow.ui" line="409"/> +- <location filename="../src/mainwindow.cpp" line="1075"/> +- <location filename="../src/mainwindow.cpp" line="1143"/> ++ <location filename="../src/mainwindow.ui" line="398"/> ++ <location filename="../src/mainwindow.cpp" line="874"/> ++ <location filename="../src/mainwindow.cpp" line="943"/> + <source>Biometric</source> + <translation type="unfinished"></translation> + </message> + <message> +- <location filename="../src/mainwindow.ui" line="480"/> ++ <location filename="../src/mainwindow.ui" line="493"/> + <source>use password</source> + <translation type="unfinished"></translation> + </message> + <message> +- <location filename="../src/mainwindow.ui" line="441"/> +- <location filename="../src/mainwindow.cpp" line="1077"/> ++ <location filename="../src/mainwindow.ui" line="436"/> ++ <location filename="../src/mainwindow.cpp" line="875"/> + <source>Cancel</source> + <translation type="unfinished"></translation> + </message> + <message> +- <location filename="../src/mainwindow.ui" line="460"/> +- <location filename="../src/mainwindow.cpp" line="1073"/> ++ <location filename="../src/mainwindow.ui" line="461"/> ++ <location filename="../src/mainwindow.cpp" line="873"/> + <source>Authenticate</source> + <translation type="unfinished"></translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="66"/> +- <source>Authentication</source> ++ <location filename="../src/mainwindow.cpp" line="85"/> ++ <source>Insert the ukey into the USB port</source> + <translation type="unfinished"></translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="105"/> +- <source>Insert the ukey into the USB port</source> ++ <location filename="../src/mainwindow.cpp" line="87"/> ++ <source>Enter the ukey password</source> + <translation type="unfinished"></translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="107"/> +- <source>Enter the ukey password</source> ++ <location filename="../src/mainwindow.cpp" line="93"/> ++ <source>Close</source> + <translation type="unfinished"></translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="226"/> +- <location filename="../src/mainwindow.cpp" line="1415"/> +- <location filename="../src/mainwindow.cpp" line="1417"/> ++ <location filename="../src/mainwindow.cpp" line="1243"/> ++ <location filename="../src/mainwindow.cpp" line="1246"/> ++ <location filename="../src/mainwindow.cpp" line="1539"/> + <source>Failed to verify %1, please enter password to unlock</source> + <translation type="unfinished"></translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="231"/> +- <location filename="../src/mainwindow.cpp" line="233"/> +- <location filename="../src/mainwindow.cpp" line="1419"/> ++ <location filename="../src/mainwindow.cpp" line="1249"/> ++ <location filename="../src/mainwindow.cpp" line="1545"/> ++ <location filename="../src/mainwindow.cpp" line="1548"/> + <source>Unable to verify %1, please enter password to unlock</source> + <translation type="unfinished"></translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="242"/> +- <location filename="../src/mainwindow.cpp" line="246"/> +- <source>Failed to verify %1, you still have %2 verification opportunities</source> ++ <location filename="../src/mainwindow.cpp" line="1261"/> ++ <source>Facial recognition to authorization</source> + <translation type="unfinished"></translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="335"/> +- <source>Please enter your password or enroll your fingerprint </source> ++ <location filename="../src/mainwindow.cpp" line="1264"/> ++ <source>Fingerprint recognition to authorization</source> + <translation type="unfinished"></translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="665"/> +- <source>This operation requires the administrator's authorization. Please enter your password to allow this operation.</source> ++ <location filename="../src/mainwindow.cpp" line="1267"/> ++ <source>Voiceprint recognition to authorization</source> + <translation type="unfinished"></translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="671"/> +- <source>A program is attempting to perform an action that requires privileges.It requires authorization to perform the action.</source> ++ <location filename="../src/mainwindow.cpp" line="1270"/> ++ <source>Finger veins recognition to authorization</source> + <translation type="unfinished"></translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="731"/> +- <source>Password: </source> ++ <location filename="../src/mainwindow.cpp" line="1273"/> ++ <source>Iris recognition to authorization</source> + <translation type="unfinished"></translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="733"/> +- <source>_Password: </source> ++ <location filename="../src/mainwindow.cpp" line="1276"/> ++ <source>Use the bound wechat scanning code to authorization</source> + <translation type="unfinished"></translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="735"/> +- <source>_Password:</source> ++ <location filename="../src/mainwindow.cpp" line="1558"/> ++ <location filename="../src/mainwindow.cpp" line="1562"/> ++ <source>Failed to verify %1, you still have %2 verification opportunities</source> + <translation type="unfinished"></translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="779"/> +- <location filename="../src/mainwindow.cpp" line="783"/> +- <location filename="../src/mainwindow.cpp" line="787"/> +- <location filename="../src/mainwindow.cpp" line="791"/> +- <source>Account locked,</source> ++ <location filename="../src/mainwindow.cpp" line="1579"/> ++ <source>Acquisition failure</source> + <translation type="unfinished"></translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="779"/> +- <source>days left</source> ++ <location filename="../src/mainwindow.cpp" line="165"/> ++ <source>Please enter your password or enroll your fingerprint </source> + <translation type="unfinished"></translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="783"/> +- <source>hours left</source> ++ <location filename="../src/mainwindow.cpp" line="517"/> ++ <source>This operation requires the administrator's authorization. Please enter your password to allow this operation.</source> + <translation type="unfinished"></translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="787"/> +- <source>minutes left</source> ++ <location filename="../src/mainwindow.cpp" line="522"/> ++ <source>A program is attempting to perform an action that requires privileges.It requires authorization to perform the action.</source> + <translation type="unfinished"></translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="791"/> +- <source>seconds left</source> ++ <location filename="../src/mainwindow.cpp" line="582"/> ++ <source>Password: </source> + <translation type="unfinished"></translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="834"/> +- <location filename="../src/mainwindow.cpp" line="835"/> +- <source>Password cannot be empty</source> ++ <location filename="../src/mainwindow.cpp" line="584"/> ++ <source>_Password: </source> + <translation type="unfinished"></translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="880"/> +- <location filename="../src/mainwindow.cpp" line="888"/> +- <source>Input your password to authentication</source> ++ <location filename="../src/mainwindow.cpp" line="586"/> ++ <source>_Password:</source> + <translation type="unfinished"></translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1079"/> +- <location filename="../src/mainwindow.cpp" line="1183"/> +- <source>Use password</source> ++ <location filename="../src/mainwindow.cpp" line="635"/> ++ <location filename="../src/mainwindow.cpp" line="638"/> ++ <location filename="../src/mainwindow.cpp" line="641"/> ++ <location filename="../src/mainwindow.cpp" line="644"/> ++ <source>Account locked,</source> + <translation type="unfinished"></translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1219"/> +- <location filename="../src/mainwindow.cpp" line="1292"/> +- <location filename="../src/mainwindow.cpp" line="1293"/> +- <source>Please try again in %1 minutes.</source> ++ <location filename="../src/mainwindow.cpp" line="635"/> ++ <source>days left</source> + <translation type="unfinished"></translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1230"/> +- <location filename="../src/mainwindow.cpp" line="1302"/> +- <location filename="../src/mainwindow.cpp" line="1303"/> +- <source>Please try again in %1 seconds.</source> ++ <location filename="../src/mainwindow.cpp" line="638"/> ++ <source>hours left</source> + <translation type="unfinished"></translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1240"/> +- <location filename="../src/mainwindow.cpp" line="1241"/> +- <location filename="../src/mainwindow.cpp" line="1311"/> +- <location filename="../src/mainwindow.cpp" line="1312"/> +- <source>Account locked permanently.</source> ++ <location filename="../src/mainwindow.cpp" line="641"/> ++ <source>minutes left</source> ++ <translation type="unfinished"></translation> ++ </message> ++ <message> ++ <location filename="../src/mainwindow.cpp" line="644"/> ++ <source>seconds left</source> + <translation type="unfinished"></translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1434"/> +- <source>Verify face recognition or enter password to unlock</source> ++ <location filename="../src/mainwindow.cpp" line="688"/> ++ <location filename="../src/mainwindow.cpp" line="689"/> ++ <source>Password cannot be empty</source> + <translation type="unfinished"></translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1439"/> +- <source>Press fingerprint or enter password to unlock</source> ++ <location filename="../src/mainwindow.cpp" line="734"/> ++ <location filename="../src/mainwindow.cpp" line="742"/> ++ <location filename="../src/mainwindow.cpp" line="1258"/> ++ <source>Input your password to authentication</source> + <translation type="unfinished"></translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1444"/> +- <source>Verify voiceprint or enter password to unlock</source> ++ <location filename="../src/mainwindow.cpp" line="876"/> ++ <source>Use password</source> + <translation type="unfinished"></translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1449"/> +- <source>Verify finger vein or enter password to unlock</source> ++ <location filename="../src/mainwindow.cpp" line="1003"/> ++ <location filename="../src/mainwindow.cpp" line="1081"/> ++ <location filename="../src/mainwindow.cpp" line="1082"/> ++ <source>Please try again in %1 minutes.</source> + <translation type="unfinished"></translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1454"/> +- <source>Verify iris or enter password to unlock</source> ++ <location filename="../src/mainwindow.cpp" line="1015"/> ++ <location filename="../src/mainwindow.cpp" line="1093"/> ++ <location filename="../src/mainwindow.cpp" line="1094"/> ++ <source>Please try again in %1 seconds.</source> + <translation type="unfinished"></translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1459"/> +- <source>Use the bound wechat scanning code or enter the password to unlock</source> ++ <location filename="../src/mainwindow.cpp" line="1026"/> ++ <location filename="../src/mainwindow.cpp" line="1027"/> ++ <location filename="../src/mainwindow.cpp" line="1104"/> ++ <location filename="../src/mainwindow.cpp" line="1105"/> ++ <source>Account locked permanently.</source> + <translation type="unfinished"></translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="108"/> +- <location filename="../src/mainwindow.cpp" line="729"/> ++ <location filename="../src/mainwindow.cpp" line="88"/> ++ <location filename="../src/mainwindow.cpp" line="580"/> + <source>Input Password</source> + <translation type="unfinished"></translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="259"/> ++ <location filename="../src/mainwindow.cpp" line="1575"/> + <source>Abnormal network</source> + <translation type="unfinished"></translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="850"/> ++ <location filename="../src/mainwindow.cpp" line="704"/> + <source>Authentication failed, please try again.</source> + <translation type="unfinished"></translation> + </message> +@@ -215,17 +229,17 @@ + <context> + <name>PolkitListener</name> + <message> +- <location filename="../src/PolkitListener.cpp" line="88"/> ++ <location filename="../src/PolkitListener.cpp" line="86"/> + <source>Another client is already authenticating, please try again later.</source> + <translation type="unfinished"></translation> + </message> + <message> +- <location filename="../src/PolkitListener.cpp" line="265"/> ++ <location filename="../src/PolkitListener.cpp" line="253"/> + <source>Authentication failure, please try again.</source> + <translation type="unfinished"></translation> + </message> + <message> +- <location filename="../src/PolkitListener.cpp" line="272"/> ++ <location filename="../src/PolkitListener.cpp" line="259"/> + <source>Password input error!</source> + <translation type="unfinished"></translation> + </message> +diff --git a/polkit-agent/i18n_ts/bo_CN.ts b/polkit-agent/i18n_ts/bo_CN.ts +index e0a54e7..deb149d 100644 +--- a/polkit-agent/i18n_ts/bo_CN.ts ++++ b/polkit-agent/i18n_ts/bo_CN.ts +@@ -51,6 +51,15 @@ + <translation type="vanished">二维码</translation> + </message> + </context> ++<context> ++ <name>FullScreenBackground</name> ++ <message> ++ <location filename="../src/fullscreenbackground.cpp" line="75"/> ++ <location filename="../src/fullscreenbackground.cpp" line="104"/> ++ <source>Authentication</source> ++ <translation type="unfinished">དབང་བསྐུར།</translation> ++ </message> ++</context> + <context> + <name>LoginOptionsWidget</name> + <message> +@@ -65,9 +74,8 @@ + <context> + <name>MainWindow</name> + <message> +- <location filename="../src/mainwindow.cpp" line="66"/> + <source>Authentication</source> +- <translation>དབང་བསྐུར།</translation> ++ <translation type="vanished">དབང་བསྐུར།</translation> + </message> + <message> + <source>Fingerprint authentication failed, you still have %1 verification opportunities</source> +@@ -91,14 +99,14 @@ + <translation type="vanished">密码</translation> + </message> + <message> +- <location filename="../src/mainwindow.ui" line="409"/> +- <location filename="../src/mainwindow.cpp" line="1075"/> +- <location filename="../src/mainwindow.cpp" line="1143"/> ++ <location filename="../src/mainwindow.ui" line="398"/> ++ <location filename="../src/mainwindow.cpp" line="874"/> ++ <location filename="../src/mainwindow.cpp" line="943"/> + <source>Biometric</source> + <translation>སྐྱེ་དངོས་དབྱེ་འབྱེད་བཀོལ་བ།</translation> + </message> + <message> +- <location filename="../src/mainwindow.ui" line="480"/> ++ <location filename="../src/mainwindow.ui" line="493"/> + <source>use password</source> + <translation>གསང་གྲངས་བེད་སྤྱོད་བྱ་དགོས།</translation> + </message> +@@ -147,20 +155,19 @@ + <translation type="vanished">Polkit.caller-pid:</translation> + </message> + <message> +- <location filename="../src/mainwindow.ui" line="441"/> +- <location filename="../src/mainwindow.cpp" line="1077"/> ++ <location filename="../src/mainwindow.ui" line="436"/> ++ <location filename="../src/mainwindow.cpp" line="875"/> + <source>Cancel</source> + <translation>ཕྱིར་འཐེན།</translation> + </message> + <message> +- <location filename="../src/mainwindow.ui" line="460"/> +- <location filename="../src/mainwindow.cpp" line="1073"/> ++ <location filename="../src/mainwindow.ui" line="461"/> ++ <location filename="../src/mainwindow.cpp" line="873"/> + <source>Authenticate</source> + <translation>དབང་བསྐུར་བ།</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1079"/> +- <location filename="../src/mainwindow.cpp" line="1183"/> ++ <location filename="../src/mainwindow.cpp" line="876"/> + <source>Use password</source> + <translation>གསང་གྲངས་བེད་སྤྱོད་བྱ་དགོས།</translation> + </message> +@@ -185,30 +192,30 @@ + <translation type="vanished">认证中,请稍等...</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1219"/> +- <location filename="../src/mainwindow.cpp" line="1292"/> +- <location filename="../src/mainwindow.cpp" line="1293"/> ++ <location filename="../src/mainwindow.cpp" line="1003"/> ++ <location filename="../src/mainwindow.cpp" line="1081"/> ++ <location filename="../src/mainwindow.cpp" line="1082"/> + <source>Please try again in %1 minutes.</source> + <translation>%1ཡང་བསྐྱར་ཚོད་ལྟ་ཞིག་བྱེད་རོགས།</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1230"/> +- <location filename="../src/mainwindow.cpp" line="1302"/> +- <location filename="../src/mainwindow.cpp" line="1303"/> ++ <location filename="../src/mainwindow.cpp" line="1015"/> ++ <location filename="../src/mainwindow.cpp" line="1093"/> ++ <location filename="../src/mainwindow.cpp" line="1094"/> + <source>Please try again in %1 seconds.</source> + <translation>ཁྱོད་ཀྱིས་དུས་ཚོད་སྐར་ཆ་གཅིག་གི་ནང་དུ་ཡང་བསྐྱར་ཚོད་ལྟ་ཞིག་བྱེད་རོགས།</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1240"/> +- <location filename="../src/mainwindow.cpp" line="1241"/> +- <location filename="../src/mainwindow.cpp" line="1311"/> +- <location filename="../src/mainwindow.cpp" line="1312"/> ++ <location filename="../src/mainwindow.cpp" line="1026"/> ++ <location filename="../src/mainwindow.cpp" line="1027"/> ++ <location filename="../src/mainwindow.cpp" line="1104"/> ++ <location filename="../src/mainwindow.cpp" line="1105"/> + <source>Account locked permanently.</source> + <translation>དུས་གཏན་དུ་ཟྭ་བརྒྱབ་པའི་རྩིས་ཐོ།</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="834"/> +- <location filename="../src/mainwindow.cpp" line="835"/> ++ <location filename="../src/mainwindow.cpp" line="688"/> ++ <location filename="../src/mainwindow.cpp" line="689"/> + <source>Password cannot be empty</source> + <translation>གསང་གྲངས་སྟོང་པ་ཡིན་མི་སྲིད།</translation> + </message> +@@ -221,8 +228,8 @@ + <translation type="vanished">无法验证%1,请输入密码.</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="242"/> +- <location filename="../src/mainwindow.cpp" line="246"/> ++ <location filename="../src/mainwindow.cpp" line="1558"/> ++ <location filename="../src/mainwindow.cpp" line="1562"/> + <source>Failed to verify %1, you still have %2 verification opportunities</source> + <translation>%1ལ་ཞིབ་བཤེར་བྱེད་མ་ཐུབ་ན། ཁྱེད་ཚོར་ད་དུང་%2ལ་ཞིབ་བཤེར་བྱེད་པའི་གོ་སྐབས་ཡོད།</translation> + </message> +@@ -231,42 +238,42 @@ + <translation type="vanished">一个程序正试图执行一个需要特权的动作。要求授权以执行该动作。</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="731"/> ++ <location filename="../src/mainwindow.cpp" line="582"/> + <source>Password: </source> + <translation>གསང་གྲངས་ནི། </translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="335"/> ++ <location filename="../src/mainwindow.cpp" line="165"/> + <source>Please enter your password or enroll your fingerprint </source> + <translation>ཁྱེད་ཀྱི་གསང་གྲངས་ནང་འཇུག་བྱེད་པའམ་ཡང་ན་ཁྱེད་ཀྱི་མཛུབ་རིས་ནང་འཇུག་བྱེད་པ། </translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="259"/> ++ <location filename="../src/mainwindow.cpp" line="1575"/> + <source>Abnormal network</source> + <translation>རྒྱུན་ལྡན་མིན་པའི་དྲ་བ།</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="665"/> ++ <location filename="../src/mainwindow.cpp" line="517"/> + <source>This operation requires the administrator's authorization. Please enter your password to allow this operation.</source> + <translation>ཐེངས་འདིའི་བཀོལ་སྤྱོད་ལ་དོ་དམ་པའི་དབང་ཆ་ཐོབ་ན་ད་གཟོད་མུ་མཐུད་དུ་ལག་བསྟར་བྱེད་ཐུབ།གསང་གྲངས་ནང་འཇུག་བྱས་ནས་ཐེངས་འདིའི་བཀོལ་སྤྱོད་བྱེད་ཆོག</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="733"/> ++ <location filename="../src/mainwindow.cpp" line="584"/> + <source>_Password: </source> + <translation>གསང་གྲངས། </translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="735"/> ++ <location filename="../src/mainwindow.cpp" line="586"/> + <source>_Password:</source> + <translation>གསང་གྲངས།:</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="850"/> ++ <location filename="../src/mainwindow.cpp" line="704"/> + <source>Authentication failed, please try again.</source> + <translation>བདེན་དཔང་ར་སྤྲོད་ལ་ཕམ་ཁ་བྱུང་བས་ཡང་བསྐྱར་ཚོད་ལྟ་བྱོས།</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="779"/> ++ <location filename="../src/mainwindow.cpp" line="635"/> + <source>days left</source> + <translation>གནམ་རྒྱབ་ཟྭ་འབྱེད།</translation> + </message> +@@ -279,16 +286,16 @@ + <translation type="vanished">生物/扫码验证失败,您还有%1次尝试机会</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="226"/> +- <location filename="../src/mainwindow.cpp" line="1415"/> +- <location filename="../src/mainwindow.cpp" line="1417"/> ++ <location filename="../src/mainwindow.cpp" line="1243"/> ++ <location filename="../src/mainwindow.cpp" line="1246"/> ++ <location filename="../src/mainwindow.cpp" line="1539"/> + <source>Failed to verify %1, please enter password to unlock</source> + <translation>%1ལ་ཞིབ་བཤེར་བྱེད་མ་ཐུབ་ན། གསང་གྲངས་ནང་འཇུག་བྱས་ནས་ཟྭ་རྒྱག་རོགས།</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="231"/> +- <location filename="../src/mainwindow.cpp" line="233"/> +- <location filename="../src/mainwindow.cpp" line="1419"/> ++ <location filename="../src/mainwindow.cpp" line="1249"/> ++ <location filename="../src/mainwindow.cpp" line="1545"/> ++ <location filename="../src/mainwindow.cpp" line="1548"/> + <source>Unable to verify %1, please enter password to unlock</source> + <translation>%1ལ་ཞིབ་བཤེར་བྱེད་ཐབས་བྲལ་བ་དང་། གསང་གྲངས་ནང་འཇུག་བྱས་ནས་ཟྭ་རྒྱག་རོགས།</translation> + </message> +@@ -297,86 +304,121 @@ + <translation type="vanished">网络异常</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="671"/> ++ <location filename="../src/mainwindow.cpp" line="522"/> + <source>A program is attempting to perform an action that requires privileges.It requires authorization to perform the action.</source> + <translation>གོ་རིམ་ཞིག་གིས་ཁྱད་དབང་དགོས་པའི་འགུལ་སྟངས་ཤིག་ལག་བསྟར་བྱེད་པར་ཚོད་ལྟ་བྱེད་བཞིན་ཡོད་པ་དང་།་འགུལ་སྟངས་འདི་ལག་བསྟར་བྱེད་པའི་དབང་ཆ་སྤྲོད་དགོས་པའི་རེ་བ་བཏོན།</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="108"/> +- <location filename="../src/mainwindow.cpp" line="729"/> ++ <location filename="../src/mainwindow.cpp" line="88"/> ++ <location filename="../src/mainwindow.cpp" line="580"/> + <source>Input Password</source> + <translation>ནང་འཇུག་གི་གསང་གྲངས།</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="105"/> ++ <location filename="../src/mainwindow.cpp" line="85"/> + <source>Insert the ukey into the USB port</source> + <translation>བདེ་འཇགས་ཀྱི་གསང་བའི་ལྡེ་མིག་དེ་USBཡི་སྣེ་འདྲེན་དུ་འཇུག་རོགས།</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="107"/> ++ <location filename="../src/mainwindow.cpp" line="87"/> + <source>Enter the ukey password</source> + <translation>གསང་བའི་ཨང་གྲངས་ནང་འཇུག་བྱེད་པ།</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="783"/> ++ <location filename="../src/mainwindow.cpp" line="93"/> ++ <source>Close</source> ++ <translation>སྒོ་རྒྱག་པ་</translation> ++ </message> ++ <message> ++ <location filename="../src/mainwindow.cpp" line="1261"/> ++ <source>Facial recognition to authorization</source> ++ <translation type="unfinished"></translation> ++ </message> ++ <message> ++ <location filename="../src/mainwindow.cpp" line="1264"/> ++ <source>Fingerprint recognition to authorization</source> ++ <translation type="unfinished"></translation> ++ </message> ++ <message> ++ <location filename="../src/mainwindow.cpp" line="1267"/> ++ <source>Voiceprint recognition to authorization</source> ++ <translation type="unfinished"></translation> ++ </message> ++ <message> ++ <location filename="../src/mainwindow.cpp" line="1270"/> ++ <source>Finger veins recognition to authorization</source> ++ <translation type="unfinished"></translation> ++ </message> ++ <message> ++ <location filename="../src/mainwindow.cpp" line="1273"/> ++ <source>Iris recognition to authorization</source> ++ <translation type="unfinished"></translation> ++ </message> ++ <message> ++ <location filename="../src/mainwindow.cpp" line="1276"/> ++ <source>Use the bound wechat scanning code to authorization</source> ++ <translation type="unfinished"></translation> ++ </message> ++ <message> ++ <location filename="../src/mainwindow.cpp" line="1579"/> ++ <source>Acquisition failure</source> ++ <translation>ཕམ་ཉེས་བྱུང་བ་རེད</translation> ++ </message> ++ <message> ++ <location filename="../src/mainwindow.cpp" line="638"/> + <source>hours left</source> + <translation>དུས་ཚོད་འགའ་ལས་ལྷག་མེད</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="787"/> ++ <location filename="../src/mainwindow.cpp" line="641"/> + <source>minutes left</source> + <translation>སྐར་མ་རྗེས་ནས་ཟྭ་ཕྱེ།</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="791"/> ++ <location filename="../src/mainwindow.cpp" line="644"/> + <source>seconds left</source> + <translation>སྐར་ཆའི་རྗེས་ནས་ཟྭ་ཕྱེ་བ།</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="880"/> +- <location filename="../src/mainwindow.cpp" line="888"/> ++ <location filename="../src/mainwindow.cpp" line="734"/> ++ <location filename="../src/mainwindow.cpp" line="742"/> ++ <location filename="../src/mainwindow.cpp" line="1258"/> + <source>Input your password to authentication</source> + <translation>གསང་བའི་ཨང་གྲངས་ནང་འཇུག་བྱེད་དབང་ཡོད།</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1434"/> + <source>Verify face recognition or enter password to unlock</source> +- <translation>དཔང་མིའི་གདོང་ལ་ཞིབ་བཤེར་བྱེད་པའམ་ཡང་ན་གསང་གྲངས་བསྣན་ནས་ཟྭ་འབྱེད་པ།</translation> ++ <translation type="vanished">དཔང་མིའི་གདོང་ལ་ཞིབ་བཤེར་བྱེད་པའམ་ཡང་ན་གསང་གྲངས་བསྣན་ནས་ཟྭ་འབྱེད་པ།</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1439"/> + <source>Press fingerprint or enter password to unlock</source> +- <translation>མཛུབ་རིས་མནན་པའམ་ཡང་ན་གསང་གྲངས་བསྣན་ནས་ཟྭ་འབྱེད་པ།</translation> ++ <translation type="vanished">མཛུབ་རིས་མནན་པའམ་ཡང་ན་གསང་གྲངས་བསྣན་ནས་ཟྭ་འབྱེད་པ།</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1444"/> + <source>Verify voiceprint or enter password to unlock</source> +- <translation>སྒྲ་རིས་ར་སྤྲོད་བྱེད་པའམ་ཡང་ན་གསང་གྲངས་བསྣན་ནས་ཟྭ་འབྱེད་པ།</translation> ++ <translation type="vanished">སྒྲ་རིས་ར་སྤྲོད་བྱེད་པའམ་ཡང་ན་གསང་གྲངས་བསྣན་ནས་ཟྭ་འབྱེད་པ།</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1449"/> + <source>Verify finger vein or enter password to unlock</source> +- <translation>ཚོད་ལྟས་ར་སྤྲོད་བྱེད་པ་ནི་སྡོད་རྩ་དང་གསང་གྲངས་བསྣན་ནས་ཟྭ་འབྱེད་པ་དེ་ཡིན།</translation> ++ <translation type="vanished">ཚོད་ལྟས་ར་སྤྲོད་བྱེད་པ་ནི་སྡོད་རྩ་དང་གསང་གྲངས་བསྣན་ནས་ཟྭ་འབྱེད་པ་དེ་ཡིན།</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1454"/> + <source>Verify iris or enter password to unlock</source> +- <translation>འཇའ་སྐྱི་ར་སྤྲོད་བྱེད་པའམ་ཡང་ན་གསང་གྲངས་བསྣན་ནས་ཟྭ་འབྱེད་པ།</translation> ++ <translation type="vanished">འཇའ་སྐྱི་ར་སྤྲོད་བྱེད་པའམ་ཡང་ན་གསང་གྲངས་བསྣན་ནས་ཟྭ་འབྱེད་པ།</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1459"/> + <source>Use the bound wechat scanning code or enter the password to unlock</source> +- <translation>སྦྲེལ་ཡོད་པའི་སྐད་འཕྲིན་གྱི་ཨང་གྲངས་སམ་གསང་གྲངས་བསྣན་ནས་ཟྭ་འབྱེད་དགོས།</translation> ++ <translation type="vanished">སྦྲེལ་ཡོད་པའི་སྐད་འཕྲིན་གྱི་ཨང་གྲངས་སམ་གསང་གྲངས་བསྣན་ནས་ཟྭ་འབྱེད་དགོས།</translation> + </message> + <message> + <source>Use the bound wechat scanning code or enter the password to log in</source> + <translation type="vanished">使用绑定的微信扫码或输入密码登录</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="779"/> +- <location filename="../src/mainwindow.cpp" line="783"/> +- <location filename="../src/mainwindow.cpp" line="787"/> +- <location filename="../src/mainwindow.cpp" line="791"/> ++ <location filename="../src/mainwindow.cpp" line="635"/> ++ <location filename="../src/mainwindow.cpp" line="638"/> ++ <location filename="../src/mainwindow.cpp" line="641"/> ++ <location filename="../src/mainwindow.cpp" line="644"/> + <source>Account locked,</source> + <translation>རྩིས་ཐོ་ཟྭ་བརྒྱབ་པ།</translation> + </message> +@@ -388,17 +430,17 @@ + <context> + <name>PolkitListener</name> + <message> +- <location filename="../src/PolkitListener.cpp" line="88"/> ++ <location filename="../src/PolkitListener.cpp" line="86"/> + <source>Another client is already authenticating, please try again later.</source> + <translation>མཁོ་མཁན་གཞན་པ་ཞིག་གིས་བདེན་དཔང་ར་སྤྲོད་བྱེད་བཞིན་ཡོད།ཅུང་ཙམ་འགོར་རྗེས་ཡང་བསྐྱར་ཚོད་ལྟ་བྱོས།</translation> + </message> + <message> +- <location filename="../src/PolkitListener.cpp" line="265"/> ++ <location filename="../src/PolkitListener.cpp" line="253"/> + <source>Authentication failure, please try again.</source> + <translation>བདེན་དཔང་ར་སྤྲོད་བྱེད་མ་ཐུབ་ན་ཁྱེད་ཀྱིས་ཡང་བསྐྱར་ཚོད་ལྟ་བྱེད།</translation> + </message> + <message> +- <location filename="../src/PolkitListener.cpp" line="272"/> ++ <location filename="../src/PolkitListener.cpp" line="259"/> + <source>Password input error!</source> + <translation>གསང་གྲངས་ནང་འཇུག་ནོར་འཁྲུལ་བྱུང་བ་རེད།</translation> + </message> +diff --git a/polkit-agent/i18n_ts/de.ts b/polkit-agent/i18n_ts/de.ts +index 8521a6d..e17acdc 100644 +--- a/polkit-agent/i18n_ts/de.ts ++++ b/polkit-agent/i18n_ts/de.ts +@@ -51,6 +51,15 @@ + <translation type="vanished">二维码</translation> + </message> + </context> ++<context> ++ <name>FullScreenBackground</name> ++ <message> ++ <location filename="../src/fullscreenbackground.cpp" line="75"/> ++ <location filename="../src/fullscreenbackground.cpp" line="104"/> ++ <source>Authentication</source> ++ <translation type="unfinished">Authentifizierung</translation> ++ </message> ++</context> + <context> + <name>LoginOptionsWidget</name> + <message> +@@ -65,9 +74,8 @@ + <context> + <name>MainWindow</name> + <message> +- <location filename="../src/mainwindow.cpp" line="66"/> + <source>Authentication</source> +- <translation>Authentifizierung</translation> ++ <translation type="vanished">Authentifizierung</translation> + </message> + <message> + <source>Fingerprint authentication failed, you still have %1 verification opportunities</source> +@@ -91,14 +99,14 @@ + <translation type="vanished">密码</translation> + </message> + <message> +- <location filename="../src/mainwindow.ui" line="409"/> +- <location filename="../src/mainwindow.cpp" line="1075"/> +- <location filename="../src/mainwindow.cpp" line="1143"/> ++ <location filename="../src/mainwindow.ui" line="398"/> ++ <location filename="../src/mainwindow.cpp" line="874"/> ++ <location filename="../src/mainwindow.cpp" line="943"/> + <source>Biometric</source> + <translation>Biometrisch</translation> + </message> + <message> +- <location filename="../src/mainwindow.ui" line="480"/> ++ <location filename="../src/mainwindow.ui" line="493"/> + <source>use password</source> + <translation>Passwort verwenden</translation> + </message> +@@ -147,20 +155,19 @@ + <translation type="vanished">Polkit.caller-pid:</translation> + </message> + <message> +- <location filename="../src/mainwindow.ui" line="441"/> +- <location filename="../src/mainwindow.cpp" line="1077"/> ++ <location filename="../src/mainwindow.ui" line="436"/> ++ <location filename="../src/mainwindow.cpp" line="875"/> + <source>Cancel</source> + <translation>Abbrechen</translation> + </message> + <message> +- <location filename="../src/mainwindow.ui" line="460"/> +- <location filename="../src/mainwindow.cpp" line="1073"/> ++ <location filename="../src/mainwindow.ui" line="461"/> ++ <location filename="../src/mainwindow.cpp" line="873"/> + <source>Authenticate</source> + <translation>Beglaubigen</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1079"/> +- <location filename="../src/mainwindow.cpp" line="1183"/> ++ <location filename="../src/mainwindow.cpp" line="876"/> + <source>Use password</source> + <translation>Passwort verwenden</translation> + </message> +@@ -185,30 +192,30 @@ + <translation type="vanished">认证中,请稍等...</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1219"/> +- <location filename="../src/mainwindow.cpp" line="1292"/> +- <location filename="../src/mainwindow.cpp" line="1293"/> ++ <location filename="../src/mainwindow.cpp" line="1003"/> ++ <location filename="../src/mainwindow.cpp" line="1081"/> ++ <location filename="../src/mainwindow.cpp" line="1082"/> + <source>Please try again in %1 minutes.</source> + <translation>Versuchen Sie es in %1 Minuten erneut.</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1230"/> +- <location filename="../src/mainwindow.cpp" line="1302"/> +- <location filename="../src/mainwindow.cpp" line="1303"/> ++ <location filename="../src/mainwindow.cpp" line="1015"/> ++ <location filename="../src/mainwindow.cpp" line="1093"/> ++ <location filename="../src/mainwindow.cpp" line="1094"/> + <source>Please try again in %1 seconds.</source> + <translation>Bitte versuchen Sie es in %1 Sekunden erneut.</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1240"/> +- <location filename="../src/mainwindow.cpp" line="1241"/> +- <location filename="../src/mainwindow.cpp" line="1311"/> +- <location filename="../src/mainwindow.cpp" line="1312"/> ++ <location filename="../src/mainwindow.cpp" line="1026"/> ++ <location filename="../src/mainwindow.cpp" line="1027"/> ++ <location filename="../src/mainwindow.cpp" line="1104"/> ++ <location filename="../src/mainwindow.cpp" line="1105"/> + <source>Account locked permanently.</source> + <translation>Das Konto wurde dauerhaft gesperrt.</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="834"/> +- <location filename="../src/mainwindow.cpp" line="835"/> ++ <location filename="../src/mainwindow.cpp" line="688"/> ++ <location filename="../src/mainwindow.cpp" line="689"/> + <source>Password cannot be empty</source> + <translation>Das Kennwort darf nicht leer sein.</translation> + </message> +@@ -221,8 +228,8 @@ + <translation type="vanished">无法验证%1,请输入密码.</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="242"/> +- <location filename="../src/mainwindow.cpp" line="246"/> ++ <location filename="../src/mainwindow.cpp" line="1558"/> ++ <location filename="../src/mainwindow.cpp" line="1562"/> + <source>Failed to verify %1, you still have %2 verification opportunities</source> + <translation>%1 konnte nicht verifiziert werden, Sie haben immer noch %2 Überprüfungsmöglichkeiten</translation> + </message> +@@ -231,42 +238,42 @@ + <translation type="vanished">一个程序正试图执行一个需要特权的动作。要求授权以执行该动作。</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="731"/> ++ <location filename="../src/mainwindow.cpp" line="582"/> + <source>Password: </source> + <translation>Passwort: </translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="335"/> ++ <location filename="../src/mainwindow.cpp" line="165"/> + <source>Please enter your password or enroll your fingerprint </source> + <translation>Bitte geben Sie Ihr Passwort ein oder registrieren Sie Ihren Fingerabdruck </translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="259"/> ++ <location filename="../src/mainwindow.cpp" line="1575"/> + <source>Abnormal network</source> + <translation>Ungewöhnliches Netzwerk</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="665"/> ++ <location filename="../src/mainwindow.cpp" line="517"/> + <source>This operation requires the administrator's authorization. Please enter your password to allow this operation.</source> + <translation>Für diesen Vorgang ist die Autorisierung des Administrators erforderlich. Bitte geben Sie Ihr Passwort ein, um diesen Vorgang zuzulassen.</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="733"/> ++ <location filename="../src/mainwindow.cpp" line="584"/> + <source>_Password: </source> + <translation>_Passwort: </translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="735"/> ++ <location filename="../src/mainwindow.cpp" line="586"/> + <source>_Password:</source> + <translation>_Passwort:</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="850"/> ++ <location filename="../src/mainwindow.cpp" line="704"/> + <source>Authentication failed, please try again.</source> + <translation>Authentifizierung fehlgeschlagen, bitte versuchen Sie es erneut.</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="779"/> ++ <location filename="../src/mainwindow.cpp" line="635"/> + <source>days left</source> + <translation>Verbleibende Tage</translation> + </message> +@@ -279,16 +286,16 @@ + <translation type="vanished">生物/扫码验证失败,您还有%1次尝试机会</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="226"/> +- <location filename="../src/mainwindow.cpp" line="1415"/> +- <location filename="../src/mainwindow.cpp" line="1417"/> ++ <location filename="../src/mainwindow.cpp" line="1243"/> ++ <location filename="../src/mainwindow.cpp" line="1246"/> ++ <location filename="../src/mainwindow.cpp" line="1539"/> + <source>Failed to verify %1, please enter password to unlock</source> + <translation>%1 konnte nicht verifiziert werden, bitte geben Sie das Kennwort zum Entsperren ein</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="231"/> +- <location filename="../src/mainwindow.cpp" line="233"/> +- <location filename="../src/mainwindow.cpp" line="1419"/> ++ <location filename="../src/mainwindow.cpp" line="1249"/> ++ <location filename="../src/mainwindow.cpp" line="1545"/> ++ <location filename="../src/mainwindow.cpp" line="1548"/> + <source>Unable to verify %1, please enter password to unlock</source> + <translation>%1 kann nicht verifiziert werden, bitte geben Sie das Kennwort zum Entsperren ein</translation> + </message> +@@ -297,86 +304,121 @@ + <translation type="vanished">网络异常</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="671"/> ++ <location filename="../src/mainwindow.cpp" line="522"/> + <source>A program is attempting to perform an action that requires privileges.It requires authorization to perform the action.</source> + <translation>Ein Programm versucht, eine Aktion auszuführen, für die Berechtigungen erforderlich sind. Zum Ausführen der Aktion ist eine Autorisierung erforderlich.</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="108"/> +- <location filename="../src/mainwindow.cpp" line="729"/> ++ <location filename="../src/mainwindow.cpp" line="88"/> ++ <location filename="../src/mainwindow.cpp" line="580"/> + <source>Input Password</source> + <translation>Passwort eingeben</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="105"/> ++ <location filename="../src/mainwindow.cpp" line="85"/> + <source>Insert the ukey into the USB port</source> + <translation type="unfinished"></translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="107"/> ++ <location filename="../src/mainwindow.cpp" line="87"/> + <source>Enter the ukey password</source> + <translation type="unfinished"></translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="783"/> ++ <location filename="../src/mainwindow.cpp" line="93"/> ++ <source>Close</source> ++ <translation type="unfinished"></translation> ++ </message> ++ <message> ++ <location filename="../src/mainwindow.cpp" line="1261"/> ++ <source>Facial recognition to authorization</source> ++ <translation type="unfinished"></translation> ++ </message> ++ <message> ++ <location filename="../src/mainwindow.cpp" line="1264"/> ++ <source>Fingerprint recognition to authorization</source> ++ <translation type="unfinished"></translation> ++ </message> ++ <message> ++ <location filename="../src/mainwindow.cpp" line="1267"/> ++ <source>Voiceprint recognition to authorization</source> ++ <translation type="unfinished"></translation> ++ </message> ++ <message> ++ <location filename="../src/mainwindow.cpp" line="1270"/> ++ <source>Finger veins recognition to authorization</source> ++ <translation type="unfinished"></translation> ++ </message> ++ <message> ++ <location filename="../src/mainwindow.cpp" line="1273"/> ++ <source>Iris recognition to authorization</source> ++ <translation type="unfinished"></translation> ++ </message> ++ <message> ++ <location filename="../src/mainwindow.cpp" line="1276"/> ++ <source>Use the bound wechat scanning code to authorization</source> ++ <translation type="unfinished"></translation> ++ </message> ++ <message> ++ <location filename="../src/mainwindow.cpp" line="1579"/> ++ <source>Acquisition failure</source> ++ <translation type="unfinished"></translation> ++ </message> ++ <message> ++ <location filename="../src/mainwindow.cpp" line="638"/> + <source>hours left</source> + <translation>Verbleibende Stunden</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="787"/> ++ <location filename="../src/mainwindow.cpp" line="641"/> + <source>minutes left</source> + <translation>Noch Minuten</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="791"/> ++ <location filename="../src/mainwindow.cpp" line="644"/> + <source>seconds left</source> + <translation>Verbleibende Sekunden</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="880"/> +- <location filename="../src/mainwindow.cpp" line="888"/> ++ <location filename="../src/mainwindow.cpp" line="734"/> ++ <location filename="../src/mainwindow.cpp" line="742"/> ++ <location filename="../src/mainwindow.cpp" line="1258"/> + <source>Input your password to authentication</source> + <translation type="unfinished"></translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1434"/> + <source>Verify face recognition or enter password to unlock</source> +- <translation>Überprüfen Sie die Gesichtserkennung oder geben Sie das Passwort ein, um zu entsperren</translation> ++ <translation type="vanished">Überprüfen Sie die Gesichtserkennung oder geben Sie das Passwort ein, um zu entsperren</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1439"/> + <source>Press fingerprint or enter password to unlock</source> +- <translation>Drücken Sie den Fingerabdruck oder geben Sie das Passwort ein, um zu entsperren</translation> ++ <translation type="vanished">Drücken Sie den Fingerabdruck oder geben Sie das Passwort ein, um zu entsperren</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1444"/> + <source>Verify voiceprint or enter password to unlock</source> +- <translation>Überprüfen Sie den Stimmabdruck oder geben Sie das Passwort ein, um zu entsperren</translation> ++ <translation type="vanished">Überprüfen Sie den Stimmabdruck oder geben Sie das Passwort ein, um zu entsperren</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1449"/> + <source>Verify finger vein or enter password to unlock</source> +- <translation>Überprüfen Sie die Fingervene oder geben Sie das Passwort ein, um zu entsperren</translation> ++ <translation type="vanished">Überprüfen Sie die Fingervene oder geben Sie das Passwort ein, um zu entsperren</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1454"/> + <source>Verify iris or enter password to unlock</source> +- <translation>Überprüfen Sie die Iris oder geben Sie das Passwort ein, um zu entsperren</translation> ++ <translation type="vanished">Überprüfen Sie die Iris oder geben Sie das Passwort ein, um zu entsperren</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1459"/> + <source>Use the bound wechat scanning code or enter the password to unlock</source> +- <translation>Verwenden Sie den gebundenen Wechat-Scan-Code oder geben Sie das Passwort zum Entsperren ein</translation> ++ <translation type="vanished">Verwenden Sie den gebundenen Wechat-Scan-Code oder geben Sie das Passwort zum Entsperren ein</translation> + </message> + <message> + <source>Use the bound wechat scanning code or enter the password to log in</source> + <translation type="vanished">使用绑定的微信扫码或输入密码登录</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="779"/> +- <location filename="../src/mainwindow.cpp" line="783"/> +- <location filename="../src/mainwindow.cpp" line="787"/> +- <location filename="../src/mainwindow.cpp" line="791"/> ++ <location filename="../src/mainwindow.cpp" line="635"/> ++ <location filename="../src/mainwindow.cpp" line="638"/> ++ <location filename="../src/mainwindow.cpp" line="641"/> ++ <location filename="../src/mainwindow.cpp" line="644"/> + <source>Account locked,</source> + <translation>Konto gesperrt,</translation> + </message> +@@ -388,17 +430,17 @@ + <context> + <name>PolkitListener</name> + <message> +- <location filename="../src/PolkitListener.cpp" line="88"/> ++ <location filename="../src/PolkitListener.cpp" line="86"/> + <source>Another client is already authenticating, please try again later.</source> + <translation>Ein anderer Client authentifiziert sich bereits, bitte versuchen Sie es später noch einmal.</translation> + </message> + <message> +- <location filename="../src/PolkitListener.cpp" line="265"/> ++ <location filename="../src/PolkitListener.cpp" line="253"/> + <source>Authentication failure, please try again.</source> + <translation>Authentifizierungsfehler, bitte versuchen Sie es erneut.</translation> + </message> + <message> +- <location filename="../src/PolkitListener.cpp" line="272"/> ++ <location filename="../src/PolkitListener.cpp" line="259"/> + <source>Password input error!</source> + <translation>Fehler bei der Passworteingabe!</translation> + </message> +diff --git a/polkit-agent/i18n_ts/es.ts b/polkit-agent/i18n_ts/es.ts +index 133ff59..11060b3 100644 +--- a/polkit-agent/i18n_ts/es.ts ++++ b/polkit-agent/i18n_ts/es.ts +@@ -51,6 +51,15 @@ + <translation type="vanished">二维码</translation> + </message> + </context> ++<context> ++ <name>FullScreenBackground</name> ++ <message> ++ <location filename="../src/fullscreenbackground.cpp" line="75"/> ++ <location filename="../src/fullscreenbackground.cpp" line="104"/> ++ <source>Authentication</source> ++ <translation type="unfinished">Autenticación</translation> ++ </message> ++</context> + <context> + <name>LoginOptionsWidget</name> + <message> +@@ -65,9 +74,8 @@ + <context> + <name>MainWindow</name> + <message> +- <location filename="../src/mainwindow.cpp" line="66"/> + <source>Authentication</source> +- <translation>Autenticación</translation> ++ <translation type="vanished">Autenticación</translation> + </message> + <message> + <source>Fingerprint authentication failed, you still have %1 verification opportunities</source> +@@ -91,14 +99,14 @@ + <translation type="vanished">密码</translation> + </message> + <message> +- <location filename="../src/mainwindow.ui" line="409"/> +- <location filename="../src/mainwindow.cpp" line="1075"/> +- <location filename="../src/mainwindow.cpp" line="1143"/> ++ <location filename="../src/mainwindow.ui" line="398"/> ++ <location filename="../src/mainwindow.cpp" line="874"/> ++ <location filename="../src/mainwindow.cpp" line="943"/> + <source>Biometric</source> + <translation>Biométrico</translation> + </message> + <message> +- <location filename="../src/mainwindow.ui" line="480"/> ++ <location filename="../src/mainwindow.ui" line="493"/> + <source>use password</source> + <translation>Usar contraseña</translation> + </message> +@@ -147,20 +155,19 @@ + <translation type="vanished">Polkit.caller-pid:</translation> + </message> + <message> +- <location filename="../src/mainwindow.ui" line="441"/> +- <location filename="../src/mainwindow.cpp" line="1077"/> ++ <location filename="../src/mainwindow.ui" line="436"/> ++ <location filename="../src/mainwindow.cpp" line="875"/> + <source>Cancel</source> + <translation>Cancelar</translation> + </message> + <message> +- <location filename="../src/mainwindow.ui" line="460"/> +- <location filename="../src/mainwindow.cpp" line="1073"/> ++ <location filename="../src/mainwindow.ui" line="461"/> ++ <location filename="../src/mainwindow.cpp" line="873"/> + <source>Authenticate</source> + <translation>Autentificar</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1079"/> +- <location filename="../src/mainwindow.cpp" line="1183"/> ++ <location filename="../src/mainwindow.cpp" line="876"/> + <source>Use password</source> + <translation>Usar contraseña</translation> + </message> +@@ -185,30 +192,30 @@ + <translation type="vanished">认证中,请稍等...</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1219"/> +- <location filename="../src/mainwindow.cpp" line="1292"/> +- <location filename="../src/mainwindow.cpp" line="1293"/> ++ <location filename="../src/mainwindow.cpp" line="1003"/> ++ <location filename="../src/mainwindow.cpp" line="1081"/> ++ <location filename="../src/mainwindow.cpp" line="1082"/> + <source>Please try again in %1 minutes.</source> + <translation>Inténtelo de nuevo en %1 minutos.</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1230"/> +- <location filename="../src/mainwindow.cpp" line="1302"/> +- <location filename="../src/mainwindow.cpp" line="1303"/> ++ <location filename="../src/mainwindow.cpp" line="1015"/> ++ <location filename="../src/mainwindow.cpp" line="1093"/> ++ <location filename="../src/mainwindow.cpp" line="1094"/> + <source>Please try again in %1 seconds.</source> + <translation>Inténtelo de nuevo en %1 segundos.</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1240"/> +- <location filename="../src/mainwindow.cpp" line="1241"/> +- <location filename="../src/mainwindow.cpp" line="1311"/> +- <location filename="../src/mainwindow.cpp" line="1312"/> ++ <location filename="../src/mainwindow.cpp" line="1026"/> ++ <location filename="../src/mainwindow.cpp" line="1027"/> ++ <location filename="../src/mainwindow.cpp" line="1104"/> ++ <location filename="../src/mainwindow.cpp" line="1105"/> + <source>Account locked permanently.</source> + <translation>Cuenta bloqueada permanentemente.</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="834"/> +- <location filename="../src/mainwindow.cpp" line="835"/> ++ <location filename="../src/mainwindow.cpp" line="688"/> ++ <location filename="../src/mainwindow.cpp" line="689"/> + <source>Password cannot be empty</source> + <translation>La contraseña no puede estar vacía</translation> + </message> +@@ -221,8 +228,8 @@ + <translation type="vanished">无法验证%1,请输入密码.</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="242"/> +- <location filename="../src/mainwindow.cpp" line="246"/> ++ <location filename="../src/mainwindow.cpp" line="1558"/> ++ <location filename="../src/mainwindow.cpp" line="1562"/> + <source>Failed to verify %1, you still have %2 verification opportunities</source> + <translation>No se pudo verificar %1, todavía tiene %2 oportunidades de verificación</translation> + </message> +@@ -231,42 +238,42 @@ + <translation type="vanished">一个程序正试图执行一个需要特权的动作。要求授权以执行该动作。</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="731"/> ++ <location filename="../src/mainwindow.cpp" line="582"/> + <source>Password: </source> + <translation>Contraseña: </translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="335"/> ++ <location filename="../src/mainwindow.cpp" line="165"/> + <source>Please enter your password or enroll your fingerprint </source> + <translation>Ingrese su contraseña o registre su huella dactilar </translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="259"/> ++ <location filename="../src/mainwindow.cpp" line="1575"/> + <source>Abnormal network</source> + <translation>Red anormal</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="665"/> ++ <location filename="../src/mainwindow.cpp" line="517"/> + <source>This operation requires the administrator's authorization. Please enter your password to allow this operation.</source> + <translation>Esta operación requiere la autorización del administrador. Introduzca su contraseña para permitir esta operación.</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="733"/> ++ <location filename="../src/mainwindow.cpp" line="584"/> + <source>_Password: </source> + <translation>_Contraseña: </translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="735"/> ++ <location filename="../src/mainwindow.cpp" line="586"/> + <source>_Password:</source> + <translation>_Contraseña:</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="850"/> ++ <location filename="../src/mainwindow.cpp" line="704"/> + <source>Authentication failed, please try again.</source> + <translation>Error de autenticación, inténtelo de nuevo.</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="779"/> ++ <location filename="../src/mainwindow.cpp" line="635"/> + <source>days left</source> + <translation>Días restantes</translation> + </message> +@@ -279,16 +286,16 @@ + <translation type="vanished">生物/扫码验证失败,您还有%1次尝试机会</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="226"/> +- <location filename="../src/mainwindow.cpp" line="1415"/> +- <location filename="../src/mainwindow.cpp" line="1417"/> ++ <location filename="../src/mainwindow.cpp" line="1243"/> ++ <location filename="../src/mainwindow.cpp" line="1246"/> ++ <location filename="../src/mainwindow.cpp" line="1539"/> + <source>Failed to verify %1, please enter password to unlock</source> + <translation>No se pudo verificar %1, ingrese la contraseña para desbloquear</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="231"/> +- <location filename="../src/mainwindow.cpp" line="233"/> +- <location filename="../src/mainwindow.cpp" line="1419"/> ++ <location filename="../src/mainwindow.cpp" line="1249"/> ++ <location filename="../src/mainwindow.cpp" line="1545"/> ++ <location filename="../src/mainwindow.cpp" line="1548"/> + <source>Unable to verify %1, please enter password to unlock</source> + <translation>No se puede verificar %1, ingrese la contraseña para desbloquear</translation> + </message> +@@ -297,86 +304,121 @@ + <translation type="vanished">网络异常</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="671"/> ++ <location filename="../src/mainwindow.cpp" line="522"/> + <source>A program is attempting to perform an action that requires privileges.It requires authorization to perform the action.</source> + <translation>Un programa está intentando realizar una acción que requiere privilegios. Requiere autorización para realizar la acción.</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="108"/> +- <location filename="../src/mainwindow.cpp" line="729"/> ++ <location filename="../src/mainwindow.cpp" line="88"/> ++ <location filename="../src/mainwindow.cpp" line="580"/> + <source>Input Password</source> + <translation>Contraseña de entrada</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="105"/> ++ <location filename="../src/mainwindow.cpp" line="85"/> + <source>Insert the ukey into the USB port</source> + <translation type="unfinished"></translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="107"/> ++ <location filename="../src/mainwindow.cpp" line="87"/> + <source>Enter the ukey password</source> + <translation type="unfinished"></translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="783"/> ++ <location filename="../src/mainwindow.cpp" line="93"/> ++ <source>Close</source> ++ <translation type="unfinished"></translation> ++ </message> ++ <message> ++ <location filename="../src/mainwindow.cpp" line="1261"/> ++ <source>Facial recognition to authorization</source> ++ <translation type="unfinished"></translation> ++ </message> ++ <message> ++ <location filename="../src/mainwindow.cpp" line="1264"/> ++ <source>Fingerprint recognition to authorization</source> ++ <translation type="unfinished"></translation> ++ </message> ++ <message> ++ <location filename="../src/mainwindow.cpp" line="1267"/> ++ <source>Voiceprint recognition to authorization</source> ++ <translation type="unfinished"></translation> ++ </message> ++ <message> ++ <location filename="../src/mainwindow.cpp" line="1270"/> ++ <source>Finger veins recognition to authorization</source> ++ <translation type="unfinished"></translation> ++ </message> ++ <message> ++ <location filename="../src/mainwindow.cpp" line="1273"/> ++ <source>Iris recognition to authorization</source> ++ <translation type="unfinished"></translation> ++ </message> ++ <message> ++ <location filename="../src/mainwindow.cpp" line="1276"/> ++ <source>Use the bound wechat scanning code to authorization</source> ++ <translation type="unfinished"></translation> ++ </message> ++ <message> ++ <location filename="../src/mainwindow.cpp" line="1579"/> ++ <source>Acquisition failure</source> ++ <translation type="unfinished"></translation> ++ </message> ++ <message> ++ <location filename="../src/mainwindow.cpp" line="638"/> + <source>hours left</source> + <translation>horas restantes</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="787"/> ++ <location filename="../src/mainwindow.cpp" line="641"/> + <source>minutes left</source> + <translation>Quedan minutos</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="791"/> ++ <location filename="../src/mainwindow.cpp" line="644"/> + <source>seconds left</source> + <translation>segundos restantes</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="880"/> +- <location filename="../src/mainwindow.cpp" line="888"/> ++ <location filename="../src/mainwindow.cpp" line="734"/> ++ <location filename="../src/mainwindow.cpp" line="742"/> ++ <location filename="../src/mainwindow.cpp" line="1258"/> + <source>Input your password to authentication</source> + <translation type="unfinished"></translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1434"/> + <source>Verify face recognition or enter password to unlock</source> +- <translation>Verifique el reconocimiento facial o ingrese la contraseña para desbloquear</translation> ++ <translation type="vanished">Verifique el reconocimiento facial o ingrese la contraseña para desbloquear</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1439"/> + <source>Press fingerprint or enter password to unlock</source> +- <translation>Presione la huella dactilar o ingrese la contraseña para desbloquear</translation> ++ <translation type="vanished">Presione la huella dactilar o ingrese la contraseña para desbloquear</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1444"/> + <source>Verify voiceprint or enter password to unlock</source> +- <translation>Verifica la huella de voz o ingresa la contraseña para desbloquear</translation> ++ <translation type="vanished">Verifica la huella de voz o ingresa la contraseña para desbloquear</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1449"/> + <source>Verify finger vein or enter password to unlock</source> +- <translation>Verifique la vena del dedo o ingrese la contraseña para desbloquear</translation> ++ <translation type="vanished">Verifique la vena del dedo o ingrese la contraseña para desbloquear</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1454"/> + <source>Verify iris or enter password to unlock</source> +- <translation>Verifique el iris o ingrese la contraseña para desbloquear</translation> ++ <translation type="vanished">Verifique el iris o ingrese la contraseña para desbloquear</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1459"/> + <source>Use the bound wechat scanning code or enter the password to unlock</source> +- <translation>Use el código de escaneo de wechat vinculado o ingrese la contraseña para desbloquear</translation> ++ <translation type="vanished">Use el código de escaneo de wechat vinculado o ingrese la contraseña para desbloquear</translation> + </message> + <message> + <source>Use the bound wechat scanning code or enter the password to log in</source> + <translation type="vanished">使用绑定的微信扫码或输入密码登录</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="779"/> +- <location filename="../src/mainwindow.cpp" line="783"/> +- <location filename="../src/mainwindow.cpp" line="787"/> +- <location filename="../src/mainwindow.cpp" line="791"/> ++ <location filename="../src/mainwindow.cpp" line="635"/> ++ <location filename="../src/mainwindow.cpp" line="638"/> ++ <location filename="../src/mainwindow.cpp" line="641"/> ++ <location filename="../src/mainwindow.cpp" line="644"/> + <source>Account locked,</source> + <translation>Cuenta bloqueada,</translation> + </message> +@@ -388,17 +430,17 @@ + <context> + <name>PolkitListener</name> + <message> +- <location filename="../src/PolkitListener.cpp" line="88"/> ++ <location filename="../src/PolkitListener.cpp" line="86"/> + <source>Another client is already authenticating, please try again later.</source> + <translation>Otro cliente ya se está autenticando, inténtelo de nuevo más tarde.</translation> + </message> + <message> +- <location filename="../src/PolkitListener.cpp" line="265"/> ++ <location filename="../src/PolkitListener.cpp" line="253"/> + <source>Authentication failure, please try again.</source> + <translation>Error de autenticación, inténtelo de nuevo.</translation> + </message> + <message> +- <location filename="../src/PolkitListener.cpp" line="272"/> ++ <location filename="../src/PolkitListener.cpp" line="259"/> + <source>Password input error!</source> + <translation>¡Error de entrada de contraseña!</translation> + </message> +diff --git a/polkit-agent/i18n_ts/fr.ts b/polkit-agent/i18n_ts/fr.ts +index 357fb71..f1c41cf 100644 +--- a/polkit-agent/i18n_ts/fr.ts ++++ b/polkit-agent/i18n_ts/fr.ts +@@ -51,6 +51,15 @@ + <translation type="vanished">二维码</translation> + </message> + </context> ++<context> ++ <name>FullScreenBackground</name> ++ <message> ++ <location filename="../src/fullscreenbackground.cpp" line="75"/> ++ <location filename="../src/fullscreenbackground.cpp" line="104"/> ++ <source>Authentication</source> ++ <translation type="unfinished">Authentification</translation> ++ </message> ++</context> + <context> + <name>LoginOptionsWidget</name> + <message> +@@ -65,9 +74,8 @@ + <context> + <name>MainWindow</name> + <message> +- <location filename="../src/mainwindow.cpp" line="66"/> + <source>Authentication</source> +- <translation>Authentification</translation> ++ <translation type="vanished">Authentification</translation> + </message> + <message> + <source>Fingerprint authentication failed, you still have %1 verification opportunities</source> +@@ -91,14 +99,14 @@ + <translation type="vanished">密码</translation> + </message> + <message> +- <location filename="../src/mainwindow.ui" line="409"/> +- <location filename="../src/mainwindow.cpp" line="1075"/> +- <location filename="../src/mainwindow.cpp" line="1143"/> ++ <location filename="../src/mainwindow.ui" line="398"/> ++ <location filename="../src/mainwindow.cpp" line="874"/> ++ <location filename="../src/mainwindow.cpp" line="943"/> + <source>Biometric</source> + <translation>Biométrique</translation> + </message> + <message> +- <location filename="../src/mainwindow.ui" line="480"/> ++ <location filename="../src/mainwindow.ui" line="493"/> + <source>use password</source> + <translation>Utiliser le mot de passe</translation> + </message> +@@ -147,20 +155,19 @@ + <translation type="vanished">Polkit.caller-pid:</translation> + </message> + <message> +- <location filename="../src/mainwindow.ui" line="441"/> +- <location filename="../src/mainwindow.cpp" line="1077"/> ++ <location filename="../src/mainwindow.ui" line="436"/> ++ <location filename="../src/mainwindow.cpp" line="875"/> + <source>Cancel</source> + <translation>Annuler</translation> + </message> + <message> +- <location filename="../src/mainwindow.ui" line="460"/> +- <location filename="../src/mainwindow.cpp" line="1073"/> ++ <location filename="../src/mainwindow.ui" line="461"/> ++ <location filename="../src/mainwindow.cpp" line="873"/> + <source>Authenticate</source> + <translation>Authentifier</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1079"/> +- <location filename="../src/mainwindow.cpp" line="1183"/> ++ <location filename="../src/mainwindow.cpp" line="876"/> + <source>Use password</source> + <translation>Utiliser le mot de passe</translation> + </message> +@@ -185,30 +192,30 @@ + <translation type="vanished">认证中,请稍等...</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1219"/> +- <location filename="../src/mainwindow.cpp" line="1292"/> +- <location filename="../src/mainwindow.cpp" line="1293"/> ++ <location filename="../src/mainwindow.cpp" line="1003"/> ++ <location filename="../src/mainwindow.cpp" line="1081"/> ++ <location filename="../src/mainwindow.cpp" line="1082"/> + <source>Please try again in %1 minutes.</source> + <translation>Veuillez réessayer dans %1 minutes.</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1230"/> +- <location filename="../src/mainwindow.cpp" line="1302"/> +- <location filename="../src/mainwindow.cpp" line="1303"/> ++ <location filename="../src/mainwindow.cpp" line="1015"/> ++ <location filename="../src/mainwindow.cpp" line="1093"/> ++ <location filename="../src/mainwindow.cpp" line="1094"/> + <source>Please try again in %1 seconds.</source> + <translation>Veuillez réessayer dans %1 secondes.</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1240"/> +- <location filename="../src/mainwindow.cpp" line="1241"/> +- <location filename="../src/mainwindow.cpp" line="1311"/> +- <location filename="../src/mainwindow.cpp" line="1312"/> ++ <location filename="../src/mainwindow.cpp" line="1026"/> ++ <location filename="../src/mainwindow.cpp" line="1027"/> ++ <location filename="../src/mainwindow.cpp" line="1104"/> ++ <location filename="../src/mainwindow.cpp" line="1105"/> + <source>Account locked permanently.</source> + <translation>Compte verrouillé définitivement.</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="834"/> +- <location filename="../src/mainwindow.cpp" line="835"/> ++ <location filename="../src/mainwindow.cpp" line="688"/> ++ <location filename="../src/mainwindow.cpp" line="689"/> + <source>Password cannot be empty</source> + <translation>Le mot de passe ne peut pas être vide</translation> + </message> +@@ -221,8 +228,8 @@ + <translation type="vanished">无法验证%1,请输入密码.</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="242"/> +- <location filename="../src/mainwindow.cpp" line="246"/> ++ <location filename="../src/mainwindow.cpp" line="1558"/> ++ <location filename="../src/mainwindow.cpp" line="1562"/> + <source>Failed to verify %1, you still have %2 verification opportunities</source> + <translation>Échec de la vérification %1, vous avez encore %2 possibilités de vérification</translation> + </message> +@@ -231,42 +238,42 @@ + <translation type="vanished">一个程序正试图执行一个需要特权的动作。要求授权以执行该动作。</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="731"/> ++ <location filename="../src/mainwindow.cpp" line="582"/> + <source>Password: </source> + <translation>Mot de passe: </translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="335"/> ++ <location filename="../src/mainwindow.cpp" line="165"/> + <source>Please enter your password or enroll your fingerprint </source> + <translation>Veuillez saisir votre mot de passe ou enregistrer votre empreinte digitale </translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="259"/> ++ <location filename="../src/mainwindow.cpp" line="1575"/> + <source>Abnormal network</source> + <translation>Réseau anormal</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="665"/> ++ <location filename="../src/mainwindow.cpp" line="517"/> + <source>This operation requires the administrator's authorization. Please enter your password to allow this operation.</source> + <translation>Cette opération nécessite l’autorisation de l’administrateur. Veuillez saisir votre mot de passe pour autoriser cette opération.</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="733"/> ++ <location filename="../src/mainwindow.cpp" line="584"/> + <source>_Password: </source> + <translation>_Mot de passe: </translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="735"/> ++ <location filename="../src/mainwindow.cpp" line="586"/> + <source>_Password:</source> + <translation>_Mot de passe:</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="850"/> ++ <location filename="../src/mainwindow.cpp" line="704"/> + <source>Authentication failed, please try again.</source> + <translation>L’authentification a échoué, veuillez réessayer.</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="779"/> ++ <location filename="../src/mainwindow.cpp" line="635"/> + <source>days left</source> + <translation>jours restants</translation> + </message> +@@ -279,16 +286,16 @@ + <translation type="vanished">生物/扫码验证失败,您还有%1次尝试机会</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="226"/> +- <location filename="../src/mainwindow.cpp" line="1415"/> +- <location filename="../src/mainwindow.cpp" line="1417"/> ++ <location filename="../src/mainwindow.cpp" line="1243"/> ++ <location filename="../src/mainwindow.cpp" line="1246"/> ++ <location filename="../src/mainwindow.cpp" line="1539"/> + <source>Failed to verify %1, please enter password to unlock</source> + <translation>Impossible de vérifier %1, veuillez entrer le mot de passe pour déverrouiller</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="231"/> +- <location filename="../src/mainwindow.cpp" line="233"/> +- <location filename="../src/mainwindow.cpp" line="1419"/> ++ <location filename="../src/mainwindow.cpp" line="1249"/> ++ <location filename="../src/mainwindow.cpp" line="1545"/> ++ <location filename="../src/mainwindow.cpp" line="1548"/> + <source>Unable to verify %1, please enter password to unlock</source> + <translation>Impossible de vérifier %1, veuillez entrer le mot de passe pour déverrouiller</translation> + </message> +@@ -297,86 +304,121 @@ + <translation type="vanished">网络异常</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="671"/> ++ <location filename="../src/mainwindow.cpp" line="522"/> + <source>A program is attempting to perform an action that requires privileges.It requires authorization to perform the action.</source> + <translation>Un programme tente d’effectuer une action qui nécessite des privilèges. Il nécessite une autorisation pour effectuer l’action.</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="108"/> +- <location filename="../src/mainwindow.cpp" line="729"/> ++ <location filename="../src/mainwindow.cpp" line="88"/> ++ <location filename="../src/mainwindow.cpp" line="580"/> + <source>Input Password</source> + <translation>Mot de passe d’entrée</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="105"/> ++ <location filename="../src/mainwindow.cpp" line="85"/> + <source>Insert the ukey into the USB port</source> + <translation type="unfinished"></translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="107"/> ++ <location filename="../src/mainwindow.cpp" line="87"/> + <source>Enter the ukey password</source> + <translation type="unfinished"></translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="783"/> ++ <location filename="../src/mainwindow.cpp" line="93"/> ++ <source>Close</source> ++ <translation type="unfinished"></translation> ++ </message> ++ <message> ++ <location filename="../src/mainwindow.cpp" line="1261"/> ++ <source>Facial recognition to authorization</source> ++ <translation type="unfinished"></translation> ++ </message> ++ <message> ++ <location filename="../src/mainwindow.cpp" line="1264"/> ++ <source>Fingerprint recognition to authorization</source> ++ <translation type="unfinished"></translation> ++ </message> ++ <message> ++ <location filename="../src/mainwindow.cpp" line="1267"/> ++ <source>Voiceprint recognition to authorization</source> ++ <translation type="unfinished"></translation> ++ </message> ++ <message> ++ <location filename="../src/mainwindow.cpp" line="1270"/> ++ <source>Finger veins recognition to authorization</source> ++ <translation type="unfinished"></translation> ++ </message> ++ <message> ++ <location filename="../src/mainwindow.cpp" line="1273"/> ++ <source>Iris recognition to authorization</source> ++ <translation type="unfinished"></translation> ++ </message> ++ <message> ++ <location filename="../src/mainwindow.cpp" line="1276"/> ++ <source>Use the bound wechat scanning code to authorization</source> ++ <translation type="unfinished"></translation> ++ </message> ++ <message> ++ <location filename="../src/mainwindow.cpp" line="1579"/> ++ <source>Acquisition failure</source> ++ <translation type="unfinished"></translation> ++ </message> ++ <message> ++ <location filename="../src/mainwindow.cpp" line="638"/> + <source>hours left</source> + <translation>Heures restantes</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="787"/> ++ <location filename="../src/mainwindow.cpp" line="641"/> + <source>minutes left</source> + <translation>minutes restantes</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="791"/> ++ <location filename="../src/mainwindow.cpp" line="644"/> + <source>seconds left</source> + <translation>secondes restantes</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="880"/> +- <location filename="../src/mainwindow.cpp" line="888"/> ++ <location filename="../src/mainwindow.cpp" line="734"/> ++ <location filename="../src/mainwindow.cpp" line="742"/> ++ <location filename="../src/mainwindow.cpp" line="1258"/> + <source>Input your password to authentication</source> + <translation type="unfinished"></translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1434"/> + <source>Verify face recognition or enter password to unlock</source> +- <translation>Vérifier la reconnaissance faciale ou saisir le mot de passe pour déverrouiller</translation> ++ <translation type="vanished">Vérifier la reconnaissance faciale ou saisir le mot de passe pour déverrouiller</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1439"/> + <source>Press fingerprint or enter password to unlock</source> +- <translation>Appuyez sur l’empreinte digitale ou entrez le mot de passe pour déverrouiller</translation> ++ <translation type="vanished">Appuyez sur l’empreinte digitale ou entrez le mot de passe pour déverrouiller</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1444"/> + <source>Verify voiceprint or enter password to unlock</source> +- <translation>Vérifier l’empreinte vocale ou saisir le mot de passe pour déverrouiller</translation> ++ <translation type="vanished">Vérifier l’empreinte vocale ou saisir le mot de passe pour déverrouiller</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1449"/> + <source>Verify finger vein or enter password to unlock</source> +- <translation>Vérifiez la veine du doigt ou entrez le mot de passe pour déverrouiller</translation> ++ <translation type="vanished">Vérifiez la veine du doigt ou entrez le mot de passe pour déverrouiller</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1454"/> + <source>Verify iris or enter password to unlock</source> +- <translation>Vérifiez l’iris ou entrez le mot de passe pour déverrouiller</translation> ++ <translation type="vanished">Vérifiez l’iris ou entrez le mot de passe pour déverrouiller</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1459"/> + <source>Use the bound wechat scanning code or enter the password to unlock</source> +- <translation>Utilisez le code d’analyse wechat lié ou entrez le mot de passe pour déverrouiller</translation> ++ <translation type="vanished">Utilisez le code d’analyse wechat lié ou entrez le mot de passe pour déverrouiller</translation> + </message> + <message> + <source>Use the bound wechat scanning code or enter the password to log in</source> + <translation type="vanished">使用绑定的微信扫码或输入密码登录</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="779"/> +- <location filename="../src/mainwindow.cpp" line="783"/> +- <location filename="../src/mainwindow.cpp" line="787"/> +- <location filename="../src/mainwindow.cpp" line="791"/> ++ <location filename="../src/mainwindow.cpp" line="635"/> ++ <location filename="../src/mainwindow.cpp" line="638"/> ++ <location filename="../src/mainwindow.cpp" line="641"/> ++ <location filename="../src/mainwindow.cpp" line="644"/> + <source>Account locked,</source> + <translation>Compte verrouillé,</translation> + </message> +@@ -388,17 +430,17 @@ + <context> + <name>PolkitListener</name> + <message> +- <location filename="../src/PolkitListener.cpp" line="88"/> ++ <location filename="../src/PolkitListener.cpp" line="86"/> + <source>Another client is already authenticating, please try again later.</source> + <translation>Un autre client est déjà en train de s’authentifier, veuillez réessayer plus tard.</translation> + </message> + <message> +- <location filename="../src/PolkitListener.cpp" line="265"/> ++ <location filename="../src/PolkitListener.cpp" line="253"/> + <source>Authentication failure, please try again.</source> + <translation>Échec de l’authentification, veuillez réessayer.</translation> + </message> + <message> +- <location filename="../src/PolkitListener.cpp" line="272"/> ++ <location filename="../src/PolkitListener.cpp" line="259"/> + <source>Password input error!</source> + <translation>Erreur de saisie du mot de passe !</translation> + </message> +diff --git a/polkit-agent/i18n_ts/kk.ts b/polkit-agent/i18n_ts/kk.ts +index d112f69..4a77b8f 100644 +--- a/polkit-agent/i18n_ts/kk.ts ++++ b/polkit-agent/i18n_ts/kk.ts +@@ -51,6 +51,15 @@ + <translation type="vanished">二维码</translation> + </message> + </context> ++<context> ++ <name>FullScreenBackground</name> ++ <message> ++ <location filename="../src/fullscreenbackground.cpp" line="75"/> ++ <location filename="../src/fullscreenbackground.cpp" line="104"/> ++ <source>Authentication</source> ++ <translation type="unfinished">شىندىقتى دالەلدەۋ</translation> ++ </message> ++</context> + <context> + <name>LoginOptionsWidget</name> + <message> +@@ -65,9 +74,8 @@ + <context> + <name>MainWindow</name> + <message> +- <location filename="../src/mainwindow.cpp" line="66"/> + <source>Authentication</source> +- <translation>شىندىقتى دالەلدەۋ</translation> ++ <translation type="vanished">شىندىقتى دالەلدەۋ</translation> + </message> + <message> + <source>Fingerprint authentication failed, you still have %1 verification opportunities</source> +@@ -91,14 +99,14 @@ + <translation type="vanished">密码</translation> + </message> + <message> +- <location filename="../src/mainwindow.ui" line="409"/> +- <location filename="../src/mainwindow.cpp" line="1075"/> +- <location filename="../src/mainwindow.cpp" line="1143"/> ++ <location filename="../src/mainwindow.ui" line="398"/> ++ <location filename="../src/mainwindow.cpp" line="874"/> ++ <location filename="../src/mainwindow.cpp" line="943"/> + <source>Biometric</source> + <translation>بىئولەگىيەلىك ەرەكشەلىكتى ٸستەتۋ</translation> + </message> + <message> +- <location filename="../src/mainwindow.ui" line="480"/> ++ <location filename="../src/mainwindow.ui" line="493"/> + <source>use password</source> + <translation>قۇپيا نومەر ٸستەتۋ</translation> + </message> +@@ -147,20 +155,19 @@ + <translation type="vanished">Polkit.caller-pid:</translation> + </message> + <message> +- <location filename="../src/mainwindow.ui" line="441"/> +- <location filename="../src/mainwindow.cpp" line="1077"/> ++ <location filename="../src/mainwindow.ui" line="436"/> ++ <location filename="../src/mainwindow.cpp" line="875"/> + <source>Cancel</source> + <translation>كۇشىنەن قالدىرۋ</translation> + </message> + <message> +- <location filename="../src/mainwindow.ui" line="460"/> +- <location filename="../src/mainwindow.cpp" line="1073"/> ++ <location filename="../src/mainwindow.ui" line="461"/> ++ <location filename="../src/mainwindow.cpp" line="873"/> + <source>Authenticate</source> + <translation>ۇقىق بەرۋ</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1079"/> +- <location filename="../src/mainwindow.cpp" line="1183"/> ++ <location filename="../src/mainwindow.cpp" line="876"/> + <source>Use password</source> + <translation>قۇپيا نومەر ٸستەتۋ ارقىلى دالەلدەۋ</translation> + </message> +@@ -185,30 +192,30 @@ + <translation type="vanished">认证中,请稍等...</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1219"/> +- <location filename="../src/mainwindow.cpp" line="1292"/> +- <location filename="../src/mainwindow.cpp" line="1293"/> ++ <location filename="../src/mainwindow.cpp" line="1003"/> ++ <location filename="../src/mainwindow.cpp" line="1081"/> ++ <location filename="../src/mainwindow.cpp" line="1082"/> + <source>Please try again in %1 minutes.</source> + <translation>٪1 مينۋت ٸشٸندە قاتە سىناپ كور.</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1230"/> +- <location filename="../src/mainwindow.cpp" line="1302"/> +- <location filename="../src/mainwindow.cpp" line="1303"/> ++ <location filename="../src/mainwindow.cpp" line="1015"/> ++ <location filename="../src/mainwindow.cpp" line="1093"/> ++ <location filename="../src/mainwindow.cpp" line="1094"/> + <source>Please try again in %1 seconds.</source> + <translation>٪1 سەكونت ٸشٸندە قاتە سىناپ كور.</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1240"/> +- <location filename="../src/mainwindow.cpp" line="1241"/> +- <location filename="../src/mainwindow.cpp" line="1311"/> +- <location filename="../src/mainwindow.cpp" line="1312"/> ++ <location filename="../src/mainwindow.cpp" line="1026"/> ++ <location filename="../src/mainwindow.cpp" line="1027"/> ++ <location filename="../src/mainwindow.cpp" line="1104"/> ++ <location filename="../src/mainwindow.cpp" line="1105"/> + <source>Account locked permanently.</source> + <translation>ەسەپات ماڭگىلىك قۇلىپتالادى.</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="834"/> +- <location filename="../src/mainwindow.cpp" line="835"/> ++ <location filename="../src/mainwindow.cpp" line="688"/> ++ <location filename="../src/mainwindow.cpp" line="689"/> + <source>Password cannot be empty</source> + <translation>قۇپيا نۇمىردى بوس قويۋعا بولمايدى</translation> + </message> +@@ -221,8 +228,8 @@ + <translation type="vanished">无法验证%1,请输入密码.</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="242"/> +- <location filename="../src/mainwindow.cpp" line="246"/> ++ <location filename="../src/mainwindow.cpp" line="1558"/> ++ <location filename="../src/mainwindow.cpp" line="1562"/> + <source>Failed to verify %1, you still have %2 verification opportunities</source> + <translation>٪1 نى دالەلدەۋ جەڭىلىپ قالدى، سىزدە جانەدە ٪2 دالەلدەۋ ورايى بار</translation> + </message> +@@ -231,42 +238,42 @@ + <translation type="vanished">一个程序正试图执行一个需要特权的动作。要求授权以执行该动作。</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="731"/> ++ <location filename="../src/mainwindow.cpp" line="582"/> + <source>Password: </source> + <translation>قۇپيا نومەر </translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="335"/> ++ <location filename="../src/mainwindow.cpp" line="165"/> + <source>Please enter your password or enroll your fingerprint </source> + <translation>قۇپيا نۇمىرىڭىزدى كىرگىزىڭىز ياكي بارماقشى ئىزىڭىزنى تونۇتۇڭ </translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="259"/> ++ <location filename="../src/mainwindow.cpp" line="1575"/> + <source>Abnormal network</source> + <translation>بينورمال تور</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="665"/> ++ <location filename="../src/mainwindow.cpp" line="517"/> + <source>This operation requires the administrator's authorization. Please enter your password to allow this operation.</source> + <translation>نۇ جوبالاۋ باسقارعٸشتٸڭ ۇقىق بىرىستى تالاپ ىستەيدى.قۇپيا نۇمىردى كىرەۈزۈپ بي رەتكى جوبالاۋنىڭ الىپ بېرىلىشىغا جول قويىڭىز.</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="733"/> ++ <location filename="../src/mainwindow.cpp" line="584"/> + <source>_Password: </source> + <translation>قۇپيا نومەر </translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="735"/> ++ <location filename="../src/mainwindow.cpp" line="586"/> + <source>_Password:</source> + <translation>قۇپيا نومەر</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="850"/> ++ <location filename="../src/mainwindow.cpp" line="704"/> + <source>Authentication failed, please try again.</source> + <translation>دالەلدەۋ جەڭىلىپ قالدى، قاتە سىناڭ</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="779"/> ++ <location filename="../src/mainwindow.cpp" line="635"/> + <source>days left</source> + <translation>1 كۇننەن كەيىن سناپ كور</translation> + </message> +@@ -279,16 +286,16 @@ + <translation type="vanished">生物/扫码验证失败,您还有%1次尝试机会</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="226"/> +- <location filename="../src/mainwindow.cpp" line="1415"/> +- <location filename="../src/mainwindow.cpp" line="1417"/> ++ <location filename="../src/mainwindow.cpp" line="1243"/> ++ <location filename="../src/mainwindow.cpp" line="1246"/> ++ <location filename="../src/mainwindow.cpp" line="1539"/> + <source>Failed to verify %1, please enter password to unlock</source> + <translation>٪1 نى دالەلدەۋ جەڭىلىپ قالدى، قۇپيا نومەر كىرگىزىڭىز</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="231"/> +- <location filename="../src/mainwindow.cpp" line="233"/> +- <location filename="../src/mainwindow.cpp" line="1419"/> ++ <location filename="../src/mainwindow.cpp" line="1249"/> ++ <location filename="../src/mainwindow.cpp" line="1545"/> ++ <location filename="../src/mainwindow.cpp" line="1548"/> + <source>Unable to verify %1, please enter password to unlock</source> + <translation>٪1 نى دالەلدەۋگە امالسٸز، قۇپيا نۇمىردى كىرەۈزۈپ قۇلىبىن ٴٸشڭٸز</translation> + </message> +@@ -297,86 +304,121 @@ + <translation type="vanished">网络异常</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="671"/> ++ <location filename="../src/mainwindow.cpp" line="522"/> + <source>A program is attempting to perform an action that requires privileges.It requires authorization to perform the action.</source> + <translation>بٸر پٸروگٸرامما ۇقىق تالاپ ىستەيتىن ارەكەتتى ىستەۋگە ئۇرۇنماقتا. نۇ ارەكەتتى اتقار ەتۋ ٷشٸن ۇقىق تالاپ ىستەيدى.</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="108"/> +- <location filename="../src/mainwindow.cpp" line="729"/> ++ <location filename="../src/mainwindow.cpp" line="88"/> ++ <location filename="../src/mainwindow.cpp" line="580"/> + <source>Input Password</source> + <translation>قۇپيا نومەر كىرگىزۋ</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="105"/> ++ <location filename="../src/mainwindow.cpp" line="85"/> + <source>Insert the ukey into the USB port</source> + <translation>ukey نى USB اۋزىنا چېتىپ قويىڭىز</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="107"/> ++ <location filename="../src/mainwindow.cpp" line="87"/> + <source>Enter the ukey password</source> + <translation>ukey قۇپيا نۇمىردى كىرگىزىڭىز</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="783"/> ++ <location filename="../src/mainwindow.cpp" line="93"/> ++ <source>Close</source> ++ <translation type="unfinished"></translation> ++ </message> ++ <message> ++ <location filename="../src/mainwindow.cpp" line="1261"/> ++ <source>Facial recognition to authorization</source> ++ <translation type="unfinished"></translation> ++ </message> ++ <message> ++ <location filename="../src/mainwindow.cpp" line="1264"/> ++ <source>Fingerprint recognition to authorization</source> ++ <translation type="unfinished"></translation> ++ </message> ++ <message> ++ <location filename="../src/mainwindow.cpp" line="1267"/> ++ <source>Voiceprint recognition to authorization</source> ++ <translation type="unfinished"></translation> ++ </message> ++ <message> ++ <location filename="../src/mainwindow.cpp" line="1270"/> ++ <source>Finger veins recognition to authorization</source> ++ <translation type="unfinished"></translation> ++ </message> ++ <message> ++ <location filename="../src/mainwindow.cpp" line="1273"/> ++ <source>Iris recognition to authorization</source> ++ <translation type="unfinished"></translation> ++ </message> ++ <message> ++ <location filename="../src/mainwindow.cpp" line="1276"/> ++ <source>Use the bound wechat scanning code to authorization</source> ++ <translation type="unfinished"></translation> ++ </message> ++ <message> ++ <location filename="../src/mainwindow.cpp" line="1579"/> ++ <source>Acquisition failure</source> ++ <translation type="unfinished"></translation> ++ </message> ++ <message> ++ <location filename="../src/mainwindow.cpp" line="638"/> + <source>hours left</source> + <translation>بٸر ساعاتتان كەيىن اشٸلدٸ</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="787"/> ++ <location filename="../src/mainwindow.cpp" line="641"/> + <source>minutes left</source> + <translation>بٸر مينوتتىن كەيىن اشٸلدٸ</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="791"/> ++ <location filename="../src/mainwindow.cpp" line="644"/> + <source>seconds left</source> + <translation>بٸر سەكونتىن كەيىن اشٸلدٸ</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="880"/> +- <location filename="../src/mainwindow.cpp" line="888"/> ++ <location filename="../src/mainwindow.cpp" line="734"/> ++ <location filename="../src/mainwindow.cpp" line="742"/> ++ <location filename="../src/mainwindow.cpp" line="1258"/> + <source>Input your password to authentication</source> + <translation>قۇپيا نۇمىردى كىرەۈزۈپ ازاماتتىق كۋالىك دالەلدەۋ.</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1434"/> + <source>Verify face recognition or enter password to unlock</source> +- <translation>چىراي تانىسن دالەلدەۋ ياكي قۇپيا نومەر كىرگىزۋ ارقىلى قۇلىپ ٸشٸۋ</translation> ++ <translation type="vanished">چىراي تانىسن دالەلدەۋ ياكي قۇپيا نومەر كىرگىزۋ ارقىلى قۇلىپ ٸشٸۋ</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1439"/> + <source>Press fingerprint or enter password to unlock</source> +- <translation>بارماقشى ٴٸزدٸ باسٸۋ ياكي قۇپيا نومەر كىرگىزۋ ارقىلى قۇلىپ ٸشٸۋ</translation> ++ <translation type="vanished">بارماقشى ٴٸزدٸ باسٸۋ ياكي قۇپيا نومەر كىرگىزۋ ارقىلى قۇلىپ ٸشٸۋ</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1444"/> + <source>Verify voiceprint or enter password to unlock</source> +- <translation>اۋا ٴٸزدٸ دالەلدەۋ ياكي قۇپيا نومەر كىرگىزۋ ارقىلى قۇلىپ ٸشٸۋ</translation> ++ <translation type="vanished">اۋا ٴٸزدٸ دالەلدەۋ ياكي قۇپيا نومەر كىرگىزۋ ارقىلى قۇلىپ ٸشٸۋ</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1449"/> + <source>Verify finger vein or enter password to unlock</source> +- <translation>بارماقشى ٴٸزٸ ارقىلى انىقتاۋ ياكي قۇپيا نومەر كىرگىزۋ ارقىلى قۇلىپ ٸشٸۋ</translation> ++ <translation type="vanished">بارماقشى ٴٸزٸ ارقىلى انىقتاۋ ياكي قۇپيا نومەر كىرگىزۋ ارقىلى قۇلىپ ٸشٸۋ</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1454"/> + <source>Verify iris or enter password to unlock</source> +- <translation>Iris نى انىقتاۋ ياكي قۇپيا نومەر كىرگىزۋ ارقىلى قۇلىپ ٸشٸۋ</translation> ++ <translation type="vanished">Iris نى انىقتاۋ ياكي قۇپيا نومەر كىرگىزۋ ارقىلى قۇلىپ ٸشٸۋ</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1459"/> + <source>Use the bound wechat scanning code or enter the password to unlock</source> +- <translation>بايلانعان ئۈندىدارنى كەسكىندەۋ بەلگىسى ياكي قۇپيا نۇمىردى كىرەۈزۈپ قۇلىپ ٸشٸۋ</translation> ++ <translation type="vanished">بايلانعان ئۈندىدارنى كەسكىندەۋ بەلگىسى ياكي قۇپيا نۇمىردى كىرەۈزۈپ قۇلىپ ٸشٸۋ</translation> + </message> + <message> + <source>Use the bound wechat scanning code or enter the password to log in</source> + <translation type="vanished">使用绑定的微信扫码或输入密码登录</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="779"/> +- <location filename="../src/mainwindow.cpp" line="783"/> +- <location filename="../src/mainwindow.cpp" line="787"/> +- <location filename="../src/mainwindow.cpp" line="791"/> ++ <location filename="../src/mainwindow.cpp" line="635"/> ++ <location filename="../src/mainwindow.cpp" line="638"/> ++ <location filename="../src/mainwindow.cpp" line="641"/> ++ <location filename="../src/mainwindow.cpp" line="644"/> + <source>Account locked,</source> + <translation>ٸستەتۋ نومەرىڭىز قۇلىپتانىپ قالدى</translation> + </message> +@@ -388,17 +430,17 @@ + <context> + <name>PolkitListener</name> + <message> +- <location filename="../src/PolkitListener.cpp" line="88"/> ++ <location filename="../src/PolkitListener.cpp" line="86"/> + <source>Another client is already authenticating, please try again later.</source> + <translation>جانە بٸر قاريدار دالەلدەپ جاتىر، سەل تۇرٸپ قاتە سىناڭ.</translation> + </message> + <message> +- <location filename="../src/PolkitListener.cpp" line="265"/> ++ <location filename="../src/PolkitListener.cpp" line="253"/> + <source>Authentication failure, please try again.</source> + <translation>دالەلدەۋ جەڭىلىپ قالدى، قاتە سىناڭ.</translation> + </message> + <message> +- <location filename="../src/PolkitListener.cpp" line="272"/> ++ <location filename="../src/PolkitListener.cpp" line="259"/> + <source>Password input error!</source> + <translation>كىرگىزگەن قۇپيا نومەر قاتە قالدى</translation> + </message> +diff --git a/polkit-agent/i18n_ts/ky.ts b/polkit-agent/i18n_ts/ky.ts +index 8ccad26..47cb3c6 100644 +--- a/polkit-agent/i18n_ts/ky.ts ++++ b/polkit-agent/i18n_ts/ky.ts +@@ -51,6 +51,15 @@ + <translation type="vanished">二维码</translation> + </message> + </context> ++<context> ++ <name>FullScreenBackground</name> ++ <message> ++ <location filename="../src/fullscreenbackground.cpp" line="75"/> ++ <location filename="../src/fullscreenbackground.cpp" line="104"/> ++ <source>Authentication</source> ++ <translation type="unfinished">راستىنى دالىلدۅ</translation> ++ </message> ++</context> + <context> + <name>LoginOptionsWidget</name> + <message> +@@ -65,9 +74,8 @@ + <context> + <name>MainWindow</name> + <message> +- <location filename="../src/mainwindow.cpp" line="66"/> + <source>Authentication</source> +- <translation>راستىنى دالىلدۅ</translation> ++ <translation type="vanished">راستىنى دالىلدۅ</translation> + </message> + <message> + <source>Fingerprint authentication failed, you still have %1 verification opportunities</source> +@@ -91,14 +99,14 @@ + <translation type="vanished">密码</translation> + </message> + <message> +- <location filename="../src/mainwindow.ui" line="409"/> +- <location filename="../src/mainwindow.cpp" line="1075"/> +- <location filename="../src/mainwindow.cpp" line="1143"/> ++ <location filename="../src/mainwindow.ui" line="398"/> ++ <location filename="../src/mainwindow.cpp" line="874"/> ++ <location filename="../src/mainwindow.cpp" line="943"/> + <source>Biometric</source> + <translation>بىئولەگىيەلىك ۅزگۅچۅلۉگۉ ىشتەتىش</translation> + </message> + <message> +- <location filename="../src/mainwindow.ui" line="480"/> ++ <location filename="../src/mainwindow.ui" line="493"/> + <source>use password</source> + <translation>جاشىرۇۇن نومۇر ىشتەتىش</translation> + </message> +@@ -147,20 +155,19 @@ + <translation type="vanished">Polkit.caller-pid:</translation> + </message> + <message> +- <location filename="../src/mainwindow.ui" line="441"/> +- <location filename="../src/mainwindow.cpp" line="1077"/> ++ <location filename="../src/mainwindow.ui" line="436"/> ++ <location filename="../src/mainwindow.cpp" line="875"/> + <source>Cancel</source> + <translation>ارعادان قالتىرىش</translation> + </message> + <message> +- <location filename="../src/mainwindow.ui" line="460"/> +- <location filename="../src/mainwindow.cpp" line="1073"/> ++ <location filename="../src/mainwindow.ui" line="461"/> ++ <location filename="../src/mainwindow.cpp" line="873"/> + <source>Authenticate</source> + <translation>ۇقۇق بەرۉۉ</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1079"/> +- <location filename="../src/mainwindow.cpp" line="1183"/> ++ <location filename="../src/mainwindow.cpp" line="876"/> + <source>Use password</source> + <translation>جاشىرۇۇن نومۇر ىشتەتىش ارقىلۇۇ دالىلدۅ</translation> + </message> +@@ -185,30 +192,30 @@ + <translation type="vanished">认证中,请稍等...</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1219"/> +- <location filename="../src/mainwindow.cpp" line="1292"/> +- <location filename="../src/mainwindow.cpp" line="1293"/> ++ <location filename="../src/mainwindow.cpp" line="1003"/> ++ <location filename="../src/mainwindow.cpp" line="1081"/> ++ <location filename="../src/mainwindow.cpp" line="1082"/> + <source>Please try again in %1 minutes.</source> + <translation>٪1 مىنۇت ىچىندە قايرا سىناپ باعىڭ.</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1230"/> +- <location filename="../src/mainwindow.cpp" line="1302"/> +- <location filename="../src/mainwindow.cpp" line="1303"/> ++ <location filename="../src/mainwindow.cpp" line="1015"/> ++ <location filename="../src/mainwindow.cpp" line="1093"/> ++ <location filename="../src/mainwindow.cpp" line="1094"/> + <source>Please try again in %1 seconds.</source> + <translation>٪1 سىكونت ىچىندە قايرا سىناپ باعىڭ.</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1240"/> +- <location filename="../src/mainwindow.cpp" line="1241"/> +- <location filename="../src/mainwindow.cpp" line="1311"/> +- <location filename="../src/mainwindow.cpp" line="1312"/> ++ <location filename="../src/mainwindow.cpp" line="1026"/> ++ <location filename="../src/mainwindow.cpp" line="1027"/> ++ <location filename="../src/mainwindow.cpp" line="1104"/> ++ <location filename="../src/mainwindow.cpp" line="1105"/> + <source>Account locked permanently.</source> + <translation>ەسابات تۉبۅلۉك قۇلۇپلىنىدۇ.</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="834"/> +- <location filename="../src/mainwindow.cpp" line="835"/> ++ <location filename="../src/mainwindow.cpp" line="688"/> ++ <location filename="../src/mainwindow.cpp" line="689"/> + <source>Password cannot be empty</source> + <translation>جاشىرۇۇن نومۇردۇ بوش ،بەكەر قويۇشقا بولبويت</translation> + </message> +@@ -221,8 +228,8 @@ + <translation type="vanished">无法验证%1,请输入密码.</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="242"/> +- <location filename="../src/mainwindow.cpp" line="246"/> ++ <location filename="../src/mainwindow.cpp" line="1558"/> ++ <location filename="../src/mainwindow.cpp" line="1562"/> + <source>Failed to verify %1, you still have %2 verification opportunities</source> + <translation>٪1 نى دالىلدۅ جەڭىلۉۉ بولدۇ ، سىزدە داعى ەلە ٪2 دالىلدۅ مۅۅرتۉ بار</translation> + </message> +@@ -231,42 +238,42 @@ + <translation type="vanished">一个程序正试图执行一个需要特权的动作。要求授权以执行该动作。</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="731"/> ++ <location filename="../src/mainwindow.cpp" line="582"/> + <source>Password: </source> + <translation>جاشىرۇۇن نومۇر </translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="335"/> ++ <location filename="../src/mainwindow.cpp" line="165"/> + <source>Please enter your password or enroll your fingerprint </source> + <translation>جاشىرۇۇن نومۇرۇڭۇزدۇ كىرگىزىڭ كۅرۉنۉشتۅرۉ بارماق ئىزىڭىزنى تونۇتۇڭ </translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="259"/> ++ <location filename="../src/mainwindow.cpp" line="1575"/> + <source>Abnormal network</source> + <translation>بۅتۅنچۅ تور</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="665"/> ++ <location filename="../src/mainwindow.cpp" line="517"/> + <source>This operation requires the administrator's authorization. Please enter your password to allow this operation.</source> + <translation>بۇل ماشقۇلدانۇۇ باشقارۇۇچۇنۇن ۇقۇق بەرۉۉنۉ تالاپ جاسايت .جاشىرۇۇن نومۇردۇ كىيىرىپ بي قاتىمقى ماشقۇلدانۇۇ نىڭ الىپ بېرىلىشىغا جول قويۇڭ.</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="733"/> ++ <location filename="../src/mainwindow.cpp" line="584"/> + <source>_Password: </source> + <translation>جاشىرۇۇن نومۇر </translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="735"/> ++ <location filename="../src/mainwindow.cpp" line="586"/> + <source>_Password:</source> + <translation>جاشىرۇۇن نومۇر</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="850"/> ++ <location filename="../src/mainwindow.cpp" line="704"/> + <source>Authentication failed, please try again.</source> + <translation>دالىلدۅ جەڭىلۉۉ بولدۇ ، قايرا سىناڭ</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="779"/> ++ <location filename="../src/mainwindow.cpp" line="635"/> + <source>days left</source> + <translation>1 كۉندۅن كىيىن سىناپ باعىڭ</translation> + </message> +@@ -279,16 +286,16 @@ + <translation type="vanished">生物/扫码验证失败,您还有%1次尝试机会</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="226"/> +- <location filename="../src/mainwindow.cpp" line="1415"/> +- <location filename="../src/mainwindow.cpp" line="1417"/> ++ <location filename="../src/mainwindow.cpp" line="1243"/> ++ <location filename="../src/mainwindow.cpp" line="1246"/> ++ <location filename="../src/mainwindow.cpp" line="1539"/> + <source>Failed to verify %1, please enter password to unlock</source> + <translation>٪1 نى دالىلدۅ جەڭىلۉۉ بولدۇ ، سىرلۇۇ نومۇر كىرگىزىڭ</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="231"/> +- <location filename="../src/mainwindow.cpp" line="233"/> +- <location filename="../src/mainwindow.cpp" line="1419"/> ++ <location filename="../src/mainwindow.cpp" line="1249"/> ++ <location filename="../src/mainwindow.cpp" line="1545"/> ++ <location filename="../src/mainwindow.cpp" line="1548"/> + <source>Unable to verify %1, please enter password to unlock</source> + <translation>٪1 نى دالىلدۅۅگۅ ايلاسىز، جاشىرۇۇن نومۇردۇ كىيىرىپ قۇلۇپنى اچىڭ</translation> + </message> +@@ -297,86 +304,121 @@ + <translation type="vanished">网络异常</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="671"/> ++ <location filename="../src/mainwindow.cpp" line="522"/> + <source>A program is attempting to perform an action that requires privileges.It requires authorization to perform the action.</source> + <translation>بىر پراگرامما ۇقۇق تالاپ جاسايتۇرعان قىيمىلدى جاسووعو ئۇرۇنماقتا. بۇل قىيمىلدى اتقارماق جاسوو ،اتقارۇۇ ۉچۉن ۇقۇق تالاپ جاسايت .</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="108"/> +- <location filename="../src/mainwindow.cpp" line="729"/> ++ <location filename="../src/mainwindow.cpp" line="88"/> ++ <location filename="../src/mainwindow.cpp" line="580"/> + <source>Input Password</source> + <translation>جاشىرۇۇن نومۇر كىرگىزۉۉ</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="105"/> ++ <location filename="../src/mainwindow.cpp" line="85"/> + <source>Insert the ukey into the USB port</source> + <translation>ukey نى USB ووزۇنا چېتىپ قويۇڭ</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="107"/> ++ <location filename="../src/mainwindow.cpp" line="87"/> + <source>Enter the ukey password</source> + <translation>ukey جاشىرۇۇن نومۇرۇن كىرگىزىڭ</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="783"/> ++ <location filename="../src/mainwindow.cpp" line="93"/> ++ <source>Close</source> ++ <translation type="unfinished"></translation> ++ </message> ++ <message> ++ <location filename="../src/mainwindow.cpp" line="1261"/> ++ <source>Facial recognition to authorization</source> ++ <translation type="unfinished"></translation> ++ </message> ++ <message> ++ <location filename="../src/mainwindow.cpp" line="1264"/> ++ <source>Fingerprint recognition to authorization</source> ++ <translation type="unfinished"></translation> ++ </message> ++ <message> ++ <location filename="../src/mainwindow.cpp" line="1267"/> ++ <source>Voiceprint recognition to authorization</source> ++ <translation type="unfinished"></translation> ++ </message> ++ <message> ++ <location filename="../src/mainwindow.cpp" line="1270"/> ++ <source>Finger veins recognition to authorization</source> ++ <translation type="unfinished"></translation> ++ </message> ++ <message> ++ <location filename="../src/mainwindow.cpp" line="1273"/> ++ <source>Iris recognition to authorization</source> ++ <translation type="unfinished"></translation> ++ </message> ++ <message> ++ <location filename="../src/mainwindow.cpp" line="1276"/> ++ <source>Use the bound wechat scanning code to authorization</source> ++ <translation type="unfinished"></translation> ++ </message> ++ <message> ++ <location filename="../src/mainwindow.cpp" line="1579"/> ++ <source>Acquisition failure</source> ++ <translation type="unfinished"></translation> ++ </message> ++ <message> ++ <location filename="../src/mainwindow.cpp" line="638"/> + <source>hours left</source> + <translation>بىر سائەتتىن كىيىن اچىلات</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="787"/> ++ <location filename="../src/mainwindow.cpp" line="641"/> + <source>minutes left</source> + <translation>بىر مىنۇتتان كىيىن اچىلات</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="791"/> ++ <location filename="../src/mainwindow.cpp" line="644"/> + <source>seconds left</source> + <translation>بىر سەكۇنتتان كىيىن اچىلات</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="880"/> +- <location filename="../src/mainwindow.cpp" line="888"/> ++ <location filename="../src/mainwindow.cpp" line="734"/> ++ <location filename="../src/mainwindow.cpp" line="742"/> ++ <location filename="../src/mainwindow.cpp" line="1258"/> + <source>Input your password to authentication</source> + <translation>جاشىرۇۇن نومۇردۇ كىيىرىپ كۉبۅلۉك دالىلدۅ.</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1434"/> + <source>Verify face recognition or enter password to unlock</source> +- <translation>چىراي تاانىشتى دالىلدۅ كۅرۉنۉشتۅرۉ جاشىرۇۇن نومۇر كىرگىزۉۉ ارقىلۇۇ قۇلپ اچۇۇ</translation> ++ <translation type="vanished">چىراي تاانىشتى دالىلدۅ كۅرۉنۉشتۅرۉ جاشىرۇۇن نومۇر كىرگىزۉۉ ارقىلۇۇ قۇلپ اچۇۇ</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1439"/> + <source>Press fingerprint or enter password to unlock</source> +- <translation>بارماق ىزىن باسۇۇدا كۅرۉنۉشتۅرۉ جاشىرۇۇن نومۇر كىرگىزۉۉ ارقىلۇۇ قۇلپ اچۇۇ</translation> ++ <translation type="vanished">بارماق ىزىن باسۇۇدا كۅرۉنۉشتۅرۉ جاشىرۇۇن نومۇر كىرگىزۉۉ ارقىلۇۇ قۇلپ اچۇۇ</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1444"/> + <source>Verify voiceprint or enter password to unlock</source> +- <translation>دووش ىزىن دالىلدۅ كۅرۉنۉشتۅرۉ جاشىرۇۇن نومۇر كىرگىزۉۉ ارقىلۇۇ قۇلپ اچۇۇ</translation> ++ <translation type="vanished">دووش ىزىن دالىلدۅ كۅرۉنۉشتۅرۉ جاشىرۇۇن نومۇر كىرگىزۉۉ ارقىلۇۇ قۇلپ اچۇۇ</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1449"/> + <source>Verify finger vein or enter password to unlock</source> +- <translation>بارماق ئزى ارقىلۇۇ انىقتاش كۅرۉنۉشتۅرۉ جاشىرۇۇن نومۇر كىرگىزۉۉ ارقىلۇۇ قۇلپ اچۇۇ</translation> ++ <translation type="vanished">بارماق ئزى ارقىلۇۇ انىقتاش كۅرۉنۉشتۅرۉ جاشىرۇۇن نومۇر كىرگىزۉۉ ارقىلۇۇ قۇلپ اچۇۇ</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1454"/> + <source>Verify iris or enter password to unlock</source> +- <translation>Iris نى انىقتاش كۅرۉنۉشتۅرۉ جاشىرۇۇن نومۇر كىرگىزۉۉ ارقىلۇۇ قۇلپ اچۇۇ</translation> ++ <translation type="vanished">Iris نى انىقتاش كۅرۉنۉشتۅرۉ جاشىرۇۇن نومۇر كىرگىزۉۉ ارقىلۇۇ قۇلپ اچۇۇ</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1459"/> + <source>Use the bound wechat scanning code or enter the password to unlock</source> +- <translation>بايلانعان ئۈندىدارنى ىسكاننىردوو قۇپۇيا نومۇرۇ كۅرۉنۉشتۅرۉ جاشىرۇۇن نومۇرۇن كىيىرىپ قۇلپ اچۇۇ</translation> ++ <translation type="vanished">بايلانعان ئۈندىدارنى ىسكاننىردوو قۇپۇيا نومۇرۇ كۅرۉنۉشتۅرۉ جاشىرۇۇن نومۇرۇن كىيىرىپ قۇلپ اچۇۇ</translation> + </message> + <message> + <source>Use the bound wechat scanning code or enter the password to log in</source> + <translation type="vanished">使用绑定的微信扫码或输入密码登录</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="779"/> +- <location filename="../src/mainwindow.cpp" line="783"/> +- <location filename="../src/mainwindow.cpp" line="787"/> +- <location filename="../src/mainwindow.cpp" line="791"/> ++ <location filename="../src/mainwindow.cpp" line="635"/> ++ <location filename="../src/mainwindow.cpp" line="638"/> ++ <location filename="../src/mainwindow.cpp" line="641"/> ++ <location filename="../src/mainwindow.cpp" line="644"/> + <source>Account locked,</source> + <translation>ىشتەتىش نومۇرۇڭۇز قۇلۇپتالىپ قالدى</translation> + </message> +@@ -388,17 +430,17 @@ + <context> + <name>PolkitListener</name> + <message> +- <location filename="../src/PolkitListener.cpp" line="88"/> ++ <location filename="../src/PolkitListener.cpp" line="86"/> + <source>Another client is already authenticating, please try again later.</source> + <translation>داعى بىر سووداگەر ، جولووچۇ دالىلدەپ جاتات، سەل تۇرۇپ قايرا سىناڭ.</translation> + </message> + <message> +- <location filename="../src/PolkitListener.cpp" line="265"/> ++ <location filename="../src/PolkitListener.cpp" line="253"/> + <source>Authentication failure, please try again.</source> + <translation>دالىلدۅ جەڭىلۉۉ بولدۇ ، قايرا سىناڭ.</translation> + </message> + <message> +- <location filename="../src/PolkitListener.cpp" line="272"/> ++ <location filename="../src/PolkitListener.cpp" line="259"/> + <source>Password input error!</source> + <translation>كىيىرگەن جاشىرۇۇن نومۇر قاتاا بولدۇ</translation> + </message> +diff --git a/polkit-agent/i18n_ts/mn.ts b/polkit-agent/i18n_ts/mn.ts +index 4f8ed3c..7f6bfe9 100644 +--- a/polkit-agent/i18n_ts/mn.ts ++++ b/polkit-agent/i18n_ts/mn.ts +@@ -51,6 +51,15 @@ + <translation type="vanished">二维码</translation> + </message> + </context> ++<context> ++ <name>FullScreenBackground</name> ++ <message> ++ <location filename="../src/fullscreenbackground.cpp" line="75"/> ++ <location filename="../src/fullscreenbackground.cpp" line="104"/> ++ <source>Authentication</source> ++ <translation type="unfinished">ᠡᠷᠬᠡ ᠤᠯᠭᠤᠬᠤ</translation> ++ </message> ++</context> + <context> + <name>LoginOptionsWidget</name> + <message> +@@ -65,9 +74,8 @@ + <context> + <name>MainWindow</name> + <message> +- <location filename="../src/mainwindow.cpp" line="66"/> + <source>Authentication</source> +- <translation>ᠡᠷᠬᠡ ᠤᠯᠭᠤᠬᠤ</translation> ++ <translation type="vanished">ᠡᠷᠬᠡ ᠤᠯᠭᠤᠬᠤ</translation> + </message> + <message> + <source>Fingerprint authentication failed, you still have %1 verification opportunities</source> +@@ -91,14 +99,14 @@ + <translation type="vanished">密码</translation> + </message> + <message> +- <location filename="../src/mainwindow.ui" line="409"/> +- <location filename="../src/mainwindow.cpp" line="1075"/> +- <location filename="../src/mainwindow.cpp" line="1143"/> ++ <location filename="../src/mainwindow.ui" line="398"/> ++ <location filename="../src/mainwindow.cpp" line="874"/> ++ <location filename="../src/mainwindow.cpp" line="943"/> + <source>Biometric</source> + <translation>ᠠᠮᠢᠳᠤ ᠪᠤᠳᠠᠰ ᠢ᠋ ᠬᠡᠷᠡᠭᠯᠡᠵᠤ ᠢᠯᠭᠠᠨ ᠳᠠᠨᠢᠬᠤ</translation> + </message> + <message> +- <location filename="../src/mainwindow.ui" line="480"/> ++ <location filename="../src/mainwindow.ui" line="493"/> + <source>use password</source> + <translation>ᠰᠢᠯᠭᠠᠨ ᠪᠠᠳᠤᠯᠠᠭᠰᠠᠨ ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋ ᠢ᠋ ᠬᠡᠷᠡᠭᠯᠡᠬᠦ</translation> + </message> +@@ -147,20 +155,19 @@ + <translation type="vanished">Polkit.caller-pid:</translation> + </message> + <message> +- <location filename="../src/mainwindow.ui" line="441"/> +- <location filename="../src/mainwindow.cpp" line="1077"/> ++ <location filename="../src/mainwindow.ui" line="436"/> ++ <location filename="../src/mainwindow.cpp" line="875"/> + <source>Cancel</source> + <translation>ᠦᠬᠡᠢᠰᠭᠡᠬᠦ᠌</translation> + </message> + <message> +- <location filename="../src/mainwindow.ui" line="460"/> +- <location filename="../src/mainwindow.cpp" line="1073"/> ++ <location filename="../src/mainwindow.ui" line="461"/> ++ <location filename="../src/mainwindow.cpp" line="873"/> + <source>Authenticate</source> + <translation>ᠡᠷᠬᠡ ᠤᠯᠭᠤᠬᠤ</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1079"/> +- <location filename="../src/mainwindow.cpp" line="1183"/> ++ <location filename="../src/mainwindow.cpp" line="876"/> + <source>Use password</source> + <translation>ᠰᠢᠯᠭᠠᠨ ᠪᠠᠳᠤᠯᠠᠭᠰᠠᠨ ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋ ᠢ᠋ ᠬᠡᠷᠡᠭᠯᠡᠬᠦ</translation> + </message> +@@ -185,30 +192,30 @@ + <translation type="vanished">认证中,请稍等...</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1219"/> +- <location filename="../src/mainwindow.cpp" line="1292"/> +- <location filename="../src/mainwindow.cpp" line="1293"/> ++ <location filename="../src/mainwindow.cpp" line="1003"/> ++ <location filename="../src/mainwindow.cpp" line="1081"/> ++ <location filename="../src/mainwindow.cpp" line="1082"/> + <source>Please try again in %1 minutes.</source> + <translation>%1 ᠮᠢᠨᠦ᠋ᠲᠦᠨ ᠳᠠᠷᠠᠭᠠ ᠳᠠᠬᠢᠵᠤ ᠳᠤᠷᠱᠢᠭᠠᠷᠠᠢ.</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1230"/> +- <location filename="../src/mainwindow.cpp" line="1302"/> +- <location filename="../src/mainwindow.cpp" line="1303"/> ++ <location filename="../src/mainwindow.cpp" line="1015"/> ++ <location filename="../src/mainwindow.cpp" line="1093"/> ++ <location filename="../src/mainwindow.cpp" line="1094"/> + <source>Please try again in %1 seconds.</source> + <translation>%1 ᠮᠢᠨᠦ᠋ᠲᠦᠨ ᠳᠠᠷᠠᠭᠠ ᠳᠠᠬᠢᠵᠤ ᠳᠤᠷᠱᠢᠭᠠᠷᠠᠢ.</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1240"/> +- <location filename="../src/mainwindow.cpp" line="1241"/> +- <location filename="../src/mainwindow.cpp" line="1311"/> +- <location filename="../src/mainwindow.cpp" line="1312"/> ++ <location filename="../src/mainwindow.cpp" line="1026"/> ++ <location filename="../src/mainwindow.cpp" line="1027"/> ++ <location filename="../src/mainwindow.cpp" line="1104"/> ++ <location filename="../src/mainwindow.cpp" line="1105"/> + <source>Account locked permanently.</source> + <translation>ᠳᠠᠩᠰᠠ ᠨᠢᠭᠡᠨᠳᠡ ᠦᠨᠢᠳᠡ ᠤᠨᠢᠰᠤᠯᠠᠭᠳᠠᠪᠠ.</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="834"/> +- <location filename="../src/mainwindow.cpp" line="835"/> ++ <location filename="../src/mainwindow.cpp" line="688"/> ++ <location filename="../src/mainwindow.cpp" line="689"/> + <source>Password cannot be empty</source> + <translation>ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋ ᠬᠤᠭᠤᠰᠤᠨ ᠪᠠᠢᠵᠤ ᠪᠤᠯᠬᠤ ᠦᠬᠡᠢ</translation> + </message> +@@ -221,8 +228,8 @@ + <translation type="vanished">无法验证%1,请输入密码.</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="242"/> +- <location filename="../src/mainwindow.cpp" line="246"/> ++ <location filename="../src/mainwindow.cpp" line="1558"/> ++ <location filename="../src/mainwindow.cpp" line="1562"/> + <source>Failed to verify %1, you still have %2 verification opportunities</source> + <translation>%1ᠶᠢᠨ/ᠦᠨ ᠰᠢᠯᠭᠠᠨ ᠪᠠᠢᠴᠠᠭᠠᠯᠳᠠ ᠢᠯᠠᠭᠳᠠᠪᠠ ᠂ ᠲᠠ ᠪᠠᠰᠠ%2 ᠤᠳᠠᠭᠠᠨᠤ ᠳᠤᠷᠱᠢᠬᠤ ᠵᠠᠪᠱᠢᠶᠠᠨ ᠲᠠᠢ</translation> + </message> +@@ -231,42 +238,42 @@ + <translation type="vanished">一个程序正试图执行一个需要特权的动作。要求授权以执行该动作。</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="731"/> ++ <location filename="../src/mainwindow.cpp" line="582"/> + <source>Password: </source> + <translation>ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋᠄ </translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="335"/> ++ <location filename="../src/mainwindow.cpp" line="165"/> + <source>Please enter your password or enroll your fingerprint </source> + <translation>ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋ ᠪᠤᠶᠤ ᠬᠤᠷᠤᠭᠤᠨ ᠤ᠋ ᠤᠷᠤᠮ ᠵᠢᠨᠨ ᠤᠷᠤᠭᠤᠯᠤᠭᠠᠷᠠᠢ </translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="259"/> ++ <location filename="../src/mainwindow.cpp" line="1575"/> + <source>Abnormal network</source> + <translation>ᠲᠤᠷ ᠰᠦᠯᠵᠢᠶᠡ ᠬᠡᠪ ᠤ᠋ᠨ ᠪᠤᠰᠤ</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="665"/> ++ <location filename="../src/mainwindow.cpp" line="517"/> + <source>This operation requires the administrator's authorization. Please enter your password to allow this operation.</source> + <translation>ᠳᠤᠰ ᠤᠳᠠᠭᠠᠨ ᠤ᠋ ᠠᠵᠢᠯᠯᠠᠬᠤᠢ ᠵᠢᠨ ᠬᠠᠮᠢᠶᠠᠷᠤᠭᠴᠢ ᠵᠢᠨ ᠡᠷᠬᠡ ᠤᠯᠭᠤᠯᠳᠠ ᠪᠡᠷ ᠰᠠᠶᠢ ᠦᠷᠬᠦᠯᠵᠢᠯᠡᠨ ᠬᠡᠷᠡᠭᠵᠢᠬᠦᠯᠦᠨᠡ᠂ ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋ ᠵᠢᠨᠨ ᠤᠷᠤᠭᠤᠯᠵᠤ ᠳᠤᠰ ᠠᠵᠢᠯᠯᠠᠬᠤᠢ ᠵᠢ ᠵᠦᠪᠰᠢᠶᠡᠷᠡᠭᠡᠷᠡᠢ.</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="733"/> ++ <location filename="../src/mainwindow.cpp" line="584"/> + <source>_Password: </source> + <translation>ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋: </translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="735"/> ++ <location filename="../src/mainwindow.cpp" line="586"/> + <source>_Password:</source> + <translation>ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋:</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="850"/> ++ <location filename="../src/mainwindow.cpp" line="704"/> + <source>Authentication failed, please try again.</source> + <translation>ᠰᠢᠯᠭᠠᠨ ᠪᠠᠳᠤᠯᠠᠵᠤ ᠴᠢᠳᠠᠭᠰᠠᠨ ᠦᠬᠡᠢ᠂ ᠳᠠᠬᠢᠵᠤ ᠳᠤᠷᠰᠢᠭᠠᠷᠠᠢ.</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="779"/> ++ <location filename="../src/mainwindow.cpp" line="635"/> + <source>days left</source> + <translation>ᠡᠳᠦᠷ ᠤ᠋ᠨ ᠳᠠᠷᠠᠭᠠ ᠤᠨᠢᠰᠤ ᠳᠠᠢᠯᠤᠨᠠ</translation> + </message> +@@ -279,16 +286,16 @@ + <translation type="vanished">生物/扫码验证失败,您还有%1次尝试机会</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="226"/> +- <location filename="../src/mainwindow.cpp" line="1415"/> +- <location filename="../src/mainwindow.cpp" line="1417"/> ++ <location filename="../src/mainwindow.cpp" line="1243"/> ++ <location filename="../src/mainwindow.cpp" line="1246"/> ++ <location filename="../src/mainwindow.cpp" line="1539"/> + <source>Failed to verify %1, please enter password to unlock</source> + <translation>%1ᠶᠢ/ᠢ ᠪᠠᠳᠤᠯᠭᠠᠵᠢᠭᠤᠯᠬᠤ ᠠᠷᠭᠠ ᠦᠬᠡᠢ ᠂ ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋ ᠤᠷᠤᠭᠤᠯᠵᠤ ᠤᠨᠢᠰᠤᠶᠢ ᠳᠠᠢᠯᠤᠭᠠᠷᠠᠢ</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="231"/> +- <location filename="../src/mainwindow.cpp" line="233"/> +- <location filename="../src/mainwindow.cpp" line="1419"/> ++ <location filename="../src/mainwindow.cpp" line="1249"/> ++ <location filename="../src/mainwindow.cpp" line="1545"/> ++ <location filename="../src/mainwindow.cpp" line="1548"/> + <source>Unable to verify %1, please enter password to unlock</source> + <translation>%1ᠶᠢ/ᠢ ᠪᠠᠳᠤᠯᠭᠠᠵᠢᠭᠤᠯᠬᠤ ᠠᠷᠭᠠ ᠦᠬᠡᠢ ᠂ ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋ ᠤᠷᠤᠭᠤᠯᠵᠤ ᠤᠨᠢᠰᠤᠶᠢ ᠳᠠᠢᠯᠤᠭᠠᠷᠠᠢ</translation> + </message> +@@ -297,86 +304,121 @@ + <translation type="vanished">网络异常</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="671"/> ++ <location filename="../src/mainwindow.cpp" line="522"/> + <source>A program is attempting to perform an action that requires privileges.It requires authorization to perform the action.</source> + <translation>ᠨᠢᠭᠡ ᠫᠡᠷᠦᠭᠷᠡᠮ ᠶᠠᠭ ᠨᠢᠭᠡ ᠤᠨᠠᠴᠠ ᠡᠷᠬᠡ ᠬᠡᠷᠡᠭᠰᠡᠬᠦ ᠬᠦᠳᠡᠯᠬᠡᠬᠡᠨ ᠢ᠋ ᠬᠡᠷᠡᠭᠵᠢᠬᠦᠯᠬᠦ ᠪᠡᠷ ᠳᠤᠷᠰᠢᠵᠤ ᠪᠠᠢᠨᠠ᠂ ᠳᠤᠰ ᠬᠦᠳᠡᠯᠬᠡᠬᠡᠨ ᠢ᠋ ᠬᠦᠢᠴᠡᠳᠬᠡᠬᠦ ᠡᠷᠬᠡ ᠤᠯᠭᠤᠬᠤ ᠵᠢ ᠱᠠᠭᠠᠷᠳᠠᠵᠤ ᠪᠠᠢᠨᠠ.</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="108"/> +- <location filename="../src/mainwindow.cpp" line="729"/> ++ <location filename="../src/mainwindow.cpp" line="88"/> ++ <location filename="../src/mainwindow.cpp" line="580"/> + <source>Input Password</source> + <translation>ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋ ᠤᠷᠤᠭᠤᠯᠬᠤ</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="105"/> ++ <location filename="../src/mainwindow.cpp" line="85"/> + <source>Insert the ukey into the USB port</source> + <translation>ᠠᠮᠤᠷ ᠲᠦᠪᠰᠢᠨ ᠦ ᠨᠢᠭᠤᠴᠠ ᠶᠢ USB ᠦᠵᠦᠭᠦᠷ ᠲᠦ ᠬᠠᠳᠬᠤᠵᠤ ᠣᠷᠣᠭᠠᠷᠠᠢ ᠃</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="107"/> ++ <location filename="../src/mainwindow.cpp" line="87"/> + <source>Enter the ukey password</source> + <translation>ᠠᠮᠤᠷ ᠲᠦᠪᠰᠢᠨ ᠨᠢᠭᠤᠴᠠ ᠨᠣᠮᠧᠷ ᠢ ᠣᠷᠣᠭᠤᠯᠤᠨᠠ ᠃</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="783"/> ++ <location filename="../src/mainwindow.cpp" line="93"/> ++ <source>Close</source> ++ <translation>ᠬᠠᠭᠠᠬᠤ</translation> ++ </message> ++ <message> ++ <location filename="../src/mainwindow.cpp" line="1261"/> ++ <source>Facial recognition to authorization</source> ++ <translation type="unfinished"></translation> ++ </message> ++ <message> ++ <location filename="../src/mainwindow.cpp" line="1264"/> ++ <source>Fingerprint recognition to authorization</source> ++ <translation type="unfinished"></translation> ++ </message> ++ <message> ++ <location filename="../src/mainwindow.cpp" line="1267"/> ++ <source>Voiceprint recognition to authorization</source> ++ <translation type="unfinished"></translation> ++ </message> ++ <message> ++ <location filename="../src/mainwindow.cpp" line="1270"/> ++ <source>Finger veins recognition to authorization</source> ++ <translation type="unfinished"></translation> ++ </message> ++ <message> ++ <location filename="../src/mainwindow.cpp" line="1273"/> ++ <source>Iris recognition to authorization</source> ++ <translation type="unfinished"></translation> ++ </message> ++ <message> ++ <location filename="../src/mainwindow.cpp" line="1276"/> ++ <source>Use the bound wechat scanning code to authorization</source> ++ <translation type="unfinished"></translation> ++ </message> ++ <message> ++ <location filename="../src/mainwindow.cpp" line="1579"/> ++ <source>Acquisition failure</source> ++ <translation>ᠢᠯᠠᠭᠳᠠᠯ ᠢ ᠣᠯᠪᠠ ᠃</translation> ++ </message> ++ <message> ++ <location filename="../src/mainwindow.cpp" line="638"/> + <source>hours left</source> + <translation>ᠨᠢᠭᠡ ᠴᠠᠭ ᠤ᠋ᠨ ᠳᠠᠷᠠᠭᠠ ᠤᠨᠢᠰᠤ ᠳᠠᠢᠯᠤᠨᠠ</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="787"/> ++ <location filename="../src/mainwindow.cpp" line="641"/> + <source>minutes left</source> + <translation>ᠮᠢᠨᠦ᠋ᠲ ᠤ᠋ᠨ ᠳᠠᠷᠠᠭᠠ ᠤᠨᠢᠰᠤ ᠳᠠᠢᠯᠤᠨᠠ</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="791"/> ++ <location filename="../src/mainwindow.cpp" line="644"/> + <source>seconds left</source> + <translation>ᠰᠸᠺᠦᠨ᠋ᠲ ᠤ᠋ᠨ ᠳᠠᠷᠠᠭᠠ ᠤᠨᠢᠰᠤ ᠳᠠᠢᠯᠤᠨᠠ</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="880"/> +- <location filename="../src/mainwindow.cpp" line="888"/> ++ <location filename="../src/mainwindow.cpp" line="734"/> ++ <location filename="../src/mainwindow.cpp" line="742"/> ++ <location filename="../src/mainwindow.cpp" line="1258"/> + <source>Input your password to authentication</source> + <translation>ᠨᠢᠭᠤᠴᠠ ᠨᠣᠮᠧᠷ ᠣᠷᠣᠭᠤᠯᠬᠤ ᠳᠤ ᠡᠷᠬᠡ ᠣᠯᠭᠣᠨᠠ ᠃</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1434"/> + <source>Verify face recognition or enter password to unlock</source> +- <translation>ᠨᠢᠭᠤᠷ ᠱᠢᠷᠪᠢᠵᠤ ᠪᠠᠳᠤᠯᠭᠠᠵᠢᠭᠤᠯᠬᠤ ᠪᠤᠶᠤ ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋ ᠤᠷᠤᠭᠤᠯᠵᠤ ᠤᠨᠢᠰᠤᠶᠢ ᠳᠠᠢᠯᠤᠭᠠᠷᠠᠢ</translation> ++ <translation type="vanished">ᠨᠢᠭᠤᠷ ᠱᠢᠷᠪᠢᠵᠤ ᠪᠠᠳᠤᠯᠭᠠᠵᠢᠭᠤᠯᠬᠤ ᠪᠤᠶᠤ ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋ ᠤᠷᠤᠭᠤᠯᠵᠤ ᠤᠨᠢᠰᠤᠶᠢ ᠳᠠᠢᠯᠤᠭᠠᠷᠠᠢ</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1439"/> + <source>Press fingerprint or enter password to unlock</source> +- <translation>ᠬᠤᠷᠤᠭᠤᠨᠤ ᠤᠷᠤᠮ ᠳᠠᠷᠤᠬᠤ ᠪᠤᠶᠤ ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋ ᠤᠷᠤᠭᠤᠯᠵᠤ ᠤᠨᠢᠰᠤᠶᠢ ᠳᠠᠢᠯᠤᠭᠠᠷᠠᠢ</translation> ++ <translation type="vanished">ᠬᠤᠷᠤᠭᠤᠨᠤ ᠤᠷᠤᠮ ᠳᠠᠷᠤᠬᠤ ᠪᠤᠶᠤ ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋ ᠤᠷᠤᠭᠤᠯᠵᠤ ᠤᠨᠢᠰᠤᠶᠢ ᠳᠠᠢᠯᠤᠭᠠᠷᠠᠢ</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1444"/> + <source>Verify voiceprint or enter password to unlock</source> +- <translation>ᠳᠠᠭᠤᠪᠠᠷ ᠰᠢᠯᠭᠠᠨ ᠪᠠᠳᠤᠯᠠᠬᠤ ᠪᠤᠶᠤ ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋ ᠤᠷᠤᠭᠤᠯᠵᠤ ᠤᠨᠢᠰᠤᠶᠢ ᠳᠠᠢᠯᠤᠭᠠᠷᠠᠢ</translation> ++ <translation type="vanished">ᠳᠠᠭᠤᠪᠠᠷ ᠰᠢᠯᠭᠠᠨ ᠪᠠᠳᠤᠯᠠᠬᠤ ᠪᠤᠶᠤ ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋ ᠤᠷᠤᠭᠤᠯᠵᠤ ᠤᠨᠢᠰᠤᠶᠢ ᠳᠠᠢᠯᠤᠭᠠᠷᠠᠢ</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1449"/> + <source>Verify finger vein or enter password to unlock</source> +- <translation>ᠬᠤᠷᠤᠭᠤᠨᠤ ᠨᠠᠮᠵᠢᠭᠤᠨ ᠰᠤᠳᠠᠯᠢᠶᠠᠷ ᠰᠢᠯᠭᠠᠨ ᠪᠠᠳᠤᠯᠠᠬᠤ ᠪᠤᠶᠤ ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋ ᠤᠷᠤᠭᠤᠯᠵᠤ ᠤᠨᠢᠰᠤᠶᠢ ᠳᠠᠢᠯᠤᠭᠠᠷᠠᠢ</translation> ++ <translation type="vanished">ᠬᠤᠷᠤᠭᠤᠨᠤ ᠨᠠᠮᠵᠢᠭᠤᠨ ᠰᠤᠳᠠᠯᠢᠶᠠᠷ ᠰᠢᠯᠭᠠᠨ ᠪᠠᠳᠤᠯᠠᠬᠤ ᠪᠤᠶᠤ ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋ ᠤᠷᠤᠭᠤᠯᠵᠤ ᠤᠨᠢᠰᠤᠶᠢ ᠳᠠᠢᠯᠤᠭᠠᠷᠠᠢ</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1454"/> + <source>Verify iris or enter password to unlock</source> +- <translation>ᠰᠤᠯᠤᠩᠭᠠ ᠪᠦᠷᠬᠦᠪᠴᠢᠶᠢ ᠰᠢᠯᠭᠠᠨ ᠪᠠᠳᠤᠯᠠᠬᠤ ᠪᠤᠶᠤ ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋ ᠤᠷᠤᠭᠤᠯᠵᠤ ᠤᠨᠢᠰᠤᠶᠢ ᠳᠠᠢᠯᠤᠭᠠᠷᠠᠢ</translation> ++ <translation type="vanished">ᠰᠤᠯᠤᠩᠭᠠ ᠪᠦᠷᠬᠦᠪᠴᠢᠶᠢ ᠰᠢᠯᠭᠠᠨ ᠪᠠᠳᠤᠯᠠᠬᠤ ᠪᠤᠶᠤ ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋ ᠤᠷᠤᠭᠤᠯᠵᠤ ᠤᠨᠢᠰᠤᠶᠢ ᠳᠠᠢᠯᠤᠭᠠᠷᠠᠢ</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1459"/> + <source>Use the bound wechat scanning code or enter the password to unlock</source> +- <translation>ᠤᠶᠠᠭᠰᠠᠨ ᠸᠢᠴᠠᠲᠢᠶᠠᠷ ᠺᠤᠳ᠋ ᠱᠢᠷᠪᠢᠬᠦ᠌ ᠪᠤᠶᠤ ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋ ᠤᠷᠤᠭᠤᠯᠵᠤ ᠤᠨᠢᠰᠤᠶᠢ ᠳᠠᠢᠯᠤᠭᠠᠷᠠᠢ</translation> ++ <translation type="vanished">ᠤᠶᠠᠭᠰᠠᠨ ᠸᠢᠴᠠᠲᠢᠶᠠᠷ ᠺᠤᠳ᠋ ᠱᠢᠷᠪᠢᠬᠦ᠌ ᠪᠤᠶᠤ ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋ ᠤᠷᠤᠭᠤᠯᠵᠤ ᠤᠨᠢᠰᠤᠶᠢ ᠳᠠᠢᠯᠤᠭᠠᠷᠠᠢ</translation> + </message> + <message> + <source>Use the bound wechat scanning code or enter the password to log in</source> + <translation type="vanished">使用绑定的微信扫码或输入密码登录</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="779"/> +- <location filename="../src/mainwindow.cpp" line="783"/> +- <location filename="../src/mainwindow.cpp" line="787"/> +- <location filename="../src/mainwindow.cpp" line="791"/> ++ <location filename="../src/mainwindow.cpp" line="635"/> ++ <location filename="../src/mainwindow.cpp" line="638"/> ++ <location filename="../src/mainwindow.cpp" line="641"/> ++ <location filename="../src/mainwindow.cpp" line="644"/> + <source>Account locked,</source> + <translation>ᠳᠠᠨᠭᠰᠠ ᠵᠢ ᠨᠢᠬᠡᠨᠳᠡ ᠤᠨᠢᠰᠤᠯᠠᠪᠠ</translation> + </message> +@@ -388,17 +430,17 @@ + <context> + <name>PolkitListener</name> + <message> +- <location filename="../src/PolkitListener.cpp" line="88"/> ++ <location filename="../src/PolkitListener.cpp" line="86"/> + <source>Another client is already authenticating, please try again later.</source> + <translation>ᠦᠬᠡᠷᠡ ᠨᠢᠭᠡ ᠬᠡᠷᠡᠭᠯᠡᠭᠴᠢ ᠵᠢᠨ ᠦᠵᠦᠬᠦᠷᠯᠢᠭ ᠢ᠋ ᠶᠠᠭ ᠨᠤᠳᠠᠯᠠᠵᠤ ᠪᠠᠢᠨᠠ᠂ ᠤᠳᠠᠰᠬᠢᠭᠠᠳ ᠳᠠᠬᠢᠨ ᠳᠤᠷᠰᠢᠭᠠᠷᠠᠢ.</translation> + </message> + <message> +- <location filename="../src/PolkitListener.cpp" line="265"/> ++ <location filename="../src/PolkitListener.cpp" line="253"/> + <source>Authentication failure, please try again.</source> + <translation>ᠰᠢᠯᠭᠠᠨ ᠪᠠᠳᠤᠯᠠᠵᠤ ᠴᠢᠳᠠᠭᠰᠠᠨ ᠦᠬᠡᠢ᠂ ᠳᠠᠬᠢᠵᠤ ᠳᠤᠷᠰᠢᠭᠠᠷᠠᠢ.</translation> + </message> + <message> +- <location filename="../src/PolkitListener.cpp" line="272"/> ++ <location filename="../src/PolkitListener.cpp" line="259"/> + <source>Password input error!</source> + <translation>ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋ ᠢ᠋ ᠪᠤᠷᠤᠭᠤ ᠤᠷᠤᠭᠤᠯᠪᠠ!</translation> + </message> +diff --git a/polkit-agent/i18n_ts/pt.ts b/polkit-agent/i18n_ts/pt.ts +index 155dec7..90bc880 100644 +--- a/polkit-agent/i18n_ts/pt.ts ++++ b/polkit-agent/i18n_ts/pt.ts +@@ -15,6 +15,13 @@ + <translation type="obsolete">Formato</translation> + </message> + </context> ++<context> ++ <name>FullScreenBackground</name> ++ <message> ++ <source>Authentication</source> ++ <translation type="unfinished">Autenticação</translation> ++ </message> ++</context> + <context> + <name>MainWindow</name> + <message> +@@ -59,7 +66,7 @@ + </message> + <message> + <source>Authentication</source> +- <translation>Autenticação</translation> ++ <translation type="vanished">Autenticação</translation> + </message> + <message> + <source>in authentication, please wait...</source> +@@ -126,75 +133,83 @@ + <translation type="unfinished"></translation> + </message> + <message> +- <source>Verify face recognition or enter password to unlock</source> ++ <source>Failed to verify %1, you still have %2 verification opportunities</source> + <translation type="unfinished"></translation> + </message> + <message> +- <source>Press fingerprint or enter password to unlock</source> ++ <source>Input Password</source> + <translation type="unfinished"></translation> + </message> + <message> +- <source>Verify voiceprint or enter password to unlock</source> ++ <source>Failed to verify %1, please enter password to unlock</source> + <translation type="unfinished"></translation> + </message> + <message> +- <source>Verify finger vein or enter password to unlock</source> ++ <source>Unable to verify %1, please enter password to unlock</source> + <translation type="unfinished"></translation> + </message> + <message> +- <source>Verify iris or enter password to unlock</source> ++ <source>A program is attempting to perform an action that requires privileges.It requires authorization to perform the action.</source> + <translation type="unfinished"></translation> + </message> + <message> +- <source>Failed to verify %1, you still have %2 verification opportunities</source> ++ <source>_Password:</source> + <translation type="unfinished"></translation> + </message> + <message> +- <source>Input Password</source> ++ <source>_Password: </source> + <translation type="unfinished"></translation> + </message> + <message> +- <source>Use the bound wechat scanning code or enter the password to unlock</source> ++ <source>Abnormal network</source> + <translation type="unfinished"></translation> + </message> + <message> +- <source>Failed to verify %1, please enter password to unlock</source> ++ <source>This operation requires the administrator's authorization. Please enter your password to allow this operation.</source> + <translation type="unfinished"></translation> + </message> + <message> +- <source>Unable to verify %1, please enter password to unlock</source> ++ <source>Insert the ukey into the USB port</source> + <translation type="unfinished"></translation> + </message> + <message> +- <source>A program is attempting to perform an action that requires privileges.It requires authorization to perform the action.</source> ++ <source>Enter the ukey password</source> + <translation type="unfinished"></translation> + </message> + <message> +- <source>_Password:</source> ++ <source>Input your password to authentication</source> + <translation type="unfinished"></translation> + </message> + <message> +- <source>_Password: </source> ++ <source>Close</source> + <translation type="unfinished"></translation> + </message> + <message> +- <source>Abnormal network</source> ++ <source>Acquisition failure</source> + <translation type="unfinished"></translation> + </message> + <message> +- <source>This operation requires the administrator's authorization. Please enter your password to allow this operation.</source> ++ <source>Facial recognition to authorization</source> + <translation type="unfinished"></translation> + </message> + <message> +- <source>Insert the ukey into the USB port</source> ++ <source>Fingerprint recognition to authorization</source> + <translation type="unfinished"></translation> + </message> + <message> +- <source>Enter the ukey password</source> ++ <source>Voiceprint recognition to authorization</source> + <translation type="unfinished"></translation> + </message> + <message> +- <source>Input your password to authentication</source> ++ <source>Finger veins recognition to authorization</source> ++ <translation type="unfinished"></translation> ++ </message> ++ <message> ++ <source>Iris recognition to authorization</source> ++ <translation type="unfinished"></translation> ++ </message> ++ <message> ++ <source>Use the bound wechat scanning code to authorization</source> + <translation type="unfinished"></translation> + </message> + </context> +diff --git a/polkit-agent/i18n_ts/ru.ts b/polkit-agent/i18n_ts/ru.ts +index c75c155..e8c5d91 100644 +--- a/polkit-agent/i18n_ts/ru.ts ++++ b/polkit-agent/i18n_ts/ru.ts +@@ -15,6 +15,13 @@ + <translation type="obsolete">форма</translation> + </message> + </context> ++<context> ++ <name>FullScreenBackground</name> ++ <message> ++ <source>Authentication</source> ++ <translation type="unfinished">Аутентификация</translation> ++ </message> ++</context> + <context> + <name>MainWindow</name> + <message> +@@ -59,7 +66,7 @@ + </message> + <message> + <source>Authentication</source> +- <translation>Аутентификация</translation> ++ <translation type="vanished">Аутентификация</translation> + </message> + <message> + <source>in authentication, please wait...</source> +@@ -126,75 +133,83 @@ + <translation type="unfinished"></translation> + </message> + <message> +- <source>Verify face recognition or enter password to unlock</source> ++ <source>Failed to verify %1, you still have %2 verification opportunities</source> + <translation type="unfinished"></translation> + </message> + <message> +- <source>Press fingerprint or enter password to unlock</source> ++ <source>Input Password</source> + <translation type="unfinished"></translation> + </message> + <message> +- <source>Verify voiceprint or enter password to unlock</source> ++ <source>Failed to verify %1, please enter password to unlock</source> + <translation type="unfinished"></translation> + </message> + <message> +- <source>Verify finger vein or enter password to unlock</source> ++ <source>Unable to verify %1, please enter password to unlock</source> + <translation type="unfinished"></translation> + </message> + <message> +- <source>Verify iris or enter password to unlock</source> ++ <source>A program is attempting to perform an action that requires privileges.It requires authorization to perform the action.</source> + <translation type="unfinished"></translation> + </message> + <message> +- <source>Failed to verify %1, you still have %2 verification opportunities</source> ++ <source>_Password:</source> + <translation type="unfinished"></translation> + </message> + <message> +- <source>Input Password</source> ++ <source>_Password: </source> + <translation type="unfinished"></translation> + </message> + <message> +- <source>Use the bound wechat scanning code or enter the password to unlock</source> ++ <source>Abnormal network</source> + <translation type="unfinished"></translation> + </message> + <message> +- <source>Failed to verify %1, please enter password to unlock</source> ++ <source>This operation requires the administrator's authorization. Please enter your password to allow this operation.</source> + <translation type="unfinished"></translation> + </message> + <message> +- <source>Unable to verify %1, please enter password to unlock</source> ++ <source>Insert the ukey into the USB port</source> + <translation type="unfinished"></translation> + </message> + <message> +- <source>A program is attempting to perform an action that requires privileges.It requires authorization to perform the action.</source> ++ <source>Enter the ukey password</source> + <translation type="unfinished"></translation> + </message> + <message> +- <source>_Password:</source> ++ <source>Input your password to authentication</source> + <translation type="unfinished"></translation> + </message> + <message> +- <source>_Password: </source> ++ <source>Close</source> + <translation type="unfinished"></translation> + </message> + <message> +- <source>Abnormal network</source> ++ <source>Acquisition failure</source> + <translation type="unfinished"></translation> + </message> + <message> +- <source>This operation requires the administrator's authorization. Please enter your password to allow this operation.</source> ++ <source>Facial recognition to authorization</source> + <translation type="unfinished"></translation> + </message> + <message> +- <source>Insert the ukey into the USB port</source> ++ <source>Fingerprint recognition to authorization</source> + <translation type="unfinished"></translation> + </message> + <message> +- <source>Enter the ukey password</source> ++ <source>Voiceprint recognition to authorization</source> + <translation type="unfinished"></translation> + </message> + <message> +- <source>Input your password to authentication</source> ++ <source>Finger veins recognition to authorization</source> ++ <translation type="unfinished"></translation> ++ </message> ++ <message> ++ <source>Iris recognition to authorization</source> ++ <translation type="unfinished"></translation> ++ </message> ++ <message> ++ <source>Use the bound wechat scanning code to authorization</source> + <translation type="unfinished"></translation> + </message> + </context> +diff --git a/polkit-agent/i18n_ts/tr.ts b/polkit-agent/i18n_ts/tr.ts +index f59c7a3..89b19dd 100644 +--- a/polkit-agent/i18n_ts/tr.ts ++++ b/polkit-agent/i18n_ts/tr.ts +@@ -31,160 +31,178 @@ + <translation type="obsolete">Ses İzi</translation> + </message> + </context> ++<context> ++ <name>FullScreenBackground</name> ++ <message> ++ <location filename="../src/fullscreenbackground.cpp" line="75"/> ++ <location filename="../src/fullscreenbackground.cpp" line="104"/> ++ <source>Authentication</source> ++ <translation type="unfinished">Kimlik Doğrulama</translation> ++ </message> ++</context> + <context> + <name>MainWindow</name> + <message> +- <location filename="../src/mainwindow.cpp" line="66"/> + <source>Authentication</source> +- <translation>Kimlik Doğrulama</translation> ++ <translation type="vanished">Kimlik Doğrulama</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="226"/> +- <location filename="../src/mainwindow.cpp" line="1415"/> +- <location filename="../src/mainwindow.cpp" line="1417"/> ++ <location filename="../src/mainwindow.cpp" line="1243"/> ++ <location filename="../src/mainwindow.cpp" line="1246"/> ++ <location filename="../src/mainwindow.cpp" line="1539"/> + <source>Failed to verify %1, please enter password to unlock</source> + <translation type="unfinished"></translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="231"/> +- <location filename="../src/mainwindow.cpp" line="233"/> +- <location filename="../src/mainwindow.cpp" line="1419"/> ++ <location filename="../src/mainwindow.cpp" line="1249"/> ++ <location filename="../src/mainwindow.cpp" line="1545"/> ++ <location filename="../src/mainwindow.cpp" line="1548"/> + <source>Unable to verify %1, please enter password to unlock</source> + <translation type="unfinished"></translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="242"/> +- <location filename="../src/mainwindow.cpp" line="246"/> ++ <location filename="../src/mainwindow.cpp" line="1558"/> ++ <location filename="../src/mainwindow.cpp" line="1562"/> + <source>Failed to verify %1, you still have %2 verification opportunities</source> + <translation type="unfinished"></translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="259"/> ++ <location filename="../src/mainwindow.cpp" line="1575"/> + <source>Abnormal network</source> + <translation type="unfinished"></translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="665"/> ++ <location filename="../src/mainwindow.cpp" line="517"/> + <source>This operation requires the administrator's authorization. Please enter your password to allow this operation.</source> + <translation type="unfinished"></translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="671"/> ++ <location filename="../src/mainwindow.cpp" line="522"/> + <source>A program is attempting to perform an action that requires privileges.It requires authorization to perform the action.</source> + <translation type="unfinished"></translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="108"/> +- <location filename="../src/mainwindow.cpp" line="729"/> ++ <location filename="../src/mainwindow.cpp" line="88"/> ++ <location filename="../src/mainwindow.cpp" line="580"/> + <source>Input Password</source> + <translation type="unfinished"></translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="105"/> ++ <location filename="../src/mainwindow.cpp" line="85"/> + <source>Insert the ukey into the USB port</source> + <translation type="unfinished"></translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="107"/> ++ <location filename="../src/mainwindow.cpp" line="87"/> + <source>Enter the ukey password</source> + <translation type="unfinished"></translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="779"/> +- <location filename="../src/mainwindow.cpp" line="783"/> +- <location filename="../src/mainwindow.cpp" line="787"/> +- <location filename="../src/mainwindow.cpp" line="791"/> +- <source>Account locked,</source> ++ <location filename="../src/mainwindow.cpp" line="93"/> ++ <source>Close</source> + <translation type="unfinished"></translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="779"/> +- <source>days left</source> ++ <location filename="../src/mainwindow.cpp" line="1261"/> ++ <source>Facial recognition to authorization</source> + <translation type="unfinished"></translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="783"/> +- <source>hours left</source> ++ <location filename="../src/mainwindow.cpp" line="1264"/> ++ <source>Fingerprint recognition to authorization</source> + <translation type="unfinished"></translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="787"/> +- <source>minutes left</source> ++ <location filename="../src/mainwindow.cpp" line="1267"/> ++ <source>Voiceprint recognition to authorization</source> + <translation type="unfinished"></translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="791"/> +- <source>seconds left</source> ++ <location filename="../src/mainwindow.cpp" line="1270"/> ++ <source>Finger veins recognition to authorization</source> + <translation type="unfinished"></translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="834"/> +- <location filename="../src/mainwindow.cpp" line="835"/> +- <source>Password cannot be empty</source> ++ <location filename="../src/mainwindow.cpp" line="1273"/> ++ <source>Iris recognition to authorization</source> + <translation type="unfinished"></translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="880"/> +- <location filename="../src/mainwindow.cpp" line="888"/> +- <source>Input your password to authentication</source> ++ <location filename="../src/mainwindow.cpp" line="1276"/> ++ <source>Use the bound wechat scanning code to authorization</source> + <translation type="unfinished"></translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1079"/> +- <location filename="../src/mainwindow.cpp" line="1183"/> +- <source>Use password</source> ++ <location filename="../src/mainwindow.cpp" line="1579"/> ++ <source>Acquisition failure</source> + <translation type="unfinished"></translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1219"/> +- <location filename="../src/mainwindow.cpp" line="1292"/> +- <location filename="../src/mainwindow.cpp" line="1293"/> +- <source>Please try again in %1 minutes.</source> ++ <location filename="../src/mainwindow.cpp" line="635"/> ++ <location filename="../src/mainwindow.cpp" line="638"/> ++ <location filename="../src/mainwindow.cpp" line="641"/> ++ <location filename="../src/mainwindow.cpp" line="644"/> ++ <source>Account locked,</source> + <translation type="unfinished"></translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1230"/> +- <location filename="../src/mainwindow.cpp" line="1302"/> +- <location filename="../src/mainwindow.cpp" line="1303"/> +- <source>Please try again in %1 seconds.</source> ++ <location filename="../src/mainwindow.cpp" line="635"/> ++ <source>days left</source> + <translation type="unfinished"></translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1240"/> +- <location filename="../src/mainwindow.cpp" line="1241"/> +- <location filename="../src/mainwindow.cpp" line="1311"/> +- <location filename="../src/mainwindow.cpp" line="1312"/> +- <source>Account locked permanently.</source> ++ <location filename="../src/mainwindow.cpp" line="638"/> ++ <source>hours left</source> ++ <translation type="unfinished"></translation> ++ </message> ++ <message> ++ <location filename="../src/mainwindow.cpp" line="641"/> ++ <source>minutes left</source> ++ <translation type="unfinished"></translation> ++ </message> ++ <message> ++ <location filename="../src/mainwindow.cpp" line="644"/> ++ <source>seconds left</source> + <translation type="unfinished"></translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1434"/> +- <source>Verify face recognition or enter password to unlock</source> ++ <location filename="../src/mainwindow.cpp" line="688"/> ++ <location filename="../src/mainwindow.cpp" line="689"/> ++ <source>Password cannot be empty</source> + <translation type="unfinished"></translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1439"/> +- <source>Press fingerprint or enter password to unlock</source> ++ <location filename="../src/mainwindow.cpp" line="734"/> ++ <location filename="../src/mainwindow.cpp" line="742"/> ++ <location filename="../src/mainwindow.cpp" line="1258"/> ++ <source>Input your password to authentication</source> + <translation type="unfinished"></translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1444"/> +- <source>Verify voiceprint or enter password to unlock</source> ++ <location filename="../src/mainwindow.cpp" line="876"/> ++ <source>Use password</source> + <translation type="unfinished"></translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1449"/> +- <source>Verify finger vein or enter password to unlock</source> ++ <location filename="../src/mainwindow.cpp" line="1003"/> ++ <location filename="../src/mainwindow.cpp" line="1081"/> ++ <location filename="../src/mainwindow.cpp" line="1082"/> ++ <source>Please try again in %1 minutes.</source> + <translation type="unfinished"></translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1454"/> +- <source>Verify iris or enter password to unlock</source> ++ <location filename="../src/mainwindow.cpp" line="1015"/> ++ <location filename="../src/mainwindow.cpp" line="1093"/> ++ <location filename="../src/mainwindow.cpp" line="1094"/> ++ <source>Please try again in %1 seconds.</source> + <translation type="unfinished"></translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1459"/> +- <source>Use the bound wechat scanning code or enter the password to unlock</source> ++ <location filename="../src/mainwindow.cpp" line="1026"/> ++ <location filename="../src/mainwindow.cpp" line="1027"/> ++ <location filename="../src/mainwindow.cpp" line="1104"/> ++ <location filename="../src/mainwindow.cpp" line="1105"/> ++ <source>Account locked permanently.</source> + <translation type="unfinished"></translation> + </message> + <message> +@@ -205,9 +223,9 @@ + <translation type="obsolete">Parola</translation> + </message> + <message> +- <location filename="../src/mainwindow.ui" line="409"/> +- <location filename="../src/mainwindow.cpp" line="1075"/> +- <location filename="../src/mainwindow.cpp" line="1143"/> ++ <location filename="../src/mainwindow.ui" line="398"/> ++ <location filename="../src/mainwindow.cpp" line="874"/> ++ <location filename="../src/mainwindow.cpp" line="943"/> + <source>Biometric</source> + <translation>Biyometrik</translation> + </message> +@@ -256,19 +274,19 @@ + <translation type="vanished">Polkit.caller-pid:</translation> + </message> + <message> +- <location filename="../src/mainwindow.ui" line="441"/> +- <location filename="../src/mainwindow.cpp" line="1077"/> ++ <location filename="../src/mainwindow.ui" line="436"/> ++ <location filename="../src/mainwindow.cpp" line="875"/> + <source>Cancel</source> + <translation>İptal</translation> + </message> + <message> +- <location filename="../src/mainwindow.ui" line="460"/> +- <location filename="../src/mainwindow.cpp" line="1073"/> ++ <location filename="../src/mainwindow.ui" line="461"/> ++ <location filename="../src/mainwindow.cpp" line="873"/> + <source>Authenticate</source> + <translation>Kimlik Doğrulaması</translation> + </message> + <message> +- <location filename="../src/mainwindow.ui" line="480"/> ++ <location filename="../src/mainwindow.ui" line="493"/> + <source>use password</source> + <translation type="unfinished"></translation> + </message> +@@ -277,7 +295,7 @@ + <translation type="obsolete">Kimlik Doğrulaması</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="335"/> ++ <location filename="../src/mainwindow.cpp" line="165"/> + <source>Please enter your password or enroll your fingerprint </source> + <translation type="unfinished"></translation> + </message> +@@ -290,22 +308,22 @@ + <translation type="vanished">Bir uygulama, ayrıcalıklar gerektiren bir eylem gerçekleştirmeye çalışıyor. Bu işlemi gerçekleştirmek için kimlik doğrulaması gerekiyor.</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="731"/> ++ <location filename="../src/mainwindow.cpp" line="582"/> + <source>Password: </source> + <translation type="unfinished">Parola: </translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="733"/> ++ <location filename="../src/mainwindow.cpp" line="584"/> + <source>_Password: </source> + <translation type="unfinished">_Parola: </translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="735"/> ++ <location filename="../src/mainwindow.cpp" line="586"/> + <source>_Password:</source> + <translation type="unfinished">_Parola:</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="850"/> ++ <location filename="../src/mainwindow.cpp" line="704"/> + <source>Authentication failed, please try again.</source> + <translation>Kimlik doğrulama başarısız, lütfen tekrar deneyin.</translation> + </message> +@@ -317,17 +335,17 @@ + <context> + <name>PolkitListener</name> + <message> +- <location filename="../src/PolkitListener.cpp" line="88"/> ++ <location filename="../src/PolkitListener.cpp" line="86"/> + <source>Another client is already authenticating, please try again later.</source> + <translation>Başka bir hesap zaten kimlik doğrulaması yapıyor, lütfen daha sonra tekrar deneyin.</translation> + </message> + <message> +- <location filename="../src/PolkitListener.cpp" line="265"/> ++ <location filename="../src/PolkitListener.cpp" line="253"/> + <source>Authentication failure, please try again.</source> + <translation>Kimlik doğrulama hatalı, lütfen tekrar deneyin.</translation> + </message> + <message> +- <location filename="../src/PolkitListener.cpp" line="272"/> ++ <location filename="../src/PolkitListener.cpp" line="259"/> + <source>Password input error!</source> + <translation type="unfinished"></translation> + </message> +diff --git a/polkit-agent/i18n_ts/ug.ts b/polkit-agent/i18n_ts/ug.ts +index 58164c0..8614ae4 100644 +--- a/polkit-agent/i18n_ts/ug.ts ++++ b/polkit-agent/i18n_ts/ug.ts +@@ -51,6 +51,15 @@ + <translation type="vanished">二维码</translation> + </message> + </context> ++<context> ++ <name>FullScreenBackground</name> ++ <message> ++ <location filename="../src/fullscreenbackground.cpp" line="75"/> ++ <location filename="../src/fullscreenbackground.cpp" line="104"/> ++ <source>Authentication</source> ++ <translation type="unfinished">راستىنى دەلىللەش</translation> ++ </message> ++</context> + <context> + <name>LoginOptionsWidget</name> + <message> +@@ -65,9 +74,8 @@ + <context> + <name>MainWindow</name> + <message> +- <location filename="../src/mainwindow.cpp" line="66"/> + <source>Authentication</source> +- <translation>راستىنى دەلىللەش</translation> ++ <translation type="vanished">راستىنى دەلىللەش</translation> + </message> + <message> + <source>Fingerprint authentication failed, you still have %1 verification opportunities</source> +@@ -91,14 +99,14 @@ + <translation type="vanished">密码</translation> + </message> + <message> +- <location filename="../src/mainwindow.ui" line="409"/> +- <location filename="../src/mainwindow.cpp" line="1075"/> +- <location filename="../src/mainwindow.cpp" line="1143"/> ++ <location filename="../src/mainwindow.ui" line="398"/> ++ <location filename="../src/mainwindow.cpp" line="874"/> ++ <location filename="../src/mainwindow.cpp" line="943"/> + <source>Biometric</source> + <translation>بىئولەگىيەلىك ئالاھىدىلىكنى ئىشلىتىش</translation> + </message> + <message> +- <location filename="../src/mainwindow.ui" line="480"/> ++ <location filename="../src/mainwindow.ui" line="493"/> + <source>use password</source> + <translation>مەخپىي نومۇر ئىشلىتىش</translation> + </message> +@@ -147,20 +155,19 @@ + <translation type="vanished">Polkit.caller-pid:</translation> + </message> + <message> +- <location filename="../src/mainwindow.ui" line="441"/> +- <location filename="../src/mainwindow.cpp" line="1077"/> ++ <location filename="../src/mainwindow.ui" line="436"/> ++ <location filename="../src/mainwindow.cpp" line="875"/> + <source>Cancel</source> + <translation>ئەمەلدىن قالدۇرۇش</translation> + </message> + <message> +- <location filename="../src/mainwindow.ui" line="460"/> +- <location filename="../src/mainwindow.cpp" line="1073"/> ++ <location filename="../src/mainwindow.ui" line="461"/> ++ <location filename="../src/mainwindow.cpp" line="873"/> + <source>Authenticate</source> + <translation>ھوقۇق بېرىش</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1079"/> +- <location filename="../src/mainwindow.cpp" line="1183"/> ++ <location filename="../src/mainwindow.cpp" line="876"/> + <source>Use password</source> + <translation>مەخپىي نومۇر ئىشلىتىش ئارقىلىق دەلىللەش</translation> + </message> +@@ -185,30 +192,30 @@ + <translation type="vanished">认证中,请稍等...</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1219"/> +- <location filename="../src/mainwindow.cpp" line="1292"/> +- <location filename="../src/mainwindow.cpp" line="1293"/> ++ <location filename="../src/mainwindow.cpp" line="1003"/> ++ <location filename="../src/mainwindow.cpp" line="1081"/> ++ <location filename="../src/mainwindow.cpp" line="1082"/> + <source>Please try again in %1 minutes.</source> + <translation>٪1 مىنۇت ئىچىدە قايتا سىناپ بېقىڭ.</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1230"/> +- <location filename="../src/mainwindow.cpp" line="1302"/> +- <location filename="../src/mainwindow.cpp" line="1303"/> ++ <location filename="../src/mainwindow.cpp" line="1015"/> ++ <location filename="../src/mainwindow.cpp" line="1093"/> ++ <location filename="../src/mainwindow.cpp" line="1094"/> + <source>Please try again in %1 seconds.</source> + <translation>٪1 سېكۇنت ئىچىدە قايتا سىناپ بېقىڭ.</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1240"/> +- <location filename="../src/mainwindow.cpp" line="1241"/> +- <location filename="../src/mainwindow.cpp" line="1311"/> +- <location filename="../src/mainwindow.cpp" line="1312"/> ++ <location filename="../src/mainwindow.cpp" line="1026"/> ++ <location filename="../src/mainwindow.cpp" line="1027"/> ++ <location filename="../src/mainwindow.cpp" line="1104"/> ++ <location filename="../src/mainwindow.cpp" line="1105"/> + <source>Account locked permanently.</source> + <translation>ھېسابات مەڭگۈلۈك قۇلۇپلىنىدۇ.</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="834"/> +- <location filename="../src/mainwindow.cpp" line="835"/> ++ <location filename="../src/mainwindow.cpp" line="688"/> ++ <location filename="../src/mainwindow.cpp" line="689"/> + <source>Password cannot be empty</source> + <translation>مەخپىي نومۇرنى بوش قويۇشقا بولمايدۇ</translation> + </message> +@@ -221,8 +228,8 @@ + <translation type="vanished">无法验证%1,请输入密码.</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="242"/> +- <location filename="../src/mainwindow.cpp" line="246"/> ++ <location filename="../src/mainwindow.cpp" line="1558"/> ++ <location filename="../src/mainwindow.cpp" line="1562"/> + <source>Failed to verify %1, you still have %2 verification opportunities</source> + <translation>٪1 نى دەلىللەش مەغلۇپ بولدى، سىزدە يەنىلا ٪2 دەلىللەش پۇرسىتى بار</translation> + </message> +@@ -231,42 +238,42 @@ + <translation type="vanished">一个程序正试图执行一个需要特权的动作。要求授权以执行该动作。</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="731"/> ++ <location filename="../src/mainwindow.cpp" line="582"/> + <source>Password: </source> + <translation>مەخپىي نومۇر </translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="335"/> ++ <location filename="../src/mainwindow.cpp" line="165"/> + <source>Please enter your password or enroll your fingerprint </source> + <translation>مەخپىي نومۇرىڭىزنى كىرگۈزۈڭ ياكى بارماق ئىزىڭىزنى تونۇتۇڭ </translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="259"/> ++ <location filename="../src/mainwindow.cpp" line="1575"/> + <source>Abnormal network</source> + <translation>بىنورمال تور</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="665"/> ++ <location filename="../src/mainwindow.cpp" line="517"/> + <source>This operation requires the administrator's authorization. Please enter your password to allow this operation.</source> + <translation>بۇ مەشغۇلات باشقۇرغۇچىنىڭ ھوقۇق بېرىشىنى تەلەپ قىلىدۇ.مەخپىي نومۇرنى كىرگۈزۈپ بي قېتىمقى مەشغۇلاتنىڭ ئېلىپ بېرىلىشىغا يول قويۇڭ.</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="733"/> ++ <location filename="../src/mainwindow.cpp" line="584"/> + <source>_Password: </source> + <translation>مەخپىي نومۇر </translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="735"/> ++ <location filename="../src/mainwindow.cpp" line="586"/> + <source>_Password:</source> + <translation>مەخپىي نومۇر</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="850"/> ++ <location filename="../src/mainwindow.cpp" line="704"/> + <source>Authentication failed, please try again.</source> + <translation>دەلىللەش مەغلۇپ بولدى، قايتا سىناڭ</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="779"/> ++ <location filename="../src/mainwindow.cpp" line="635"/> + <source>days left</source> + <translation>1 كۈندىن كېيىن سىناب بېقىڭ</translation> + </message> +@@ -279,16 +286,16 @@ + <translation type="vanished">生物/扫码验证失败,您还有%1次尝试机会</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="226"/> +- <location filename="../src/mainwindow.cpp" line="1415"/> +- <location filename="../src/mainwindow.cpp" line="1417"/> ++ <location filename="../src/mainwindow.cpp" line="1243"/> ++ <location filename="../src/mainwindow.cpp" line="1246"/> ++ <location filename="../src/mainwindow.cpp" line="1539"/> + <source>Failed to verify %1, please enter password to unlock</source> + <translation>٪1 نى دەلىللەش مەغلۇپ بولدى، مەخپى نۇمۇر كىرگۈزۈڭ</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="231"/> +- <location filename="../src/mainwindow.cpp" line="233"/> +- <location filename="../src/mainwindow.cpp" line="1419"/> ++ <location filename="../src/mainwindow.cpp" line="1249"/> ++ <location filename="../src/mainwindow.cpp" line="1545"/> ++ <location filename="../src/mainwindow.cpp" line="1548"/> + <source>Unable to verify %1, please enter password to unlock</source> + <translation>٪1 نى دەلىللەشكە ئامالسىز، مەخپىي نومۇرنى كىرگۈزۈپ قۇلۇپنى ئېچىڭ</translation> + </message> +@@ -297,86 +304,121 @@ + <translation type="vanished">网络异常</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="671"/> ++ <location filename="../src/mainwindow.cpp" line="522"/> + <source>A program is attempting to perform an action that requires privileges.It requires authorization to perform the action.</source> + <translation>بىر پروگرامما ئىمتىياز تەلەپ قىلىدىغان ھەرىكەتنى قىلىشقا ئۇرۇنماقتا. بۇ ھەرىكەتنى ئىجرا قىلىش ئۈچۈن ھوقۇق تەلەپ قىلىدۇ.</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="108"/> +- <location filename="../src/mainwindow.cpp" line="729"/> ++ <location filename="../src/mainwindow.cpp" line="88"/> ++ <location filename="../src/mainwindow.cpp" line="580"/> + <source>Input Password</source> + <translation>ئىم كىرگۈزۈش</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="105"/> ++ <location filename="../src/mainwindow.cpp" line="85"/> + <source>Insert the ukey into the USB port</source> + <translation>ukey نى USB ئېغىزىغا چېتىپ قويۇڭ</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="107"/> ++ <location filename="../src/mainwindow.cpp" line="87"/> + <source>Enter the ukey password</source> + <translation>ukey مەخپىي نومۇرىنى كىرگۈزۈڭ</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="783"/> ++ <location filename="../src/mainwindow.cpp" line="93"/> ++ <source>Close</source> ++ <translation type="unfinished"></translation> ++ </message> ++ <message> ++ <location filename="../src/mainwindow.cpp" line="1261"/> ++ <source>Facial recognition to authorization</source> ++ <translation type="unfinished"></translation> ++ </message> ++ <message> ++ <location filename="../src/mainwindow.cpp" line="1264"/> ++ <source>Fingerprint recognition to authorization</source> ++ <translation type="unfinished"></translation> ++ </message> ++ <message> ++ <location filename="../src/mainwindow.cpp" line="1267"/> ++ <source>Voiceprint recognition to authorization</source> ++ <translation type="unfinished"></translation> ++ </message> ++ <message> ++ <location filename="../src/mainwindow.cpp" line="1270"/> ++ <source>Finger veins recognition to authorization</source> ++ <translation type="unfinished"></translation> ++ </message> ++ <message> ++ <location filename="../src/mainwindow.cpp" line="1273"/> ++ <source>Iris recognition to authorization</source> ++ <translation type="unfinished"></translation> ++ </message> ++ <message> ++ <location filename="../src/mainwindow.cpp" line="1276"/> ++ <source>Use the bound wechat scanning code to authorization</source> ++ <translation type="unfinished"></translation> ++ </message> ++ <message> ++ <location filename="../src/mainwindow.cpp" line="1579"/> ++ <source>Acquisition failure</source> ++ <translation type="unfinished"></translation> ++ </message> ++ <message> ++ <location filename="../src/mainwindow.cpp" line="638"/> + <source>hours left</source> + <translation>بىر سائەتتىن كېيىن ئېچىلىدۇ</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="787"/> ++ <location filename="../src/mainwindow.cpp" line="641"/> + <source>minutes left</source> + <translation>بىر مىنۇتتىن كېيىن ئېچىلىدۇ</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="791"/> ++ <location filename="../src/mainwindow.cpp" line="644"/> + <source>seconds left</source> + <translation>بىر سېكۇنتتىن كېيىن ئېچىلىدۇ</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="880"/> +- <location filename="../src/mainwindow.cpp" line="888"/> ++ <location filename="../src/mainwindow.cpp" line="734"/> ++ <location filename="../src/mainwindow.cpp" line="742"/> ++ <location filename="../src/mainwindow.cpp" line="1258"/> + <source>Input your password to authentication</source> + <translation>مەخپىي نومۇرنى كىرگۈزۈپ كىملىك دەلىللەش.</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1434"/> + <source>Verify face recognition or enter password to unlock</source> +- <translation>چىراي تونۇشنى دەلىللەش ياكى مەخپىي نومۇر كىرگۈزۈش ئارقىلىق قۇلۇپ ئېچىش</translation> ++ <translation type="vanished">چىراي تونۇشنى دەلىللەش ياكى مەخپىي نومۇر كىرگۈزۈش ئارقىلىق قۇلۇپ ئېچىش</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1439"/> + <source>Press fingerprint or enter password to unlock</source> +- <translation>بارماق ئىزىنى بېسىش ياكى مەخپىي نومۇر كىرگۈزۈش ئارقىلىق قۇلۇپ ئېچىش</translation> ++ <translation type="vanished">بارماق ئىزىنى بېسىش ياكى مەخپىي نومۇر كىرگۈزۈش ئارقىلىق قۇلۇپ ئېچىش</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1444"/> + <source>Verify voiceprint or enter password to unlock</source> +- <translation>ئاۋاز ئىزىنى دەلىللەش ياكى مەخپىي نومۇر كىرگۈزۈش ئارقىلىق قۇلۇپ ئېچىش</translation> ++ <translation type="vanished">ئاۋاز ئىزىنى دەلىللەش ياكى مەخپىي نومۇر كىرگۈزۈش ئارقىلىق قۇلۇپ ئېچىش</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1449"/> + <source>Verify finger vein or enter password to unlock</source> +- <translation>بارماق ئىزى ئارقىلىق ئېنىقلاش ياكى مەخپىي نومۇر كىرگۈزۈش ئارقىلىق قۇلۇپ ئېچىش</translation> ++ <translation type="vanished">بارماق ئىزى ئارقىلىق ئېنىقلاش ياكى مەخپىي نومۇر كىرگۈزۈش ئارقىلىق قۇلۇپ ئېچىش</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1454"/> + <source>Verify iris or enter password to unlock</source> +- <translation>Iris نى ئېنىقلاش ياكى مەخپىي نومۇر كىرگۈزۈش ئارقىلىق قۇلۇپ ئېچىش</translation> ++ <translation type="vanished">Iris نى ئېنىقلاش ياكى مەخپىي نومۇر كىرگۈزۈش ئارقىلىق قۇلۇپ ئېچىش</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1459"/> + <source>Use the bound wechat scanning code or enter the password to unlock</source> +- <translation>باغلانغان ئۈندىدارنى سىكاننېرلاش كودى ياكى مەخپىي نومۇرىنى كىرگۈزۈپ قۇلۇپ ئېچىش</translation> ++ <translation type="vanished">باغلانغان ئۈندىدارنى سىكاننېرلاش كودى ياكى مەخپىي نومۇرىنى كىرگۈزۈپ قۇلۇپ ئېچىش</translation> + </message> + <message> + <source>Use the bound wechat scanning code or enter the password to log in</source> + <translation type="vanished">使用绑定的微信扫码或输入密码登录</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="779"/> +- <location filename="../src/mainwindow.cpp" line="783"/> +- <location filename="../src/mainwindow.cpp" line="787"/> +- <location filename="../src/mainwindow.cpp" line="791"/> ++ <location filename="../src/mainwindow.cpp" line="635"/> ++ <location filename="../src/mainwindow.cpp" line="638"/> ++ <location filename="../src/mainwindow.cpp" line="641"/> ++ <location filename="../src/mainwindow.cpp" line="644"/> + <source>Account locked,</source> + <translation>ئىشلىتىش نومۇرىڭىز قۇلۇپلىنىپ قالدى</translation> + </message> +@@ -388,17 +430,17 @@ + <context> + <name>PolkitListener</name> + <message> +- <location filename="../src/PolkitListener.cpp" line="88"/> ++ <location filename="../src/PolkitListener.cpp" line="86"/> + <source>Another client is already authenticating, please try again later.</source> + <translation>يەنە بىر خېرىدار دەلىللەۋاتىدۇ، سەل تۇرۇپ قايتا سىناڭ.</translation> + </message> + <message> +- <location filename="../src/PolkitListener.cpp" line="265"/> ++ <location filename="../src/PolkitListener.cpp" line="253"/> + <source>Authentication failure, please try again.</source> + <translation>دەلىللەش مەغلۇپ بولدى، قايتا سىناڭ.</translation> + </message> + <message> +- <location filename="../src/PolkitListener.cpp" line="272"/> ++ <location filename="../src/PolkitListener.cpp" line="259"/> + <source>Password input error!</source> + <translation>كىرگۈزگەن مەخپىي نومۇر خاتا بولدى</translation> + </message> +diff --git a/polkit-agent/i18n_ts/zh_CN.ts b/polkit-agent/i18n_ts/zh_CN.ts +index 070732c..5fc6ea0 100644 +--- a/polkit-agent/i18n_ts/zh_CN.ts ++++ b/polkit-agent/i18n_ts/zh_CN.ts +@@ -51,6 +51,15 @@ + <translation type="vanished">二维码</translation> + </message> + </context> ++<context> ++ <name>FullScreenBackground</name> ++ <message> ++ <location filename="../src/fullscreenbackground.cpp" line="75"/> ++ <location filename="../src/fullscreenbackground.cpp" line="104"/> ++ <source>Authentication</source> ++ <translation type="unfinished">授权</translation> ++ </message> ++</context> + <context> + <name>LoginOptionsWidget</name> + <message> +@@ -65,9 +74,8 @@ + <context> + <name>MainWindow</name> + <message> +- <location filename="../src/mainwindow.cpp" line="66"/> + <source>Authentication</source> +- <translation>授权</translation> ++ <translation type="vanished">授权</translation> + </message> + <message> + <source>Fingerprint authentication failed, you still have %1 verification opportunities</source> +@@ -91,14 +99,14 @@ + <translation type="vanished">密码</translation> + </message> + <message> +- <location filename="../src/mainwindow.ui" line="409"/> +- <location filename="../src/mainwindow.cpp" line="1075"/> +- <location filename="../src/mainwindow.cpp" line="1143"/> ++ <location filename="../src/mainwindow.ui" line="398"/> ++ <location filename="../src/mainwindow.cpp" line="874"/> ++ <location filename="../src/mainwindow.cpp" line="943"/> + <source>Biometric</source> + <translation>使用生物识别</translation> + </message> + <message> +- <location filename="../src/mainwindow.ui" line="480"/> ++ <location filename="../src/mainwindow.ui" line="493"/> + <source>use password</source> + <translation>使用密码验证</translation> + </message> +@@ -147,20 +155,19 @@ + <translation type="vanished">Polkit.caller-pid:</translation> + </message> + <message> +- <location filename="../src/mainwindow.ui" line="441"/> +- <location filename="../src/mainwindow.cpp" line="1077"/> ++ <location filename="../src/mainwindow.ui" line="436"/> ++ <location filename="../src/mainwindow.cpp" line="875"/> + <source>Cancel</source> + <translation>取消</translation> + </message> + <message> +- <location filename="../src/mainwindow.ui" line="460"/> +- <location filename="../src/mainwindow.cpp" line="1073"/> ++ <location filename="../src/mainwindow.ui" line="461"/> ++ <location filename="../src/mainwindow.cpp" line="873"/> + <source>Authenticate</source> + <translation>授权</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1079"/> +- <location filename="../src/mainwindow.cpp" line="1183"/> ++ <location filename="../src/mainwindow.cpp" line="876"/> + <source>Use password</source> + <translation>使用密码验证</translation> + </message> +@@ -185,30 +192,30 @@ + <translation type="vanished">认证中,请稍等...</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1219"/> +- <location filename="../src/mainwindow.cpp" line="1292"/> +- <location filename="../src/mainwindow.cpp" line="1293"/> ++ <location filename="../src/mainwindow.cpp" line="1003"/> ++ <location filename="../src/mainwindow.cpp" line="1081"/> ++ <location filename="../src/mainwindow.cpp" line="1082"/> + <source>Please try again in %1 minutes.</source> + <translation>请%1分钟后再试</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1230"/> +- <location filename="../src/mainwindow.cpp" line="1302"/> +- <location filename="../src/mainwindow.cpp" line="1303"/> ++ <location filename="../src/mainwindow.cpp" line="1015"/> ++ <location filename="../src/mainwindow.cpp" line="1093"/> ++ <location filename="../src/mainwindow.cpp" line="1094"/> + <source>Please try again in %1 seconds.</source> + <translation>请%1秒后再试</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1240"/> +- <location filename="../src/mainwindow.cpp" line="1241"/> +- <location filename="../src/mainwindow.cpp" line="1311"/> +- <location filename="../src/mainwindow.cpp" line="1312"/> ++ <location filename="../src/mainwindow.cpp" line="1026"/> ++ <location filename="../src/mainwindow.cpp" line="1027"/> ++ <location filename="../src/mainwindow.cpp" line="1104"/> ++ <location filename="../src/mainwindow.cpp" line="1105"/> + <source>Account locked permanently.</source> + <translation>账号已被永久锁定</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="834"/> +- <location filename="../src/mainwindow.cpp" line="835"/> ++ <location filename="../src/mainwindow.cpp" line="688"/> ++ <location filename="../src/mainwindow.cpp" line="689"/> + <source>Password cannot be empty</source> + <translation>密码不能为空</translation> + </message> +@@ -221,8 +228,8 @@ + <translation type="vanished">无法验证%1,请输入密码.</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="242"/> +- <location filename="../src/mainwindow.cpp" line="246"/> ++ <location filename="../src/mainwindow.cpp" line="1558"/> ++ <location filename="../src/mainwindow.cpp" line="1562"/> + <source>Failed to verify %1, you still have %2 verification opportunities</source> + <translation>验证%1失败,您还有%2次尝试机会</translation> + </message> +@@ -231,42 +238,42 @@ + <translation type="vanished">一个程序正试图执行一个需要特权的动作。要求授权以执行该动作。</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="731"/> ++ <location filename="../src/mainwindow.cpp" line="582"/> + <source>Password: </source> + <translation>密码: </translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="335"/> ++ <location filename="../src/mainwindow.cpp" line="165"/> + <source>Please enter your password or enroll your fingerprint </source> + <translation>请输入密码或者录入指纹</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="259"/> ++ <location filename="../src/mainwindow.cpp" line="1575"/> + <source>Abnormal network</source> + <translation>网络异常</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="665"/> ++ <location filename="../src/mainwindow.cpp" line="517"/> + <source>This operation requires the administrator's authorization. Please enter your password to allow this operation.</source> + <translation>本次操作需要通过管理员的授权才能继续执行,请输入密码以允许本次操作。</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="733"/> ++ <location filename="../src/mainwindow.cpp" line="584"/> + <source>_Password: </source> + <translation>密码: </translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="735"/> ++ <location filename="../src/mainwindow.cpp" line="586"/> + <source>_Password:</source> + <translation>密码:</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="850"/> ++ <location filename="../src/mainwindow.cpp" line="704"/> + <source>Authentication failed, please try again.</source> + <translation>认证失败,请重试。</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="779"/> ++ <location filename="../src/mainwindow.cpp" line="635"/> + <source>days left</source> + <translation>天后解锁</translation> + </message> +@@ -279,16 +286,16 @@ + <translation type="vanished">生物/扫码验证失败,您还有%1次尝试机会</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="226"/> +- <location filename="../src/mainwindow.cpp" line="1415"/> +- <location filename="../src/mainwindow.cpp" line="1417"/> ++ <location filename="../src/mainwindow.cpp" line="1243"/> ++ <location filename="../src/mainwindow.cpp" line="1246"/> ++ <location filename="../src/mainwindow.cpp" line="1539"/> + <source>Failed to verify %1, please enter password to unlock</source> + <translation>验证%1失败,请输入密码解锁</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="231"/> +- <location filename="../src/mainwindow.cpp" line="233"/> +- <location filename="../src/mainwindow.cpp" line="1419"/> ++ <location filename="../src/mainwindow.cpp" line="1249"/> ++ <location filename="../src/mainwindow.cpp" line="1545"/> ++ <location filename="../src/mainwindow.cpp" line="1548"/> + <source>Unable to verify %1, please enter password to unlock</source> + <translation>无法验证%1,请输入密码解锁</translation> + </message> +@@ -297,86 +304,121 @@ + <translation type="vanished">网络异常</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="671"/> ++ <location filename="../src/mainwindow.cpp" line="522"/> + <source>A program is attempting to perform an action that requires privileges.It requires authorization to perform the action.</source> + <translation>一个程序正试图执行一个需要特权的动作,要求授权以执行该动作。</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="108"/> +- <location filename="../src/mainwindow.cpp" line="729"/> ++ <location filename="../src/mainwindow.cpp" line="88"/> ++ <location filename="../src/mainwindow.cpp" line="580"/> + <source>Input Password</source> + <translation>输入密码</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="105"/> ++ <location filename="../src/mainwindow.cpp" line="85"/> + <source>Insert the ukey into the USB port</source> + <translation>请将安全密钥插入USB端口</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="107"/> ++ <location filename="../src/mainwindow.cpp" line="87"/> + <source>Enter the ukey password</source> + <translation>输入安全密钥密码</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="783"/> ++ <location filename="../src/mainwindow.cpp" line="93"/> ++ <source>Close</source> ++ <translation>关闭</translation> ++ </message> ++ <message> ++ <location filename="../src/mainwindow.cpp" line="1261"/> ++ <source>Facial recognition to authorization</source> ++ <translation>识别人脸以授权</translation> ++ </message> ++ <message> ++ <location filename="../src/mainwindow.cpp" line="1264"/> ++ <source>Fingerprint recognition to authorization</source> ++ <translation>识别指纹以授权</translation> ++ </message> ++ <message> ++ <location filename="../src/mainwindow.cpp" line="1267"/> ++ <source>Voiceprint recognition to authorization</source> ++ <translation>识别声纹以授权</translation> ++ </message> ++ <message> ++ <location filename="../src/mainwindow.cpp" line="1270"/> ++ <source>Finger veins recognition to authorization</source> ++ <translation>识别指静脉以授权</translation> ++ </message> ++ <message> ++ <location filename="../src/mainwindow.cpp" line="1273"/> ++ <source>Iris recognition to authorization</source> ++ <translation>识别虹膜以授权</translation> ++ </message> ++ <message> ++ <location filename="../src/mainwindow.cpp" line="1276"/> ++ <source>Use the bound wechat scanning code to authorization</source> ++ <translation>微信扫码以授权</translation> ++ </message> ++ <message> ++ <location filename="../src/mainwindow.cpp" line="1579"/> ++ <source>Acquisition failure</source> ++ <translation>获取失败</translation> ++ </message> ++ <message> ++ <location filename="../src/mainwindow.cpp" line="638"/> + <source>hours left</source> + <translation>小时后解锁</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="787"/> ++ <location filename="../src/mainwindow.cpp" line="641"/> + <source>minutes left</source> + <translation>分钟后解锁</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="791"/> ++ <location filename="../src/mainwindow.cpp" line="644"/> + <source>seconds left</source> + <translation>秒后解锁</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="880"/> +- <location filename="../src/mainwindow.cpp" line="888"/> ++ <location filename="../src/mainwindow.cpp" line="734"/> ++ <location filename="../src/mainwindow.cpp" line="742"/> ++ <location filename="../src/mainwindow.cpp" line="1258"/> + <source>Input your password to authentication</source> + <translation>输入密码以授权</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1434"/> + <source>Verify face recognition or enter password to unlock</source> +- <translation>验证人脸识别或输入密码解锁</translation> ++ <translation type="vanished">验证人脸识别或输入密码解锁</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1439"/> + <source>Press fingerprint or enter password to unlock</source> +- <translation>按压指纹或输入密码解锁</translation> ++ <translation type="vanished">按压指纹或输入密码解锁</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1444"/> + <source>Verify voiceprint or enter password to unlock</source> +- <translation>验证声纹或输入密码解锁</translation> ++ <translation type="vanished">验证声纹或输入密码解锁</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1449"/> + <source>Verify finger vein or enter password to unlock</source> +- <translation>验证指静脉或输入密码解锁</translation> ++ <translation type="vanished">验证指静脉或输入密码解锁</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1454"/> + <source>Verify iris or enter password to unlock</source> +- <translation>验证虹膜或输入密码解锁</translation> ++ <translation type="vanished">验证虹膜或输入密码解锁</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1459"/> + <source>Use the bound wechat scanning code or enter the password to unlock</source> +- <translation>使用绑定的微信扫码或输入密码解锁</translation> ++ <translation type="vanished">使用绑定的微信扫码或输入密码解锁</translation> + </message> + <message> + <source>Use the bound wechat scanning code or enter the password to log in</source> + <translation type="vanished">使用绑定的微信扫码或输入密码登录</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="779"/> +- <location filename="../src/mainwindow.cpp" line="783"/> +- <location filename="../src/mainwindow.cpp" line="787"/> +- <location filename="../src/mainwindow.cpp" line="791"/> ++ <location filename="../src/mainwindow.cpp" line="635"/> ++ <location filename="../src/mainwindow.cpp" line="638"/> ++ <location filename="../src/mainwindow.cpp" line="641"/> ++ <location filename="../src/mainwindow.cpp" line="644"/> + <source>Account locked,</source> + <translation>账户已锁定,</translation> + </message> +@@ -388,17 +430,17 @@ + <context> + <name>PolkitListener</name> + <message> +- <location filename="../src/PolkitListener.cpp" line="88"/> ++ <location filename="../src/PolkitListener.cpp" line="86"/> + <source>Another client is already authenticating, please try again later.</source> + <translation>有另外一个客户端正在认证,请稍后重试。</translation> + </message> + <message> +- <location filename="../src/PolkitListener.cpp" line="265"/> ++ <location filename="../src/PolkitListener.cpp" line="253"/> + <source>Authentication failure, please try again.</source> + <translation>认证失败,请重试。</translation> + </message> + <message> +- <location filename="../src/PolkitListener.cpp" line="272"/> ++ <location filename="../src/PolkitListener.cpp" line="259"/> + <source>Password input error!</source> + <translation>密码输入错误!</translation> + </message> +diff --git a/polkit-agent/i18n_ts/zh_HK.ts b/polkit-agent/i18n_ts/zh_HK.ts +index 95c8c43..52c432d 100644 +--- a/polkit-agent/i18n_ts/zh_HK.ts ++++ b/polkit-agent/i18n_ts/zh_HK.ts +@@ -1,6 +1,6 @@ + <?xml version="1.0" encoding="utf-8"?> + <!DOCTYPE TS> +-<TS version="2.1" language="zh_Hant"> ++<TS version="2.1" language="zh"> + <context> + <name>BioAuthWidget</name> + <message> +@@ -51,6 +51,15 @@ + <translation type="vanished">二维码</translation> + </message> + </context> ++<context> ++ <name>FullScreenBackground</name> ++ <message> ++ <location filename="../src/fullscreenbackground.cpp" line="75"/> ++ <location filename="../src/fullscreenbackground.cpp" line="104"/> ++ <source>Authentication</source> ++ <translation type="unfinished">授權</translation> ++ </message> ++</context> + <context> + <name>LoginOptionsWidget</name> + <message> +@@ -65,9 +74,8 @@ + <context> + <name>MainWindow</name> + <message> +- <location filename="../src/mainwindow.cpp" line="66"/> + <source>Authentication</source> +- <translation>授權</translation> ++ <translation type="vanished">授權</translation> + </message> + <message> + <source>Fingerprint authentication failed, you still have %1 verification opportunities</source> +@@ -91,14 +99,14 @@ + <translation type="vanished">密码</translation> + </message> + <message> +- <location filename="../src/mainwindow.ui" line="409"/> +- <location filename="../src/mainwindow.cpp" line="1075"/> +- <location filename="../src/mainwindow.cpp" line="1143"/> ++ <location filename="../src/mainwindow.ui" line="398"/> ++ <location filename="../src/mainwindow.cpp" line="874"/> ++ <location filename="../src/mainwindow.cpp" line="943"/> + <source>Biometric</source> + <translation>使用生物識別</translation> + </message> + <message> +- <location filename="../src/mainwindow.ui" line="480"/> ++ <location filename="../src/mainwindow.ui" line="493"/> + <source>use password</source> + <translation>使用密碼驗證</translation> + </message> +@@ -147,20 +155,19 @@ + <translation type="vanished">Polkit.caller-pid:</translation> + </message> + <message> +- <location filename="../src/mainwindow.ui" line="441"/> +- <location filename="../src/mainwindow.cpp" line="1077"/> ++ <location filename="../src/mainwindow.ui" line="436"/> ++ <location filename="../src/mainwindow.cpp" line="875"/> + <source>Cancel</source> + <translation>取消</translation> + </message> + <message> +- <location filename="../src/mainwindow.ui" line="460"/> +- <location filename="../src/mainwindow.cpp" line="1073"/> ++ <location filename="../src/mainwindow.ui" line="461"/> ++ <location filename="../src/mainwindow.cpp" line="873"/> + <source>Authenticate</source> + <translation>授權</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1079"/> +- <location filename="../src/mainwindow.cpp" line="1183"/> ++ <location filename="../src/mainwindow.cpp" line="876"/> + <source>Use password</source> + <translation>使用密碼驗證</translation> + </message> +@@ -185,30 +192,30 @@ + <translation type="vanished">认证中,请稍等...</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1219"/> +- <location filename="../src/mainwindow.cpp" line="1292"/> +- <location filename="../src/mainwindow.cpp" line="1293"/> ++ <location filename="../src/mainwindow.cpp" line="1003"/> ++ <location filename="../src/mainwindow.cpp" line="1081"/> ++ <location filename="../src/mainwindow.cpp" line="1082"/> + <source>Please try again in %1 minutes.</source> + <translation>請%1分鐘后再試</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1230"/> +- <location filename="../src/mainwindow.cpp" line="1302"/> +- <location filename="../src/mainwindow.cpp" line="1303"/> ++ <location filename="../src/mainwindow.cpp" line="1015"/> ++ <location filename="../src/mainwindow.cpp" line="1093"/> ++ <location filename="../src/mainwindow.cpp" line="1094"/> + <source>Please try again in %1 seconds.</source> + <translation>請%1秒後再試</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1240"/> +- <location filename="../src/mainwindow.cpp" line="1241"/> +- <location filename="../src/mainwindow.cpp" line="1311"/> +- <location filename="../src/mainwindow.cpp" line="1312"/> ++ <location filename="../src/mainwindow.cpp" line="1026"/> ++ <location filename="../src/mainwindow.cpp" line="1027"/> ++ <location filename="../src/mainwindow.cpp" line="1104"/> ++ <location filename="../src/mainwindow.cpp" line="1105"/> + <source>Account locked permanently.</source> + <translation>帳號已被永久鎖定</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="834"/> +- <location filename="../src/mainwindow.cpp" line="835"/> ++ <location filename="../src/mainwindow.cpp" line="688"/> ++ <location filename="../src/mainwindow.cpp" line="689"/> + <source>Password cannot be empty</source> + <translation>密碼不能為空</translation> + </message> +@@ -221,8 +228,8 @@ + <translation type="vanished">无法验证%1,请输入密码.</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="242"/> +- <location filename="../src/mainwindow.cpp" line="246"/> ++ <location filename="../src/mainwindow.cpp" line="1558"/> ++ <location filename="../src/mainwindow.cpp" line="1562"/> + <source>Failed to verify %1, you still have %2 verification opportunities</source> + <translation>驗證%1失敗,您還有%2次嘗試機會</translation> + </message> +@@ -231,42 +238,42 @@ + <translation type="vanished">一个程序正试图执行一个需要特权的动作。要求授权以执行该动作。</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="731"/> ++ <location filename="../src/mainwindow.cpp" line="582"/> + <source>Password: </source> + <translation>密碼: </translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="335"/> ++ <location filename="../src/mainwindow.cpp" line="165"/> + <source>Please enter your password or enroll your fingerprint </source> + <translation>請輸入密碼或者錄入指紋 </translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="259"/> ++ <location filename="../src/mainwindow.cpp" line="1575"/> + <source>Abnormal network</source> + <translation>網路異常</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="665"/> ++ <location filename="../src/mainwindow.cpp" line="517"/> + <source>This operation requires the administrator's authorization. Please enter your password to allow this operation.</source> + <translation>本次操作需要通過管理員的授權才能繼續執行,請輸入密碼以允許本次操作。</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="733"/> ++ <location filename="../src/mainwindow.cpp" line="584"/> + <source>_Password: </source> + <translation>密碼: </translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="735"/> ++ <location filename="../src/mainwindow.cpp" line="586"/> + <source>_Password:</source> + <translation>密碼:</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="850"/> ++ <location filename="../src/mainwindow.cpp" line="704"/> + <source>Authentication failed, please try again.</source> + <translation>認證失敗,請重試。</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="779"/> ++ <location filename="../src/mainwindow.cpp" line="635"/> + <source>days left</source> + <translation>天后解鎖</translation> + </message> +@@ -279,16 +286,16 @@ + <translation type="vanished">生物/扫码验证失败,您还有%1次尝试机会</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="226"/> +- <location filename="../src/mainwindow.cpp" line="1415"/> +- <location filename="../src/mainwindow.cpp" line="1417"/> ++ <location filename="../src/mainwindow.cpp" line="1243"/> ++ <location filename="../src/mainwindow.cpp" line="1246"/> ++ <location filename="../src/mainwindow.cpp" line="1539"/> + <source>Failed to verify %1, please enter password to unlock</source> + <translation>驗證%1失敗,請輸入密碼解鎖</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="231"/> +- <location filename="../src/mainwindow.cpp" line="233"/> +- <location filename="../src/mainwindow.cpp" line="1419"/> ++ <location filename="../src/mainwindow.cpp" line="1249"/> ++ <location filename="../src/mainwindow.cpp" line="1545"/> ++ <location filename="../src/mainwindow.cpp" line="1548"/> + <source>Unable to verify %1, please enter password to unlock</source> + <translation>無法驗證%1,請輸入密碼解鎖</translation> + </message> +@@ -297,86 +304,121 @@ + <translation type="vanished">网络异常</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="671"/> ++ <location filename="../src/mainwindow.cpp" line="522"/> + <source>A program is attempting to perform an action that requires privileges.It requires authorization to perform the action.</source> + <translation>一個程式正試圖執行一個需要特權的動作,要求授權以執行該動作。</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="108"/> +- <location filename="../src/mainwindow.cpp" line="729"/> ++ <location filename="../src/mainwindow.cpp" line="88"/> ++ <location filename="../src/mainwindow.cpp" line="580"/> + <source>Input Password</source> + <translation>輸入密碼</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="105"/> ++ <location filename="../src/mainwindow.cpp" line="85"/> + <source>Insert the ukey into the USB port</source> + <translation>請將安全金鑰插入USB埠</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="107"/> ++ <location filename="../src/mainwindow.cpp" line="87"/> + <source>Enter the ukey password</source> + <translation>輸入安全金鑰密碼</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="783"/> ++ <location filename="../src/mainwindow.cpp" line="93"/> ++ <source>Close</source> ++ <translation>關閉</translation> ++ </message> ++ <message> ++ <location filename="../src/mainwindow.cpp" line="1261"/> ++ <source>Facial recognition to authorization</source> ++ <translation>識別人臉以授權</translation> ++ </message> ++ <message> ++ <location filename="../src/mainwindow.cpp" line="1264"/> ++ <source>Fingerprint recognition to authorization</source> ++ <translation>識別指紋以授權</translation> ++ </message> ++ <message> ++ <location filename="../src/mainwindow.cpp" line="1267"/> ++ <source>Voiceprint recognition to authorization</source> ++ <translation>識別聲紋以授權</translation> ++ </message> ++ <message> ++ <location filename="../src/mainwindow.cpp" line="1270"/> ++ <source>Finger veins recognition to authorization</source> ++ <translation>識別指靜脈以授權</translation> ++ </message> ++ <message> ++ <location filename="../src/mainwindow.cpp" line="1273"/> ++ <source>Iris recognition to authorization</source> ++ <translation>識別虹膜以授權</translation> ++ </message> ++ <message> ++ <location filename="../src/mainwindow.cpp" line="1276"/> ++ <source>Use the bound wechat scanning code to authorization</source> ++ <translation>微信掃碼以授權</translation> ++ </message> ++ <message> ++ <location filename="../src/mainwindow.cpp" line="1579"/> ++ <source>Acquisition failure</source> ++ <translation>獲取失敗</translation> ++ </message> ++ <message> ++ <location filename="../src/mainwindow.cpp" line="638"/> + <source>hours left</source> + <translation>小時後解鎖</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="787"/> ++ <location filename="../src/mainwindow.cpp" line="641"/> + <source>minutes left</source> + <translation>分鐘後解鎖</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="791"/> ++ <location filename="../src/mainwindow.cpp" line="644"/> + <source>seconds left</source> + <translation>秒後解鎖</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="880"/> +- <location filename="../src/mainwindow.cpp" line="888"/> ++ <location filename="../src/mainwindow.cpp" line="734"/> ++ <location filename="../src/mainwindow.cpp" line="742"/> ++ <location filename="../src/mainwindow.cpp" line="1258"/> + <source>Input your password to authentication</source> + <translation>輸入密碼以認證</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1434"/> + <source>Verify face recognition or enter password to unlock</source> +- <translation>驗證人臉識別或輸入密碼解鎖</translation> ++ <translation type="vanished">驗證人臉識別或輸入密碼解鎖</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1439"/> + <source>Press fingerprint or enter password to unlock</source> +- <translation>按壓指紋或輸入密碼解鎖</translation> ++ <translation type="vanished">按壓指紋或輸入密碼解鎖</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1444"/> + <source>Verify voiceprint or enter password to unlock</source> +- <translation>驗證聲紋或輸入密碼解鎖</translation> ++ <translation type="vanished">驗證聲紋或輸入密碼解鎖</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1449"/> + <source>Verify finger vein or enter password to unlock</source> +- <translation>驗證指靜脈或輸入密碼解鎖</translation> ++ <translation type="vanished">驗證指靜脈或輸入密碼解鎖</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1454"/> + <source>Verify iris or enter password to unlock</source> +- <translation>驗證虹膜或輸入密碼解鎖</translation> ++ <translation type="vanished">驗證虹膜或輸入密碼解鎖</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="1459"/> + <source>Use the bound wechat scanning code or enter the password to unlock</source> +- <translation>使用綁定的微信掃碼或輸入密碼解鎖</translation> ++ <translation type="vanished">使用綁定的微信掃碼或輸入密碼解鎖</translation> + </message> + <message> + <source>Use the bound wechat scanning code or enter the password to log in</source> + <translation type="vanished">使用绑定的微信扫码或输入密码登录</translation> + </message> + <message> +- <location filename="../src/mainwindow.cpp" line="779"/> +- <location filename="../src/mainwindow.cpp" line="783"/> +- <location filename="../src/mainwindow.cpp" line="787"/> +- <location filename="../src/mainwindow.cpp" line="791"/> ++ <location filename="../src/mainwindow.cpp" line="635"/> ++ <location filename="../src/mainwindow.cpp" line="638"/> ++ <location filename="../src/mainwindow.cpp" line="641"/> ++ <location filename="../src/mainwindow.cpp" line="644"/> + <source>Account locked,</source> + <translation>帳戶已鎖定,</translation> + </message> +@@ -388,17 +430,17 @@ + <context> + <name>PolkitListener</name> + <message> +- <location filename="../src/PolkitListener.cpp" line="88"/> ++ <location filename="../src/PolkitListener.cpp" line="86"/> + <source>Another client is already authenticating, please try again later.</source> + <translation>有另外一個用戶端正在認證,請稍後重試。</translation> + </message> + <message> +- <location filename="../src/PolkitListener.cpp" line="265"/> ++ <location filename="../src/PolkitListener.cpp" line="253"/> + <source>Authentication failure, please try again.</source> + <translation>認證失敗,請重試。</translation> + </message> + <message> +- <location filename="../src/PolkitListener.cpp" line="272"/> ++ <location filename="../src/PolkitListener.cpp" line="259"/> + <source>Password input error!</source> + <translation>密碼輸入錯誤!</translation> + </message> +diff --git a/polkit-agent/src/PolkitListener.cpp b/polkit-agent/src/PolkitListener.cpp +index 749e551..6a37a22 100644 +--- a/polkit-agent/src/PolkitListener.cpp ++++ b/polkit-agent/src/PolkitListener.cpp +@@ -31,28 +31,21 @@ + #include <QApplication> + #include <QScreen> + #include <fcntl.h> +-#include <kysdk/kysdk-system/libkysysinfo.h> + + #include "PolkitListener.h" + #include "mainwindow.h" + #include "generic.h" + #include <libkysysinfo.h> +-#include "windowmanager/windowmanager.h" + + PolkitListener::PolkitListener(QObject *parent) +- : Listener(parent), +- inProgress(false), +- currentIdentity(0), +- mainWindow(nullptr) ++ : Listener(parent), inProgress(false), currentIdentity(0), m_managerFullScreen(nullptr) + { + m_isSupportTableMode = isSupportTableMode(); +- m_isMavis = isMavis(); +- qDebug()<<"isSupportTableMode:"<<m_isSupportTableMode; ++ m_isMavis = isMavis(); ++ qDebug() << "isSupportTableMode:" << m_isSupportTableMode; + } + +-PolkitListener::~PolkitListener() +-{ +-} ++PolkitListener::~PolkitListener() {} + + bool PolkitListener::isMavis() + { +@@ -81,12 +74,15 @@ bool PolkitListener::isSupportTableMode() + + /* initiateAuthentication message from polkit */ + void PolkitListener::initiateAuthentication( +- const QString &actionId, const QString &message, +- const QString &iconName, const PolkitQt1::Details &details, +- const QString &cookie, const PolkitQt1::Identity::List &identities, ++ const QString &actionId, ++ const QString &message, ++ const QString &iconName, ++ const PolkitQt1::Details &details, ++ const QString &cookie, ++ const PolkitQt1::Identity::List &identities, + PolkitQt1::Agent::AsyncResult *result) + { +- if(inProgress){ ++ if (inProgress) { + result->setError(tr("Another client is already authenticating, please try again later.")); + result->setCompleted(); + qDebug() << "Another client is already authenticating, please try again later."; +@@ -107,13 +103,13 @@ void PolkitListener::initiateAuthentication( + + subjectPid = details.lookup("polkit.subject-pid"); + callerPid = details.lookup("polkit.caller-pid"); ++ implicitActiveStr = details.lookup("implicit_authorization"); + + /* find action description for actionId */ +- foreach(const PolkitQt1::ActionDescription &desc, +- PolkitQt1::Authority::instance()->enumerateActionsSync()) { ++ foreach (const PolkitQt1::ActionDescription &desc, PolkitQt1::Authority::instance()->enumerateActionsSync()) { + if (actionId == desc.actionId()) { + actionDesc = desc; +- qDebug() << "Action description has been found" ; ++ qDebug() << "Action description has been found"; + break; + } + } +@@ -135,117 +131,103 @@ void PolkitListener::initiateAuthentication( + this->result = result; + session.clear(); + if (identities.length() == 1) { +- this->currentIdentity = identities[0]; ++ this->currentIdentity = identities[0]; + } else { + currentIdentity = identities[0]; + } + + /* Create the polkit window */ + +- mainWindow = new MainWindow; +-// MotifWmHints hints; +-// hints.flags = MWM_HINTS_FUNCTIONS|MWM_HINTS_DECORATIONS; +-// hints.functions = MWM_FUNC_ALL; +-// hints.decorations = MWM_DECOR_BORDER; +-// XAtomHelper::getInstance()->setWindowMotifHint(mainWindow->winId(), hints); +- mainWindow->setIcon(iconName); +- mainWindow->setCurProject(m_isMavis); +- mainWindow->setHeader(message); +- mainWindow->setUsers(usersList); +- mainWindow->setEditInputMethod(m_isSupportTableMode); +- mainWindow->setFixedSize(420, 297); +- /* +- mainWindow->setDetails(subjectPid, callerPid, +- actionDesc.actionId(), +- actionDesc.description(), +- actionDesc.vendorName(), +- actionDesc.vendorUrl()); +- */ +- /* set the position of the mainwindow */ +- QPoint pos = QCursor::pos(); +- QRect desScreenGeometry; +- for (QScreen *screen : qApp->screens()) { +- if (screen->geometry().contains(pos)) { +- desScreenGeometry = screen->geometry(); +- } +- } +- +- if (desScreenGeometry.isEmpty()) { +- desScreenGeometry = qApp->primaryScreen()->geometry(); +- } +-// mainWindow->move(desScreenGeometry.x() + (desScreenGeometry.width() - mainWindow->width())/2, +-// desScreenGeometry.y() + (desScreenGeometry.height() - mainWindow->height())/2); +-// qDebug()<<"MoveWindow to center1:"<<desScreenGeometry<<","<<mainWindow->geometry()<<QGuiApplication::platformName();; +- +- +- +- connect(mainWindow, &MainWindow::accept, this, &PolkitListener::onResponse); +- connect(mainWindow, &MainWindow::canceled, this, [&]{ +- wasCancelled = true; +- unacknowledged_messages = false; +- if(!session.isNull()) { +- session.data()->cancel(); +- } +- }); +- +- connect(mainWindow, &MainWindow::switchToBiometric, this, [&]{ +- wasSwitchToBiometric = true; +- startAuthentication(); +- }); +- +- connect(mainWindow, &MainWindow::restartAuth, this, [&]{ +- startAuthentication(); +- }); +- +- connect(mainWindow, &MainWindow::userChanged, this, [&](const QString &userName){ +- for(int i = 0; i < this->identities.size(); i++) { +- auto identity = this->identities.at(i); +- if(identity.toString().remove("unix-user:") == userName) { +- this->currentIdentity = this->identities.at(i); +- numTries = 0; +- startAuthentication(); +- break; ++ m_managerFullScreen = new FullScreenBackground(); ++ m_managerFullScreen->initMainWindow( ++ iconName, message, usersList, subjectPid, callerPid, actionDesc, m_isMavis, m_isSupportTableMode); ++ ++ if (m_managerFullScreen && m_managerFullScreen->getMainWindow()) { ++ connect(m_managerFullScreen->getMainWindow(), &MainWindow::accept, this, &PolkitListener::onResponse); ++ connect(m_managerFullScreen->getMainWindow(), &MainWindow::canceled, this, [&] { ++ if (inProgress && !gainedAuthorization) { ++ wasCancelled = true; ++ unacknowledged_messages = false; ++ if (!session.isNull()) { ++ session.data()->cancel(); ++ } ++ finishObtainPrivilege(); + } +- } +- }); ++ }); ++ ++ connect(m_managerFullScreen->getMainWindow(), &MainWindow::switchToBiometric, this, [&] { ++ wasSwitchToBiometric = true; ++ startAuthentication(); ++ }); ++ ++ connect(m_managerFullScreen->getMainWindow(), &MainWindow::yesPrompted, this, [=] { ++ result->setCompleted(); ++ this->gainedAuthorization = true; ++ finishObtainPrivilege(); ++ }); ++ ++ connect(m_managerFullScreen->getMainWindow(), &MainWindow::restartAuth, this, [&] { startAuthentication(); }); ++ ++ connect(m_managerFullScreen->getMainWindow(), &MainWindow::userChanged, this, [&](const QString &userName) { ++ for (int i = 0; i < this->identities.size(); i++) { ++ auto identity = this->identities.at(i); ++ if (identity.toString().remove("unix-user:") == userName) { ++ this->currentIdentity = this->identities.at(i); ++ numTries = 0; ++ startAuthentication(); ++ break; ++ } ++ } ++ }); + +- numTries = 0; +- wasCancelled = false; +- wasSwitchToBiometric = false; ++ numTries = 0; ++ wasCancelled = false; ++ wasSwitchToBiometric = false; + +- mainWindow->userChanged(usersList.at(0)); ++ if (implicitActiveStr == "yes_prompt") { ++ m_managerFullScreen->getMainWindow()->onShowYesPrompt(); ++ m_managerFullScreen->getMainWindow()->setFixedSize(m_managerFullScreen->getMainWindow()->width(), 200); ++ m_managerFullScreen->getMainWindow()->show(); ++ m_managerFullScreen->getMainWindow()->activateWindow(); ++ return; ++ } + ++ m_managerFullScreen->getMainWindow()->userChanged(usersList.at(0)); ++ } + } + +-static +-int get_pam_tally(int *deny, int *unlock_time) ++static int get_pam_tally(int *deny, int *unlock_time) + { + char buf[128]; +- FILE *auth_file; ++ FILE *auth_file = NULL; + +- if( (auth_file = fopen("/etc/pam.d/common-auth", "r")) == NULL) ++ if ((auth_file = fopen("/etc/pam.d/common-auth", "r")) == NULL) + return -1; + +- while(fgets(buf, sizeof(buf), auth_file)) { +- if(strlen(buf) == 0 || buf[0] == '#') ++ while (fgets(buf, sizeof(buf), auth_file)) { ++ if (strlen(buf) == 0 || buf[0] == '#') + continue; +- if(!strstr(buf, "deny")) ++ if (!strstr(buf, "deny")) + continue; + + char *ptr = strtok(buf, " \t"); +- while(ptr) { +- if(strncmp(ptr, "deny=", 5)==0){ ++ while (ptr) { ++ if (strncmp(ptr, "deny=", 5) == 0) { + sscanf(ptr, "deny=%d", deny); +- //gs_debug("-------------------- deny=%d", *deny); ++ // gs_debug("-------------------- deny=%d", *deny); + } +- if(strncmp(ptr, "unlock_time=", 12)==0){ ++ if (strncmp(ptr, "unlock_time=", 12) == 0) { + sscanf(ptr, "unlock_time=%d", unlock_time); +- //gs_debug("-------------------- unlock_time=%d", *unlock_time); ++ // gs_debug("-------------------- unlock_time=%d", *unlock_time); + } + ptr = strtok(NULL, " \t"); + } ++ fclose(auth_file); ++ auth_file = NULL; + return 1; + } ++ fclose(auth_file); ++ auth_file = NULL; + return 0; + } + +@@ -253,54 +235,59 @@ void PolkitListener::finishObtainPrivilege() + { + /* Number of tries increase only when some user is selected */ + if (currentIdentity.isValid()) { +- numTries++; ++ numTries++; + } + qDebug().noquote() << QString("Finishing obtaining " +- "privileges (G:%1, C:%2, D:%3).") +- .arg(gainedAuthorization) +- .arg(wasCancelled) +- .arg(mainWindow != NULL); +- +- if (!gainedAuthorization && !wasCancelled && (mainWindow != NULL)) { +- int deny = 0, unlock_time = 0; +- mainWindow->stopDoubleAuth(); +- if(!get_pam_tally(&deny, &unlock_time)||(deny == 0 &&unlock_time == 0)) { +- //if(!wasSwitchToBiometric){ +- if (!unacknowledged_messages) +- mainWindow->setAuthResult(gainedAuthorization, tr("Authentication failure, please try again.")); +- //} +- startAuthentication(); +- return; +- } +- else { +- if (!unacknowledged_messages) { +- mainWindow->setAuthResult(gainedAuthorization, tr("Password input error!")); +- } +- startAuthentication(); +- return; +- } +- +- startAuthentication(); ++ "privileges (G:%1, C:%2, D:%3).") ++ .arg(gainedAuthorization) ++ .arg(wasCancelled) ++ .arg(m_managerFullScreen && m_managerFullScreen->getMainWindow()); ++ ++ if (!gainedAuthorization && !wasCancelled && (m_managerFullScreen && m_managerFullScreen->getMainWindow())) { ++ int deny = 0, unlock_time = 0; ++ m_managerFullScreen->getMainWindow()->stopDoubleAuth(); ++ if (!get_pam_tally(&deny, &unlock_time) || (deny == 0 && unlock_time == 0)) { ++ // if(!wasSwitchToBiometric){ ++ if (!unacknowledged_messages) ++ m_managerFullScreen->getMainWindow()->setAuthResult( ++ gainedAuthorization, tr("Authentication failure, please try again.")); ++ //} ++ startAuthentication(); + return; ++ } else { ++ if (!unacknowledged_messages) { ++ m_managerFullScreen->getMainWindow()->setAuthResult(gainedAuthorization, tr("Password input error!")); ++ } ++ startAuthentication(); ++ return; ++ } ++ ++ startAuthentication(); ++ return; + } + +- if (mainWindow) { +- mainWindow->hide(); +- mainWindow->stopDoubleAuth(); +- mainWindow->close(); +- mainWindow->deleteLater(); +- mainWindow = NULL; ++ if (m_managerFullScreen) { ++ m_managerFullScreen->closeDialog(); ++ m_managerFullScreen->deleteLater(); ++ m_managerFullScreen = nullptr; ++ } ++ ++ if ((implicitActiveStr == "yes_prompt") && wasCancelled) { ++ result->setError("polkit-ukui-authentication-agent-1 cancel"); + } + + if (!session.isNull()) { + session.data()->result()->setCompleted(); ++ session.data()->deleteLater(); ++ session.clear(); + } else { + result->setCompleted(); + } +- session.data()->deleteLater(); + + this->inProgress = false; ++ implicitActiveStr = ""; + qDebug() << "Finish obtain authorization:" << gainedAuthorization; ++ gainedAuthorization = false; + } + + void establishToBioPAM() +@@ -308,12 +295,12 @@ void establishToBioPAM() + FILE *file; + const char *data = "polkit-ukui-authentication-agent-1"; + +- if( (file = fopen(BIO_COM_FILE, "w")) == NULL){ ++ if ((file = fopen(BIO_COM_FILE, "w")) == NULL) { + qWarning() << "open communication file failed: " << strerror(errno); + return; + } + +- if(fputs(data, file) == EOF) { ++ if (fputs(data, file) == EOF) { + qWarning() << "write to communication file error: " << strerror(errno); + } + fclose(file); +@@ -323,7 +310,7 @@ void PolkitListener::startAuthentication() + { + qDebug() << "start authenticate user " << currentIdentity.toString(); + unacknowledged_messages = false; +- if(!session.isNull()) { ++ if (!session.isNull()) { + session.data()->deleteLater(); + } + +@@ -332,92 +319,61 @@ void PolkitListener::startAuthentication() + + establishToBioPAM(); + +- session = new Session(currentIdentity, cookie, result); +- connect(session.data(), SIGNAL(request(QString, bool)), this, +- SLOT(onShowPrompt(QString,bool))); +- connect(session.data(), SIGNAL(completed(bool)), this, +- SLOT(onAuthCompleted(bool))); +- connect(session.data(), SIGNAL(showError(QString)), this, +- SLOT(onShowError(QString))); +- connect(session.data(), SIGNAL(showInfo(QString)), this, +- SLOT(onShowError(QString))); +- session.data()->initiate(); ++ session = new Session(currentIdentity, cookie, result); ++ connect(session.data(), SIGNAL(request(QString, bool)), this, SLOT(onShowPrompt(QString, bool))); ++ connect(session.data(), SIGNAL(completed(bool)), this, SLOT(onAuthCompleted(bool))); ++ connect(session.data(), SIGNAL(showError(QString)), this, SLOT(onShowError(QString))); ++ connect(session.data(), SIGNAL(showInfo(QString)), this, SLOT(onShowError(QString))); ++ session.data()->initiate(); + } + +- mainWindow->clearEdit(); ++ if (m_managerFullScreen && m_managerFullScreen->getMainWindow()) { ++ m_managerFullScreen->getMainWindow()->clearEdit(); ++ } + } + + void PolkitListener::onShowPrompt(const QString &prompt, bool echo) + { + qDebug() << "Prompt: " << prompt << "echo: " << echo; +- +- if(prompt == BIOMETRIC_PAM || prompt == BIOMETRIC_PAM_QRCODE) { +- mainWindow->setDoubleAuth(false); +- mainWindow->switchAuthMode(MainWindow::BIOMETRIC); +- }else if(prompt == BIOMETRIC_PAM_DOUBLE){ +- mainWindow->setDoubleAuth(true); +- mainWindow->switchAuthMode(MainWindow::BIOMETRIC); +- //这时候不需要显示授权弹窗,下一次收到prompt请求的时候再显示 ++ if (!m_managerFullScreen || !m_managerFullScreen->getMainWindow()) { + return; + } +- else { ++ if (prompt == BIOMETRIC_PAM || prompt == BIOMETRIC_PAM_QRCODE) { ++ m_managerFullScreen->getMainWindow()->setDoubleAuth(false); ++ m_managerFullScreen->getMainWindow()->switchAuthMode(MainWindow::BIOMETRIC); ++ } else if (prompt == BIOMETRIC_PAM_DOUBLE) { ++ m_managerFullScreen->getMainWindow()->setDoubleAuth(true); ++ m_managerFullScreen->getMainWindow()->switchAuthMode(MainWindow::BIOMETRIC); ++ //这时候不需要显示授权弹窗,下一次收到prompt请求的时候再显示 ++ return; ++ } else { + unacknowledged_messages = false; +- mainWindow->switchAuthMode(MainWindow::PASSWORD); +- mainWindow->setPrompt(prompt, echo); ++ m_managerFullScreen->getMainWindow()->switchAuthMode(MainWindow::PASSWORD); ++ m_managerFullScreen->getMainWindow()->setPrompt(prompt, echo); ++ m_managerFullScreen->showDialog(); + } +- mainWindow->setFixedSize(mainWindow->width(),mainWindow->height()); +- +- /* set the position of the mainwindow */ +- QPoint pos = QCursor::pos(); +- QRect desScreenGeometry; +- for (QScreen *screen : qApp->screens()) { +- if (screen->geometry().contains(pos)) { +- desScreenGeometry = screen->geometry(); +- } +- } +- +- if (desScreenGeometry.isEmpty()) { +- desScreenGeometry = qApp->primaryScreen()->geometry(); +- } +- +- kdk::WindowManager::setGeometry(mainWindow->windowHandle(), +- QRect(desScreenGeometry.left() + (desScreenGeometry.width() - mainWindow->width())/2, +- desScreenGeometry.top() + (desScreenGeometry.height() - mainWindow->height())/2, +- mainWindow->width(), mainWindow->height())); +- +- mainWindow->show(); +- // 重新开始认证不调整窗口位置 +-// QPoint pos = QCursor::pos(); +-// for(auto screen : QGuiApplication::screens()) +-// { +-// if(screen->geometry().contains(pos)) +-// { +-// mainWindow->move(screen->geometry().left() + (screen->geometry().width() - mainWindow->width()) / 2, +-// screen->geometry().top() + (screen->geometry().height() - mainWindow->height()) / 2); +-// } +-// } +- +- mainWindow->activateWindow(); + } + + //目前返回的pam错误就onShowError,onShowInfo两类 + void PolkitListener::onShowError(const QString &text) + { +- qDebug() << "[Polkit]:" << "Error:" << text; ++ qDebug() << "[Polkit]:" ++ << "Error:" << text; + unacknowledged_messages = true; +- if(mainWindow){ +- QString strText = mainWindow->check_is_pam_message(text); +- mainWindow->setMessage(strText); ++ if (m_managerFullScreen && m_managerFullScreen->getMainWindow()) { ++ QString strText = m_managerFullScreen->getMainWindow()->check_is_pam_message(text); ++ m_managerFullScreen->getMainWindow()->setMessage(strText); + } + } + + void PolkitListener::onShowInfo(const QString &text) + { +- qDebug() << "[Polkit]:" << "Info:" << text; ++ qDebug() << "[Polkit]:" ++ << "Info:" << text; + unacknowledged_messages = true; +- if(mainWindow){ +- QString strText = mainWindow->check_is_pam_message(text); +- mainWindow->setMessage(strText); ++ if (m_managerFullScreen && m_managerFullScreen->getMainWindow()) { ++ QString strText = m_managerFullScreen->getMainWindow()->check_is_pam_message(text); ++ m_managerFullScreen->getMainWindow()->setMessage(strText); + } + } + +diff --git a/polkit-agent/src/PolkitListener.h b/polkit-agent/src/PolkitListener.h +index 850077c..4137f79 100644 +--- a/polkit-agent/src/PolkitListener.h ++++ b/polkit-agent/src/PolkitListener.h +@@ -22,45 +22,47 @@ + #include <QPointer> + + #include "mainwindow.h" ++#include "fullscreenbackground.h" + + using namespace PolkitQt1::Agent; + + class PolkitListener : public Listener + { +- Q_OBJECT ++ Q_OBJECT + public: +- PolkitListener(QObject *parent = 0); +- virtual ~PolkitListener(); ++ PolkitListener(QObject *parent = 0); ++ virtual ~PolkitListener(); + + private: + bool isSupportTableMode(); + bool isMavis(); + + public slots: +- void initiateAuthentication(const QString &actionId, +- const QString &message, +- const QString &iconName, +- const PolkitQt1::Details &details, +- const QString &cookie, +- const PolkitQt1::Identity::List &identities, +- PolkitQt1::Agent::AsyncResult *result); +- bool initiateAuthenticationFinish(); +- void cancelAuthentication(); +- void finishObtainPrivilege(); +- ++ void initiateAuthentication( ++ const QString &actionId, ++ const QString &message, ++ const QString &iconName, ++ const PolkitQt1::Details &details, ++ const QString &cookie, ++ const PolkitQt1::Identity::List &identities, ++ PolkitQt1::Agent::AsyncResult *result); ++ bool initiateAuthenticationFinish(); ++ void cancelAuthentication(); ++ void finishObtainPrivilege(); + + private: +- bool gainedAuthorization; +- bool wasCancelled; +- bool wasSwitchToBiometric; ++ bool gainedAuthorization = false; ++ bool wasCancelled = false; ++ bool wasSwitchToBiometric = false; + bool inProgress; +- int numTries; ++ int numTries; ++ QString implicitActiveStr; + QPointer<Session> session; +- PolkitQt1::Identity::List identities; +- PolkitQt1::Identity currentIdentity; +- PolkitQt1::Agent::AsyncResult *result; +- QString cookie; +- MainWindow *mainWindow; ++ PolkitQt1::Identity::List identities; ++ PolkitQt1::Identity currentIdentity; ++ PolkitQt1::Agent::AsyncResult *result; ++ QString cookie; ++ FullScreenBackground *m_managerFullScreen; + bool unacknowledged_messages = false; + bool m_isSupportTableMode = false; + bool m_isMavis = false; +diff --git a/polkit-agent/src/fullscreenbackground.cpp b/polkit-agent/src/fullscreenbackground.cpp +new file mode 100644 +index 0000000..9bbaa3d +--- /dev/null ++++ b/polkit-agent/src/fullscreenbackground.cpp +@@ -0,0 +1,513 @@ ++/* ++ * Copyright (C) 2024 Tianjin KYLIN Information Technology Co., Ltd. ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 3, or (at your option) ++ * any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, see <http://www.gnu.org/licenses/>. ++ * ++ **/ ++#include "fullscreenbackground.h" ++#include "mainwindow.h" ++#include <unistd.h> ++#include <QDebug> ++#include <QImageReader> ++#include <QPixmap> ++#include <QApplication> ++#include <QScreen> ++#include <QCursor> ++#include <QTimer> ++#include <QDesktopWidget> ++#include <QPainter> ++#include <QPainterPath> ++#include <KWindowSystem> ++#include <windowmanager/windowmanager.h> ++ ++using namespace kdk; ++ ++#define PERSONALSIE_SCHEMA "org.mate.background" ++#define PERSONALSIE_TRAN_KEY "picture-filename" ++ ++#define USD_MEDIA_KEYS_SCHEMA "org.ukui.SettingsDaemon.plugins.media-keys" ++#define USD_MEDIA_KEYS_WINDOW_SWTICH_KEY "ukuiWindowSwitch" ++#define USD_MEDIA_KEYS_WINDOW_SWTICH2_KEY "ukuiWindowSwitch2" ++ ++FullScreenBackground::FullScreenBackground(QWidget *parent) : QWidget(parent) ++{ ++ m_isWayland = QString(qgetenv("XDG_SESSION_TYPE")) == "wayland"; ++ initUI(); ++ initConnections(); ++} ++ ++FullScreenBackground::~FullScreenBackground() ++{ ++ closeDialog(); ++} ++ ++void FullScreenBackground::initMainWindow( ++ const QString &strIconName, ++ const QString &strMsg, ++ const QStringList &listUsers, ++ const QString &subjectPid, ++ const QString &callerPid, ++ const PolkitQt1::ActionDescription &actionDesc, ++ const bool &isMavis, ++ const bool &isSupportTableMode) ++{ ++ if (!m_wndMain) { ++ if (m_isWayland) { ++ m_wndMain = new MainWindow(); ++ m_wndMain->setWindowFlags(windowFlags() | Qt::Tool | Qt::WindowStaysOnTopHint); ++ KWindowSystem::setState(m_wndMain->winId(), NET::State::KeepAbove | NET::State::SkipTaskbar); ++ } else { ++ m_wndMain = new MainWindow(this); ++ m_wndMain->setModal(true); ++ } ++ setWindowFlags(windowFlags() & ~Qt::WindowMaximizeButtonHint & ~Qt::WindowMinimizeButtonHint); ++ m_wndMain->setWindowTitle(tr("Authentication")); ++ WindowManager::setSkipTaskBar(m_wndMain->windowHandle(), true); ++ m_wndMain->setIcon(strIconName); ++ m_wndMain->setCurProject(isMavis); ++ m_wndMain->setHeader(strMsg); ++ m_wndMain->setUsers(listUsers); ++ m_wndMain->setEditInputMethod(isSupportTableMode); ++ m_wndMain->setFixedSize(420, 337); ++ /* ++ * ++ mainWindow->setDetails(subjectPid, callerPid, ++ actionDesc.actionId(), ++ actionDesc.description(), ++ actionDesc.vendorName(), ++ actionDesc.vendorUrl()); ++ */ ++ connect(m_wndMain, &MainWindow::finished, this, [=](int nResult) { ++ qDebug() << "auth dialog finished:" << nResult; ++ }); ++ } ++ if (m_isWayland) { ++ hide(); ++ } else { ++ show(); ++ } ++} ++ ++void FullScreenBackground::initUI() ++{ ++ setWindowTitle(tr("Authentication")); ++ if (m_isWayland) { ++ setAttribute(Qt::WA_TranslucentBackground); ++ setGeometry(0, 0, 0, 0); ++ } else { ++ setWindowFlags(Qt::Tool | Qt::WindowStaysOnTopHint | Qt::FramelessWindowHint); ++ setWindowOpacity(0.25); ++ KWindowSystem::setState(winId(), NET::State::KeepAbove | NET::State::SkipTaskbar); ++ WindowManager::setSkipTaskBar(this->windowHandle(), true); ++ installEventFilter(this); ++ ++ if (!isSupportCompositing()) { ++ m_pixmapBackground = getBackground(); ++ } ++ setGeometry(0, 0, 7680, 4320); ++ } ++ qDebug() << "Window geometry:" << geometry(); ++} ++ ++void FullScreenBackground::initConnections() ++{ ++ QDesktopWidget *desktop = QApplication::desktop(); ++ if (desktop) { ++ connect(desktop, &QDesktopWidget::resized, this, &FullScreenBackground::onDesktopResized); ++ connect(desktop, &QDesktopWidget::workAreaResized, this, &FullScreenBackground::onWorkAreaResized); ++ connect(desktop, &QDesktopWidget::primaryScreenChanged, this, &FullScreenBackground::onPrimaryScreenChanged); ++ connect(desktop, &QDesktopWidget::screenCountChanged, this, &FullScreenBackground::onScreenCountChanged); ++ } ++} ++ ++void FullScreenBackground::onScreenCountChanged(int) ++{ ++ qDebug() << "onScreenCountChanged----"; ++ if (m_isWayland) { ++ update(); ++ moveToCursorScreen(); ++ return; ++ } ++ QDesktopWidget *desktop = QApplication::desktop(); ++ if ((desktop->geometry().x() != 0 || desktop->geometry().y() != 0) && this->geometry().contains(desktop->geometry()) ++ && (QApplication::screens().count() == 1)) { ++ return; ++ } ++ if (desktop->geometry().height() > height() || desktop->geometry().width() > width()) { ++ setGeometry( ++ desktop->geometry().x(), ++ desktop->geometry().y(), ++ desktop->geometry().width() + 1, ++ desktop->geometry().height() + 1); ++ } ++ ++ update(); ++ moveToCursorScreen(); ++ qDebug() << desktop->geometry(); ++} ++ ++void FullScreenBackground::onWorkAreaResized() ++{ ++ qDebug() << "onWorkAreaResized----"; ++ update(); ++} ++ ++void FullScreenBackground::onPrimaryScreenChanged() ++{ ++ qDebug() << "onPrimaryScreenChanged----"; ++ moveToCursorScreen(); ++} ++ ++void FullScreenBackground::onDesktopResized() ++{ ++ qDebug() << "onDesktopResized----"; ++ if (m_isWayland) { ++ update(); ++ moveToCursorScreen(); ++ return; ++ } ++ QDesktopWidget *desktop = QApplication::desktop(); ++ if ((desktop->geometry().x() != 0 || desktop->geometry().y() != 0) && this->geometry().contains(desktop->geometry()) ++ && (QGuiApplication::screens().count() == 1)) { ++ return; ++ } ++ if (desktop->geometry().height() > height() || desktop->geometry().width() > width()) { ++ setGeometry( ++ desktop->geometry().x(), ++ desktop->geometry().y(), ++ desktop->geometry().width() + 1, ++ desktop->geometry().height() + 1); ++ } ++ ++ update(); ++ moveToCursorScreen(); ++ qDebug() << desktop->geometry(); ++} ++ ++void FullScreenBackground::showDialog() ++{ ++ if (m_isFirstShow) { ++ m_isFirstShow = false; ++ blockSomeShortCut(true); ++ if (!m_isWayland) { ++ show(); ++ } ++ if (m_wndMain) { ++ qDebug() << "DialogGeometry:" << m_wndMain->geometry(); ++ m_wndMain->show(); ++ m_wndMain->activateWindow(); ++ // move auth dialog to cursor screen ++ moveToCursorScreen(); ++ } ++ } ++} ++ ++void FullScreenBackground::closeDialog() ++{ ++ blockSomeShortCut(false); ++ if (m_wndMain) { ++ m_wndMain->hide(); ++ m_wndMain->stopDoubleAuth(); ++ m_wndMain->close(); ++ m_wndMain->deleteLater(); ++ m_wndMain = nullptr; ++ } ++} ++ ++bool FullScreenBackground::isSupportCompositing() ++{ ++ if (QString(qgetenv("XDG_SESSION_TYPE")) == "wayland") { ++ return true; ++ } ++ QDBusInterface kwinCompositor( ++ "org.ukui.KWin", "/Compositor", "org.freedesktop.DBus.Properties", QDBusConnection::sessionBus()); ++ QDBusReply<QDBusVariant> sessionReply = kwinCompositor.call("Get", "org.kde.kwin.Compositing", "compositingType"); ++ if (!sessionReply.isValid()) { ++ qWarning() << sessionReply.error(); ++ } else { ++ QString strType = sessionReply.value().variant().toString(); ++ if (strType.isEmpty() || strType == "none") ++ return false; ++ } ++ return true; ++} ++ ++QPixmap FullScreenBackground::getBackground() ++{ ++ QPixmap pixmapBackground; ++ QString strPicName = ""; ++ ++ // 获取桌面壁纸路径 ++ QGSettings *personalGSettings = nullptr; ++ if (QGSettings::isSchemaInstalled(PERSONALSIE_SCHEMA)) { ++ personalGSettings = new QGSettings(PERSONALSIE_SCHEMA, QByteArray(), this); ++ QStringList keys = personalGSettings->keys(); ++ if (keys.contains(PERSONALSIE_TRAN_KEY)) { ++ strPicName = personalGSettings->get(PERSONALSIE_TRAN_KEY).toString(); ++ } ++ delete personalGSettings; ++ personalGSettings = nullptr; ++ } ++ ++ // 文件存在且可读则加载图片 ++ QFileInfo fileInfo(strPicName); ++ if (fileInfo.exists() && fileInfo.isReadable()) { ++ // do nothing ++ } else { ++ strPicName = getAccountBackground(); ++ } ++ ++ if (!strPicName.isEmpty()) { ++ QImageReader reader; ++ reader.setFileName(strPicName); ++ reader.setAutoTransform(true); ++ reader.setDecideFormatFromContent(true); ++ pixmapBackground = QPixmap::fromImageReader(&reader); ++ } ++ ++ return pixmapBackground; ++} ++ ++QString FullScreenBackground::getAccountBackground() ++{ ++ QString strTmpPicName = "/usr/share/backgrounds/ubuntukylin-default-settings.jpg"; ++ ++ uid_t uid = getuid(); ++ QDBusInterface iface( ++ "org.freedesktop.Accounts", ++ "/org/freedesktop/Accounts", ++ "org.freedesktop.Accounts", ++ QDBusConnection::systemBus()); ++ ++ QDBusReply<QDBusObjectPath> userPath = iface.call("FindUserById", (qint64)uid); ++ if (!userPath.isValid()) { ++ return strTmpPicName; ++ } else { ++ QDBusInterface userIface( ++ "org.freedesktop.Accounts", ++ userPath.value().path(), ++ "org.freedesktop.DBus.Properties", ++ QDBusConnection::systemBus()); ++ QDBusReply<QDBusVariant> backgroundReply ++ = userIface.call("Get", "org.freedesktop.Accounts.User", "BackgroundFile"); ++ if (backgroundReply.isValid()) { ++ QString strPicName = backgroundReply.value().variant().toString(); ++ if (!strPicName.isEmpty()) { ++ QFileInfo fileInfo(strPicName); ++ if (fileInfo.exists() && fileInfo.isReadable()) { ++ return strPicName; ++ } ++ } ++ } ++ } ++ ++ return strTmpPicName; ++} ++ ++void FullScreenBackground::moveToScreen(QScreen *screen) ++{ ++ // 将主全屏更新到新屏幕上,并重新将对话框居中 ++ if (!screen) { ++ return; ++ } ++ ++ if (m_wndMain) { ++ QRect rectParent = screen->geometry(); ++ QRect rectDes = QRect( ++ rectParent.x() + (rectParent.width() - m_wndMain->width()) / 2, ++ rectParent.y() + (rectParent.height() - m_wndMain->height()) / 2, ++ m_wndMain->width(), ++ m_wndMain->height()); ++ ++ WindowManager::setGeometry(m_wndMain->windowHandle(), rectDes); ++ qDebug() << "new rect:" << rectParent << "," << rectDes << "," << m_wndMain->geometry(); ++ } ++} ++ ++void FullScreenBackground::moveToCursorScreen() ++{ ++ bool isFoundScreen = false; ++ if (m_isWayland) { ++ QString strCurScreen = WindowManager::currentOutputName(); ++ for (auto screen : QApplication::screens()) { ++ qDebug() << "Screen:" << screen->name() << "," << screen->geometry(); ++ if (screen && screen->name() == strCurScreen) { ++ isFoundScreen = true; ++ moveToScreen(screen); ++ break; ++ } ++ } ++ } else { ++ QPoint cursor = QCursor::pos(); ++ for (auto screen : QApplication::screens()) { ++ qDebug() << "Screen:" << screen->name() << "," << screen->geometry(); ++ if (screen && screen->geometry().contains(cursor)) { ++ isFoundScreen = true; ++ moveToScreen(screen); ++ break; ++ } ++ } ++ } ++ if (!isFoundScreen) { ++ if (QApplication::primaryScreen()) { ++ moveToScreen(QApplication::primaryScreen()); ++ } ++ isFoundScreen = true; ++ } ++} ++ ++void FullScreenBackground::paintEvent(QPaintEvent *event) ++{ ++ if (!m_isWayland) { ++ for (auto screen : QApplication::screens()) { ++ QPainter painter(this); ++ if (!m_pixmapBackground.isNull()) { ++ painter.drawPixmap(screen->geometry(), m_pixmapBackground); ++ } ++ } ++ } ++ return QWidget::paintEvent(event); ++} ++ ++void FullScreenBackground::closeEvent(QCloseEvent *event) ++{ ++ qDebug() << "FullScreenBackground::closeEvent"; ++ if (!m_isWayland) { ++ // 断开屏幕变化信号 ++ QDesktopWidget *desktop = QApplication::desktop(); ++ disconnect(desktop, &QDesktopWidget::resized, this, &FullScreenBackground::onDesktopResized); ++ disconnect(desktop, &QDesktopWidget::workAreaResized, this, &FullScreenBackground::onWorkAreaResized); ++ disconnect(desktop, &QDesktopWidget::primaryScreenChanged, this, &FullScreenBackground::onPrimaryScreenChanged); ++ disconnect(desktop, &QDesktopWidget::screenCountChanged, this, &FullScreenBackground::onScreenCountChanged); ++ } ++ ++ return QWidget::closeEvent(event); ++} ++ ++void FullScreenBackground::resizeEvent(QResizeEvent *event) ++{ ++ Q_UNUSED(event); ++ qDebug() << "WndSize:" << this->size(); ++} ++ ++void FullScreenBackground::blockSomeShortCut(bool isBlock /* = false*/) ++{ ++ static bool sIsBlocked = false; ++ if (sIsBlocked == isBlock) { ++ return; ++ } ++ QStringList listBlockShortCut = { ++ "Minimize All Window", // 最小化所有窗口 ++ "Minimize Or Unminimize All Window Besides Active Window", // 最小化或还原非焦点窗口 ++ "Multitask View show", // 显示工作区 ++ "Show/Hide Desktop", // 显示/隐藏桌面 ++ "ShowDesktopGrid", // Show Desktop Grid ++ "ShowMultitaskView", // Show Multitask View ++ "Switch One Desktop Down", // 切换到下面的桌面 ++ "Switch One Desktop Up", // 切换到上面的桌面 ++ "Switch One Desktop to the Left", // 切换到左边的工作区 ++ "Switch One Desktop to the Right", // 切换到右边的工作区 ++ "Switch to Desktop 1", // 切换到桌面 1 ++ "Switch to Desktop 2", // 切换到桌面 2 ++ "Switch to Desktop 3", // 切换到桌面 3 ++ "Switch to Desktop 4", // 切换到桌面 4 ++ "Switch to Next Screen", // 切换到下一屏幕 ++ "Switch to Previous Screen", // 切换到上一个屏幕 ++ "Toggle Window Raise/Lower", // 窗口置前或置后 ++ "Unminimize All Window", // 还原所有最小化窗口 ++ "Walk Through Desktop List", // 遍历桌面列表 ++ "Walk Through Desktop List (Reverse)", // 遍历桌面列表(反向) ++ "Walk Through Desktops", // 遍历桌面 ++ "Walk Through Desktops (Reverse)", // 遍历桌面(反向) ++ "Walk Through Windows", // 遍历窗口 ++ "Walk Through Windows (Reverse)", // 遍历窗口(反向) ++ "Walk Through Windows Alternative", // 遍历窗口候选 ++ "Walk Through Windows Alternative (Reverse)", // 遍历窗口候选(反向) ++ "Walk Through Windows of Current Application", // 遍历当前应用程序窗口 ++ "Walk Through Windows of Current Application (Reverse)", // 遍历当前应用程序窗口(反向) ++ "Walk Through Windows of Current Application Alternative", // 遍历当前应用程序窗口候选 ++ "Walk Through Windows of Current Application Alternative (Reverse)", // 遍历当前应用程序窗口候选(反向) ++ "Walk Through fullscreenWindows", // 遍历所有最大化或全屏窗口 ++ "Window Lower", // 降低窗口 ++ "Window Maximize", // 最大化窗口 ++ "Window Maximize Horizontal", // 水平最大化窗口 ++ "Window Maximize Vertical", // 垂直最大化窗口 ++ "Window Minimize", // 最小化窗口 ++ "Window On All Desktops", // 将窗口放到全部桌面 ++ "Window One Desktop Down", // 窗口下移一个桌面 ++ "Window One Desktop Up", // 窗口上移一个桌面 ++ "Window One Desktop to the Left", // 窗口左移一个桌面 ++ "Window One Desktop to the Right", // 窗口右移一个桌面 ++ "Window Operations Menu", // 窗口操作菜单 ++ "Window Quick Move And Maximize Left Screen", // 窗口快速移动并最大化到下一个屏幕 ++ "Window Quick Move And Maximize Right Screen", // 窗口快速移动并最大化到上一个屏幕 ++ "Window Quick Move Left Screen", // 窗口快速移动到下一个屏幕 ++ "Window Quick Move Right Screen", // 窗口快速移动到上一个屏幕 ++ "Window to Desktop 1", // 窗口到桌面 1 ++ "Window to Desktop 2", // 窗口到桌面 2 ++ "Window to Desktop 3", // 窗口到桌面 3 ++ "Window to Desktop 4", // 窗口到桌面 4 ++ "Window to Next Desktop", // 窗口到下一桌面 ++ "Window to Next Screen", // 窗口到下一屏幕 ++ "Window to Previous Desktop", // 窗口到前一桌面 ++ "Window to Previous Screen", // 窗口到前一屏幕 ++ "Window to Screen 0", // 窗口到屏幕 0 ++ "Window to Screen 1", // 窗口到屏幕 1 ++ "Window to Screen 2", // 窗口到屏幕 2 ++ "Window to Screen 3", // 窗口到屏幕 3 ++ "Window to Screen 4", // 窗口到屏幕 4 ++ }; ++ sIsBlocked = isBlock; ++ if (sIsBlocked) { ++ if (!m_isWayland) { ++ // kwin shortcut ++ QDBusInterface kwinInterface("org.ukui.KWin", "/KWin", "org.kde.KWin", QDBusConnection::sessionBus()); ++ for (QString strShortCut : listBlockShortCut) { ++ QDBusMessage blockMessage = kwinInterface.call("blockShortcut", strShortCut, true); ++ if (blockMessage.type() == QDBusMessage::ErrorMessage) { ++ qWarning() << "Kwin dbus error:" << blockMessage.errorMessage(); ++ break; ++ } ++ } ++ } ++ ++ // usd shortcut ++ if (!m_usdBlockShortCut) { ++ m_usdBlockShortCut = new USDBlockShortCut(this); ++ } ++ } else { ++ if (!m_isWayland) { ++ // kwin shortcut ++ QDBusInterface kwinInterface("org.ukui.KWin", "/KWin", "org.kde.KWin", QDBusConnection::sessionBus()); ++ for (QString strShortCut : listBlockShortCut) { ++ QDBusMessage blockMessage = kwinInterface.call("blockShortcut", strShortCut, false); ++ if (blockMessage.type() == QDBusMessage::ErrorMessage) { ++ qWarning() << "Kwin dbus error1:" << blockMessage.errorMessage(); ++ break; ++ } ++ } ++ } ++ ++ // usd shortcut ++ if (m_usdBlockShortCut) { ++ delete m_usdBlockShortCut; ++ m_usdBlockShortCut = nullptr; ++ } ++ } ++} ++ ++bool FullScreenBackground::eventFilter(QObject *obj, QEvent *event) ++{ ++ return QWidget::eventFilter(obj, event); ++} +diff --git a/polkit-agent/src/fullscreenbackground.h b/polkit-agent/src/fullscreenbackground.h +new file mode 100644 +index 0000000..90c0665 +--- /dev/null ++++ b/polkit-agent/src/fullscreenbackground.h +@@ -0,0 +1,173 @@ ++/* ++ * Copyright (C) 2024 Tianjin KYLIN Information Technology Co., Ltd. ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 3, or (at your option) ++ * any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, see <http://www.gnu.org/licenses/>. ++ * ++ **/ ++#ifndef FULLSCREENMANAGER_H ++#define FULLSCREENMANAGER_H ++ ++#include <QWidget> ++#include <QList> ++#include <QPair> ++#include <QRect> ++#include <PolkitQt1/ActionDescription> ++#include <QPixmap> ++#include <QScreen> ++#include "usdblockshortcut.h" ++ ++class MainWindow; ++class FullScreenBackground : public QWidget ++{ ++ Q_OBJECT ++public: ++ explicit FullScreenBackground(QWidget *parent = nullptr); ++ virtual ~FullScreenBackground(); ++ ++ /** ++ * @brief getMainWindow 获取认证对话框 ++ * @return 认证对话框指针 ++ */ ++ inline MainWindow *getMainWindow() ++ { ++ return m_wndMain; ++ } ++ ++ /** ++ * @brief initMainWindow 初始化认证对话框 ++ * @param strIconName 认证图标名称 ++ * @param strMsg 认证消息 ++ * @param listUsers 认证用户列表 ++ * @param subjectPid 项目进程号 ++ * @param callerPid 调用者进程号 ++ * @param actionDesc 动作描述 ++ * @param isMavis 是否为mavis平台 ++ * @param isSupportTableMode 是否支持平板模式 ++ */ ++ void initMainWindow( ++ const QString &strIconName, ++ const QString &strMsg, ++ const QStringList &listUsers, ++ const QString &subjectPid, ++ const QString &callerPid, ++ const PolkitQt1::ActionDescription &actionDesc, ++ const bool &isMavis, ++ const bool &isSupportTableMode); ++ ++ /** ++ * @brief showDialog 显示认证对话框 ++ */ ++ void showDialog(); ++ ++ /** ++ * @brief closeDialog 关闭认证对话框 ++ */ ++ void closeDialog(); ++ ++protected: ++ /** ++ * @brief paintEvent 绘制事件处理 ++ * @param event 事件指针 ++ */ ++ void paintEvent(QPaintEvent *event); ++ ++ /** ++ * @brief closeEvent 窗口关闭事件处理 ++ * @param event 事件指针 ++ */ ++ void closeEvent(QCloseEvent *event); ++ ++ /** ++ * @brief resizeEvent 窗口大小改变事件处理 ++ * @param event 事件指针 ++ */ ++ void resizeEvent(QResizeEvent *event); ++ ++ bool eventFilter(QObject *obj, QEvent *event); ++ ++private Q_SLOTS: ++ /** ++ * @brief onScreenCountChanged 屏幕数变化处理 ++ */ ++ void onScreenCountChanged(int); ++ ++ /** ++ * @brief onDesktopResized 桌面大小变化处理 ++ */ ++ void onDesktopResized(); ++ ++ /** ++ * @brief onPrimaryScreenChanged 主屏变化处理 ++ */ ++ void onPrimaryScreenChanged(); ++ ++ /** ++ * @brief onWorkAreaResized 工作区大小变化处理 ++ */ ++ void onWorkAreaResized(); ++ ++private: ++ /** ++ * @brief initUI 初始化UI ++ */ ++ void initUI(); ++ ++ /** ++ * @brief initConnections 初始化信号槽连接 ++ */ ++ void initConnections(); ++ /** ++ * @brief isSupportCompositing 是否支持窗口复合 ++ * @return true 支持,否则不支持 ++ */ ++ bool isSupportCompositing(); ++ ++ /** ++ * @brief getBackground 获取背景 ++ * @return 背景pixmap ++ */ ++ QPixmap getBackground(); ++ ++ /** ++ * @brief getAccountBackground 获取账户背景 ++ * @return 背景路径 ++ */ ++ QString getAccountBackground(); ++ ++ /** ++ * @brief moveToScreen 移动认证弹窗到指定屏幕 ++ * @param screen 屏幕信息指针 ++ */ ++ void moveToScreen(QScreen *screen); ++ ++ /** ++ * @brief moveToCursorScreen 移动认证窗口到光标屏幕 ++ */ ++ void moveToCursorScreen(); ++ ++ /** ++ * @brief blockSomeShortCut 禁启用快捷键 ++ * @param isBlock 是否为禁用 ++ */ ++ void blockSomeShortCut(bool isBlock = false); ++ ++private: ++ MainWindow *m_wndMain = nullptr; // 认证对话框 ++ QPixmap m_pixmapBackground; // 背景图 ++ bool m_isFirstShow = true; // 第一次显示才主动移动对话框居中 ++ USDBlockShortCut *m_usdBlockShortCut = nullptr; // usd禁启用快捷键实例 ++ bool m_isWayland = false; ++}; ++ ++#endif // FULLSCREENMANAGER_H +diff --git a/polkit-agent/src/kalabel.cpp b/polkit-agent/src/kalabel.cpp +index a74f9da..9f14c79 100644 +--- a/polkit-agent/src/kalabel.cpp ++++ b/polkit-agent/src/kalabel.cpp +@@ -17,15 +17,12 @@ + **/ + #include "kalabel.h" + +- +-KALabel::KALabel(QWidget *parent) +- : QLabel(parent) ++KALabel::KALabel(QWidget *parent) : QLabel(parent) + { + m_strText = ""; + } + +-KALabel::KALabel(QString strText, QWidget *parent) +- : QLabel(strText, parent) ++KALabel::KALabel(QString strText, QWidget *parent) : QLabel(strText, parent) + { + m_strText = strText; + } +@@ -38,7 +35,7 @@ void KALabel::setText(const QString &strText) + + void KALabel::paintEvent(QPaintEvent *event) + { +- QString strEText = getElidedText(font(), width() ,m_strText); ++ QString strEText = getElidedText(font(), width(), m_strText); + if (strEText != m_strText) { + QLabel::setText(strEText); + setToolTip(m_strText); +@@ -49,13 +46,12 @@ void KALabel::paintEvent(QPaintEvent *event) + QLabel::paintEvent(event); + } + +-QString KALabel::getElidedText(QFont font,int width,QString strInfo) ++QString KALabel::getElidedText(QFont font, int width, QString strInfo) + { + QFontMetrics fontMetrics(font); + //如果当前字体下,字符串长度大于指定宽度 +- if(fontMetrics.width(strInfo) > width) +- { +- strInfo= QFontMetrics(font).elidedText(strInfo, Qt::ElideRight, width); ++ if (fontMetrics.width(strInfo) > width) { ++ strInfo = QFontMetrics(font).elidedText(strInfo, Qt::ElideRight, width); + } + return strInfo; + } +diff --git a/polkit-agent/src/kalabel.h b/polkit-agent/src/kalabel.h +index 8fc9b53..7ee60cb 100644 +--- a/polkit-agent/src/kalabel.h ++++ b/polkit-agent/src/kalabel.h +@@ -26,7 +26,8 @@ class KALabel : public QLabel + public: + KALabel(QWidget *parent = nullptr); + KALabel(QString strText, QWidget *parent = nullptr); +- QString getElidedText(QFont font,int width,QString strInfo); ++ QString getElidedText(QFont font, int width, QString strInfo); ++ + public slots: + void setText(const QString &); + +diff --git a/polkit-agent/src/mainwindow.cpp b/polkit-agent/src/mainwindow.cpp +index 74a0730..1a99b89 100644 +--- a/polkit-agent/src/mainwindow.cpp ++++ b/polkit-agent/src/mainwindow.cpp +@@ -13,8 +13,8 @@ + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see <http://www.gnu.org/licenses/>. +- * +-**/ ++ * ++ **/ + #include "mainwindow.h" + #include "ui_mainwindow.h" + #include <QMovie> +@@ -44,58 +44,38 @@ + #include "biotypes.h" + #include "modeButton.h" + #include <QDebug> ++#include <windowmanager/windowmanager.h> + #define _(string) gettext(string) + extern void qt_blurImage(QImage &blurImage, qreal radius, bool quality, int transposed); + +-MainWindow::MainWindow(QWidget *parent) : +- QWidget(parent), +- ui(new Ui::MainWindow), +- users(new Users(this)), +- enableBioAuth(false), +- receiveBioPAM(false), +- authMode(UNDEFINED), +- useDoubleAuth(false), +- m_timer(nullptr), +- w_timer(nullptr), +- isLockingFlg(false), +- m_nCurLockMin(0), +- isbioSuccess(false) ++MainWindow::MainWindow(QWidget *parent) ++ : kdk::KDialog(parent) ++ , ui(new Ui::MainWindow) ++ , users(new Users(this)) ++ , enableBioAuth(false) ++ , receiveBioPAM(false) ++ , authMode(UNDEFINED) ++ , useDoubleAuth(false) ++ , m_timer(nullptr) ++ , w_timer(nullptr) ++ , isLockingFlg(false) ++ , m_nCurLockMin(0) ++ , isbioSuccess(false) + { +- setWindowFlags(Qt::Tool | Qt::WindowCloseButtonHint | Qt::WindowStaysOnTopHint); + ui->setupUi(this); +- setWindowTitle(tr("Authentication")); ++ mainLayout()->addLayout(ui->verticalLayout_2); + + pam_tally_init(); // + +-// headerLayout = new QHBoxLayout(); +-// headerLayout->setContentsMargins(8,0,8,0); +-// headerLayout->setSpacing(8); +-// logoLabel = new QLabel(); +-// logoLabel->setPixmap(QIcon::fromTheme("ukui-polkit").pixmap(QSize(24,24))); +-// headerLayout->addWidget(logoLabel); +-// titleLabel = new QLabel(); +-// titleLabel->setText(tr("Authenticate")); +-// headerLayout->addWidget(titleLabel); +-// ui->headerWidget->setLayout(headerLayout); +-// headerLayout->addStretch(); +-// closeBtn = new QPushButton(); +-// closeBtn->setFixedSize(30, 30); +-// closeBtn->setToolTip(tr("Close")); +-// closeBtn->setProperty("isWindowButton", 0x02); +-// closeBtn->setProperty("useIconHighlightEffect", 0x08); +-// closeBtn->setFlat(true); +-// closeBtn->setIcon(QIcon::fromTheme("window-close-symbolic")); +-// connect(closeBtn, &QPushButton::clicked, this, &MainWindow::close); +-// headerLayout->addWidget(closeBtn); +- + // 登录选项 + m_labelTip = new KALabel(); + m_labelTip->setText(""); ++ m_labelTip->setFixedHeight(30); + m_labelTip->hide(); + m_loginOptsWidget = new LoginOptionsWidget(); + m_loginOptsWidget->hide(); + ui->titleTipLayout->addWidget(m_labelTip); +- ui->loginOptionsLayout->setAlignment(Qt::AlignTop|Qt::AlignCenter); ++ ui->loginOptionsLayout->setAlignment(Qt::AlignTop | Qt::AlignCenter); + ui->loginOptionsLayout->addWidget(m_loginOptsWidget); + ui->loadingUkeyWidget->adjustSize(); + ui->loadingUkeyWidget->hide(); +@@ -103,174 +83,19 @@ MainWindow::MainWindow(QWidget *parent) : + ui->loadingUkeyBtn->setAttribute(Qt::WA_TransparentForMouseEvents, true); + ui->ukeyPassword->setEchoMode(QLineEdit::Password); + ui->loadingUkeyLbl->setText(tr("Insert the ukey into the USB port")); +- ui->loadingUkeyLbl->setAlignment(Qt::AlignTop|Qt::AlignHCenter); ++ ui->loadingUkeyLbl->setAlignment(Qt::AlignTop | Qt::AlignHCenter); + ui->ukeyTipLbl->setText(tr("Enter the ukey password")); + ui->ukeyPassword->setPlaceholderText(tr("Input Password")); ++ ui->btnCancel->setAutoDefault(false); ++ ui->btnCancel->setDefault(false); + maxFailedTimes = bioDevices.getFailedTimes(); + isHiddenSwitchButton = bioDevices.GetHiddenSwitchButton(); ++ closeButton()->setToolTip(tr("Close")); + +- connect(m_loginOptsWidget, &LoginOptionsWidget::optionSelected, +- this, [&](unsigned uCurLoginOptType, const DeviceInfoPtr &deviceInfo){ +- isLoadingUkey = false; +- +- if(uCurLoginOptType == LOGINOPT_TYPE_GENERAL_UKEY){ +- stopLoadingUkey(); +- } +- +- if(uCurLoginOptType == LOGINOPT_TYPE_PASSWORD){ +- switchLoginOptType(uCurLoginOptType); +- if(m_loginOptsWidget){ +- m_loginOptsWidget->stopAuth(); +- } +- m_deviceInfo = nullptr; +- authMode = PASSWORD; +- emit restartAuth(); +- return; +- } +- +- if (uCurLoginOptType != LOGINOPT_TYPE_GENERAL_UKEY && !deviceInfo) +- return; +- +- if(deviceInfo) +- qDebug() << "device changed: " << deviceInfo->biotype; +- +- if(deviceInfo && m_failMap[getUid(userName)][deviceInfo->device_id] >= maxFailedTimes){ +- qDebug() << "Failed MAX!!"; +- return ; +- } +- +- if (uCurLoginOptType == LOGINOPT_TYPE_GENERAL_UKEY && !deviceInfo){ +- isLoadingUkey = true; +- startLoadingUkey(); +- m_loginOptsWidget->updateUkeyUIStatus(LOGINOPT_TYPE_GENERAL_UKEY); +- }else if(uCurLoginOptType == LOGINOPT_TYPE_GENERAL_UKEY && deviceInfo){ +- stopLoadingUkey(); +- m_loginOptsWidget->updateUkeyUIStatus(LOGINOPT_TYPE_GENERAL_UKEY); +- } +- +- if (deviceInfo == m_deviceInfo) { +- return; +- } +- +- if (uCurLoginOptType != LOGINOPT_TYPE_GENERAL_UKEY && deviceInfo == m_deviceInfo) { +- return ; +- } +- +- if(m_bioTimer) +- m_bioTimer->stop(); +- +- m_deviceInfo = deviceInfo; +- switchLoginOptType(uCurLoginOptType); +- if(!isbioSuccess && m_deviceInfo) { +- startBioAuth(); +- } +- }); +- +- connect(m_loginOptsWidget, &LoginOptionsWidget::notifyOptionsChange, +- this, [&](unsigned uOptionsCount){ +- if (uOptionsCount > 0) { +- m_loginOptsWidget->show(); +- } else { +- //m_loginOptsWidget->hide(); +- } +- +- if (m_deviceInfo && m_deviceInfo->biotype == LOGINOPT_TYPE_GENERAL_UKEY){ +- stopLoadingUkey(); +- } +- +- if (!m_deviceInfo || !m_loginOptsWidget->findDeviceById(m_deviceInfo->device_id) +- || m_loginOptsWidget->isDeviceDisable(m_deviceInfo->device_id)) { +- m_loginOptsWidget->stopAuth(); +- if (authMode != UNDEFINED) { +- authMode = UNDEFINED; +- emit switchToBiometric(); +- } +- } +- }); +- +- connect(m_loginOptsWidget, &LoginOptionsWidget::authComplete, +- this, [&](uid_t uid, bool ret, int nStatus){ +- qDebug() << "biometric authentication complete: " << uid << ret << nStatus; +- +- if(m_deviceInfo && m_deviceInfo->biotype == LOGINOPT_TYPE_GENERAL_UKEY && ui->widgetUkeyAuth->isVisible()){ +- ui->ukeyPassword->setText(""); +- } +- +- if(uid == getUid(userName) && ret) { +- isbioSuccess = true; +- emit switchToBiometric(); +- authMode = UNDEFINED; +- } else { +- if (nStatus == 5 && m_deviceInfo) { +- if(w_timer && w_timer->isActive()) +- w_timer->stop(); +- QImage imgFailed; +- m_loginOptsWidget->setFaceImg(imgFailed, 2); +- return; +- } else if (nStatus >= 2 && nStatus != 5)if (nStatus >= 2) { +- if (m_deviceInfo) { +- uid_t curUid = getUid(userName); +- if(m_failMap.contains(curUid) && m_failMap[curUid].contains(m_deviceInfo->device_id)){ +- m_failMap[curUid][m_deviceInfo->device_id] = m_failMap[curUid][m_deviceInfo->device_id] + 1; +- }else{ +- m_failMap[curUid][m_deviceInfo->device_id] = 1; +- } +- qDebug()<<"Failed count:"<<m_failMap[curUid][m_deviceInfo->device_id]<<",Max:"<<maxFailedTimes; +- if (m_deviceInfo->biotype == BIOTYPE_FACE) { +- QImage imgFailed; +- m_loginOptsWidget->setFaceImg(imgFailed, 1); +- } +- if(m_failMap[curUid][m_deviceInfo->device_id] >= maxFailedTimes){ +- no_changes = true; +- if (m_deviceInfo->biotype == REMOTE_QRCODE_TYPE) { +- setLoginTypeTip(tr("Failed to verify %1, please enter password to unlock").arg(BioDevices::bioTypeToString_tr(m_deviceInfo->biotype))); +- QImage nullImage; +- m_loginOptsWidget->setQRCode(nullImage); +- } else if(m_deviceInfo->biotype == LOGINOPT_TYPE_GENERAL_UKEY){ +- ui->ukeyPassword->setReadOnly(true); +- setUkeyTypeTip(tr("Unable to verify %1, please enter password to unlock").arg(BioDevices::bioTypeToString_tr(m_deviceInfo->biotype))); +- }else { +- setLoginTypeTip(tr("Unable to verify %1, please enter password to unlock").arg(BioDevices::bioTypeToString_tr(m_deviceInfo->biotype))); +- } +- +- m_loginOptsWidget->setDeviceDisable(m_deviceInfo->device_id, true); +- useDoubleAuth = false; +- return ; +- } +- no_changes = false; +- if(m_deviceInfo->biotype == LOGINOPT_TYPE_GENERAL_UKEY){ +- setUkeyTypeTip(tr("Failed to verify %1, you still have %2 verification opportunities") +- .arg(BioDevices::bioTypeToString_tr(m_deviceInfo->biotype)) +- .arg(maxFailedTimes-m_failMap[curUid][m_deviceInfo->device_id])); +- }else{ +- setLoginTypeTip(tr("Failed to verify %1, you still have %2 verification opportunities") +- .arg(BioDevices::bioTypeToString_tr(m_deviceInfo->biotype)) +- .arg(maxFailedTimes-m_failMap[curUid][m_deviceInfo->device_id])); +- } +- } +- } +- if(!isbioSuccess) { +- // dbus error +- if (nStatus == -1) { +- qDebug()<<"Biometric dbus error:"<<authMode; +- } +- if (m_uCurLoginOptType == LOGINOPT_TYPE_QRCODE && nStatus == 1) { +- m_isNetworkErr = true; +- m_loginOptsWidget->setQRCodeMsg(tr("Abnormal network")); +- startBioAuth(10000); +- } else { +- startBioAuth(); +- } +- if (nStatus >= 2 && m_deviceInfo) { +- if (m_deviceInfo->biotype == BIOTYPE_FACE) { +- QImage imgFailed; +- m_loginOptsWidget->setFaceImg(imgFailed, 1); +- } +- } +- } +- } +- }); +- ++ // 连接登录选项信号响应槽 ++ connect(m_loginOptsWidget, &LoginOptionsWidget::optionSelected, this, &MainWindow::onOptionSelected); ++ connect(m_loginOptsWidget, &LoginOptionsWidget::notifyOptionsChange, this, &MainWindow::onNotifyOptionsChanged); ++ connect(m_loginOptsWidget, &LoginOptionsWidget::authComplete, this, &MainWindow::onLoginOptionsAuthCompleted); + connect(m_loginOptsWidget, &LoginOptionsWidget::updateAuthMsg, this, &MainWindow::onUpdateBioAuthMsg); + connect(m_loginOptsWidget, &LoginOptionsWidget::updateWndSize, this, &MainWindow::onUpdateWndSize); + +@@ -279,36 +104,29 @@ MainWindow::MainWindow(QWidget *parent) : + setStyleSheet(qssFile.readAll()); + qssFile.close(); + +- //ui->cmbUsers->hide(); +- //ui->widgetDetails->hide(); +- //ui->btnDetails->setIcon(QIcon(":/image/assets/arrow_right.svg")); +- //ui->btnDetails->hide(); + ui->lePassword->installEventFilter(this); ++ // 初始化UI状态 + switchWidget(UNDEFINED); + editIcon(); + ui->lblContent->adjustSize(); +- ui->lblContent->height(); +- ui->lblMessage->adjustSize(); ++ ui->lblContent->hide(); ++ ui->lblMessage->setFixedSize(372, 30); + ui->widgetPasswdAuth->adjustSize(); + ui->widgetUkeyAuth->adjustSize(); +- ui->lblMessage->height(); + ui->cmbUsers->view()->setTextElideMode(Qt::ElideRight); +- +- settings = new QGSettings("org.ukui.style","",this); +- fontSize = settings->get("system-font-size").toInt(); +- connect(settings, &QGSettings::changed, +- this, &MainWindow::onConfigurationChanged); +- +- QDBusInterface *interfaceScreensaver = new QDBusInterface( +- "org.ukui.ScreenSaver", +- "/", +- "org.ukui.ScreenSaver", +- QDBusConnection::sessionBus()); +- connect(interfaceScreensaver, SIGNAL(lock()), +- this, SLOT(onLockStatus())); +- connect(interfaceScreensaver, SIGNAL(unlock()), +- this, SLOT(onUnlockStatus())); +- ++ ui->cmbUsers->setFixedHeight(36); ++ ui->lePassword->setFixedHeight(36); ++ ui->btnBioAuth->hide(); ++ ui->returnButton->hide(); ++ ++ settings = new QGSettings("org.ukui.style", "", this); ++ fontSize = settings->get("system-font-size").toInt(); ++ connect(settings, &QGSettings::changed, this, &MainWindow::onConfigurationChanged); ++ ++ QDBusInterface *interfaceScreensaver ++ = new QDBusInterface("org.ukui.ScreenSaver", "/", "org.ukui.ScreenSaver", QDBusConnection::sessionBus()); ++ connect(interfaceScreensaver, SIGNAL(lock()), this, SLOT(onLockStatus())); ++ connect(interfaceScreensaver, SIGNAL(unlock()), this, SLOT(onUnlockStatus())); + } + + MainWindow::~MainWindow() +@@ -318,19 +136,31 @@ MainWindow::~MainWindow() + + void MainWindow::onConfigurationChanged(QString key) + { +- if(key == "systemFontSize"){ ++ if (key == "systemFontSize") { + m_loginOptsWidget->updateUIStatus(false); +- fontSize = settings->get("system-font-size").toInt(); ++ fontSize = settings->get("system-font-size").toInt(); + } +- if(key == "iconThemeName") { ++ if (key == "iconThemeName") { + setIcon(app_IconName); + } ++ if (key == "styleName") { ++ QPalette pe; ++ if (no_changes) { ++ pe.setColor(QPalette::WindowText, Qt::red); ++ m_labelTip->setPalette(pe); ++ } else { ++ QColor color = palette().color(QPalette::WindowText); ++ QPalette pal(this->palette()); ++ pal.setColor(QPalette::WindowText, QColor(color)); ++ m_labelTip->setPalette(pal); ++ } ++ } + } + + void MainWindow::restart_bio_identify() + { + DeviceInfoPtr device = bioDevices.getDefaultDevice(getUid(userName)); +- if(device){ ++ if (device) { + m_loginOptsWidget->startAuth(device, getUid(userName)); + setMessage(tr("Please enter your password or enroll your fingerprint ")); + } +@@ -338,21 +168,20 @@ void MainWindow::restart_bio_identify() + + void MainWindow::closeEvent(QCloseEvent *event) + { +- m_loginOptsWidget->stopAuth(); ++ if (m_loginOptsWidget) { ++ m_loginOptsWidget->stopAuth(); ++ } + m_failMap.clear(); + emit canceled(); +- +- return QWidget::closeEvent(event); ++ return kdk::KDialog::closeEvent(event); + } + + void MainWindow::setUkeyTypeTip(QString text) + { + QString textTip = text; + if (!textTip.isEmpty()) { +-// QFontMetrics font(m_ukeyMessageLabel->font()); +-// QString textTip = font.elidedText(textTip, Qt::ElideRight, m_messageLabel->width()-8); + QPalette pe; +- pe.setColor(QPalette::WindowText,Qt::red); ++ pe.setColor(QPalette::WindowText, Qt::red); + ui->ukeyMessage->setPalette(pe); + ui->ukeyMessage->setText(textTip); + ui->ukeyMessage->setToolTip(text); +@@ -364,7 +193,7 @@ void MainWindow::setUkeyTypeTip(QString text) + + void MainWindow::startLoadingUkey() + { +- m_loadingPixmap = QIcon::fromTheme("ukui-loading-0-symbolic").pixmap(27,27); ++ m_loadingPixmap = QIcon::fromTheme("ukui-loading-0-symbolic").pixmap(27, 27); + ui->loadingUkeyBtn->setIcon(m_loadingPixmap); + ui->loadingUkeyBtn->setIconSize(QSize(27, 27)); + +@@ -378,8 +207,7 @@ void MainWindow::startLoadingUkey() + isLoadingUkey = true; + ui->loadingUkeyWidget->show(); + +- if(!m_loadingTimer) +- { ++ if (!m_loadingTimer) { + m_loadingTimer = new QTimer(this); + m_loadingTimer->setInterval(150); + connect(m_loadingTimer, &QTimer::timeout, this, &MainWindow::updateLoadingPixmap); +@@ -390,13 +218,13 @@ void MainWindow::startLoadingUkey() + void MainWindow::stopLoadingUkey() + { + isLoadingUkey = false; +- if(m_loadingTimer){ ++ if (m_loadingTimer) { + m_loadingTimer->stop(); + } + + ui->loadingUkeyWidget->hide(); +- //ui->cmbUsers->show(); +- //ui->widgetUkeyAuth->show(); ++ // ui->cmbUsers->show(); ++ // ui->widgetUkeyAuth->show(); + } + + void MainWindow::updateLoadingPixmap() +@@ -409,20 +237,19 @@ void MainWindow::updateLoadingPixmap() + + void MainWindow::paintEvent(QPaintEvent *event) + { +- + Q_UNUSED(event); + QStyleOption *option = new QStyleOption(); + QPainter p(this); + p.setRenderHint(QPainter::Antialiasing); + QPainterPath rectPath; +- rectPath.addRoundedRect(this->rect().adjusted(0,0,0,0),0,0); ++ rectPath.addRoundedRect(this->rect().adjusted(0, 0, 0, 0), 0, 0); + // 画一个黑底 + QPixmap pixmap(this->rect().size()); + pixmap.fill(Qt::transparent); + QPainter pixmapPainter(&pixmap); + pixmapPainter.setRenderHint(QPainter::Antialiasing); + pixmapPainter.setPen(Qt::transparent); +- pixmapPainter.setBrush(QColor(0,0,0,100)); ++ pixmapPainter.setBrush(QColor(0, 0, 0, 100)); + pixmapPainter.drawPath(rectPath); + pixmapPainter.end(); + +@@ -444,34 +271,49 @@ void MainWindow::paintEvent(QPaintEvent *event) + + // 绘制一个背景 + p.save(); +- p.fillPath(rectPath,option->palette.color(QPalette::Base)); ++ p.fillPath(rectPath, option->palette.color(QPalette::Base)); + p.restore(); +- //绘制一个矩形 +- +- p.setPen(Qt::red); +- QRectF rect(0,290,20,20); +- + } + + bool MainWindow::eventFilter(QObject *obj, QEvent *event) + { +- if(obj == ui->lePassword){ +- if(event->type() == QEvent::KeyPress){ //禁止复制粘贴功能。 ++ if (obj == ui->lePassword) { ++ if (event->type() == QEvent::KeyPress) { // 禁止复制粘贴功能。 + QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event); +- if(keyEvent->matches(QKeySequence::Copy) || keyEvent->matches(QKeySequence::Cut) || keyEvent->matches(QKeySequence::Paste)){ ++ if (keyEvent->matches(QKeySequence::Copy) || keyEvent->matches(QKeySequence::Cut) ++ || keyEvent->matches(QKeySequence::Paste)) { + event->ignore(); + return true; + } + } +- if(event->type() == QEvent::MouseButtonRelease) { //禁用鼠标中键 +- QMouseEvent *mouseevent = static_cast<QMouseEvent*>(event); +- if(mouseevent->button() == Qt::MidButton){ ++ if (event->type() == QEvent::MouseButtonRelease) { // 禁用鼠标中键 ++ QMouseEvent *mouseevent = static_cast<QMouseEvent *>(event); ++ if (mouseevent->button() == Qt::MidButton) { + event->ignore(); + return true; + } + } ++ } else if (obj == this) { ++ if (event->type() == QEvent::Show || event->type() == QEvent::UpdateRequest) { ++ if (QString(qgetenv("XDG_SESSION_TYPE")) == "wayland") { ++ WindowManager::setWindowLayer(this->windowHandle(), (kdk::WindowLayer)15); ++ } ++ } ++ } ++ return kdk::KDialog::eventFilter(obj, event); ++} ++ ++void MainWindow::keyPressEvent(QKeyEvent *event) ++{ ++ switch (event->key()) { ++ case Qt::Key_Escape: { ++ break; ++ } ++ default: { ++ kdk::KDialog::keyPressEvent(event); ++ break; ++ } + } +- return false; + } + + /*** main ***/ +@@ -479,14 +321,14 @@ void MainWindow::on_cmbUsers_currentTextChanged(const QString &userName) + { + qDebug() << "user changed to " << userName; + m_loginOptsWidget->stopAuth(); +- if(m_bioTimer && m_bioTimer->isActive()) ++ if (m_bioTimer && m_bioTimer->isActive()) + m_bioTimer->stop(); +- authMode=UNDEFINED; ++ authMode = UNDEFINED; + + QList<UserItem> accountUsers = users->getUsers(); + this->userName = userName; +- for(UserItem user:accountUsers){ +- if(user.realName == userName){ ++ for (UserItem user : accountUsers) { ++ if (user.realName == userName) { + this->userName = user.name; + } + } +@@ -506,36 +348,35 @@ int MainWindow::enable_biometric_authentication() + char line[1024], is_enable[16]; + int i; + +- +- if((file = fopen(conf_file, "r")) == NULL){ ++ if ((file = fopen(conf_file, "r")) == NULL) { + return 0; + } +- while(fgets(line, sizeof(line), file)) { +- i = sscanf(line, "EnableAuth=%s\n", is_enable); +- if(i > 0) { ++ while (fgets(line, sizeof(line), file)) { ++ i = sscanf(line, "EnableAuth=%s\n", is_enable); ++ if (i > 0) { + break; + } + } + + fclose(file); +- if(!strcmp(is_enable, "true")) ++ if (!strcmp(is_enable, "true")) + return 1; + return 0; + } + + void MainWindow::on_btnDetails_clicked() +-{/* +- if(ui->widgetDetails->isHidden()) { +- ui->widgetDetails->show(); +- ui->btnDetails->setIcon(QIcon(":/image/assets/arrow_down.svg")); +-// resize(width(), height() + ui->widgetDetails->height()); +- } +- else { +- ui->widgetDetails->hide(); +- ui->btnDetails->setIcon(QIcon(":/image/assets/arrow_right.svg")); +-// resize(width(), height() - ui->widgetDetails->height()); +- } +- adjustSize();*/ ++{ /* ++ if(ui->widgetDetails->isHidden()) { ++ ui->widgetDetails->show(); ++ ui->btnDetails->setIcon(QIcon(":/image/assets/arrow_down.svg")); ++ // resize(width(), height() + ui->widgetDetails->height()); ++ } ++ else { ++ ui->widgetDetails->hide(); ++ ui->btnDetails->setIcon(QIcon(":/image/assets/arrow_right.svg")); ++ // resize(width(), height() - ui->widgetDetails->height()); ++ } ++ adjustSize();*/ + } + + void MainWindow::on_btnCancel_clicked() +@@ -545,22 +386,37 @@ void MainWindow::on_btnCancel_clicked() + + void MainWindow::on_btnAuth_clicked() + { +- if(ui->widgetUkeyAuth->isVisible()){ ++ if (doNotNeedAuth) { ++ emit yesPrompted(); ++ return; ++ } ++ ++ if (ui->widgetUkeyAuth->isVisible()) { + on_ukeyPassword_returnPressed(); +- }else{ ++ } else { + on_lePassword_returnPressed(); + } + } + ++void MainWindow::onShowYesPrompt() ++{ ++ doNotNeedAuth = true; ++ ui->widgetPasswdAuth->hide(); ++ ui->cmbUsers->hide(); ++ ui->btnBioAuth->hide(); ++ ui->returnButton->hide(); ++ ui->btnAuth->show(); ++} ++ + void MainWindow::onLockStatus() + { +- //m_loginOptsWidget->stopAuth(); ++ // m_loginOptsWidget->stopAuth(); + m_loginOptsWidget->lockStatusChanged(true); + } + + void MainWindow::onUnlockStatus() + { +- //m_loginOptsWidget->readDevicesInfo(); ++ // m_loginOptsWidget->readDevicesInfo(); + m_loginOptsWidget->lockStatusChanged(false); + startBioAuth(); + } +@@ -570,7 +426,7 @@ void MainWindow::editIcon() + { + m_modeButton = new ModeButton(ui->lePassword); + m_modeButton->setFocusPolicy(Qt::NoFocus); +- connect(m_modeButton, &QPushButton::clicked, this, [=](){ ++ connect(m_modeButton, &QPushButton::clicked, this, [=]() { + if (ui->lePassword->echoMode() == QLineEdit::Password) { + ui->lePassword->setEchoMode(QLineEdit::Normal); + } else { +@@ -580,15 +436,15 @@ void MainWindow::editIcon() + QHBoxLayout *layout = new QHBoxLayout(ui->lePassword); + layout->addStretch(); + layout->addWidget(m_modeButton); +- layout->setContentsMargins(0,0,8,0); ++ layout->setContentsMargins(0, 0, 8, 0); + +- ui->lePassword->setTextMargins(1, 1, 4+ m_modeButton->width(), 1); ++ ui->lePassword->setTextMargins(1, 1, 4 + m_modeButton->width(), 1); + } + + void MainWindow::on_ukeyPassword_returnPressed() + { +- if(m_loginOptsWidget && m_deviceInfo){ +- m_loginOptsWidget->SetExtraInfo(ui->ukeyPassword->text(),"pincode"); ++ if (m_loginOptsWidget && m_deviceInfo) { ++ m_loginOptsWidget->SetExtraInfo(ui->ukeyPassword->text(), "pincode"); + m_loginOptsWidget->startAuth(m_deviceInfo, getUid(userName)); + } + } +@@ -598,8 +454,7 @@ void MainWindow::on_lePassword_returnPressed() + emit accept(ui->lePassword->text()); + ui->btnAuth->hide(); + ui->btnLoading->show(); +- if(!w_timer) +- { ++ if (!w_timer) { + w_timer = new QTimer(this); + w_timer->setInterval(150); + connect(w_timer, &QTimer::timeout, this, &MainWindow::updatePixmap); +@@ -625,20 +480,19 @@ void MainWindow::on_returnButton_clicked() + } + /*** end of control's slot ***/ + +- + /*** public member ***/ + + void MainWindow::setIcon(const QString &iconName) + { +-// QIcon::setThemeName("ukui-icon-theme"); ++ // QIcon::setThemeName("ukui-icon-theme"); + app_IconName = iconName; +- if(!QIcon::hasThemeIcon("ukui-polkit")) { ++ if (!QIcon::hasThemeIcon("ukui-polkit")) { + QDir iconsDir("/usr/share/icons"); + auto themesList = iconsDir.entryList(QDir::Dirs | QDir::NoDotAndDotDot); + qDebug() << themesList; +- for(auto theme : themesList) { ++ for (auto theme : themesList) { + QIcon::setThemeName(theme); +- if(QIcon::hasThemeIcon("ukui-polkit")) { ++ if (QIcon::hasThemeIcon("ukui-polkit")) { + qDebug() << theme << "has ukui-polkit icon"; + break; + } +@@ -649,25 +503,22 @@ void MainWindow::setIcon(const QString &iconName) + QPainter painter; + + painter.begin(&icon); +- QRect rect(32, +- 32, +- 32, 32); ++ QRect rect(32, 32, 32, 32); + painter.drawPixmap(rect, actionIcon); + painter.end(); + + setWindowIcon(icon); +- //ui->lblIcon->setPixmap(icon); ++ // ui->lblIcon->setPixmap(icon); + } + + void MainWindow::setHeader(const QString &text) + { +- if(is_Mavis) ++ if (is_Mavis) + ui->lblHeader->setText(tr("This operation requires the administrator's authorization. " +- "Please enter your password to allow this operation.")); ++ "Please enter your password to allow this operation.")); + else + ui->lblHeader->setText(text); + ui->lblHeader->adjustSize(); +- ui->lblHeader->height(); + ui->lblContent->setText(tr("A program is attempting to perform an action that requires privileges." + "It requires authorization to perform the action.")); + ui->lblContent->adjustSize(); +@@ -675,24 +526,24 @@ void MainWindow::setHeader(const QString &text) + + void MainWindow::setUsers(const QStringList &usersList) + { +- if(usersList.isEmpty()) ++ if (usersList.isEmpty()) + return; + +- if(usersList.size() == 1) { ++ if (usersList.size() == 1) { + UserItem user = users->getUserByName(usersList.at(0)); +- if(user.realName != ""){ ++ if (user.realName != "") { + userName = user.realName; +- }else{ ++ } else { + userName = usersList.at(0); + } + } + + QList<UserItem> accountUsers = users->getUsers(); +- for(QString identifyUser:usersList){ ++ for (QString identifyUser : usersList) { + bool isFoundAccount = false; +- for(UserItem user:accountUsers){ +- if(identifyUser == user.name){ +- if(user.realName != "") ++ for (UserItem user : accountUsers) { ++ if (identifyUser == user.name) { ++ if (user.realName != "") + ui->cmbUsers->addItem(user.realName); + else + ui->cmbUsers->addItem(user.name); +@@ -706,7 +557,7 @@ void MainWindow::setUsers(const QStringList &usersList) + } + + ui->cmbUsers->show(); +- //ui->cmbUsers->adjustSize(); ++ // ui->cmbUsers->adjustSize(); + } + /* + void MainWindow::setDetails(const QString &subPid, const QString &callerPid, const QString &actionId, +@@ -725,7 +576,7 @@ void MainWindow::setPrompt(const QString &text, bool echo) + { + QString prompt = text; + +- if(text == "Input Password"){ ++ if (text == "Input Password") { + prompt = tr("Input Password"); + } else if (text == "Password: " || text == "Password:") { + prompt = tr("Password: "); +@@ -734,18 +585,18 @@ void MainWindow::setPrompt(const QString &text, bool echo) + } else if (text == "_Password:") { + prompt = tr("_Password:"); + } +- if(!m_timer){ ++ if (!m_timer) { + m_timer = new QTimer(this); + m_timer->setInterval(200); + connect(m_timer, &QTimer::timeout, this, &MainWindow::unlock_countdown); + } +- //qDebug() << "6666"; ++ // qDebug() << "6666"; + m_timer->start(); + unlock_countdown(); + + ui->lePassword->clear(); + ui->lePassword->setPlaceholderText(prompt); +- // switchWidget(PASSWORD); ++ // switchWidget(PASSWORD); + } + + /* +@@ -756,89 +607,92 @@ void MainWindow::setPrompt(const QString &text, bool echo) + */ + QString MainWindow::check_is_pam_message(QString text) + { +- setlocale(LC_ALL,""); +- bindtextdomain("Linux-PAM","/usr/share/locale"); +- bind_textdomain_codeset("Linux-PAM","UTF-8"); ++ if (text.isEmpty()) { ++ return text; ++ } ++ setlocale(LC_ALL, ""); ++ bindtextdomain("Linux-PAM", "/usr/share/locale"); ++ bind_textdomain_codeset("Linux-PAM", "UTF-8"); + textdomain("Linux-PAM"); +- char* str; ++ char *str; + QString strTrans = ""; + QByteArray ba = text.toLocal8Bit(); // must +- str=ba.data(); ++ str = ba.data(); + char l_str[1024]; +- int a,b; +- //兼容旧版本翻译,以及适配新版本翻译 +- //因为不知道什么原因,pam发过来的始终为英文,因此这里主动加载pam的翻译文件,使用gettext获取翻译 +- if(text.contains("attemps",Qt::CaseSensitive) && sscanf(str,"Authenticated failed, %d login attemps left",&a)) +- snprintf(l_str,1024,_("Authenticated failed, %d login attemps left"),a); +- else if(text.contains("attempts",Qt::CaseSensitive) && sscanf(str,"Authenticated failed, %d login attempts left",&a)) +- snprintf(l_str,1024,_("Authenticated failed, %d login attempts left"),a); +- else if(text.contains("attempt",Qt::CaseSensitive) && sscanf(str,"Authenticated failed, %d login attempt left",&a)) +- snprintf(l_str,1024,_("Authenticated failed, %d login attempt left"),a); +- else if(text.contains("days",Qt::CaseSensitive) && sscanf(str,"Account locked, %d days left",&a)){ +- //这里的消息是多个字符串拼接起来的,无法在翻译文件中找到对应的句子,只能自己翻译 ++ int a, b; ++ // 兼容旧版本翻译,以及适配新版本翻译 ++ // 因为不知道什么原因,pam发过来的始终为英文,因此这里主动加载pam的翻译文件,使用gettext获取翻译 ++ if (text.contains("attemps", Qt::CaseSensitive) && sscanf(str, "Authenticated failed, %d login attemps left", &a)) ++ snprintf(l_str, 1024, _("Authenticated failed, %d login attemps left"), a); ++ else if ( ++ text.contains("attempts", Qt::CaseSensitive) && sscanf(str, "Authenticated failed, %d login attempts left", &a)) ++ snprintf(l_str, 1024, _("Authenticated failed, %d login attempts left"), a); ++ else if ( ++ text.contains("attempt", Qt::CaseSensitive) && sscanf(str, "Authenticated failed, %d login attempt left", &a)) ++ snprintf(l_str, 1024, _("Authenticated failed, %d login attempt left"), a); ++ else if (text.contains("days", Qt::CaseSensitive) && sscanf(str, "Account locked, %d days left", &a)) { ++ // 这里的消息是多个字符串拼接起来的,无法在翻译文件中找到对应的句子,只能自己翻译 + strTrans = tr("Account locked,") + QString("%1 ").arg(a) + tr("days left"); + return strTrans; +- } +- else if(text.contains("hours",Qt::CaseSensitive) && sscanf(str,"Account locked, %d hours left",&a)){ ++ } else if (text.contains("hours", Qt::CaseSensitive) && sscanf(str, "Account locked, %d hours left", &a)) { + strTrans = tr("Account locked,") + QString("%1 ").arg(a) + tr("hours left"); + return strTrans; +- } +- else if(text.contains("minutes",Qt::CaseSensitive) && sscanf(str,"Account locked, %d minutes left",&a)){ ++ } else if (text.contains("minutes", Qt::CaseSensitive) && sscanf(str, "Account locked, %d minutes left", &a)) { + strTrans = tr("Account locked,") + QString("%1 ").arg(a) + tr("minutes left"); + return strTrans; +- } +- else if(text.contains("seconds",Qt::CaseSensitive) && sscanf(str,"Account locked, %d seconds left",&a)){ ++ } else if (text.contains("seconds", Qt::CaseSensitive) && sscanf(str, "Account locked, %d seconds left", &a)) { + strTrans = tr("Account locked,") + QString("%1 ").arg(a) + tr("seconds left"); + return strTrans; +- }else if(text.contains("Warning: ",Qt::CaseSensitive) && sscanf(str,"Warning: your password will expire in %d day",&a)){ +- snprintf(l_str,1024,_("Warning: your password will expire in %d day"),a); +- }else if(text.contains("Warning: ",Qt::CaseSensitive) && sscanf(str,"Warning: your password will expire in %d days",&a)){ +- snprintf(l_str,1024,_("Warning: your password will expire in %d days"),a); +- } +- else{ ++ } else if ( ++ text.contains("Warning: ", Qt::CaseSensitive) ++ && sscanf(str, "Warning: your password will expire in %d day", &a)) { ++ snprintf(l_str, 1024, _("Warning: your password will expire in %d day"), a); ++ } else if ( ++ text.contains("Warning: ", Qt::CaseSensitive) ++ && sscanf(str, "Warning: your password will expire in %d days", &a)) { ++ snprintf(l_str, 1024, _("Warning: your password will expire in %d days"), a); ++ } else { + return _(str); + } +- +- qDebug()<<"l_str = "<<l_str; ++ ++ qDebug() << "l_str = " << l_str; + return QString(l_str); + } + +-void MainWindow::setMessage(const QString &text,situation situat) ++void MainWindow::setMessage(const QString &text, situation situat) + { + +- if(situat == ERROR){ ++ if (situat == ERROR) { + QPalette pe; +- pe.setColor(QPalette::WindowText,Qt::red); ++ pe.setColor(QPalette::WindowText, Qt::red); + ui->lblMessage->setPalette(pe); +-// ui->lePassword->setStyleSheet("QLineEdit{background-color: palette(Button);" +-// "border-radius: 6px;border: 1px solid #F3222D;}"); +- }else if(situat == TRUE){ +- QColor color = palette().color(QPalette::WindowText); +- QPalette pal(this->palette()); +- pal.setColor(QPalette::WindowText,QColor(color)); +- ui->lblMessage->setPalette(pal); ++ // ui->lePassword->setStyleSheet("QLineEdit{background-color: palette(Button);" ++ // "border-radius: 6px;border: 1px solid #F3222D;}"); ++ } else if (situat == TRUE) { ++ QColor color = palette().color(QPalette::WindowText); ++ QPalette pal(this->palette()); ++ pal.setColor(QPalette::WindowText, QColor(color)); ++ ui->lblMessage->setPalette(pal); + } + + // qDebug()<<"receive:text = "<<text; +- if (text.indexOf("account locked") != -1 || text.indexOf("账户已锁定") != -1 +- || text.indexOf("Account locked") != -1 || text.indexOf("永久锁定") != -1) +- { +- if(!m_timer){ ++ if (text.indexOf("account locked") != -1 || text.indexOf("账户已锁定") != -1 || text.indexOf("Account locked") != -1 ++ || text.indexOf("永久锁定") != -1) { ++ if (!m_timer) { + m_timer = new QTimer(this); + m_timer->setInterval(800); + connect(m_timer, &QTimer::timeout, this, &MainWindow::unlock_countdown); + } + m_timer->start(); +- }else if (text.indexOf("No password received, please input password") != -1) +- { ++ } else if (text.indexOf("No password received, please input password") != -1) { + ui->lblMessage->setText(tr("Password cannot be empty")); + ui->lblMessage->setToolTip(tr("Password cannot be empty")); +- }else{ ++ } else { + ui->lblMessage->setText(text); + ui->lblMessage->setToolTip(text); + } +- ui->lblMessage->adjustSize(); +- //ui->widgetPasswdAuth->adjustSize(); ++ // ui->lblMessage->adjustSize(); ++ // ui->widgetPasswdAuth->adjustSize(); + // ui->lblMessage->setText(text); + } + +@@ -846,36 +700,36 @@ void MainWindow::setAuthResult(bool result, const QString &text) + { + QString message = text; + +- if(!result && text.isEmpty()){ ++ if (!result && text.isEmpty()) { + message = tr("Authentication failed, please try again."); + } + +- if(authMode == PASSWORD) { ++ if (authMode == PASSWORD) { + switchWidget(PASSWORD); +- setMessage(message,ERROR); +- } +- else if(authMode == BIOMETRIC) +- setMessage(message,ERROR); +- +- ++ setMessage(message, ERROR); ++ } else if (authMode == BIOMETRIC) ++ setMessage(message, ERROR); + } + + void MainWindow::clearEdit() + { + ui->lePassword->setText(""); ++ ui->lePassword->setDisabled(true); ++ ui->lePassword->setReadOnly(true); + ui->ukeyPassword->setText(""); ++ ui->btnAuth->setDisabled(true); + } + + void MainWindow::switchAuthMode(Mode mode) + { +- if(isbioSuccess){ ++ if (isbioSuccess) { + accept(BIOMETRIC_SUCCESS); +- return ; ++ return; + } + int uid = getUid(userName); + m_loginOptsWidget->setUser(uid); + int count = m_loginOptsWidget->getLoginOptCount(); +- enableBioAuth = count > 0; ++ enableBioAuth = count > 0; + if (count < 1) { + setLoginTypeTip(tr("Input your password to authentication")); + m_loginOptsWidget->hide(); +@@ -884,185 +738,131 @@ void MainWindow::switchAuthMode(Mode mode) + m_loginOptsWidget->setEnabled(true); + } + +- if(m_loginOptsWidget->getHasUkeyOptions()){ ++ if (m_loginOptsWidget->getHasUkeyOptions()) { + setLoginTypeTip(tr("Input your password to authentication")); + m_loginOptsWidget->show(); + } +- +- switch(mode){ +- case PASSWORD: +- { +- qDebug() << "switch to password"; + +- authMode = mode; ++ switch (mode) { ++ case PASSWORD: { ++ qDebug() << "switch to password"; + +- if(!enableBioAuth || !receiveBioPAM || useDoubleAuth) { +- ui->btnBioAuth->hide(); +- }else{ +- ui->btnBioAuth->show(); +- } +- +- if(isHiddenSwitchButton) +- ui->btnBioAuth->hide(); +- +- +- // if(enableBioAuth && useDoubleAuth){ +- // DeviceInfoPtr device = bioDevices.getDefaultDevice(getUid(userName)); +- // if(device){ +- // widgetBioAuth->startAuth(getUid(userName), device); +- // } +- // } +- } +- break; +- case BIOMETRIC: +- { +- if(authMode == PASSWORD){ +- emit accept(BIOMETRIC_IGNORE); +- isFirstAuth = false; +- return; +- } +- authMode = mode; +- qDebug() << "switch to biometric"; +- if (m_deviceInfo) { +- if (!m_loginOptsWidget->findDeviceById(m_deviceInfo->device_id) +- || m_loginOptsWidget->isDeviceDisable(m_deviceInfo->device_id)) { +- m_deviceInfo = DeviceInfoPtr(); +- } +- } ++ authMode = mode; + +- if(!enableBioAuth){ +- qDebug() << "It doesn't meet the condition for enabling biometric authentication, switch to password."; +- emit accept(BIOMETRIC_IGNORE); +- isFirstAuth = false; +- return; +- } else if(authMode == BIOMETRIC) { +- QString strDeviceName; +- if(isLoadingUkey){ +- strDeviceName = m_loginOptsWidget->GetDefaultDevice(uid, UniT_General_Ukey); +- }else{ +- strDeviceName = m_loginOptsWidget->GetDefaultDevice(uid); +- } +- //如果默认设备为空的话,第一次不启动生物识别认证 +- if(strDeviceName.isEmpty() && !m_deviceInfo) +- { +- qDebug() << "No default device"; +- emit accept(BIOMETRIC_IGNORE); +- isFirstAuth = false; +- return; ++ if (!enableBioAuth || !receiveBioPAM || useDoubleAuth) { ++ ui->btnBioAuth->hide(); ++ } else { ++ ui->btnBioAuth->show(); + } + +- //第一次,获取默认设备的设备信息,之后使用的则是从设备选择窗口传出的设备信息 +- if(!m_deviceInfo) +- { +- m_deviceInfo = m_loginOptsWidget->findDeviceByName(strDeviceName); ++ if (isHiddenSwitchButton) { ++ ui->btnBioAuth->hide(); + } +- if(!m_deviceInfo){ ++ } break; ++ case BIOMETRIC: { ++ if (authMode == PASSWORD) { + emit accept(BIOMETRIC_IGNORE); + isFirstAuth = false; + return; + } ++ authMode = mode; ++ qDebug() << "switch to biometric"; ++ if (m_deviceInfo) { ++ if (!m_loginOptsWidget->findDeviceById(m_deviceInfo->device_id) ++ || m_loginOptsWidget->isDeviceDisable(m_deviceInfo->device_id)) { ++ m_deviceInfo = DeviceInfoPtr(); ++ } ++ } + +- if(m_failMap.contains(uid) && m_failMap[uid].contains(m_deviceInfo->device_id) +- && m_failMap[uid][m_deviceInfo->device_id] >= maxFailedTimes){ ++ if (!enableBioAuth) { ++ qDebug() << "It doesn't meet the condition for enabling biometric authentication, switch to password."; + emit accept(BIOMETRIC_IGNORE); + isFirstAuth = false; + return; +- } +- +- if(m_deviceInfo->biotype == LOGINOPT_TYPE_GENERAL_UKEY){ +- if(isFirstAuth){ +- isFirstAuth = false; +- m_deviceInfo = nullptr; +- emit accept(BIOMETRIC_IGNORE); +- return ; ++ } else if (authMode == BIOMETRIC) { ++ QString strDeviceName; ++ if (isLoadingUkey) { ++ strDeviceName = m_loginOptsWidget->GetDefaultDevice(uid, UniT_General_Ukey); ++ } else { ++ strDeviceName = m_loginOptsWidget->GetDefaultDevice(uid); + } +- switchLoginOptType(LOGINOPT_TYPE_GENERAL_UKEY); +- stopLoadingUkey(); +- startBioAuth(); +- m_loginOptsWidget->setCurrentDevice(m_deviceInfo); +- m_loginOptsWidget->updateUIStatus(false); +- +- return ; +- } +- +- isFirstAuth = false; +- startBioAuth(); +- emit accept(BIOMETRIC_IGNORE); +- return; +- } /*else if(authMode == UNDEFINED){ +- authMode = BIOMETRIC; +- +- if(enableBioAuth) { +- qDebug() << "enable biometric authenticaion"; +- QString strDeviceName = m_loginOptsWidget->GetDefaultDevice(uid); +- //如果默认设备为空的话,第一次不启动生物识别认证 +- if(strDeviceName.isEmpty() && !m_deviceInfo) +- { ++ // 如果默认设备为空的话,第一次不启动生物识别认证 ++ if (strDeviceName.isEmpty() && !m_deviceInfo) { + qDebug() << "No default device"; +- if(useFirstDevice == true){ +- m_deviceInfo = m_loginOptsWidget->getFirstDevInfo(); +- }else{ +- emit accept(BIOMETRIC_IGNORE); +- return; +- } ++ emit accept(BIOMETRIC_IGNORE); ++ isFirstAuth = false; ++ return; + } +- //第一次,获取默认设备的设备信息,之后使用的则是从设备选择窗口传出的设备信息 +- if(!m_deviceInfo) +- { ++ ++ // 第一次,获取默认设备的设备信息,之后使用的则是从设备选择窗口传出的设备信息 ++ if (!m_deviceInfo) { + m_deviceInfo = m_loginOptsWidget->findDeviceByName(strDeviceName); +- if (!m_deviceInfo) +- m_deviceInfo = m_loginOptsWidget->getFirstDevInfo(); + } +- if(!m_deviceInfo){ ++ ++ if (!m_deviceInfo) { + emit accept(BIOMETRIC_IGNORE); ++ isFirstAuth = false; + return; + } +- if(m_failMap.contains(uid) && m_failMap[uid].contains(m_deviceInfo->device_id) +- && m_failMap[uid][m_deviceInfo->device_id] >= maxFailedTimes){ ++ ++ if (m_failMap.contains(uid) && m_failMap[uid].contains(m_deviceInfo->device_id) ++ && m_failMap[uid][m_deviceInfo->device_id] >= maxFailedTimes) { + emit accept(BIOMETRIC_IGNORE); ++ isFirstAuth = false; ++ return; ++ } ++ ++ if (m_deviceInfo->biotype == LOGINOPT_TYPE_GENERAL_UKEY) { ++ if (isFirstAuth) { ++ isFirstAuth = false; ++ m_deviceInfo = nullptr; ++ emit accept(BIOMETRIC_IGNORE); ++ return; ++ } ++ switchLoginOptType(LOGINOPT_TYPE_GENERAL_UKEY); ++ stopLoadingUkey(); ++ startBioAuth(); ++ m_loginOptsWidget->setCurrentDevice(m_deviceInfo); ++ m_loginOptsWidget->updateUIStatus(false); + return; + } ++ ++ isFirstAuth = false; ++ switchLoginOptType(m_loginOptsWidget->convertDeviceType(m_deviceInfo->biotype)); + startBioAuth(); + emit accept(BIOMETRIC_IGNORE); + return; +- } else {*/ +- /* pass biometric's pam module if there are not available devices */ +-// qDebug() << "It doesn't meet the condition for enabling biometric authentication, switch to password."; +-// emit accept(BIOMETRIC_IGNORE); +-// return; +-// } +-// } +- } +- break; +- default: +- break; ++ } ++ } break; ++ default: ++ break; + } + switchWidget(mode); + } + + /*** end of public memeber ***/ + +- + /*** private member ***/ + + uid_t MainWindow::getUid(const QString &userName) + { + struct passwd *pwd = getpwnam(userName.toStdString().c_str()); +- if(pwd == NULL) { ++ if (pwd == NULL) { + qWarning() << "getpwnam error: " << strerror(errno); + return -1; + } + return pwd->pw_uid; + } + +-void MainWindow::setDoubleAuth(bool val){ +- useDoubleAuth = val; ++void MainWindow::setDoubleAuth(bool val) ++{ ++ useDoubleAuth = val; + } + + void MainWindow::stopDoubleAuth() + { +-// if(useDoubleAuth && widgetBioAuth) +-// widgetBioAuth->stopAuth(); ++ // if(useDoubleAuth && widgetBioAuth) ++ // widgetBioAuth->stopAuth(); + } + + void MainWindow::switchWidget(Mode mode) +@@ -1071,127 +871,110 @@ void MainWindow::switchWidget(Mode mode) + ui->btnAuth->hide(); + ui->btnLoading->hide(); + ui->btnAuth->setText(tr("Authenticate")); +- ui->btnAuth->adjustSize(); + ui->btnBioAuth->setText(tr("Biometric")); +- ui->btnBioAuth->adjustSize(); + ui->btnCancel->setText(tr("Cancel")); +- ui->btnCancel->adjustSize(); + ui->returnButton->setText(tr("Use password")); + ui->btnLoading->setDisabled(true); +- ui->returnButton->adjustSize(); +- m_labelTip->adjustSize(); +- if(is_Mavis){ ++ if (is_Mavis) { + ui->cmbUsers->setFixedHeight(48); + ui->lePassword->setFixedHeight(48); + ui->ukeyPassword->setFixedHeight(48); + ui->btnAuth->setFixedHeight(48); + ui->btnCancel->setFixedHeight(48); +- } +- switch(mode){ +- case PASSWORD: +- { +- setFixedWidth(420); +- +- if (m_deviceInfo && m_loginOptsWidget->findDeviceById(m_deviceInfo->device_id)) { +- switchLoginOptType(m_loginOptsWidget->convertDeviceType(m_deviceInfo->biotype)); +- } else { +- switchLoginOptType(LOGINOPT_TYPE_PASSWORD); +- } +- if (!m_loginOptsWidget->isHidden()) { +- m_loginOptsWidget->adjustSize(); +- } +- int height; +- if(fontSize = 10){ +- height = 130 + ui->lblHeader->height() /*+ ui->lblContent->height()*/ +- + ui->cmbUsers->height() + ui->lePassword->height() + ui->lblMessage->height() +- + ui->btnAuth->height(); +- } else if(fontSize = 11 ){ +- height = 150 + ui->lblHeader->height() /*+ ui->lblContent->height()*/ +- + ui->cmbUsers->height() + ui->lePassword->height() + ui->lblMessage->height() +- + ui->btnAuth->height(); +- } else if (fontSize = 12){ +- height = 160 + ui->lblHeader->height() /*+ ui->lblContent->height()*/ +- + ui->cmbUsers->height() + ui->lePassword->height() + ui->lblMessage->height() +- + ui->btnAuth->height(); +- } else if (fontSize = 13){ +- height = 170 + ui->lblHeader->height() /*+ ui->lblContent->height()*/ +- + ui->cmbUsers->height() + ui->lePassword->height() + ui->lblMessage->height() +- + ui->btnAuth->height(); +- } else if (fontSize = 14){ +- height = 190 + ui->lblHeader->height() /*+ ui->lblContent->height()*/ +- + ui->cmbUsers->height() + ui->lePassword->height() + ui->lblMessage->height() +- + ui->btnAuth->height(); +- } else if (fontSize = 15){ +- height = 230 + ui->lblHeader->height() /*+ ui->lblContent->height()*/ +- + ui->cmbUsers->height() + ui->lePassword->height() + ui->lblMessage->height() +- + ui->btnAuth->height(); +- } +-// if (m_loginOptsWidget->isHidden()) { +-// height = height - m_labelTip->height() - 10; +-// } +- +- unsigned uOptsWidgetHeight = m_loginOptsWidget->height(); +- if (m_loginOptsWidget->isHidden()) { +- uOptsWidgetHeight = 0; +- height = height + m_labelTip->height() - 10; +- } +- setFixedHeight(height + uOptsWidgetHeight + 10); +- +- //m_loginOptsWidget->updateUIStatus(); +- ui->btnBioAuth->setStyleSheet("QPushButton{font-size:14px;}QPushButton:hover{border:none;color:#3E6CE5;}QPushButton:pressed{border:none;}"); +- ui->btnBioAuth->setFlat(true); +- ui->btnBioAuth->setText(tr("Biometric")); +- ui->btnBioAuth->setAttribute(Qt::WA_UnderMouse,false); +- ui->btnBioAuth->adjustSize(); +- ui->widgetPasswdAuth->show(); +- ui->lePassword->setFocus(); +- //ui->lePassword->setAttribute(Qt::WA_InputMethodEnabled, false); +- if (m_modeButton && m_modeButton->isShowPwd()) { +- ui->lePassword->setEchoMode(QLineEdit::Normal); +- } else { +- ui->lePassword->setEchoMode(QLineEdit::Password); +- } +- ui->btnAuth->show(); +- ui->btnLoading->hide(); +- //ui->lePassword->setDisabled(false); +- if(w_timer && w_timer->isActive()) +- { +- w_timer->stop(); +- } +- ui->btnCancel->show(); +- //ui->lblContent->show(); +- ui->returnButton->hide(); +- ui->lblContent->hide(); +- } +- break; +- +- case BIOMETRIC: +- setFixedWidth(420); +- if(m_loginOptsWidget->getLoginOptCount() <= 1){ +- setFixedHeight(392+ui->cmbUsers->height()+ui->lblHeader->height()); +- } else { +- setFixedHeight(482+ui->cmbUsers->height()+ui->lblHeader->height()); +- } +- +- ui->btnCancel->hide(); +- ui->lblContent->hide(); +- ui->btnBioAuth->hide(); +- ui->returnButton->show(); +- ui->returnButton->setAttribute(Qt::WA_UnderMouse,false); +- ui->returnButton->setFlat(true); +- ui->returnButton->setStyleSheet("QPushButton{font-size:14px;}QPushButton:hover{border:none;color:#3E6CE5;}QPushButton:pressed{border:none;}"); +- ui->returnButton->setText(tr("Use password")); +- ui->returnButton->adjustSize(); +- break; +-// case DEVICES: +-// widgetBioAuth->show(); +- +-// break; +- default: +- break; ++ } else { ++ ui->cmbUsers->setFixedHeight(36); ++ ui->lePassword->setFixedHeight(36); ++ ui->ukeyPassword->setFixedHeight(36); ++ ui->btnAuth->setFixedHeight(36); ++ ui->btnBioAuth->setFixedHeight(36); ++ ui->btnCancel->setFixedHeight(36); ++ ui->returnButton->setFixedHeight(36); ++ } ++ switch (mode) { ++ case PASSWORD: { ++ setFixedWidth(420); ++ ++ if (m_deviceInfo && m_loginOptsWidget->findDeviceById(m_deviceInfo->device_id)) { ++ switchLoginOptType(m_loginOptsWidget->convertDeviceType(m_deviceInfo->biotype)); ++ } else { ++ switchLoginOptType(LOGINOPT_TYPE_PASSWORD); ++ } ++ // 标题+间隔+内容头+间隔+类型提示+间隔+用户列表+间隔+ ++ // (密码输入框+间隔+验证提示+间隔+授权按钮+边距)/ --仅密码方式 ++ // (密码输入框+间隔+验证提示+间隔+登录选项+间隔+授权按钮+边距)/ --密码+生物识别 选择密码 ++ // (登录选项+间隔+授权按钮+边距)/ --密码+生物识别 选择生物识别 ++ // (ukey加载页+间隔+登录选项+间隔+授权按钮+边距)/(ukey认证页+间隔+登录选项+间隔+授权按钮+边距) ++ // --选择Ukey ++ int height = 40 + 8 + ui->lblHeader->height() + 8 + m_labelTip->height() + 8; ++ switch (m_uCurLoginOptType) { ++ case LOGINOPT_TYPE_PASSWORD: { ++ height += ui->cmbUsers->height() + 8 + ui->lePassword->height() + 8 + ui->lblMessage->height() + 8; ++ } break; ++ case LOGINOPT_TYPE_FACE: ++ case LOGINOPT_TYPE_FINGERPRINT: ++ case LOGINOPT_TYPE_FINGERVEIN: ++ case LOGINOPT_TYPE_IRIS: ++ case LOGINOPT_TYPE_VOICEPRINT: ++ case LOGINOPT_TYPE_QRCODE: { ++ height += ui->cmbUsers->height() + 8; ++ } break; ++ case LOGINOPT_TYPE_GENERAL_UKEY: ++ case LOGINOPT_TYPE_ADVANCED_UKEY: { ++ if (!ui->widgetUkeyAuth->isHidden()) { ++ height += ui->widgetUkeyAuth->height() + 8; ++ } else if (!ui->loadingUkeyWidget->isHidden()) { ++ height += ui->loadingUkeyWidget->height() + 8; ++ } ++ } break; ++ default: ++ break; ++ } ++ if (!m_loginOptsWidget->isHidden()) { ++ height += m_loginOptsWidget->height() + 8; ++ } ++ height += ui->btnAuth->height() + 24; ++ setFixedSize(width(), height); ++ qInfo() << "MainWindow geometry:" << geometry() << height; ++ ++ // m_loginOptsWidget->updateUIStatus(); ++ ui->btnBioAuth->setStyleSheet("QPushButton{font-size:14px;}QPushButton:hover{border:none;color:#3E6CE5;}" ++ "QPushButton:pressed{border:none;}"); ++ ui->btnBioAuth->setFlat(true); ++ ui->btnBioAuth->setText(tr("Biometric")); ++ ui->btnBioAuth->setAttribute(Qt::WA_UnderMouse, false); ++ ui->btnBioAuth->adjustSize(); ++ if (m_uCurLoginOptType == LOGINOPT_TYPE_PASSWORD) { ++ ui->widgetPasswdAuth->show(); ++ ui->lePassword->setFocus(); ++ // ui->lePassword->setAttribute(Qt::WA_InputMethodEnabled, false); ++ if (m_modeButton && m_modeButton->isShowPwd()) { ++ ui->lePassword->setEchoMode(QLineEdit::Normal); ++ } else { ++ ui->lePassword->setEchoMode(QLineEdit::Password); ++ } ++ } ++ ui->btnAuth->show(); ++ ui->btnLoading->hide(); ++ if (w_timer && w_timer->isActive()) { ++ w_timer->stop(); ++ } ++ ui->btnCancel->show(); ++ // ui->lblContent->show(); ++ ui->returnButton->hide(); ++ ui->lblContent->hide(); ++ } break; ++ ++ case BIOMETRIC: ++ setFixedWidth(420); ++ ui->btnCancel->hide(); ++ ui->lblContent->hide(); ++ ui->btnBioAuth->hide(); ++ break; ++ default: ++ break; + } + +-// adjustSize(); ++ // adjustSize(); + } + + void MainWindow::unlock_countdown() +@@ -1199,70 +982,75 @@ void MainWindow::unlock_countdown() + int failed_count = 0; + int time_left = 0; + int deny = 0; +- int fail_time =0; ++ int fail_time = 0; + int unlock_time = 0; +- pam_tally_unlock_time_left(getUid(userName),&failed_count, &time_left, &deny,&fail_time,&unlock_time); ++ pam_tally_unlock_time_left(getUid(userName), &failed_count, &time_left, &deny, &fail_time, &unlock_time); + +- // qDebug() << "failed_count:" << failed_count << "time_left:" <<time_left <<"deny:"<<deny<<"fail_time:"<< fail_time<<"unlock_time:" << unlock_time; +- if(time_left >= 60)//请多少分钟后重试 ++ // qDebug() << "failed_count:" << failed_count << "time_left:" <<time_left <<"deny:"<<deny<<"fail_time:"<< ++ // fail_time<<"unlock_time:" << unlock_time; ++ if (time_left >= 60) // 请多少分钟后重试 + { +- int nMinuteleft = time_left/60; +- if (isLockingFlg == false){ +- m_nCurLockMin = unlock_time/60;//获取当前需要锁定的分钟数 ++ int nMinuteleft = time_left / 60; ++ if (isLockingFlg == false) { ++ m_nCurLockMin = unlock_time / 60; // 获取当前需要锁定的分钟数 + } + +- //如果当前设置的不是1min钟锁定,那么1min显示成2min,由2min直接跳到59s || 剩余分钟数小于当前设置的锁定时间,并且大于1min,自增+1 +- if ((nMinuteleft == 1 && m_nCurLockMin != 1) || (nMinuteleft > 1 && nMinuteleft < m_nCurLockMin)) +- { ++ // 如果当前设置的不是1min钟锁定,那么1min显示成2min,由2min直接跳到59s || ++ // 剩余分钟数小于当前设置的锁定时间,并且大于1min,自增+1 ++ if ((nMinuteleft == 1 && m_nCurLockMin != 1) || (nMinuteleft > 1 && nMinuteleft < m_nCurLockMin)) { + nMinuteleft = nMinuteleft + 1; + } +- setMessage(tr("Please try again in %1 minutes.").arg(nMinuteleft),TRUE); +- //ui->lblMessage->setToolTip(tr("Please try again in %1 minutes.").arg(nMinute)); ++ setMessage(tr("Please try again in %1 minutes.").arg(nMinuteleft), ERROR); ++ // ui->lblMessage->setToolTip(tr("Please try again in %1 minutes.").arg(nMinute)); + ui->lePassword->setText(""); + ui->lePassword->setDisabled(true); ++ ui->lePassword->setReadOnly(true); + ui->btnAuth->setDisabled(true); + isLockingFlg = true; +- return ; +- } +- else if(time_left > 0 && time_left < 60)//请多少秒后重试 ++ setBiometricAuthDisabledStatus(isLockingFlg); ++ return; ++ } else if (time_left > 0 && time_left < 60) // 请多少秒后重试 + { +- char ch[100]={0}; +- setMessage(tr("Please try again in %1 seconds.").arg(time_left%60),TRUE); +- //ui->lblMessage->setToolTip(tr("Please try again in %1 seconds.").arg(time_left%60)); ++ char ch[100] = { 0 }; ++ setMessage(tr("Please try again in %1 seconds.").arg(time_left % 60), ERROR); ++ // ui->lblMessage->setToolTip(tr("Please try again in %1 seconds.").arg(time_left%60)); + ui->lePassword->setText(""); + ui->lePassword->setDisabled(true); ++ ui->lePassword->setReadOnly(true); + ui->btnAuth->setDisabled(true); + isLockingFlg = true; +- return ; +- } +- else if (failed_count == 0xFFFF)//账号被永久锁定 ++ setBiometricAuthDisabledStatus(isLockingFlg); ++ return; ++ } else if (failed_count == 0xFFFF) // 账号被永久锁定 + { + ui->lblMessage->setText(tr("Account locked permanently.")); + ui->lblMessage->setToolTip(tr("Account locked permanently.")); + ui->lePassword->setText(""); + ui->lePassword->setDisabled(true); ++ ui->lePassword->setReadOnly(true); + ui->btnAuth->setDisabled(true); + isLockingFlg = true; +- return ; +- } +- else +- { +- if(ui->lePassword){ ++ setBiometricAuthDisabledStatus(isLockingFlg); ++ return; ++ } else { ++ if (ui->lePassword) { + ui->lePassword->setDisabled(false); ++ ui->lePassword->setReadOnly(false); + ui->lePassword->setFocus(); + } +- if(ui->btnAuth){ ++ if (ui->btnAuth) { + ui->btnAuth->setDisabled(false); + } + + if (isLockingFlg) { +- //setMessage(tr("Authentication failed, please try again."),ERROR); ++ // setMessage(tr("Authentication failed, please try again."),ERROR); + setMessage(""); + isLockingFlg = false; ++ setBiometricAuthDisabledStatus(isLockingFlg); + } + m_timer->stop(); + } +- return ; ++ return; + } + + void MainWindow::root_unlock_countdown() +@@ -1270,22 +1058,23 @@ void MainWindow::root_unlock_countdown() + int failed_count = 0; + int time_left = 0; + int deny = 0; +- int fail_time =0; ++ int fail_time = 0; + int unlock_time = 0; +- pam_tally_root_unlock_time_left(&failed_count, &time_left, &deny,&fail_time,&unlock_time); ++ pam_tally_root_unlock_time_left(&failed_count, &time_left, &deny, &fail_time, &unlock_time); + +- // qDebug() << "failed_count:" << failed_count << "time_left:" <<time_left <<"deny:"<<deny<<"fail_time:"<< fail_time<<"unlock_time:" << unlock_time; +- int nMinuteleft = time_left/60; +- if(time_left >= 60)//请多少分钟后重试 ++ // qDebug() << "failed_count:" << failed_count << "time_left:" <<time_left <<"deny:"<<deny<<"fail_time:"<< ++ // fail_time<<"unlock_time:" << unlock_time; ++ int nMinuteleft = time_left / 60; ++ if (time_left >= 60) // 请多少分钟后重试 + { +- int nMinuteleft = time_left/60; +- if (isLockingFlg == false){ +- m_nCurLockMin = unlock_time/60;//获取当前需要锁定的分钟数 ++ int nMinuteleft = time_left / 60; ++ if (isLockingFlg == false) { ++ m_nCurLockMin = unlock_time / 60; // 获取当前需要锁定的分钟数 + } + +- //如果当前设置的不是1min钟锁定,那么1min显示成2min,由2min直接跳到59s || 剩余分钟数小于当前设置的锁定时间,并且大于1min,自增+1 +- if ((nMinuteleft == 1 && m_nCurLockMin != 1) || (nMinuteleft > 1 && nMinuteleft < m_nCurLockMin)) +- { ++ // 如果当前设置的不是1min钟锁定,那么1min显示成2min,由2min直接跳到59s || ++ // 剩余分钟数小于当前设置的锁定时间,并且大于1min,自增+1 ++ if ((nMinuteleft == 1 && m_nCurLockMin != 1) || (nMinuteleft > 1 && nMinuteleft < m_nCurLockMin)) { + nMinuteleft = nMinuteleft + 1; + } + +@@ -1293,179 +1082,204 @@ void MainWindow::root_unlock_countdown() + ui->lblMessage->setToolTip(tr("Please try again in %1 minutes.").arg(nMinuteleft)); + ui->lePassword->setText(""); + ui->lePassword->setDisabled(true); ++ ui->lePassword->setReadOnly(true); ++ ui->btnAuth->setDisabled(true); + isLockingFlg = true; +- return ; +- } +- else if(time_left > 0 && time_left < 60)//请多少秒后重试 ++ setBiometricAuthDisabledStatus(isLockingFlg); ++ return; ++ } else if (time_left > 0 && time_left < 60) // 请多少秒后重试 + { +- char ch[100]={0}; +- ui->lblMessage->setText(tr("Please try again in %1 seconds.").arg(time_left%60)); +- ui->lblMessage->setToolTip(tr("Please try again in %1 seconds.").arg(time_left%60)); ++ char ch[100] = { 0 }; ++ ui->lblMessage->setText(tr("Please try again in %1 seconds.").arg(time_left % 60)); ++ ui->lblMessage->setToolTip(tr("Please try again in %1 seconds.").arg(time_left % 60)); + ui->lePassword->setText(""); + ui->lePassword->setDisabled(true); ++ ui->lePassword->setReadOnly(true); ++ ui->btnAuth->setDisabled(true); + isLockingFlg = true; +- return ; +- } +- else if (failed_count == 0xFFFF)//账号被永久锁定 ++ setBiometricAuthDisabledStatus(isLockingFlg); ++ return; ++ } else if (failed_count == 0xFFFF) // 账号被永久锁定 + { + ui->lblMessage->setText(tr("Account locked permanently.")); + ui->lblMessage->setToolTip(tr("Account locked permanently.")); + ui->lePassword->setText(""); + ui->lePassword->setDisabled(true); ++ ui->lePassword->setReadOnly(false); ++ ui->btnAuth->setDisabled(true); + isLockingFlg = true; +- return ; +- } +- else +- { +- if(ui->lePassword){ ++ setBiometricAuthDisabledStatus(isLockingFlg); ++ return; ++ } else { ++ if (ui->lePassword) { + ui->lePassword->setDisabled(false); ++ ui->lePassword->setReadOnly(false); + ui->lePassword->setFocus(); + } ++ if (ui->btnAuth) { ++ ui->btnAuth->setDisabled(false); ++ } + +- if (isLockingFlg) +- { +- //setMessage(tr("Authentication failed, please try again."),ERROR); ++ if (isLockingFlg) { ++ // setMessage(tr("Authentication failed, please try again."),ERROR); + setMessage(""); + isLockingFlg = false; ++ setBiometricAuthDisabledStatus(isLockingFlg); + } +- ++ + m_timer->stop(); + } +- return ; ++ return; ++} ++ ++void MainWindow::setBiometricAuthDisabledStatus(bool locked) ++{ ++ if (locked) { ++ if (m_loginOptsWidget) { ++ m_loginOptsWidget->stopAuth(); ++ m_loginOptsWidget->setAllDeviceDisable(true); ++ if (m_bioTimer && m_bioTimer->isActive()) ++ m_bioTimer->stop(); ++ } ++ if (m_deviceInfo && m_deviceInfo->biotype == BIOTYPE_FACE) { ++ QImage imgFailed; ++ m_loginOptsWidget->setFaceImg(imgFailed, 1); ++ } else if (m_deviceInfo && m_deviceInfo->biotype == REMOTE_QRCODE_TYPE) { ++ QImage nullImage; ++ m_loginOptsWidget->setQRCode(nullImage); ++ } ++ } else { ++ if (m_deviceInfo && m_loginOptsWidget) { ++ m_loginOptsWidget->startAuth(m_deviceInfo, getUid(userName)); ++ m_loginOptsWidget->setAllDeviceDisable(false); ++ } ++ } + } + + void MainWindow::onRespondUkey(const QString &text) + { +- if (m_loginOptsWidget){ +- m_loginOptsWidget->SetExtraInfo(text,"pincode"); +- } ++ if (m_loginOptsWidget) { ++ m_loginOptsWidget->SetExtraInfo(text, "pincode"); ++ } + } + + void MainWindow::switchLoginOptType(unsigned uLoginOptType) + { +- switch(uLoginOptType) { +- case LOGINOPT_TYPE_PASSWORD: +- { +- //m_loginOptsWidget->hide(); +- ui->lePassword->show(); +- ui->cmbUsers->show(); +- ui->widgetPasswdAuth->show(); +- ui->widgetUkeyAuth->hide(); +- ui->ukeyPassword->clearFocus(); +- ui->loadingUkeyWidget->hide(); +- setFocusProxy(ui->lePassword); +- ui->cmbUsers->show(); +- } +- break; +- case LOGINOPT_TYPE_FACE: +- case LOGINOPT_TYPE_FINGERPRINT: +- case LOGINOPT_TYPE_IRIS: +- case LOGINOPT_TYPE_VOICEPRINT: +- case LOGINOPT_TYPE_FINGERVEIN: +- case LOGINOPT_TYPE_QRCODE: +- { +- //m_loginOptsWidget->show(); +- // 延迟检查错误状态 +- m_isNetworkErr = false; +- QTimer::singleShot(500, this, [&,this](){ +- if (!this->m_isNetworkErr) { +- m_loginOptsWidget->setQRCodeMsg(""); ++ switch (uLoginOptType) { ++ case LOGINOPT_TYPE_PASSWORD: { ++ // m_loginOptsWidget->hide(); ++ ui->lePassword->show(); ++ ui->cmbUsers->show(); ++ ui->widgetPasswdAuth->show(); ++ ui->widgetUkeyAuth->hide(); ++ ui->ukeyPassword->clearFocus(); ++ ui->loadingUkeyWidget->hide(); ++ setFocusProxy(ui->lePassword); ++ ui->cmbUsers->show(); ++ m_loginOptsWidget->stopBioWaiting(); ++ } break; ++ case LOGINOPT_TYPE_FACE: ++ case LOGINOPT_TYPE_FINGERPRINT: ++ case LOGINOPT_TYPE_IRIS: ++ case LOGINOPT_TYPE_VOICEPRINT: ++ case LOGINOPT_TYPE_FINGERVEIN: ++ case LOGINOPT_TYPE_QRCODE: { ++ switch (uLoginOptType) { ++ case LOGINOPT_TYPE_FINGERPRINT: ++ case LOGINOPT_TYPE_IRIS: ++ case LOGINOPT_TYPE_VOICEPRINT: ++ case LOGINOPT_TYPE_FINGERVEIN: { ++ m_loginOptsWidget->startBioWaiting(uLoginOptType); ++ } break; ++ default: ++ m_loginOptsWidget->stopBioWaiting(); ++ break; + } +- }); +- +- //m_loginOptsWidget->hide(); +- ui->lePassword->show(); +- ui->widgetUkeyAuth->hide(); +- ui->loadingUkeyWidget->hide(); +- ui->ukeyPassword->clearFocus(); +- setFocusProxy(ui->lePassword); +- ui->cmbUsers->show(); +- ui->widgetPasswdAuth->show(); +- } +- break; +- case LOGINOPT_TYPE_GENERAL_UKEY: +- { +- ui->lePassword->hide(); +- ui->cmbUsers->hide(); +- if(m_deviceInfo){ +- stopLoadingUkey(); +- ui->widgetUkeyAuth->show(); +- }else{ +- startLoadingUkey(); +- } +- setFocusProxy(ui->ukeyPassword); +- ui->ukeyPassword->setFocusPolicy(Qt::StrongFocus); +- ui->ukeyPassword->setFocus(); +- ui->widgetPasswdAuth->hide(); +- } +- break; +- default: +- return; ++ ++ // 延迟检查错误状态 ++ m_isNetworkErr = false; ++ QTimer::singleShot(500, this, [&, this]() { ++ if (!this->m_isNetworkErr) { ++ m_loginOptsWidget->setQRCodeMsg(""); ++ } ++ }); ++ ++ ui->lePassword->show(); ++ ui->widgetUkeyAuth->hide(); ++ ui->loadingUkeyWidget->hide(); ++ ui->ukeyPassword->clearFocus(); ++ setFocusProxy(ui->lePassword); ++ ui->cmbUsers->show(); ++ ui->widgetPasswdAuth->hide(); ++ } break; ++ case LOGINOPT_TYPE_GENERAL_UKEY: { ++ ui->lePassword->hide(); ++ ui->cmbUsers->hide(); ++ if (m_deviceInfo) { ++ stopLoadingUkey(); ++ ui->widgetUkeyAuth->show(); ++ } else { ++ startLoadingUkey(); ++ } ++ setFocusProxy(ui->ukeyPassword); ++ ui->ukeyPassword->setFocusPolicy(Qt::StrongFocus); ++ ui->ukeyPassword->setFocus(); ++ ui->widgetPasswdAuth->hide(); ++ m_loginOptsWidget->stopBioWaiting(); ++ } break; ++ default: ++ return; + } +- qDebug()<<"CurOptType:"<<uLoginOptType; +- if(m_deviceInfo && m_failMap.contains(getUid(userName)) ++ qDebug() << "CurOptType:" << uLoginOptType; ++ if (m_deviceInfo && m_failMap.contains(getUid(userName)) + && m_failMap[getUid(userName)].contains(m_deviceInfo->device_id) +- && m_failMap[getUid(userName)][m_deviceInfo->device_id] >= maxFailedTimes){ ++ && m_failMap[getUid(userName)][m_deviceInfo->device_id] >= maxFailedTimes) { + if (m_deviceInfo->biotype == BIOTYPE_FACE) { + QImage imgFailed; + m_loginOptsWidget->setFaceImg(imgFailed, 1); + } + no_changes = true; + if (m_deviceInfo->biotype == REMOTE_QRCODE_TYPE) { +- setLoginTypeTip(tr("Failed to verify %1, please enter password to unlock").arg(BioDevices::bioTypeToString_tr(m_deviceInfo->biotype))); +- }else if(m_deviceInfo->biotype == LOGINOPT_TYPE_GENERAL_UKEY){ +- setUkeyTypeTip(tr("Failed to verify %1, please enter password to unlock").arg(BioDevices::bioTypeToString_tr(m_deviceInfo->biotype))); +- }else { +- setLoginTypeTip(tr("Unable to verify %1, please enter password to unlock").arg(BioDevices::bioTypeToString_tr(m_deviceInfo->biotype))); ++ setLoginTypeTip(tr("Failed to verify %1, please enter password to unlock") ++ .arg(BioDevices::bioTypeToString_tr(m_deviceInfo->biotype))); ++ } else if (m_deviceInfo->biotype == LOGINOPT_TYPE_GENERAL_UKEY) { ++ setUkeyTypeTip(tr("Failed to verify %1, please enter password to unlock") ++ .arg(BioDevices::bioTypeToString_tr(m_deviceInfo->biotype))); ++ } else { ++ setLoginTypeTip(tr("Unable to verify %1, please enter password to unlock") ++ .arg(BioDevices::bioTypeToString_tr(m_deviceInfo->biotype))); + } + m_loginOptsWidget->setDeviceDisable(m_deviceInfo->device_id, true); + } else { + no_changes = false; + if (uLoginOptType != m_uCurLoginOptType || (m_deviceInfo && m_deviceInfo->device_id != m_nLastDeviceId)) { +- switch(uLoginOptType) { +- case LOGINOPT_TYPE_PASSWORD: +- { +- setLoginTypeTip(""); +- //setMessage("",TRUE); +- } +- break; +- case LOGINOPT_TYPE_FACE: +- { +- setLoginTypeTip(tr("Verify face recognition or enter password to unlock")); +- } +- break; +- case LOGINOPT_TYPE_FINGERPRINT: +- { +- setLoginTypeTip(tr("Press fingerprint or enter password to unlock")); +- } +- break; +- case LOGINOPT_TYPE_VOICEPRINT: +- { +- setLoginTypeTip(tr("Verify voiceprint or enter password to unlock")); +- } +- break; +- case LOGINOPT_TYPE_FINGERVEIN: +- { +- setLoginTypeTip(tr("Verify finger vein or enter password to unlock")); +- } +- break; +- case LOGINOPT_TYPE_IRIS: +- { +- setLoginTypeTip(tr("Verify iris or enter password to unlock")); +- } +- break; +- case LOGINOPT_TYPE_QRCODE: +- { +- setLoginTypeTip(tr("Use the bound wechat scanning code or enter the password to unlock")); +- } +- break; +- case LOGINOPT_TYPE_GENERAL_UKEY: +- { +- setLoginTypeTip(""); +- } +- break; +- default: +- return; ++ switch (uLoginOptType) { ++ case LOGINOPT_TYPE_PASSWORD: { ++ setLoginTypeTip(tr("Input your password to authentication")); ++ } break; ++ case LOGINOPT_TYPE_FACE: { ++ setLoginTypeTip(tr("Facial recognition to authorization")); ++ } break; ++ case LOGINOPT_TYPE_FINGERPRINT: { ++ setLoginTypeTip(tr("Fingerprint recognition to authorization")); ++ } break; ++ case LOGINOPT_TYPE_VOICEPRINT: { ++ setLoginTypeTip(tr("Voiceprint recognition to authorization")); ++ } break; ++ case LOGINOPT_TYPE_FINGERVEIN: { ++ setLoginTypeTip(tr("Finger veins recognition to authorization")); ++ } break; ++ case LOGINOPT_TYPE_IRIS: { ++ setLoginTypeTip(tr("Iris recognition to authorization")); ++ } break; ++ case LOGINOPT_TYPE_QRCODE: { ++ setLoginTypeTip(tr("Use the bound wechat scanning code to authorization")); ++ } break; ++ case LOGINOPT_TYPE_GENERAL_UKEY: { ++ setLoginTypeTip(""); ++ } break; ++ default: ++ return; + } + } + } +@@ -1475,6 +1289,7 @@ void MainWindow::switchLoginOptType(unsigned uLoginOptType) + m_nLastDeviceId = -1; + } + m_uCurLoginOptType = uLoginOptType; ++ m_loginOptsWidget->updateUIStatus(true, m_uCurLoginOptType); + } + + void MainWindow::setLoginTypeTip(QString strLoginTypeTip) +@@ -1484,13 +1299,13 @@ void MainWindow::setLoginTypeTip(QString strLoginTypeTip) + m_labelTip->hide(); + } else { + QPalette pe; +- if(no_changes) { +- pe.setColor(QPalette::WindowText,Qt::red); ++ if (no_changes) { ++ pe.setColor(QPalette::WindowText, Qt::red); + m_labelTip->setPalette(pe); + } else { + QColor color = palette().color(QPalette::WindowText); + QPalette pal(this->palette()); +- pal.setColor(QPalette::WindowText,QColor(color)); ++ pal.setColor(QPalette::WindowText, QColor(color)); + m_labelTip->setPalette(pal); + } + m_labelTip->setText(m_strLoginTypeTip); +@@ -1501,9 +1316,9 @@ void MainWindow::setLoginTypeTip(QString strLoginTypeTip) + void MainWindow::startBioAuthDelay() + { + if (m_deviceInfo) { +- if(m_deviceInfo->biotype == LOGINOPT_TYPE_GENERAL_UKEY){ ++ if (m_deviceInfo->biotype == LOGINOPT_TYPE_GENERAL_UKEY) { + +- }else{ ++ } else { + m_loginOptsWidget->startAuth(m_deviceInfo, getUid(userName)); + } + switchLoginOptType(m_loginOptsWidget->convertDeviceType(m_deviceInfo->biotype)); +@@ -1517,11 +1332,11 @@ void MainWindow::startBioAuth(unsigned uTimeout) + { + m_loginOptsWidget->stopAuth(); + +- if(m_deviceInfo && m_deviceInfo->biotype == LOGINOPT_TYPE_GENERAL_UKEY){ ++ if (m_deviceInfo && m_deviceInfo->biotype == LOGINOPT_TYPE_GENERAL_UKEY) { + switchLoginOptType(m_loginOptsWidget->convertDeviceType(m_deviceInfo->biotype)); + } + +- if(!m_bioTimer){ ++ if (!m_bioTimer) { + m_bioTimer = new QTimer(this); + connect(m_bioTimer, SIGNAL(timeout()), this, SLOT(startBioAuthDelay())); + } +@@ -1538,8 +1353,10 @@ void MainWindow::onUpdateBioAuthMsg(QString strMsg) + void MainWindow::updatePixmap() + { + ui->btnAuth->hide(); ++ ui->btnAuth->setDisabled(true); + ui->btnLoading->show(); + ui->lePassword->setDisabled(true); ++ ui->lePassword->setReadOnly(true); + QMatrix matrix; + matrix.rotate(90.0); + m_waitingPixmap = m_waitingPixmap.transformed(matrix, Qt::FastTransformation); +@@ -1549,64 +1366,49 @@ void MainWindow::updatePixmap() + void MainWindow::onUpdateWndSize(unsigned uLoginOptType, unsigned uLoginOptSize) + { + ui->lblContent->hide(); +- if (!m_loginOptsWidget->isHidden()) { +- m_loginOptsWidget->adjustSize(); +- } +- unsigned uOptsWidgetHeight = m_loginOptsWidget->height(); +- if (m_loginOptsWidget->isHidden() || +- (uLoginOptSize == 1 && uLoginOptType != LOGINOPT_TYPE_QRCODE && uLoginOptType != LOGINOPT_TYPE_FACE)) { +- uOptsWidgetHeight = 0; +- } + ui->lblHeader->adjustSize(); +- if(uLoginOptType == LOGINOPT_TYPE_QRCODE && uLoginOptType == LOGINOPT_TYPE_FACE){ +- uOptsWidgetHeight = m_loginOptsWidget->height() + 20; +- } +- else if(uLoginOptType == LOGINOPT_TYPE_FINGERPRINT){ +- uOptsWidgetHeight = m_loginOptsWidget->height() + 10 ; +- } +-// ui->lblContent->adjustSize(); +-// ui->lblHeader->adjustSize(); +- int height; +- if(fontSize = 10){ +- height = 130 + ui->lblHeader->height() /*+ ui->lblContent->height()*/ +- + ui->cmbUsers->height() + ui->lePassword->height() + ui->lblMessage->height() +- + ui->btnAuth->height(); +- } else if(fontSize = 11 ){ +- height = 150 + ui->lblHeader->height() /*+ ui->lblContent->height()*/ +- + ui->cmbUsers->height() + ui->lePassword->height() + ui->lblMessage->height() +- + ui->btnAuth->height(); +- } else if (fontSize = 12){ +- height = 160 + ui->lblHeader->height() /*+ ui->lblContent->height()*/ +- + ui->cmbUsers->height() + ui->lePassword->height() + ui->lblMessage->height() +- + ui->btnAuth->height(); +- } else if (fontSize = 13){ +- height = 170 + ui->lblHeader->height() /*+ ui->lblContent->height()*/ +- + ui->cmbUsers->height() + ui->lePassword->height() + ui->lblMessage->height() +- + ui->btnAuth->height(); +- } else if (fontSize = 14){ +- height = 190 + ui->lblHeader->height() /*+ ui->lblContent->height()*/ +- + ui->cmbUsers->height() + ui->lePassword->height() + ui->lblMessage->height() +- + ui->btnAuth->height(); +- } else if (fontSize = 15){ +- height = 230 + ui->lblHeader->height() /*+ ui->lblContent->height()*/ +- + ui->cmbUsers->height() + ui->lePassword->height() + ui->lblMessage->height() +- + ui->btnAuth->height(); +- } +- if (m_loginOptsWidget->isHidden()) { +- height = height + m_labelTip->height() - 10; +- } + +- if(uLoginOptType == LOGINOPT_TYPE_GENERAL_UKEY){ +- setLoginTypeTip(""); +- setFixedSize(width(), height + uOptsWidgetHeight + 10); +- }else{ +- setFixedSize(width(), height + uOptsWidgetHeight); ++ // 标题+间隔+内容头+间隔+类型提示+间隔+用户列表+间隔+ ++ // (密码输入框+间隔+验证提示+间隔+授权按钮+边距)/ --仅密码方式 ++ // (密码输入框+间隔+验证提示+间隔+登录选项+间隔+授权按钮+边距)/ --密码+生物识别 选择密码 ++ // (登录选项+间隔+授权按钮+边距)/ --密码+生物识别 选择生物识别 ++ // (ukey加载页+间隔+登录选项+间隔+授权按钮+边距)/(ukey认证页+间隔+登录选项+间隔+授权按钮+边距) ++ // --选择Ukey ++ int height = 40 + 8 + ui->lblHeader->height() + 8 + m_labelTip->height() + 8; ++ switch (m_uCurLoginOptType) { ++ case LOGINOPT_TYPE_PASSWORD: { ++ height += ui->cmbUsers->height() + 8 + ui->lePassword->height() + 8 + ui->lblMessage->height() + 8; ++ } break; ++ case LOGINOPT_TYPE_FACE: ++ case LOGINOPT_TYPE_FINGERPRINT: ++ case LOGINOPT_TYPE_FINGERVEIN: ++ case LOGINOPT_TYPE_IRIS: ++ case LOGINOPT_TYPE_VOICEPRINT: ++ case LOGINOPT_TYPE_QRCODE: { ++ height += ui->cmbUsers->height() + 8; ++ } break; ++ case LOGINOPT_TYPE_GENERAL_UKEY: ++ case LOGINOPT_TYPE_ADVANCED_UKEY: { ++ if (!ui->widgetUkeyAuth->isHidden()) { ++ height += ui->widgetUkeyAuth->height() + 8; ++ } else if (!ui->loadingUkeyWidget->isHidden()) { ++ height += ui->loadingUkeyWidget->height() + 8; ++ } ++ } break; ++ default: ++ break; ++ } ++ if (!m_loginOptsWidget->isHidden()) { ++ height += m_loginOptsWidget->height() + 8; + } ++ height += ui->btnAuth->height() + 24; ++ setFixedSize(width(), height); ++ qInfo() << "MainWindow geometry update:" << geometry() << height; + } + + void MainWindow::setEditInputMethod(bool bEnable) + { +- qDebug()<<"setEditInputMethod:"<<bEnable; ++ qDebug() << "setEditInputMethod:" << bEnable; + if (bEnable) { + ui->lePassword->setAttribute(Qt::WA_InputMethodEnabled, true); + } else { +@@ -1619,4 +1421,174 @@ void MainWindow::setCurProject(bool isMavis) + is_Mavis = isMavis; + } + ++void MainWindow::onOptionSelected(unsigned uCurLoginOptType, const DeviceInfoPtr &deviceInfo) ++{ ++ isLoadingUkey = false; ++ ++ if (uCurLoginOptType == LOGINOPT_TYPE_GENERAL_UKEY) { ++ stopLoadingUkey(); ++ } ++ ++ if (uCurLoginOptType == LOGINOPT_TYPE_PASSWORD) { ++ switchLoginOptType(uCurLoginOptType); ++ if (m_loginOptsWidget) { ++ m_loginOptsWidget->stopAuth(); ++ } ++ m_deviceInfo = nullptr; ++ authMode = PASSWORD; ++ emit restartAuth(); ++ return; ++ } ++ ++ if (uCurLoginOptType != LOGINOPT_TYPE_GENERAL_UKEY && !deviceInfo) ++ return; ++ ++ if (deviceInfo) ++ qDebug() << "device changed: " << deviceInfo->biotype; ++ ++ if (deviceInfo && m_failMap[getUid(userName)][deviceInfo->device_id] >= maxFailedTimes) { ++ qDebug() << "Failed MAX!!"; ++ return; ++ } ++ ++ if (uCurLoginOptType == LOGINOPT_TYPE_GENERAL_UKEY && !deviceInfo) { ++ isLoadingUkey = true; ++ startLoadingUkey(); ++ m_loginOptsWidget->updateUkeyUIStatus(LOGINOPT_TYPE_GENERAL_UKEY); ++ } else if (uCurLoginOptType == LOGINOPT_TYPE_GENERAL_UKEY && deviceInfo) { ++ stopLoadingUkey(); ++ m_loginOptsWidget->updateUkeyUIStatus(LOGINOPT_TYPE_GENERAL_UKEY); ++ } ++ ++ if (deviceInfo == m_deviceInfo) { ++ return; ++ } ++ ++ if (uCurLoginOptType != LOGINOPT_TYPE_GENERAL_UKEY && deviceInfo == m_deviceInfo) { ++ return; ++ } ++ ++ if (m_bioTimer) ++ m_bioTimer->stop(); ++ ++ m_deviceInfo = deviceInfo; ++ switchLoginOptType(uCurLoginOptType); ++ if (!isbioSuccess && m_deviceInfo) { ++ startBioAuth(); ++ } ++} ++ ++void MainWindow::onNotifyOptionsChanged(unsigned uOptionsCount) ++{ ++ if (uOptionsCount > 0) { ++ m_loginOptsWidget->show(); ++ } else { ++ // m_loginOptsWidget->hide(); ++ } ++ ++ if (m_deviceInfo && m_deviceInfo->biotype == LOGINOPT_TYPE_GENERAL_UKEY) { ++ stopLoadingUkey(); ++ } ++ ++ if (!m_deviceInfo || !m_loginOptsWidget->findDeviceById(m_deviceInfo->device_id) ++ || m_loginOptsWidget->isDeviceDisable(m_deviceInfo->device_id)) { ++ m_loginOptsWidget->stopAuth(); ++ if (authMode != UNDEFINED) { ++ authMode = UNDEFINED; ++ emit switchToBiometric(); ++ } ++ } ++} ++ ++void MainWindow::onLoginOptionsAuthCompleted(uid_t uid, bool ret, int nStatus) ++{ ++ qDebug() << "biometric authentication complete: " << uid << ret << nStatus; ++ if (m_deviceInfo && m_deviceInfo->biotype == LOGINOPT_TYPE_GENERAL_UKEY && ui->widgetUkeyAuth->isVisible()) { ++ ui->ukeyPassword->setText(""); ++ } ++ ++ if (uid == getUid(userName) && ret) { ++ isbioSuccess = true; ++ emit switchToBiometric(); ++ authMode = UNDEFINED; ++ } else { ++ if (nStatus == 5 && m_deviceInfo) { ++ if (w_timer && w_timer->isActive()) ++ w_timer->stop(); ++ QImage imgFailed; ++ m_loginOptsWidget->setFaceImg(imgFailed, 2); ++ return; ++ } else if (nStatus >= 2 && nStatus != 5) ++ if (nStatus >= 2) { ++ if (m_deviceInfo) { ++ uid_t curUid = getUid(userName); ++ if (m_failMap.contains(curUid) && m_failMap[curUid].contains(m_deviceInfo->device_id)) { ++ m_failMap[curUid][m_deviceInfo->device_id] = m_failMap[curUid][m_deviceInfo->device_id] + 1; ++ } else { ++ m_failMap[curUid][m_deviceInfo->device_id] = 1; ++ } ++ qDebug() << "Failed count:" << m_failMap[curUid][m_deviceInfo->device_id] ++ << ",Max:" << maxFailedTimes; ++ if (m_deviceInfo->biotype == BIOTYPE_FACE) { ++ QImage imgFailed; ++ m_loginOptsWidget->setFaceImg(imgFailed, 1); ++ } ++ if (m_failMap[curUid][m_deviceInfo->device_id] >= maxFailedTimes) { ++ no_changes = true; ++ if (m_deviceInfo->biotype == REMOTE_QRCODE_TYPE) { ++ setLoginTypeTip(tr("Failed to verify %1, please enter password to unlock") ++ .arg(BioDevices::bioTypeToString_tr(m_deviceInfo->biotype))); ++ QImage nullImage; ++ m_loginOptsWidget->setQRCode(nullImage); ++ } else if (m_deviceInfo->biotype == LOGINOPT_TYPE_GENERAL_UKEY) { ++ ui->ukeyPassword->setReadOnly(true); ++ setUkeyTypeTip(tr("Unable to verify %1, please enter password to unlock") ++ .arg(BioDevices::bioTypeToString_tr(m_deviceInfo->biotype))); ++ } else { ++ setLoginTypeTip(tr("Unable to verify %1, please enter password to unlock") ++ .arg(BioDevices::bioTypeToString_tr(m_deviceInfo->biotype))); ++ } ++ ++ m_loginOptsWidget->setDeviceDisable(m_deviceInfo->device_id, true); ++ useDoubleAuth = false; ++ return; ++ } ++ no_changes = false; ++ if (m_deviceInfo->biotype == LOGINOPT_TYPE_GENERAL_UKEY) { ++ setUkeyTypeTip(tr("Failed to verify %1, you still have %2 verification opportunities") ++ .arg(BioDevices::bioTypeToString_tr(m_deviceInfo->biotype)) ++ .arg(maxFailedTimes - m_failMap[curUid][m_deviceInfo->device_id])); ++ } else { ++ setLoginTypeTip(tr("Failed to verify %1, you still have %2 verification opportunities") ++ .arg(BioDevices::bioTypeToString_tr(m_deviceInfo->biotype)) ++ .arg(maxFailedTimes - m_failMap[curUid][m_deviceInfo->device_id])); ++ } ++ } ++ } ++ if (!isbioSuccess) { ++ // dbus error ++ if (nStatus == -1) { ++ qDebug() << "Biometric dbus error:" << authMode; ++ } ++ if (m_uCurLoginOptType == LOGINOPT_TYPE_QRCODE && nStatus == 1) { ++ m_isNetworkErr = true; ++ m_loginOptsWidget->setQRCodeMsg(tr("Abnormal network")); ++ startBioAuth(10000); ++ } else if (m_uCurLoginOptType == LOGINOPT_TYPE_QRCODE && nStatus == -4) { ++ m_isNetworkErr = true; ++ m_loginOptsWidget->setQRCodeMsg(tr("Acquisition failure")); ++ startBioAuth(10000); ++ } else { ++ startBioAuth(); ++ } ++ if (nStatus >= 2 && m_deviceInfo) { ++ if (m_deviceInfo->biotype == BIOTYPE_FACE) { ++ QImage imgFailed; ++ m_loginOptsWidget->setFaceImg(imgFailed, 1); ++ } ++ } ++ } ++ } ++} ++ + /*** end of private member ***/ +diff --git a/polkit-agent/src/mainwindow.h b/polkit-agent/src/mainwindow.h +index 898f2d0..bf8e9ab 100644 +--- a/polkit-agent/src/mainwindow.h ++++ b/polkit-agent/src/mainwindow.h +@@ -31,11 +31,14 @@ + #include "loginoptionswidget.h" + #include "modeButton.h" + #include "kalabel.h" ++#include <kysdk/applications/kdialog.h> ++using namespace kdk; ++ + namespace Ui { + class MainWindow; + } + +-class MainWindow : public QWidget ++class MainWindow : public kdk::KDialog + { + Q_OBJECT + +@@ -45,17 +48,32 @@ public: + void closeEvent(QCloseEvent *event); + bool eventFilter(QObject *obj, QEvent *event); + void paintEvent(QPaintEvent *event); +- enum Mode{UNDEFINED, PASSWORD, BIOMETRIC, DEVICES}; +- enum situation{TRUE, ERROR}; ++ void keyPressEvent(QKeyEvent *event); //屏蔽esc按钮 ++ enum Mode ++ { ++ UNDEFINED, ++ PASSWORD, ++ BIOMETRIC, ++ DEVICES ++ }; ++ enum situation ++ { ++ TRUE, ++ ERROR ++ }; + void setIcon(const QString &iconName); + void setHeader(const QString &text); + void setUsers(const QStringList &usersList); +- void setDetails(const QString &subPid, const QString &callerPid, +- const QString &actionId, const QString &actionDesc, +- const QString vendorName, const QString vendorUrl); ++ void setDetails( ++ const QString &subPid, ++ const QString &callerPid, ++ const QString &actionId, ++ const QString &actionDesc, ++ const QString vendorName, ++ const QString vendorUrl); + void setPrompt(const QString &text, bool echo); +- void setMessage(const QString &text,situation situat = ERROR); +- void setAuthResult(bool result, const QString &text=""); ++ void setMessage(const QString &text, situation situat = ERROR); ++ void setAuthResult(bool result, const QString &text = ""); + void clearEdit(); + void switchAuthMode(Mode mode); + void setDoubleAuth(bool val); +@@ -69,15 +87,14 @@ public: + void stopLoadingUkey(); + void updateLoadingPixmap(); + +-private: ++private: + uid_t getUid(const QString &userName); + void setMovie(); + void setPixmap(); +- void startBioAuth(unsigned uTimeout = 1000); ++ void startBioAuth(unsigned uTimeout = 200); + void switchWidget(Mode mode); + int enable_biometric_authentication(); + +- + void root_unlock_countdown(); + void unlock_countdown(); + void editIcon(); +@@ -85,11 +102,35 @@ private: + void setMavisSheel(); + void updatePixmap(); + ++ void setBiometricAuthDisabledStatus(bool locked); ++ + public slots: + void onUpdateBioAuthMsg(QString strMsg); + void onUpdateWndSize(unsigned uLoginOptType, unsigned uLoginOptSize); ++ void onShowYesPrompt(); + + private slots: ++ /** ++ * @brief onOptionSelected ++ * @param uCurLoginOptType ++ * @param deviceInfo ++ */ ++ void onOptionSelected(unsigned uCurLoginOptType, const DeviceInfoPtr &deviceInfo); ++ ++ /** ++ * @brief onNotifyOptionsChanged ++ * @param uOptionsCount ++ */ ++ void onNotifyOptionsChanged(unsigned uOptionsCount); ++ ++ /** ++ * @brief onLoginOptionsAuthCompleted ++ * @param uid ++ * @param ret ++ * @param nStatus ++ */ ++ void onLoginOptionsAuthCompleted(uid_t uid, bool ret, int nStatus); ++ + void on_btnDetails_clicked(); + void on_lePassword_returnPressed(); + void on_ukeyPassword_returnPressed(); +@@ -112,10 +153,11 @@ signals: + void switchToBiometric(); + void userChanged(const QString &userName); + void restartAuth(); ++ void yesPrompted(); + + private: + Ui::MainWindow *ui; +- Users *users; ++ Users *users; + QString userName; + bool enableBioAuth; + bool receiveBioPAM; +@@ -124,25 +166,25 @@ private: + bool isFirst; + bool useDoubleAuth; + bool isbioSuccess; +- QMap<qint32,QMap<int,int>> m_failMap; +- int maxFailedTimes; ++ QMap<qint32, QMap<int, int>> m_failMap; ++ int maxFailedTimes; + bool isHiddenSwitchButton; + ModeButton *m_modeButton; + QIcon modeIcon; + bool pwdShow = false; + bool isHover = false; + +- //ukey优先级比密码低,该变量用于判断是否第一次认证,并选中密码 ++ // ukey优先级比密码低,该变量用于判断是否第一次认证,并选中密码 + bool isFirstAuth = true; + + QTimer *m_timer; +- //const DeviceInfo *device = NULL; +- bool isLockingFlg; //判断当前是否正在锁定倒计时 +- int m_nCurLockMin; //当前锁定的分钟数 ++ // const DeviceInfo *device = NULL; ++ bool isLockingFlg; //判断当前是否正在锁定倒计时 ++ int m_nCurLockMin; //当前锁定的分钟数 + // 登录选项 + KALabel *m_labelTip = nullptr; + LoginOptionsWidget *m_loginOptsWidget = nullptr; +- unsigned m_uCurLoginOptType = LOGINOPT_TYPE_PASSWORD; // 当前登录验证方式 ++ unsigned m_uCurLoginOptType = LOGINOPT_TYPE_PASSWORD; // 当前登录验证方式 + QString m_strLoginTypeTip = ""; + QTimer *m_bioTimer = nullptr; + DeviceInfoPtr m_deviceInfo = nullptr; +@@ -153,7 +195,7 @@ private: + QLabel *titleLabel; + QPushButton *closeBtn; + +- QGSettings *settings; ++ QGSettings *settings; + int fontSize; + + QString app_IconName; +@@ -165,9 +207,11 @@ private: + QTimer *w_timer; + QPixmap m_waitingPixmap; + +- QTimer *m_loadingTimer = nullptr; +- QPixmap m_loadingPixmap; +- bool isLoadingUkey = false; ++ QTimer *m_loadingTimer = nullptr; ++ QPixmap m_loadingPixmap; ++ bool isLoadingUkey = false; ++ ++ bool doNotNeedAuth = false; + }; + + #endif // MAINWINDOW_H +diff --git a/polkit-agent/src/mainwindow.ui b/polkit-agent/src/mainwindow.ui +index 01fc13b..7a29dab 100644 +--- a/polkit-agent/src/mainwindow.ui ++++ b/polkit-agent/src/mainwindow.ui +@@ -7,7 +7,7 @@ + <x>0</x> + <y>0</y> + <width>459</width> +- <height>646</height> ++ <height>716</height> + </rect> + </property> + <property name="sizePolicy"> +@@ -27,7 +27,7 @@ + </property> + <layout class="QVBoxLayout" name="verticalLayout_2"> + <property name="spacing"> +- <number>0</number> ++ <number>8</number> + </property> + <property name="sizeConstraint"> + <enum>QLayout::SetDefaultConstraint</enum> +@@ -36,7 +36,7 @@ + <number>0</number> + </property> + <property name="topMargin"> +- <number>6</number> ++ <number>8</number> + </property> + <property name="rightMargin"> + <number>0</number> +@@ -45,21 +45,15 @@ + <number>24</number> + </property> + <item> +- <layout class="QFormLayout" name="formLayout"> +- <property name="fieldGrowthPolicy"> +- <enum>QFormLayout::AllNonFixedFieldsGrow</enum> +- </property> +- <property name="rowWrapPolicy"> +- <enum>QFormLayout::WrapAllRows</enum> +- </property> +- <property name="horizontalSpacing"> +- <number>0</number> ++ <layout class="QVBoxLayout" name="verticalLayout_5"> ++ <property name="spacing"> ++ <number>8</number> + </property> + <property name="leftMargin"> + <number>24</number> + </property> + <property name="topMargin"> +- <number>15</number> ++ <number>0</number> + </property> + <property name="rightMargin"> + <number>24</number> +@@ -67,7 +61,7 @@ + <property name="bottomMargin"> + <number>0</number> + </property> +- <item row="0" column="1"> ++ <item> + <widget class="QLabel" name="lblHeader"> + <property name="minimumSize"> + <size> +@@ -98,7 +92,7 @@ + </property> + </widget> + </item> +- <item row="1" column="1"> ++ <item> + <widget class="QLabel" name="lblContent"> + <property name="styleSheet"> + <string notr="true"/> +@@ -111,24 +105,20 @@ + </property> + </widget> + </item> +- <item row="3" column="1"> +- <layout class="QFormLayout" name="bioAuthLayout"> +- <property name="bottomMargin"> +- <number>8</number> +- </property> +- </layout> +- </item> +- <item row="4" column="1"> ++ <item> + <layout class="QHBoxLayout" name="titleTipLayout"> ++ <property name="spacing"> ++ <number>0</number> ++ </property> + <property name="topMargin"> +- <number>8</number> ++ <number>0</number> + </property> + <property name="bottomMargin"> +- <number>8</number> ++ <number>0</number> + </property> + </layout> + </item> +- <item row="5" column="1"> ++ <item> + <widget class="QWidget" name="loadingUkeyWidget" native="true"> + <property name="minimumSize"> + <size> +@@ -140,6 +130,9 @@ + <string notr="true"/> + </property> + <layout class="QVBoxLayout" name="verticalLayout_4"> ++ <property name="spacing"> ++ <number>8</number> ++ </property> + <property name="leftMargin"> + <number>0</number> + </property> +@@ -149,6 +142,9 @@ + <property name="rightMargin"> + <number>0</number> + </property> ++ <property name="bottomMargin"> ++ <number>0</number> ++ </property> + <item> + <widget class="QPushButton" name="loadingUkeyBtn"> + <property name="text"> +@@ -169,7 +165,7 @@ + </layout> + </widget> + </item> +- <item row="6" column="1"> ++ <item> + <widget class="QComboBox" name="cmbUsers"> + <property name="enabled"> + <bool>true</bool> +@@ -179,14 +175,7 @@ + </property> + </widget> + </item> +- <item row="7" column="1"> +- <layout class="QFormLayout" name="bioDeviceLayout"> +- <property name="bottomMargin"> +- <number>8</number> +- </property> +- </layout> +- </item> +- <item row="8" column="1"> ++ <item> + <widget class="QWidget" name="widgetUkeyAuth" native="true"> + <property name="minimumSize"> + <size> +@@ -211,12 +200,9 @@ + <number>9</number> + </property> + <item> +- <layout class="QFormLayout" name="formLayout_3"> +- <property name="horizontalSpacing"> +- <number>0</number> +- </property> +- <property name="verticalSpacing"> +- <number>6</number> ++ <layout class="QVBoxLayout" name="verticalLayout_7"> ++ <property name="spacing"> ++ <number>8</number> + </property> + <property name="topMargin"> + <number>0</number> +@@ -227,7 +213,17 @@ + <property name="bottomMargin"> + <number>0</number> + </property> +- <item row="1" column="0" colspan="2"> ++ <item> ++ <widget class="QLabel" name="ukeyTipLbl"> ++ <property name="text"> ++ <string/> ++ </property> ++ <property name="alignment"> ++ <set>Qt::AlignCenter</set> ++ </property> ++ </widget> ++ </item> ++ <item> + <widget class="QLineEdit" name="ukeyPassword"> + <property name="contextMenuPolicy"> + <enum>Qt::NoContextMenu</enum> +@@ -237,7 +233,7 @@ + </property> + </widget> + </item> +- <item row="3" column="0" colspan="2"> ++ <item> + <widget class="KALabel" name="ukeyMessage"> + <property name="minimumSize"> + <size> +@@ -262,22 +258,12 @@ + </property> + </widget> + </item> +- <item row="0" column="0" colspan="2"> +- <widget class="QLabel" name="ukeyTipLbl"> +- <property name="text"> +- <string/> +- </property> +- <property name="alignment"> +- <set>Qt::AlignCenter</set> +- </property> +- </widget> +- </item> + </layout> + </item> + </layout> + </widget> + </item> +- <item row="9" column="1"> ++ <item> + <widget class="QWidget" name="widgetPasswdAuth" native="true"> + <property name="minimumSize"> + <size> +@@ -299,17 +285,14 @@ + <number>0</number> + </property> + <item> +- <layout class="QFormLayout" name="formLayout_2"> +- <property name="horizontalSpacing"> +- <number>0</number> +- </property> +- <property name="verticalSpacing"> +- <number>6</number> ++ <layout class="QVBoxLayout" name="verticalLayout_6"> ++ <property name="spacing"> ++ <number>8</number> + </property> + <property name="topMargin"> + <number>0</number> + </property> +- <item row="0" column="0" colspan="2"> ++ <item> + <widget class="QLineEdit" name="lePassword"> + <property name="contextMenuPolicy"> + <enum>Qt::NoContextMenu</enum> +@@ -319,7 +302,7 @@ + </property> + </widget> + </item> +- <item row="2" column="0" colspan="2"> ++ <item> + <widget class="KALabel" name="lblMessage"> + <property name="minimumSize"> + <size> +@@ -351,23 +334,10 @@ + </item> + </layout> + </item> +- <item> +- <spacer name="verticalSpacer_2"> +- <property name="orientation"> +- <enum>Qt::Vertical</enum> +- </property> +- <property name="sizeHint" stdset="0"> +- <size> +- <width>20</width> +- <height>40</height> +- </size> +- </property> +- </spacer> +- </item> + <item> + <layout class="QVBoxLayout" name="loginOptionsLayout"> + <property name="spacing"> +- <number>8</number> ++ <number>0</number> + </property> + <property name="leftMargin"> + <number>24</number> +@@ -383,6 +353,19 @@ + </property> + </layout> + </item> ++ <item> ++ <spacer name="verticalSpacer"> ++ <property name="orientation"> ++ <enum>Qt::Vertical</enum> ++ </property> ++ <property name="sizeHint" stdset="0"> ++ <size> ++ <width>20</width> ++ <height>40</height> ++ </size> ++ </property> ++ </spacer> ++ </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_7"> + <property name="spacing"> +@@ -399,6 +382,12 @@ + </property> + <item> + <widget class="QPushButton" name="btnBioAuth"> ++ <property name="minimumSize"> ++ <size> ++ <width>0</width> ++ <height>36</height> ++ </size> ++ </property> + <property name="cursor"> + <cursorShape>ArrowCursor</cursorShape> + </property> +@@ -431,6 +420,12 @@ + <verstretch>0</verstretch> + </sizepolicy> + </property> ++ <property name="minimumSize"> ++ <size> ++ <width>0</width> ++ <height>36</height> ++ </size> ++ </property> + <property name="cursor"> + <cursorShape>ArrowCursor</cursorShape> + </property> +@@ -450,6 +445,12 @@ + <verstretch>0</verstretch> + </sizepolicy> + </property> ++ <property name="minimumSize"> ++ <size> ++ <width>0</width> ++ <height>36</height> ++ </size> ++ </property> + <property name="cursor"> + <cursorShape>ArrowCursor</cursorShape> + </property> +@@ -463,6 +464,12 @@ + </item> + <item> + <widget class="QPushButton" name="btnLoading"> ++ <property name="minimumSize"> ++ <size> ++ <width>0</width> ++ <height>36</height> ++ </size> ++ </property> + <property name="text"> + <string/> + </property> +@@ -473,6 +480,12 @@ + </item> + <item> + <widget class="QPushButton" name="returnButton"> ++ <property name="minimumSize"> ++ <size> ++ <width>0</width> ++ <height>36</height> ++ </size> ++ </property> + <property name="styleSheet"> + <string notr="true"/> + </property> +diff --git a/polkit-agent/src/modeButton.h b/polkit-agent/src/modeButton.h +index 51ab67f..63bc0fd 100644 +--- a/polkit-agent/src/modeButton.h ++++ b/polkit-agent/src/modeButton.h +@@ -37,7 +37,7 @@ public: + bool isShowPwd(); + + protected: +- bool eventFilter(QObject *obj, QEvent *event) override; //事件过滤 ++ bool eventFilter(QObject *obj, QEvent *event) override; //事件过滤 + private: + void initStyleTheme(); + +diff --git a/polkit-agent/src/pam-tally.c b/polkit-agent/src/pam-tally.c +index da2651b..180c7d2 100644 +--- a/polkit-agent/src/pam-tally.c ++++ b/polkit-agent/src/pam-tally.c +@@ -111,7 +111,7 @@ int get_is_open_other_authentication() + int get_pam_tally(int *deny, int *unlock_time , int *root_unlock_time) + { + char buf[128]; +- FILE *auth_file; ++ FILE *auth_file = NULL; + + if( (auth_file = fopen("/etc/pam.d/common-auth", "r")) == NULL) + return -1; +@@ -138,8 +138,12 @@ int get_pam_tally(int *deny, int *unlock_time , int *root_unlock_time) + } + ptr = strtok(NULL, " \t"); + } ++ fclose(auth_file); ++ auth_file = NULL; + return 1; + } ++ fclose(auth_file); ++ auth_file = NULL; + return 0; + } + +@@ -389,15 +393,15 @@ void get_tally(uid_t uid, int *tfile, struct tallylog *tally) + + int pam_tally_unlock_time_left(int uid, int *fail_cnt,int *left_time, int *deny, int *fail_time, int *unlock_time1) + { +- pam_tally *tally_ptr; ++ pam_tally *tally_ptr; + +- if((tally_ptr = pam_tally_memory()) == NULL) +- return 0; ++ if((tally_ptr = pam_tally_memory()) == NULL) ++ return 0; + +- int unlock_time = tally_ptr->unlock_time; ++ int unlock_time = tally_ptr->unlock_time; + *deny = tally_ptr->deny; + if(unlock_time == 0) +- return 0; ++ return 0; + + int tfile = -1; + struct tallylog tally; +diff --git a/polkit-agent/src/pam-tally.h b/polkit-agent/src/pam-tally.h +index 2585f56..5741e83 100644 +--- a/polkit-agent/src/pam-tally.h ++++ b/polkit-agent/src/pam-tally.h +@@ -21,30 +21,32 @@ + #include <time.h> + + #ifdef __cplusplus +-extern "C" { ++extern "C" ++{ + #endif + + #define SHM_TALLY "/shm_tally" +-struct _pam_tally { +- int deny; //失败次数上限 +- int unlock_time; //普通用户失败次数达到上限后,多少秒之后才能解锁 +- int root_unlock_time; //root用户失败次数达到上限后,多少秒之后才能解锁 +- int failed; //当前失败的次数 +- time_t lock_start_time; //失败次数达到上限后,开始计时 +-}; +-typedef struct _pam_tally pam_tally; ++ struct _pam_tally ++ { ++ int deny; //失败次数上限 ++ int unlock_time; //普通用户失败次数达到上限后,多少秒之后才能解锁 ++ int root_unlock_time; // root用户失败次数达到上限后,多少秒之后才能解锁 ++ int failed; //当前失败的次数 ++ time_t lock_start_time; //失败次数达到上限后,开始计时 ++ }; ++ typedef struct _pam_tally pam_tally; + +-int pam_tally_init(); +-int pam_tally_add_failed(); +-int pam_tally_clear_failed(); +-int pam_tally_falure_is_out(); +-int pam_tally_deny(); +-int pam_tally_failed_count(); +-int pam_tally_unlock_time(); +-int pam_tally_is_enbled(); +-int pam_tally_is_canUnlock(); +-int pam_tally_unlock_time_left(int uid, int *fail_cnt, int *left_time, int *deny, int *fail_time, int *unlock_time); +-int pam_tally_root_unlock_time_left(int *fail_cnt, int *left_time, int *deny, int *fail_time, int *unlock_time1); ++ int pam_tally_init(); ++ int pam_tally_add_failed(); ++ int pam_tally_clear_failed(); ++ int pam_tally_falure_is_out(); ++ int pam_tally_deny(); ++ int pam_tally_failed_count(); ++ int pam_tally_unlock_time(); ++ int pam_tally_is_enbled(); ++ int pam_tally_is_canUnlock(); ++ int pam_tally_unlock_time_left(int uid, int *fail_cnt, int *left_time, int *deny, int *fail_time, int *unlock_time); ++ int pam_tally_root_unlock_time_left(int *fail_cnt, int *left_time, int *deny, int *fail_time, int *unlock_time1); + + #ifdef __cplusplus + } +diff --git a/polkit-agent/src/sessionmanager.cpp b/polkit-agent/src/sessionmanager.cpp +index 61d4ace..d9ee886 100644 +--- a/polkit-agent/src/sessionmanager.cpp ++++ b/polkit-agent/src/sessionmanager.cpp +@@ -27,40 +27,35 @@ + #define SM_DBUS_INTERFACE "org.gnome.SessionManager" + #define SM_DBUS_CLIENT_INTERFACE "org.gnome.SessionManager.ClientPrivate" + +- + SessionManager::SessionManager(QObject *parent) : QObject(parent) + { +- smInterface = new QDBusInterface(SM_DBUS_SERVICE, +- SM_DBUS_PATH, +- SM_DBUS_INTERFACE, +- QDBusConnection::sessionBus()); ++ smInterface = new QDBusInterface(SM_DBUS_SERVICE, SM_DBUS_PATH, SM_DBUS_INTERFACE, QDBusConnection::sessionBus()); + QString appId("polkit-ukui-authentication-agent-1.desktop"); + QString clientStartupId(qgetenv("DESKTOP_AUTOSTART_ID")); + +- QDBusReply<QDBusObjectPath> reply = smInterface->call("RegisterClient", +- appId, clientStartupId); ++ QDBusReply<QDBusObjectPath> reply = smInterface->call("RegisterClient", appId, clientStartupId); + +- if(!reply.isValid()) { ++ if (!reply.isValid()) { + qWarning() << "Register Client to gnome session failed"; + } + clientId = reply.value().path(); + + qDebug() << "Register Client to gnome session: " << reply.value().path(); + +- clientInterface = new QDBusInterface(SM_DBUS_SERVICE, +- clientId, +- SM_DBUS_CLIENT_INTERFACE, +- QDBusConnection::sessionBus()); ++ clientInterface ++ = new QDBusInterface(SM_DBUS_SERVICE, clientId, SM_DBUS_CLIENT_INTERFACE, QDBusConnection::sessionBus()); + qDebug() << clientInterface->isValid(); + + QDBusConnection conn = clientInterface->connection(); +- conn.connect(SM_DBUS_SERVICE, clientId, SM_DBUS_CLIENT_INTERFACE, +- "Stop", this, SLOT(onStop())); +- conn.connect(SM_DBUS_SERVICE, clientId, SM_DBUS_CLIENT_INTERFACE, +- "EndSession", this, SLOT(onEndSession(unsigned int))); +- conn.connect(SM_DBUS_SERVICE, clientId, SM_DBUS_CLIENT_INTERFACE, +- "QueryEndSession", this, SLOT(onQueryEndSession(unsigned int))); +- ++ conn.connect(SM_DBUS_SERVICE, clientId, SM_DBUS_CLIENT_INTERFACE, "Stop", this, SLOT(onStop())); ++ conn.connect( ++ SM_DBUS_SERVICE, clientId, SM_DBUS_CLIENT_INTERFACE, "EndSession", this, SLOT(onEndSession(unsigned int))); ++ conn.connect(SM_DBUS_SERVICE, ++ clientId, ++ SM_DBUS_CLIENT_INTERFACE, ++ "QueryEndSession", ++ this, ++ SLOT(onQueryEndSession(unsigned int))); + } + + void SessionManager::onStop() +@@ -82,6 +77,6 @@ void SessionManager::onQueryEndSession(unsigned int flag) + void SessionManager::endSessionResponse() + { + QDBusMessage msg = clientInterface->call("EndSessionResponse", true, ""); +- if(msg.type() == QDBusMessage::ErrorMessage) ++ if (msg.type() == QDBusMessage::ErrorMessage) + qDebug() << "Failed to call EndSessionResponse " << msg.errorMessage(); + } +diff --git a/polkit-agent/src/types.h b/polkit-agent/src/types.h +index ded7185..3881c37 100644 +--- a/polkit-agent/src/types.h ++++ b/polkit-agent/src/types.h +@@ -34,34 +34,34 @@ enum ScreenStatus + SCREEN_LOCK = 0x02 + }; + +-#define SM_DBUS_SERVICE "org.gnome.SessionManager" +-#define SM_DBUS_PATH "/org/gnome/SessionManager/Presence" +-#define SM_DBUS_INTERFACE "org.gnome.SessionManager.Presence" ++#define SM_DBUS_SERVICE "org.gnome.SessionManager" ++#define SM_DBUS_PATH "/org/gnome/SessionManager/Presence" ++#define SM_DBUS_INTERFACE "org.gnome.SessionManager.Presence" + +-#define DM_DBUS_SERVICE "org.freedesktop.DisplayManager" +-#define DM_DBUS_PATH "/org/freedesktop/DisplayManager" +-#define DM_DBUS_INTERFACE "org.freedesktop.DisplayManager" +-#define DM_SEAT_INTERFACE "org.freedesktop.DisplayManager.Seat" ++#define DM_DBUS_SERVICE "org.freedesktop.DisplayManager" ++#define DM_DBUS_PATH "/org/freedesktop/DisplayManager" ++#define DM_DBUS_INTERFACE "org.freedesktop.DisplayManager" ++#define DM_SEAT_INTERFACE "org.freedesktop.DisplayManager.Seat" + +-#define ACT_DBUS_SERVICE "org.freedesktop.Accounts" +-#define ACT_DBUS_PATH "/org/freedesktop/Accounts" +-#define ACT_DBUS_INTERFACE "org.freedesktop.Accounts" +-#define ACT_USER_INTERFACE "org.freedesktop.Accounts.User" ++#define ACT_DBUS_SERVICE "org.freedesktop.Accounts" ++#define ACT_DBUS_PATH "/org/freedesktop/Accounts" ++#define ACT_DBUS_INTERFACE "org.freedesktop.Accounts" ++#define ACT_USER_INTERFACE "org.freedesktop.Accounts.User" + + #define DBUS_PROP_INTERFACE "org.freedesktop.DBus.Properties" + +-#define SS_DBUS_SERVICE "org.ukui.ScreenSaver" +-#define SS_DBUS_PATH "/" +-#define SS_DBUS_INTERFACE "org.ukui.ScreenSaver" ++#define SS_DBUS_SERVICE "org.ukui.ScreenSaver" ++#define SS_DBUS_PATH "/" ++#define SS_DBUS_INTERFACE "org.ukui.ScreenSaver" + + #define BIO_ERROR -1 + #define BIO_FAILED 0 + #define BIO_SUCCESS 1 + #define BIO_IGNORE 2 + +-#define BIOMETRIC_PAM "BIOMETRIC_PAM" +-#define BIOMETRIC_IGNORE "BIOMETRIC_IGNORE" +-#define BIOMETRIC_SUCCESS "BIOMETRIC_SUCCESS" +-#define BIOMETRIC_FAILED "BIOMETRIC_FAILED" ++#define BIOMETRIC_PAM "BIOMETRIC_PAM" ++#define BIOMETRIC_IGNORE "BIOMETRIC_IGNORE" ++#define BIOMETRIC_SUCCESS "BIOMETRIC_SUCCESS" ++#define BIOMETRIC_FAILED "BIOMETRIC_FAILED" + + #endif // TYPES_H +diff --git a/polkit-agent/src/usdblockshortcut.cpp b/polkit-agent/src/usdblockshortcut.cpp +new file mode 100644 +index 0000000..2d0b57c +--- /dev/null ++++ b/polkit-agent/src/usdblockshortcut.cpp +@@ -0,0 +1,61 @@ ++/* ++ * Copyright (C) 2024 Tianjin KYLIN Information Technology Co., Ltd. ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 3, or (at your option) ++ * any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, see <http://www.gnu.org/licenses/>. ++ * ++ **/ ++#include "usdblockshortcut.h" ++#include <QDBusConnection> ++#include <QDBusError> ++#include <QDBusMetaType> ++#include <QDebug> ++ ++USDBlockShortCut::USDBlockShortCut(QObject *parent) : QObject(parent) ++{ ++ QString displayNum = QString(qgetenv("DISPLAY")).replace(":", "").replace(".", "_"); ++ m_strDbusPath = QString("%1%2").arg(QString("org.ukui.settingsDaemon.shortcut.ukui-polkit")).arg(displayNum); ++ m_isRegistService = QDBusConnection::sessionBus().registerService(m_strDbusPath); ++ if (!m_isRegistService) { ++ qInfo() << "registerService " << m_strDbusPath << " failed!!"; ++ } else { ++ m_isRegistObject = QDBusConnection::sessionBus().registerObject( ++ "/org/ukui/settingsDaemon/shortcut", ++ "org.ukui.settingsDaemon.shortcut", ++ this, ++ QDBusConnection::ExportAllSlots | QDBusConnection::ExportAllProperties); ++ if (!m_isRegistObject) { ++ qInfo() << "registerObject /org/ukui/settingsDaemon/shortcut failed!!"; ++ } ++ } ++} ++ ++USDBlockShortCut::~USDBlockShortCut() ++{ ++ if (m_isRegistObject) { ++ QDBusConnection::sessionBus().unregisterObject("/org/ukui/settingsDaemon/shortcut"); ++ m_isRegistObject = false; ++ } ++ if (m_isRegistService) { ++ QDBusConnection::sessionBus().unregisterService(m_strDbusPath); ++ m_isRegistService = false; ++ } ++} ++ ++QStringList USDBlockShortCut::blockShortcuts() ++{ ++ QStringList listShortCut = { ++ "WINDOWSWITCH_KEY", "WLCOM_SWITCH_WORKSPACE", "WLCOM_WINDOW_ACTION", "WLCOM_MAXIMIZED_VIEWS", "WLCOM_CTRL_VIEWS" ++ }; ++ return listShortCut; ++} +diff --git a/polkit-agent/src/usdblockshortcut.h b/polkit-agent/src/usdblockshortcut.h +new file mode 100644 +index 0000000..645cba9 +--- /dev/null ++++ b/polkit-agent/src/usdblockshortcut.h +@@ -0,0 +1,49 @@ ++/* ++ * Copyright (C) 2024 Tianjin KYLIN Information Technology Co., Ltd. ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 3, or (at your option) ++ * any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, see <http://www.gnu.org/licenses/>. ++ * ++ **/ ++#ifndef USDBLOCKSHORTCUT_H ++#define USDBLOCKSHORTCUT_H ++ ++#include <QObject> ++#include <QDBusAbstractAdaptor> ++#include <QDBusContext> ++#include <QStringList> ++ ++class USDBlockShortCut : public QObject, public QDBusContext ++{ ++ Q_OBJECT ++ Q_CLASSINFO("D-Bus Interface", "org.ukui.settingsDaemon.shortcut") ++ Q_PROPERTY(QStringList blockShortcuts READ blockShortcuts) ++ ++public: ++ USDBlockShortCut(QObject *parent = nullptr); ++ virtual ~USDBlockShortCut(); ++ ++public slots: ++ /** ++ * @brief blockShortcuts 禁用按键列表 ++ * @return 禁用按键字符串列表 ++ */ ++ QStringList blockShortcuts(); ++ ++private: ++ bool m_isRegistService = false; /**是否已注册服务*/ ++ bool m_isRegistObject = false; /**是否已注册对象*/ ++ QString m_strDbusPath; /**dbus服务路径*/ ++}; ++ ++#endif // USDBLOCKSHORTCUT_H +diff --git a/polkit-agent/src/users.cpp b/polkit-agent/src/users.cpp +index 64395c5..d9908f5 100644 +--- a/polkit-agent/src/users.cpp ++++ b/polkit-agent/src/users.cpp +@@ -29,8 +29,7 @@ + + QDebug operator<<(QDebug stream, const UserItem &user) + { +- stream << user.name << user.realName << user.uid +- << user.icon << user.path; ++ stream << user.name << user.realName << user.uid << user.icon << user.path; + return stream; + } + +@@ -47,26 +46,20 @@ QList<UserItem> Users::getUsers() + + UserItem Users::getUserByName(const QString &name) + { +- for(int i = 0 ; i < users.size() ; i++) { +- if(users.at(i).name == name) +- { ++ for (int i = 0; i < users.size(); i++) { ++ if (users.at(i).name == name) { + return users.at(i); + } + } + UserItem user; +- if(name == "root") +- { ++ if (name == "root") { + user.icon = "/root/.face"; +- if(!QFile(user.icon).exists()) +- { ++ if (!QFile(user.icon).exists()) { + user.icon = defaultIcon; + } +- } +- else +- { +- user.icon = qgetenv("HOME")+"/.face"; +- if(!QFile(user.icon).exists()) +- { ++ } else { ++ user.icon = qgetenv("HOME") + "/.face"; ++ if (!QFile(user.icon).exists()) { + user.icon = defaultIcon; + } + } +@@ -81,29 +74,23 @@ QString Users::getDefaultIcon() + return defaultIcon; + } + +- +-//https://stackoverflow.com/questions/20206376/ +-//how-do-i-extract-the-returned-data-from-qdbusmessage-in-a-qt-dbus-call ++// https://stackoverflow.com/questions/20206376/ ++// how-do-i-extract-the-returned-data-from-qdbusmessage-in-a-qt-dbus-call + void Users::loadUsers() + { + qDebug() << "loadUsers"; +- actService = new QDBusInterface(ACT_DBUS_SERVICE, +- ACT_DBUS_PATH, +- ACT_DBUS_INTERFACE, +- QDBusConnection::systemBus()); ++ actService = new QDBusInterface(ACT_DBUS_SERVICE, ACT_DBUS_PATH, ACT_DBUS_INTERFACE, QDBusConnection::systemBus()); + +- connect(actService, SIGNAL(UserAdded(const QDBusObjectPath&)), +- this, SLOT(onUserAdded(const QDBusObjectPath&))); +- connect(actService, SIGNAL(UserDeleted(const QDBusObjectPath&)), +- this, SLOT(onUserDeleted(const QDBusObjectPath&))); ++ connect(actService, SIGNAL(UserAdded(const QDBusObjectPath &)), this, SLOT(onUserAdded(const QDBusObjectPath &))); ++ connect( ++ actService, SIGNAL(UserDeleted(const QDBusObjectPath &)), this, SLOT(onUserDeleted(const QDBusObjectPath &))); + QDBusMessage ret = actService->call("ListCachedUsers"); +- QList<QVariant> outArgs = ret.arguments(); //(QVariant(QDBusArgument,)) +- QVariant first = outArgs.at(0); //QVariant(QDBusArgument,) ++ QList<QVariant> outArgs = ret.arguments(); //(QVariant(QDBusArgument,)) ++ QVariant first = outArgs.at(0); // QVariant(QDBusArgument,) + const QDBusArgument &dbusArgs = first.value<QDBusArgument>(); + QDBusObjectPath path; + dbusArgs.beginArray(); +- while (!dbusArgs.atEnd()) +- { ++ while (!dbusArgs.atEnd()) { + dbusArgs >> path; + getUser(path.path()); + } +@@ -112,10 +99,7 @@ void Users::loadUsers() + + UserItem Users::getUser(const QString &path) + { +- QDBusInterface iface(ACT_DBUS_SERVICE, +- path, +- DBUS_PROP_INTERFACE, +- QDBusConnection::systemBus()); ++ QDBusInterface iface(ACT_DBUS_SERVICE, path, DBUS_PROP_INTERFACE, QDBusConnection::systemBus()); + QDBusMessage ret = iface.call("GetAll", ACT_USER_INTERFACE); + QList<QVariant> outArgs = ret.arguments(); + QVariant first = outArgs.at(0); +@@ -123,57 +107,45 @@ UserItem Users::getUser(const QString &path) + UserItem user; + user.path = path; + dbusArgs.beginMap(); +- while(!dbusArgs.atEnd()) +- { ++ while (!dbusArgs.atEnd()) { + QString key; + QVariant value; + dbusArgs.beginMapEntry(); + dbusArgs >> key >> value; +- if(key == "UserName") +- { +- user.name = value.toString(); +- } +- else if(key == "RealName") +- { ++ if (key == "UserName") { ++ user.name = value.toString(); ++ } else if (key == "RealName") { + user.realName = value.toString(); +- } +- else if(key == "IconFile") +- { ++ } else if (key == "IconFile") { + user.icon = value.toString(); +- if(!QFile(user.icon).exists()) +- { ++ if (!QFile(user.icon).exists()) { + user.icon = defaultIcon; + } +- } +- else if(key == "Uid") +- { ++ } else if (key == "Uid") { + user.uid = value.toUInt(); + } + dbusArgs.endMapEntry(); + } + dbusArgs.endMap(); +- if(user.realName.isEmpty()) +- { ++ if (user.realName.isEmpty()) { + user.realName = user.name; + } + users.push_back(user); + return user; + } + +-void Users::onUserAdded(const QDBusObjectPath& path) ++void Users::onUserAdded(const QDBusObjectPath &path) + { + int index = findUserByPath(path.path()); +- if(index >=0 &&index<users.count()) +- { ++ if (index >= 0 && index < users.count()) { + UserItem user = getUser(path.path()); + Q_EMIT userAdded(user); + } + } +-void Users::onUserDeleted(const QDBusObjectPath& path) ++void Users::onUserDeleted(const QDBusObjectPath &path) + { + int index = findUserByPath(path.path()); +- if(index >= 0 && index<users.count()) +- { ++ if (index >= 0 && index < users.count()) { + UserItem user = users.at(index); + users.removeAt(index); + Q_EMIT userDeleted(user); +@@ -182,13 +154,9 @@ void Users::onUserDeleted(const QDBusObjectPath& path) + + int Users::findUserByPath(const QString &path) + { +- auto iter = std::find_if(users.begin(), users.end(), +- [&](const UserItem &user){ +- return user.path == path; +- }); ++ auto iter = std::find_if(users.begin(), users.end(), [&](const UserItem &user) { return user.path == path; }); + + int index = iter - users.begin(); + + return index; + } +- +diff --git a/polkit-agent/src/users.h b/polkit-agent/src/users.h +index 509cb3f..747bcc3 100644 +--- a/polkit-agent/src/users.h ++++ b/polkit-agent/src/users.h +@@ -20,14 +20,13 @@ + + #include <QObject> + +- + struct UserItem + { + QString name; + QString realName; + QString icon; + quint64 uid; +- QString path; //accounts service path ++ QString path; // accounts service path + friend QDebug operator<<(QDebug stream, const UserItem &user); + }; + +@@ -48,17 +47,17 @@ private: + int findUserByPath(const QString &path); + + private Q_SLOTS: +- void onUserAdded(const QDBusObjectPath& path); +- void onUserDeleted(const QDBusObjectPath& path); ++ void onUserAdded(const QDBusObjectPath &path); ++ void onUserDeleted(const QDBusObjectPath &path); + + Q_SIGNALS: + void userAdded(const UserItem &user); + void userDeleted(const UserItem &user); + + private: +- QDBusInterface *actService; +- QList<UserItem> users; +- QString defaultIcon; ++ QDBusInterface *actService; ++ QList<UserItem> users; ++ QString defaultIcon; + }; + + #endif // USERS_H diff -Nru ukui-biometric-auth-4.10.0.0/debian/patches/0002-update-changelog.patch ukui-biometric-auth-4.20.0.0/debian/patches/0002-update-changelog.patch --- ukui-biometric-auth-4.10.0.0/debian/patches/0002-update-changelog.patch 2024-04-23 10:31:46.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/debian/patches/0002-update-changelog.patch 2024-11-15 17:01:40.000000000 +0800 @@ -1,50 +1,59 @@ -From: yangmin <winner_yangmin@163.com> -Date: Fri, 17 Nov 2023 10:08:07 +0800 +From: yangmin100 <yangmin@kylinos.cn> +Date: Fri, 15 Nov 2024 17:03:14 +0800 Subject: update changelog --- - polkit-agent/CMakeLists.txt | 3 +-- - polkit-agent/src/mainwindow.cpp | 2 -- - 2 files changed, 1 insertion(+), 4 deletions(-) + polkit-agent/src/fullscreenbackground.cpp | 38 +++++++++++++++---------------- + 1 file changed, 19 insertions(+), 19 deletions(-) -diff --git a/polkit-agent/CMakeLists.txt b/polkit-agent/CMakeLists.txt -index c5065d1..fa7768e 100644 ---- a/polkit-agent/CMakeLists.txt -+++ b/polkit-agent/CMakeLists.txt -@@ -6,7 +6,6 @@ pkg_check_modules(KDKINFO REQUIRED kysdk-sysinfo) - - find_package(PolkitQt5-1 REQUIRED 0.103.0) - find_package(Qt5 COMPONENTS Core Widgets DBus X11Extras Xml Network Svg) --find_package(KF5WindowSystem) - set(CMAKE_AUTOMOC ON) - set(CMAKE_AUTOUIC ON) - set(CMAKE_AUTORCC ON) -@@ -60,7 +59,7 @@ set(polkit_SRCS - - add_executable(polkit-ukui-authentication-agent-1 ${polkit_SRCS}) - target_link_libraries(polkit-ukui-authentication-agent-1 -- Qt5::Core Qt5::Widgets Qt5::DBus ${EXTRA_LIBS} KF5::WindowSystem -+ Qt5::Core Qt5::Widgets Qt5::DBus ${EXTRA_LIBS} - ${POLKITQT-1_LIBRARIES} - BioAuthWidgets - -lrt -diff --git a/polkit-agent/src/mainwindow.cpp b/polkit-agent/src/mainwindow.cpp -index c72a01d..bbc327f 100644 ---- a/polkit-agent/src/mainwindow.cpp -+++ b/polkit-agent/src/mainwindow.cpp -@@ -30,7 +30,6 @@ - #include <QFontMetrics> - #include <QtMath> - #include <QAbstractItemView> --#include <KWindowSystem> - #include <fcntl.h> - #include <unistd.h> - #include <sys/types.h> -@@ -62,7 +61,6 @@ MainWindow::MainWindow(QWidget *parent) : - m_nCurLockMin(0), - isbioSuccess(false) +diff --git a/polkit-agent/src/fullscreenbackground.cpp b/polkit-agent/src/fullscreenbackground.cpp +index 9bbaa3d..40bb5b8 100644 +--- a/polkit-agent/src/fullscreenbackground.cpp ++++ b/polkit-agent/src/fullscreenbackground.cpp +@@ -338,27 +338,27 @@ void FullScreenBackground::moveToScreen(QScreen *screen) + void FullScreenBackground::moveToCursorScreen() { -- KWindowSystem::setState(this->winId(), NET::SkipTaskbar | NET::SkipPager); - ui->setupUi(this); - setWindowTitle(tr("Authentication")); - setWindowFlags(Qt::WindowCloseButtonHint | Qt::WindowStaysOnTopHint); + bool isFoundScreen = false; +- if (m_isWayland) { +- QString strCurScreen = WindowManager::currentOutputName(); +- for (auto screen : QApplication::screens()) { +- qDebug() << "Screen:" << screen->name() << "," << screen->geometry(); +- if (screen && screen->name() == strCurScreen) { +- isFoundScreen = true; +- moveToScreen(screen); +- break; +- } +- } +- } else { +- QPoint cursor = QCursor::pos(); +- for (auto screen : QApplication::screens()) { +- qDebug() << "Screen:" << screen->name() << "," << screen->geometry(); +- if (screen && screen->geometry().contains(cursor)) { +- isFoundScreen = true; +- moveToScreen(screen); +- break; +- } ++ // if (m_isWayland) { ++ // QString strCurScreen = WindowManager::currentOutputName(); ++ // for (auto screen : QApplication::screens()) { ++ // qDebug() << "Screen:" << screen->name() << "," << screen->geometry(); ++ // if (screen && screen->name() == strCurScreen) { ++ // isFoundScreen = true; ++ // moveToScreen(screen); ++ // break; ++ // } ++ // } ++ // } else { ++ QPoint cursor = QCursor::pos(); ++ for (auto screen : QApplication::screens()) { ++ qDebug() << "Screen:" << screen->name() << "," << screen->geometry(); ++ if (screen && screen->geometry().contains(cursor)) { ++ isFoundScreen = true; ++ moveToScreen(screen); ++ break; + } + } ++ // } + if (!isFoundScreen) { + if (QApplication::primaryScreen()) { + moveToScreen(QApplication::primaryScreen()); diff -Nru ukui-biometric-auth-4.10.0.0/debian/patches/0003-update-changelog.patch ukui-biometric-auth-4.20.0.0/debian/patches/0003-update-changelog.patch --- ukui-biometric-auth-4.10.0.0/debian/patches/0003-update-changelog.patch 2024-04-23 10:31:46.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/debian/patches/0003-update-changelog.patch 1970-01-01 08:00:00.000000000 +0800 @@ -1,7094 +0,0 @@ -From: yangmin <winner_yangmin@163.com> -Date: Mon, 27 Nov 2023 17:42:21 +0800 -Subject: update changelog - ---- - bioauth-bin/i18n_ts/bo.ts | 76 +++++++++----- - bioauth-bin/i18n_ts/bo_CN.ts | 17 ++-- - bioauth-bin/i18n_ts/de.ts | 197 +++++++++++++++++++++++++++--------- - bioauth-bin/i18n_ts/es.ts | 193 +++++++++++++++++++++++++++-------- - bioauth-bin/i18n_ts/fr.ts | 193 +++++++++++++++++++++++++++-------- - bioauth-bin/i18n_ts/kk.ts | 193 +++++++++++++++++++++++++++-------- - bioauth-bin/i18n_ts/ky.ts | 197 +++++++++++++++++++++++++++--------- - bioauth-bin/i18n_ts/mn.ts | 197 +++++++++++++++++++++++++++--------- - bioauth-bin/i18n_ts/pt.ts | 16 +++ - bioauth-bin/i18n_ts/ru.ts | 16 +++ - bioauth-bin/i18n_ts/tr.ts | 76 +++++++++----- - bioauth-bin/i18n_ts/ug.ts | 197 +++++++++++++++++++++++++++--------- - bioauth-bin/i18n_ts/zh_CN.ts | 64 ++++++------ - bioauth-bin/i18n_ts/zh_HK.ts | 197 +++++++++++++++++++++++++++--------- - bioauth/i18n_ts/bo.ts | 34 ++++--- - bioauth/i18n_ts/bo_CN.ts | 6 +- - bioauth/i18n_ts/es.ts | 12 ++- - bioauth/i18n_ts/fr.ts | 12 ++- - bioauth/i18n_ts/mn.ts | 26 +++-- - bioauth/i18n_ts/pt.ts | 12 ++- - bioauth/i18n_ts/ru.ts | 12 ++- - bioauth/i18n_ts/tr.ts | 34 ++++--- - bioauth/i18n_ts/zh_CN.ts | 30 +++--- - bioauth/i18n_ts/zh_HK.ts | 26 +++-- - polkit-agent/i18n_ts/bo.ts | 126 +++++++++++++---------- - polkit-agent/i18n_ts/bo_CN.ts | 126 +++++++++++++---------- - polkit-agent/i18n_ts/de.ts | 126 +++++++++++++---------- - polkit-agent/i18n_ts/es.ts | 126 +++++++++++++---------- - polkit-agent/i18n_ts/fr.ts | 126 +++++++++++++---------- - polkit-agent/i18n_ts/kk.ts | 126 +++++++++++++---------- - polkit-agent/i18n_ts/ky.ts | 126 +++++++++++++---------- - polkit-agent/i18n_ts/mn.ts | 48 ++++----- - polkit-agent/i18n_ts/pt.ts | 12 +++ - polkit-agent/i18n_ts/ru.ts | 12 +++ - polkit-agent/i18n_ts/tr.ts | 126 +++++++++++++---------- - polkit-agent/i18n_ts/ug.ts | 126 +++++++++++++---------- - polkit-agent/i18n_ts/zh_CN.ts | 122 ++++++++++++---------- - polkit-agent/i18n_ts/zh_HK.ts | 108 ++++++++++---------- - polkit-agent/src/PolkitListener.cpp | 18 ++-- - polkit-agent/src/mainwindow.cpp | 2 +- - 40 files changed, 2344 insertions(+), 1145 deletions(-) - -diff --git a/bioauth-bin/i18n_ts/bo.ts b/bioauth-bin/i18n_ts/bo.ts -index 6f9b4cc..494a230 100644 ---- a/bioauth-bin/i18n_ts/bo.ts -+++ b/bioauth-bin/i18n_ts/bo.ts -@@ -4,114 +4,134 @@ - <context> - <name>QObject</name> - <message> -- <location filename="../src/main.cpp" line="100"/> -+ <location filename="../src/main.cpp" line="126"/> -+ <source>Enter the ukey password</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="150"/> - <source>Try it again</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/main.cpp" line="102"/> -+ <location filename="../src/main.cpp" line="152"/> - <source>Use other Devices</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/main.cpp" line="103"/> -+ <location filename="../src/main.cpp" line="153"/> - <source>Cancel</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/main.cpp" line="112"/> -+ <location filename="../src/main.cpp" line="162"/> - <source>Choose the option</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/main.cpp" line="134"/> -- <location filename="../src/main.cpp" line="169"/> -- <location filename="../src/main.cpp" line="178"/> -+ <location filename="../src/main.cpp" line="184"/> -+ <location filename="../src/main.cpp" line="219"/> -+ <location filename="../src/main.cpp" line="228"/> - <source>Invaild response "</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/main.cpp" line="134"/> -- <location filename="../src/main.cpp" line="169"/> -- <location filename="../src/main.cpp" line="178"/> -+ <location filename="../src/main.cpp" line="184"/> -+ <location filename="../src/main.cpp" line="219"/> -+ <location filename="../src/main.cpp" line="228"/> - <source>authentication will be canceld</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/main.cpp" line="135"/> -- <location filename="../src/main.cpp" line="170"/> -- <location filename="../src/main.cpp" line="179"/> -- <location filename="../src/main.cpp" line="315"/> -+ <location filename="../src/main.cpp" line="185"/> -+ <location filename="../src/main.cpp" line="220"/> -+ <location filename="../src/main.cpp" line="229"/> -+ <location filename="../src/main.cpp" line="408"/> - <source>AUTHENTICATION CANCELED</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/main.cpp" line="146"/> -+ <location filename="../src/main.cpp" line="196"/> - <source>=== BIOMETRIC DEVICES ===</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/main.cpp" line="157"/> -+ <location filename="../src/main.cpp" line="207"/> - <source>Choose the device</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/main.cpp" line="210"/> -+ <location filename="../src/main.cpp" line="260"/> - <source>Sevice Name</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/main.cpp" line="211"/> -+ <location filename="../src/main.cpp" line="261"/> - <source>DISPLAY env</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/main.cpp" line="212"/> -+ <location filename="../src/main.cpp" line="262"/> - <source>User</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/main.cpp" line="213"/> -+ <location filename="../src/main.cpp" line="263"/> - <source>Display debug information</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/main.cpp" line="214"/> -+ <location filename="../src/main.cpp" line="264"/> - <source>Device short name</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/main.cpp" line="249"/> -+ <location filename="../src/main.cpp" line="306"/> -+ <source>UKEY AUTHENTICATION</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="308"/> - <source>BIOMETRIC AUTHENTICATION</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/main.cpp" line="251"/> -+ <location filename="../src/main.cpp" line="310"/> - <source>Press Q or Esc to cancel</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/main.cpp" line="263"/> -+ <location filename="../src/main.cpp" line="330"/> -+ <source>BIOMETRIC AUTHENTICATION IS CLOSED</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="334"/> - <source>AUTHENTICATION SUCCESS</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/main.cpp" line="267"/> -+ <location filename="../src/main.cpp" line="338"/> - <source>AUTHENTICATION FAILED</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/main.cpp" line="277"/> -+ <location filename="../src/main.cpp" line="348"/> - <source>Failed to verify %1, you still have %2 verification opportunities</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/main.cpp" line="279"/> -+ <location filename="../src/main.cpp" line="350"/> - <source>Unable to verify %1, please enter password.</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/main.cpp" line="302"/> -+ <location filename="../src/main.cpp" line="386"/> -+ <source>AUTHENTICATION END</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="388"/> - <source>BIOMETRIC AUTHENTICATION END</source> - <translation type="unfinished"></translation> - </message> -diff --git a/bioauth-bin/i18n_ts/bo_CN.ts b/bioauth-bin/i18n_ts/bo_CN.ts -index 149ffa2..99a7e33 100644 ---- a/bioauth-bin/i18n_ts/bo_CN.ts -+++ b/bioauth-bin/i18n_ts/bo_CN.ts -@@ -13,7 +13,7 @@ - </message> - <message> - <source>=== BIOMETRIC DEVICES ===</source> -- <translation>=== 生物识别设备 ===</translation> -+ <translation>=== སྐྱེ་དངོས་ངོས་འཛིན་སྒྲིག་ཆས། ===</translation> - </message> - <message> - <source>Display debug information</source> -@@ -81,28 +81,27 @@ - </message> - <message> - <source>Failed to verify %1, you still have %2 verification opportunities</source> -- <translation type="unfinished"></translation> -+ <translation>ཚོད་ལྟས་ར་སྤྲོད་%1ཕམ་ཉེས་བྱུང་།ཁྱེད་རང་ད་དུང་ཡོད།%2ཚོད་ལྟ་བྱེད་པའི་གོ་སྐབས་ཤིག་རེད།</translation> - </message> - <message> - <source>Unable to verify %1, please enter password.</source> -- <translation type="unfinished"></translation> -+ <translation>ཚོད་ལྟས་ར་སྤྲོད་བྱེད་ཐབས་མེད%1,ཁྱོད་ཀྱིས་གསང་གྲངས་ནང་འཇུག་བྱེད་རོགས།</translation> - </message> - <message> - <source>UKEY AUTHENTICATION</source> -- <translation type="unfinished"></translation> -+ <translation>བདེ་འཇགས་ཀྱི་གསང་བའི་བདེན་དཔང་ར་སྤྲོད།</translation> - </message> - <message> - <source>BIOMETRIC AUTHENTICATION IS CLOSED</source> -- <translation type="unfinished"></translation> -+ <translation>སྐྱེ་དངོས་ཀྱི་ངོས་འཛིན་ཁས་ལེན་བྱས་པ་སྒོ་བརྒྱབ་ཟིན།</translation> - </message> - <message> - <source>AUTHENTICATION END</source> -- <translation type="unfinished"></translation> -+ <translation>བདེན་དཔང་ར་སྤྲོད་མཇུག་བསྒྲི</translation> - </message> - <message> -- <source>Enter the ukey password --</source> -- <translation type="unfinished"></translation> -+ <source>Enter the ukey password</source> -+ <translation>བདེ་འཇགས་ཀྱི་གསང་བའི་གསང་བའི་ཨང་གྲངས་ནང་འཇུག་བྱེད་དགོས།</translation> - </message> - </context> - </TS> -diff --git a/bioauth-bin/i18n_ts/de.ts b/bioauth-bin/i18n_ts/de.ts -index c3eb69c..921d35b 100644 ---- a/bioauth-bin/i18n_ts/de.ts -+++ b/bioauth-bin/i18n_ts/de.ts -@@ -3,20 +3,13 @@ - <TS version="2.1" language="de"> - <context> - <name>BioAuthWidget</name> -- <message> -- <location filename="../src/bioauthwidget.ui" line="14"/> -- <source>Form</source> -- <translation></translation> -- </message> - <message> - <source>More</source> - <translation type="vanished">更多</translation> - </message> - <message> -- <location filename="../src/bioauthwidget.ui" line="146"/> -- <location filename="../src/bioauthwidget.cpp" line="41"/> - <source>Retry</source> -- <translation>wiederholen</translation> -+ <translation type="vanished">wiederholen</translation> - </message> - <message> - <source>Too many unsuccessful attempts,please enter password.</source> -@@ -28,85 +21,70 @@ - </message> - <message> - <source>Password</source> -- <translation>Passwort</translation> -+ <translation type="vanished">Passwort</translation> - </message> - <message> - <source>Current Device: </source> - <translation type="vanished">当前设备:</translation> - </message> - <message> -- <location filename="../src/bioauthwidget.cpp" line="96"/> -- <location filename="../src/bioauthwidget.cpp" line="212"/> - <source>%1 too many unsuccessful attempts,please enter password.</source> -- <translation>%1 Es gibt zu viele fehlgeschlagene Versuche, bitte geben Sie Ihr Passwort ein.</translation> -+ <translation type="vanished">%1 Es gibt zu viele fehlgeschlagene Versuche, bitte geben Sie Ihr Passwort ein.</translation> - </message> - <message> -- <location filename="../src/bioauthwidget.cpp" line="102"/> - <source>%1 authentication failure,there are still %2 remaining opportunities</source> -- <translation>%1 Authentifizierung fehlgeschlagen und es sind noch %2 verbleibende Chancen</translation> -+ <translation type="vanished">%1 Authentifizierung fehlgeschlagen und es sind noch %2 verbleibende Chancen</translation> - </message> - <message> -- <location filename="../src/bioauthwidget.cpp" line="226"/> - <source>Please use wechat to scan the code</source> -- <translation>Bitte verwenden Sie WeChat, um den Code zu scannen</translation> -+ <translation type="vanished">Bitte verwenden Sie WeChat, um den Code zu scannen</translation> - </message> - </context> - <context> - <name>BioDevices</name> - <message> -- <location filename="../src/biodevices.cpp" line="78"/> - <source>Unplugging of %1 device detected</source> -- <translation>Das %1-Gerät wurde vom Stromnetz getrennt</translation> -+ <translation type="vanished">Das %1-Gerät wurde vom Stromnetz getrennt</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="88"/> - <source>%1 device insertion detected</source> -- <translation>%1 angeschlossenes Gerät erkannt</translation> -+ <translation type="vanished">%1 angeschlossenes Gerät erkannt</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="97"/> - <source>ukui-biometric-manager</source> -- <translation>Tools für die biometrische Verwaltung</translation> -+ <translation type="vanished">Tools für die biometrische Verwaltung</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="100"/> - <source>biometric</source> -- <translation>Biologische Eigenschaften</translation> -+ <translation type="vanished">Biologische Eigenschaften</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="647"/> - <source>FingerPrint</source> -- <translation>Fingerabdruck</translation> -+ <translation type="vanished">Fingerabdruck</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="649"/> - <source>FingerVein</source> -- <translation>Fingervenen</translation> -+ <translation type="vanished">Fingervenen</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="651"/> - <source>Iris</source> -- <translation>Iris</translation> -+ <translation type="vanished">Iris</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="653"/> - <source>Face</source> -- <translation>Gesichtserkennung</translation> -+ <translation type="vanished">Gesichtserkennung</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="655"/> - <source>VoicePrint</source> -- <translation>Stimmenausdruck</translation> -+ <translation type="vanished">Stimmenausdruck</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="657"/> - <source>ukey</source> -- <translation>Sicherheitsschlüssel</translation> -+ <translation type="vanished">Sicherheitsschlüssel</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="659"/> - <source>QRCode</source> -- <translation>QR-Code</translation> -+ <translation type="vanished">QR-Code</translation> - </message> - <message> - <source>Wechat</source> -@@ -115,11 +93,6 @@ - </context> - <context> - <name>BioDevicesWidget</name> -- <message> -- <location filename="../src/biodeviceswidget.ui" line="14"/> -- <source>Form</source> -- <translation></translation> -- </message> - <message> - <source>Device types:</source> - <translation type="vanished">设备类型:</translation> -@@ -140,14 +113,12 @@ - <context> - <name>LoginOptionsWidget</name> - <message> -- <location filename="../src/loginoptionswidget.cpp" line="61"/> - <source>Login Options</source> -- <translation>Anmeldeoptionen</translation> -+ <translation type="vanished">Anmeldeoptionen</translation> - </message> - <message> -- <location filename="../src/loginoptionswidget.cpp" line="294"/> - <source>Password</source> -- <translation>Passwort</translation> -+ <translation type="vanished">Passwort</translation> - </message> - <message> - <source>Wechat</source> -@@ -180,5 +151,137 @@ - <source>VoicePrint</source> - <translation type="vanished">声纹</translation> - </message> -+ <message> -+ <location filename="../src/main.cpp" line="126"/> -+ <source>Enter the ukey password</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="150"/> -+ <source>Try it again</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="152"/> -+ <source>Use other Devices</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="153"/> -+ <source>Cancel</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="162"/> -+ <source>Choose the option</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="184"/> -+ <location filename="../src/main.cpp" line="219"/> -+ <location filename="../src/main.cpp" line="228"/> -+ <source>Invaild response "</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="184"/> -+ <location filename="../src/main.cpp" line="219"/> -+ <location filename="../src/main.cpp" line="228"/> -+ <source>authentication will be canceld</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="185"/> -+ <location filename="../src/main.cpp" line="220"/> -+ <location filename="../src/main.cpp" line="229"/> -+ <location filename="../src/main.cpp" line="408"/> -+ <source>AUTHENTICATION CANCELED</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="196"/> -+ <source>=== BIOMETRIC DEVICES ===</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="207"/> -+ <source>Choose the device</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="260"/> -+ <source>Sevice Name</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="261"/> -+ <source>DISPLAY env</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="262"/> -+ <source>User</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="263"/> -+ <source>Display debug information</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="264"/> -+ <source>Device short name</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="306"/> -+ <source>UKEY AUTHENTICATION</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="308"/> -+ <source>BIOMETRIC AUTHENTICATION</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="310"/> -+ <source>Press Q or Esc to cancel</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="330"/> -+ <source>BIOMETRIC AUTHENTICATION IS CLOSED</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="334"/> -+ <source>AUTHENTICATION SUCCESS</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="338"/> -+ <source>AUTHENTICATION FAILED</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="348"/> -+ <source>Failed to verify %1, you still have %2 verification opportunities</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="350"/> -+ <source>Unable to verify %1, please enter password.</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="386"/> -+ <source>AUTHENTICATION END</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="388"/> -+ <source>BIOMETRIC AUTHENTICATION END</source> -+ <translation type="unfinished"></translation> -+ </message> - </context> - </TS> -diff --git a/bioauth-bin/i18n_ts/es.ts b/bioauth-bin/i18n_ts/es.ts -index 03ba179..4a94f0c 100644 ---- a/bioauth-bin/i18n_ts/es.ts -+++ b/bioauth-bin/i18n_ts/es.ts -@@ -4,19 +4,16 @@ - <context> - <name>BioAuthWidget</name> - <message> -- <location filename="../src/bioauthwidget.ui" line="14"/> - <source>Form</source> -- <translation>Forma</translation> -+ <translation type="vanished">Forma</translation> - </message> - <message> - <source>More</source> - <translation type="vanished">更多</translation> - </message> - <message> -- <location filename="../src/bioauthwidget.ui" line="146"/> -- <location filename="../src/bioauthwidget.cpp" line="41"/> - <source>Retry</source> -- <translation>Reintentar</translation> -+ <translation type="vanished">Reintentar</translation> - </message> - <message> - <source>Too many unsuccessful attempts,please enter password.</source> -@@ -28,85 +25,70 @@ - </message> - <message> - <source>Password</source> -- <translation>Contraseña</translation> -+ <translation type="vanished">Contraseña</translation> - </message> - <message> - <source>Current Device: </source> - <translation type="vanished">当前设备:</translation> - </message> - <message> -- <location filename="../src/bioauthwidget.cpp" line="96"/> -- <location filename="../src/bioauthwidget.cpp" line="212"/> - <source>%1 too many unsuccessful attempts,please enter password.</source> -- <translation>%1 Demasiados intentos fallidos, ingrese la contraseña.</translation> -+ <translation type="vanished">%1 Demasiados intentos fallidos, ingrese la contraseña.</translation> - </message> - <message> -- <location filename="../src/bioauthwidget.cpp" line="102"/> - <source>%1 authentication failure,there are still %2 remaining opportunities</source> -- <translation>%1 error de autenticación, todavía quedan %2 oportunidades</translation> -+ <translation type="vanished">%1 error de autenticación, todavía quedan %2 oportunidades</translation> - </message> - <message> -- <location filename="../src/bioauthwidget.cpp" line="226"/> - <source>Please use wechat to scan the code</source> -- <translation>Utilice wechat para escanear el código</translation> -+ <translation type="vanished">Utilice wechat para escanear el código</translation> - </message> - </context> - <context> - <name>BioDevices</name> - <message> -- <location filename="../src/biodevices.cpp" line="78"/> - <source>Unplugging of %1 device detected</source> -- <translation>Se ha detectado la desconexión del dispositivo %1</translation> -+ <translation type="vanished">Se ha detectado la desconexión del dispositivo %1</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="88"/> - <source>%1 device insertion detected</source> -- <translation>%1 inserción de dispositivo detectada</translation> -+ <translation type="vanished">%1 inserción de dispositivo detectada</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="97"/> - <source>ukui-biometric-manager</source> -- <translation>ukui-gestor-biométrico</translation> -+ <translation type="vanished">ukui-gestor-biométrico</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="100"/> - <source>biometric</source> -- <translation>biométrico</translation> -+ <translation type="vanished">biométrico</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="647"/> - <source>FingerPrint</source> -- <translation>Huellas</translation> -+ <translation type="vanished">Huellas</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="649"/> - <source>FingerVein</source> -- <translation>FingerVein</translation> -+ <translation type="vanished">FingerVein</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="651"/> - <source>Iris</source> -- <translation>Iris</translation> -+ <translation type="vanished">Iris</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="653"/> - <source>Face</source> -- <translation>Cara</translation> -+ <translation type="vanished">Cara</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="655"/> - <source>VoicePrint</source> -- <translation>Huella de voz</translation> -+ <translation type="vanished">Huella de voz</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="657"/> - <source>ukey</source> -- <translation>ukey</translation> -+ <translation type="vanished">ukey</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="659"/> - <source>QRCode</source> -- <translation>QRCode</translation> -+ <translation type="vanished">QRCode</translation> - </message> - <message> - <source>Wechat</source> -@@ -116,9 +98,8 @@ - <context> - <name>BioDevicesWidget</name> - <message> -- <location filename="../src/biodeviceswidget.ui" line="14"/> - <source>Form</source> -- <translation>Forma</translation> -+ <translation type="vanished">Forma</translation> - </message> - <message> - <source>Device types:</source> -@@ -140,14 +121,12 @@ - <context> - <name>LoginOptionsWidget</name> - <message> -- <location filename="../src/loginoptionswidget.cpp" line="61"/> - <source>Login Options</source> -- <translation>Opciones de inicio de sesión</translation> -+ <translation type="vanished">Opciones de inicio de sesión</translation> - </message> - <message> -- <location filename="../src/loginoptionswidget.cpp" line="294"/> - <source>Password</source> -- <translation>Contraseña</translation> -+ <translation type="vanished">Contraseña</translation> - </message> - <message> - <source>Wechat</source> -@@ -180,5 +159,137 @@ - <source>VoicePrint</source> - <translation type="vanished">声纹</translation> - </message> -+ <message> -+ <location filename="../src/main.cpp" line="126"/> -+ <source>Enter the ukey password</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="150"/> -+ <source>Try it again</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="152"/> -+ <source>Use other Devices</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="153"/> -+ <source>Cancel</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="162"/> -+ <source>Choose the option</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="184"/> -+ <location filename="../src/main.cpp" line="219"/> -+ <location filename="../src/main.cpp" line="228"/> -+ <source>Invaild response "</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="184"/> -+ <location filename="../src/main.cpp" line="219"/> -+ <location filename="../src/main.cpp" line="228"/> -+ <source>authentication will be canceld</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="185"/> -+ <location filename="../src/main.cpp" line="220"/> -+ <location filename="../src/main.cpp" line="229"/> -+ <location filename="../src/main.cpp" line="408"/> -+ <source>AUTHENTICATION CANCELED</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="196"/> -+ <source>=== BIOMETRIC DEVICES ===</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="207"/> -+ <source>Choose the device</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="260"/> -+ <source>Sevice Name</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="261"/> -+ <source>DISPLAY env</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="262"/> -+ <source>User</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="263"/> -+ <source>Display debug information</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="264"/> -+ <source>Device short name</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="306"/> -+ <source>UKEY AUTHENTICATION</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="308"/> -+ <source>BIOMETRIC AUTHENTICATION</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="310"/> -+ <source>Press Q or Esc to cancel</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="330"/> -+ <source>BIOMETRIC AUTHENTICATION IS CLOSED</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="334"/> -+ <source>AUTHENTICATION SUCCESS</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="338"/> -+ <source>AUTHENTICATION FAILED</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="348"/> -+ <source>Failed to verify %1, you still have %2 verification opportunities</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="350"/> -+ <source>Unable to verify %1, please enter password.</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="386"/> -+ <source>AUTHENTICATION END</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="388"/> -+ <source>BIOMETRIC AUTHENTICATION END</source> -+ <translation type="unfinished"></translation> -+ </message> - </context> - </TS> -diff --git a/bioauth-bin/i18n_ts/fr.ts b/bioauth-bin/i18n_ts/fr.ts -index 8dbf86c..f0bdda7 100644 ---- a/bioauth-bin/i18n_ts/fr.ts -+++ b/bioauth-bin/i18n_ts/fr.ts -@@ -4,19 +4,16 @@ - <context> - <name>BioAuthWidget</name> - <message> -- <location filename="../src/bioauthwidget.ui" line="14"/> - <source>Form</source> -- <translation>Forme</translation> -+ <translation type="vanished">Forme</translation> - </message> - <message> - <source>More</source> - <translation type="vanished">更多</translation> - </message> - <message> -- <location filename="../src/bioauthwidget.ui" line="146"/> -- <location filename="../src/bioauthwidget.cpp" line="41"/> - <source>Retry</source> -- <translation>réessayer</translation> -+ <translation type="vanished">réessayer</translation> - </message> - <message> - <source>Too many unsuccessful attempts,please enter password.</source> -@@ -28,85 +25,70 @@ - </message> - <message> - <source>Password</source> -- <translation>mot de passe</translation> -+ <translation type="vanished">mot de passe</translation> - </message> - <message> - <source>Current Device: </source> - <translation type="vanished">当前设备:</translation> - </message> - <message> -- <location filename="../src/bioauthwidget.cpp" line="96"/> -- <location filename="../src/bioauthwidget.cpp" line="212"/> - <source>%1 too many unsuccessful attempts,please enter password.</source> -- <translation>%1 Il y a trop de tentatives infructueuses, veuillez saisir votre mot de passe.</translation> -+ <translation type="vanished">%1 Il y a trop de tentatives infructueuses, veuillez saisir votre mot de passe.</translation> - </message> - <message> -- <location filename="../src/bioauthwidget.cpp" line="102"/> - <source>%1 authentication failure,there are still %2 remaining opportunities</source> -- <translation>%1 authentification a échoué et il reste encore %2 chances</translation> -+ <translation type="vanished">%1 authentification a échoué et il reste encore %2 chances</translation> - </message> - <message> -- <location filename="../src/bioauthwidget.cpp" line="226"/> - <source>Please use wechat to scan the code</source> -- <translation>Veuillez utiliser WeChat pour scanner le code</translation> -+ <translation type="vanished">Veuillez utiliser WeChat pour scanner le code</translation> - </message> - </context> - <context> - <name>BioDevices</name> - <message> -- <location filename="../src/biodevices.cpp" line="78"/> - <source>Unplugging of %1 device detected</source> -- <translation>L’appareil %1 a été débranché</translation> -+ <translation type="vanished">L’appareil %1 a été débranché</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="88"/> - <source>%1 device insertion detected</source> -- <translation>%1 périphérique branché détecté</translation> -+ <translation type="vanished">%1 périphérique branché détecté</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="97"/> - <source>ukui-biometric-manager</source> -- <translation>Outils de gestion biométrique</translation> -+ <translation type="vanished">Outils de gestion biométrique</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="100"/> - <source>biometric</source> -- <translation>Caractéristiques biologiques</translation> -+ <translation type="vanished">Caractéristiques biologiques</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="647"/> - <source>FingerPrint</source> -- <translation>empreinte digitale</translation> -+ <translation type="vanished">empreinte digitale</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="649"/> - <source>FingerVein</source> -- <translation>Veines des doigts</translation> -+ <translation type="vanished">Veines des doigts</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="651"/> - <source>Iris</source> -- <translation>iris</translation> -+ <translation type="vanished">iris</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="653"/> - <source>Face</source> -- <translation>Reconnaissance faciale</translation> -+ <translation type="vanished">Reconnaissance faciale</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="655"/> - <source>VoicePrint</source> -- <translation>Voiceprint</translation> -+ <translation type="vanished">Voiceprint</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="657"/> - <source>ukey</source> -- <translation>Clés de sécurité</translation> -+ <translation type="vanished">Clés de sécurité</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="659"/> - <source>QRCode</source> -- <translation>Code QR</translation> -+ <translation type="vanished">Code QR</translation> - </message> - <message> - <source>Wechat</source> -@@ -116,9 +98,8 @@ - <context> - <name>BioDevicesWidget</name> - <message> -- <location filename="../src/biodeviceswidget.ui" line="14"/> - <source>Form</source> -- <translation>Forme</translation> -+ <translation type="vanished">Forme</translation> - </message> - <message> - <source>Device types:</source> -@@ -140,14 +121,12 @@ - <context> - <name>LoginOptionsWidget</name> - <message> -- <location filename="../src/loginoptionswidget.cpp" line="61"/> - <source>Login Options</source> -- <translation>Options de connexion</translation> -+ <translation type="vanished">Options de connexion</translation> - </message> - <message> -- <location filename="../src/loginoptionswidget.cpp" line="294"/> - <source>Password</source> -- <translation>mot de passe</translation> -+ <translation type="vanished">mot de passe</translation> - </message> - <message> - <source>Wechat</source> -@@ -180,5 +159,137 @@ - <source>VoicePrint</source> - <translation type="vanished">声纹</translation> - </message> -+ <message> -+ <location filename="../src/main.cpp" line="126"/> -+ <source>Enter the ukey password</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="150"/> -+ <source>Try it again</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="152"/> -+ <source>Use other Devices</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="153"/> -+ <source>Cancel</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="162"/> -+ <source>Choose the option</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="184"/> -+ <location filename="../src/main.cpp" line="219"/> -+ <location filename="../src/main.cpp" line="228"/> -+ <source>Invaild response "</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="184"/> -+ <location filename="../src/main.cpp" line="219"/> -+ <location filename="../src/main.cpp" line="228"/> -+ <source>authentication will be canceld</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="185"/> -+ <location filename="../src/main.cpp" line="220"/> -+ <location filename="../src/main.cpp" line="229"/> -+ <location filename="../src/main.cpp" line="408"/> -+ <source>AUTHENTICATION CANCELED</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="196"/> -+ <source>=== BIOMETRIC DEVICES ===</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="207"/> -+ <source>Choose the device</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="260"/> -+ <source>Sevice Name</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="261"/> -+ <source>DISPLAY env</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="262"/> -+ <source>User</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="263"/> -+ <source>Display debug information</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="264"/> -+ <source>Device short name</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="306"/> -+ <source>UKEY AUTHENTICATION</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="308"/> -+ <source>BIOMETRIC AUTHENTICATION</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="310"/> -+ <source>Press Q or Esc to cancel</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="330"/> -+ <source>BIOMETRIC AUTHENTICATION IS CLOSED</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="334"/> -+ <source>AUTHENTICATION SUCCESS</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="338"/> -+ <source>AUTHENTICATION FAILED</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="348"/> -+ <source>Failed to verify %1, you still have %2 verification opportunities</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="350"/> -+ <source>Unable to verify %1, please enter password.</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="386"/> -+ <source>AUTHENTICATION END</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="388"/> -+ <source>BIOMETRIC AUTHENTICATION END</source> -+ <translation type="unfinished"></translation> -+ </message> - </context> - </TS> -diff --git a/bioauth-bin/i18n_ts/kk.ts b/bioauth-bin/i18n_ts/kk.ts -index ad57405..02bdc1e 100644 ---- a/bioauth-bin/i18n_ts/kk.ts -+++ b/bioauth-bin/i18n_ts/kk.ts -@@ -4,19 +4,16 @@ - <context> - <name>BioAuthWidget</name> - <message> -- <location filename="../src/bioauthwidget.ui" line="14"/> - <source>Form</source> -- <translation>Пішін</translation> -+ <translation type="vanished">Пішін</translation> - </message> - <message> - <source>More</source> - <translation type="vanished">更多</translation> - </message> - <message> -- <location filename="../src/bioauthwidget.ui" line="146"/> -- <location filename="../src/bioauthwidget.cpp" line="41"/> - <source>Retry</source> -- <translation>ретри</translation> -+ <translation type="vanished">ретри</translation> - </message> - <message> - <source>Too many unsuccessful attempts,please enter password.</source> -@@ -28,85 +25,70 @@ - </message> - <message> - <source>Password</source> -- <translation>құпиясөз</translation> -+ <translation type="vanished">құпиясөз</translation> - </message> - <message> - <source>Current Device: </source> - <translation type="vanished">当前设备:</translation> - </message> - <message> -- <location filename="../src/bioauthwidget.cpp" line="96"/> -- <location filename="../src/bioauthwidget.cpp" line="212"/> - <source>%1 too many unsuccessful attempts,please enter password.</source> -- <translation>% 1 Қате әрекеттер тым көп, құпия сөзіңізді енгізіңіз.</translation> -+ <translation type="vanished">% 1 Қате әрекеттер тым көп, құпия сөзіңізді енгізіңіз.</translation> - </message> - <message> -- <location filename="../src/bioauthwidget.cpp" line="102"/> - <source>%1 authentication failure,there are still %2 remaining opportunities</source> -- <translation>% 1 аутентификациясы жаңылысқан және әлі де% 2 мүмкіндігі бар</translation> -+ <translation type="vanished">% 1 аутентификациясы жаңылысқан және әлі де% 2 мүмкіндігі бар</translation> - </message> - <message> -- <location filename="../src/bioauthwidget.cpp" line="226"/> - <source>Please use wechat to scan the code</source> -- <translation>Кодты сканерлеу үшін WeChat пайдалануыңызды сұраймын</translation> -+ <translation type="vanished">Кодты сканерлеу үшін WeChat пайдалануыңызды сұраймын</translation> - </message> - </context> - <context> - <name>BioDevices</name> - <message> -- <location filename="../src/biodevices.cpp" line="78"/> - <source>Unplugging of %1 device detected</source> -- <translation>% 1 құрылғы ажыратылды</translation> -+ <translation type="vanished">% 1 құрылғы ажыратылды</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="88"/> - <source>%1 device insertion detected</source> -- <translation>% 1 құрылғы анықталды</translation> -+ <translation type="vanished">% 1 құрылғы анықталды</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="97"/> - <source>ukui-biometric-manager</source> -- <translation>Биометриялық басқару құралдары</translation> -+ <translation type="vanished">Биометриялық басқару құралдары</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="100"/> - <source>biometric</source> -- <translation>Биологиялық сипаттамалары</translation> -+ <translation type="vanished">Биологиялық сипаттамалары</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="647"/> - <source>FingerPrint</source> -- <translation>саусақ ізі</translation> -+ <translation type="vanished">саусақ ізі</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="649"/> - <source>FingerVein</source> -- <translation>Саусақ көктамырлары</translation> -+ <translation type="vanished">Саусақ көктамырлары</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="651"/> - <source>Iris</source> -- <translation>ирис</translation> -+ <translation type="vanished">ирис</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="653"/> - <source>Face</source> -- <translation>Бет тану</translation> -+ <translation type="vanished">Бет тану</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="655"/> - <source>VoicePrint</source> -- <translation>Дауыстық із</translation> -+ <translation type="vanished">Дауыстық із</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="657"/> - <source>ukey</source> -- <translation>Қауіпсіздік кілттері</translation> -+ <translation type="vanished">Қауіпсіздік кілттері</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="659"/> - <source>QRCode</source> -- <translation>QR коды</translation> -+ <translation type="vanished">QR коды</translation> - </message> - <message> - <source>Wechat</source> -@@ -116,9 +98,8 @@ - <context> - <name>BioDevicesWidget</name> - <message> -- <location filename="../src/biodeviceswidget.ui" line="14"/> - <source>Form</source> -- <translation>Пішін</translation> -+ <translation type="vanished">Пішін</translation> - </message> - <message> - <source>Device types:</source> -@@ -140,14 +121,12 @@ - <context> - <name>LoginOptionsWidget</name> - <message> -- <location filename="../src/loginoptionswidget.cpp" line="61"/> - <source>Login Options</source> -- <translation>Кіру параметрлері</translation> -+ <translation type="vanished">Кіру параметрлері</translation> - </message> - <message> -- <location filename="../src/loginoptionswidget.cpp" line="294"/> - <source>Password</source> -- <translation>құпиясөз</translation> -+ <translation type="vanished">құпиясөз</translation> - </message> - <message> - <source>Wechat</source> -@@ -180,5 +159,137 @@ - <source>VoicePrint</source> - <translation type="vanished">声纹</translation> - </message> -+ <message> -+ <location filename="../src/main.cpp" line="126"/> -+ <source>Enter the ukey password</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="150"/> -+ <source>Try it again</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="152"/> -+ <source>Use other Devices</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="153"/> -+ <source>Cancel</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="162"/> -+ <source>Choose the option</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="184"/> -+ <location filename="../src/main.cpp" line="219"/> -+ <location filename="../src/main.cpp" line="228"/> -+ <source>Invaild response "</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="184"/> -+ <location filename="../src/main.cpp" line="219"/> -+ <location filename="../src/main.cpp" line="228"/> -+ <source>authentication will be canceld</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="185"/> -+ <location filename="../src/main.cpp" line="220"/> -+ <location filename="../src/main.cpp" line="229"/> -+ <location filename="../src/main.cpp" line="408"/> -+ <source>AUTHENTICATION CANCELED</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="196"/> -+ <source>=== BIOMETRIC DEVICES ===</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="207"/> -+ <source>Choose the device</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="260"/> -+ <source>Sevice Name</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="261"/> -+ <source>DISPLAY env</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="262"/> -+ <source>User</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="263"/> -+ <source>Display debug information</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="264"/> -+ <source>Device short name</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="306"/> -+ <source>UKEY AUTHENTICATION</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="308"/> -+ <source>BIOMETRIC AUTHENTICATION</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="310"/> -+ <source>Press Q or Esc to cancel</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="330"/> -+ <source>BIOMETRIC AUTHENTICATION IS CLOSED</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="334"/> -+ <source>AUTHENTICATION SUCCESS</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="338"/> -+ <source>AUTHENTICATION FAILED</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="348"/> -+ <source>Failed to verify %1, you still have %2 verification opportunities</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="350"/> -+ <source>Unable to verify %1, please enter password.</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="386"/> -+ <source>AUTHENTICATION END</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="388"/> -+ <source>BIOMETRIC AUTHENTICATION END</source> -+ <translation type="unfinished"></translation> -+ </message> - </context> - </TS> -diff --git a/bioauth-bin/i18n_ts/ky.ts b/bioauth-bin/i18n_ts/ky.ts -index e9a3f13..0488393 100644 ---- a/bioauth-bin/i18n_ts/ky.ts -+++ b/bioauth-bin/i18n_ts/ky.ts -@@ -3,20 +3,13 @@ - <TS version="2.1" language="ky"> - <context> - <name>BioAuthWidget</name> -- <message> -- <location filename="../src/bioauthwidget.ui" line="14"/> -- <source>Form</source> -- <translation></translation> -- </message> - <message> - <source>More</source> - <translation type="vanished">更多</translation> - </message> - <message> -- <location filename="../src/bioauthwidget.ui" line="146"/> -- <location filename="../src/bioauthwidget.cpp" line="41"/> - <source>Retry</source> -- <translation>Ретри</translation> -+ <translation type="vanished">Ретри</translation> - </message> - <message> - <source>Too many unsuccessful attempts,please enter password.</source> -@@ -28,85 +21,70 @@ - </message> - <message> - <source>Password</source> -- <translation>Сырсөз</translation> -+ <translation type="vanished">Сырсөз</translation> - </message> - <message> - <source>Current Device: </source> - <translation type="vanished">当前设备:</translation> - </message> - <message> -- <location filename="../src/bioauthwidget.cpp" line="96"/> -- <location filename="../src/bioauthwidget.cpp" line="212"/> - <source>%1 too many unsuccessful attempts,please enter password.</source> -- <translation>%1 өтө көп ийгиликсиз аракеттер,, сураныч, сырсөз киргизүү.</translation> -+ <translation type="vanished">%1 өтө көп ийгиликсиз аракеттер,, сураныч, сырсөз киргизүү.</translation> - </message> - <message> -- <location filename="../src/bioauthwidget.cpp" line="102"/> - <source>%1 authentication failure,there are still %2 remaining opportunities</source> -- <translation>%1 аутентификациялык жетишсиздик,дагы эле %2 калган мүмкүнчүлүктөр бар</translation> -+ <translation type="vanished">%1 аутентификациялык жетишсиздик,дагы эле %2 калган мүмкүнчүлүктөр бар</translation> - </message> - <message> -- <location filename="../src/bioauthwidget.cpp" line="226"/> - <source>Please use wechat to scan the code</source> -- <translation>Кодду сканерлеу үчүн вечат колдонуңуз</translation> -+ <translation type="vanished">Кодду сканерлеу үчүн вечат колдонуңуз</translation> - </message> - </context> - <context> - <name>BioDevices</name> - <message> -- <location filename="../src/biodevices.cpp" line="78"/> - <source>Unplugging of %1 device detected</source> -- <translation>%1 орнотмосунун өчүрүлүшү аныкталды</translation> -+ <translation type="vanished">%1 орнотмосунун өчүрүлүшү аныкталды</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="88"/> - <source>%1 device insertion detected</source> -- <translation>%1 түзмөк орнотмосу аныкталды</translation> -+ <translation type="vanished">%1 түзмөк орнотмосу аныкталды</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="97"/> - <source>ukui-biometric-manager</source> -- <translation>укуи-биометриялык-менеджери</translation> -+ <translation type="vanished">укуи-биометриялык-менеджери</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="100"/> - <source>biometric</source> -- <translation>биометрия</translation> -+ <translation type="vanished">биометрия</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="647"/> - <source>FingerPrint</source> -- <translation>Манжа изи</translation> -+ <translation type="vanished">Манжа изи</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="649"/> - <source>FingerVein</source> -- <translation>Манжавейн</translation> -+ <translation type="vanished">Манжавейн</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="651"/> - <source>Iris</source> -- <translation>Ирис</translation> -+ <translation type="vanished">Ирис</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="653"/> - <source>Face</source> -- <translation>Бет</translation> -+ <translation type="vanished">Бет</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="655"/> - <source>VoicePrint</source> -- <translation>VoicePrint</translation> -+ <translation type="vanished">VoicePrint</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="657"/> - <source>ukey</source> -- <translation>уики</translation> -+ <translation type="vanished">уики</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="659"/> - <source>QRCode</source> -- <translation>QRCode</translation> -+ <translation type="vanished">QRCode</translation> - </message> - <message> - <source>Wechat</source> -@@ -115,11 +93,6 @@ - </context> - <context> - <name>BioDevicesWidget</name> -- <message> -- <location filename="../src/biodeviceswidget.ui" line="14"/> -- <source>Form</source> -- <translation></translation> -- </message> - <message> - <source>Device types:</source> - <translation type="vanished">设备类型:</translation> -@@ -140,14 +113,12 @@ - <context> - <name>LoginOptionsWidget</name> - <message> -- <location filename="../src/loginoptionswidget.cpp" line="61"/> - <source>Login Options</source> -- <translation>Кирүү параметрлери</translation> -+ <translation type="vanished">Кирүү параметрлери</translation> - </message> - <message> -- <location filename="../src/loginoptionswidget.cpp" line="294"/> - <source>Password</source> -- <translation>Сырсөз</translation> -+ <translation type="vanished">Сырсөз</translation> - </message> - <message> - <source>Wechat</source> -@@ -180,5 +151,137 @@ - <source>VoicePrint</source> - <translation type="vanished">声纹</translation> - </message> -+ <message> -+ <location filename="../src/main.cpp" line="126"/> -+ <source>Enter the ukey password</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="150"/> -+ <source>Try it again</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="152"/> -+ <source>Use other Devices</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="153"/> -+ <source>Cancel</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="162"/> -+ <source>Choose the option</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="184"/> -+ <location filename="../src/main.cpp" line="219"/> -+ <location filename="../src/main.cpp" line="228"/> -+ <source>Invaild response "</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="184"/> -+ <location filename="../src/main.cpp" line="219"/> -+ <location filename="../src/main.cpp" line="228"/> -+ <source>authentication will be canceld</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="185"/> -+ <location filename="../src/main.cpp" line="220"/> -+ <location filename="../src/main.cpp" line="229"/> -+ <location filename="../src/main.cpp" line="408"/> -+ <source>AUTHENTICATION CANCELED</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="196"/> -+ <source>=== BIOMETRIC DEVICES ===</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="207"/> -+ <source>Choose the device</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="260"/> -+ <source>Sevice Name</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="261"/> -+ <source>DISPLAY env</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="262"/> -+ <source>User</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="263"/> -+ <source>Display debug information</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="264"/> -+ <source>Device short name</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="306"/> -+ <source>UKEY AUTHENTICATION</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="308"/> -+ <source>BIOMETRIC AUTHENTICATION</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="310"/> -+ <source>Press Q or Esc to cancel</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="330"/> -+ <source>BIOMETRIC AUTHENTICATION IS CLOSED</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="334"/> -+ <source>AUTHENTICATION SUCCESS</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="338"/> -+ <source>AUTHENTICATION FAILED</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="348"/> -+ <source>Failed to verify %1, you still have %2 verification opportunities</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="350"/> -+ <source>Unable to verify %1, please enter password.</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="386"/> -+ <source>AUTHENTICATION END</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="388"/> -+ <source>BIOMETRIC AUTHENTICATION END</source> -+ <translation type="unfinished"></translation> -+ </message> - </context> - </TS> -diff --git a/bioauth-bin/i18n_ts/mn.ts b/bioauth-bin/i18n_ts/mn.ts -index b96b503..7457942 100644 ---- a/bioauth-bin/i18n_ts/mn.ts -+++ b/bioauth-bin/i18n_ts/mn.ts -@@ -3,20 +3,13 @@ - <TS version="2.1" language="mn"> - <context> - <name>BioAuthWidget</name> -- <message> -- <location filename="../src/bioauthwidget.ui" line="14"/> -- <source>Form</source> -- <translation></translation> -- </message> - <message> - <source>More</source> - <translation type="vanished">更多</translation> - </message> - <message> -- <location filename="../src/bioauthwidget.ui" line="146"/> -- <location filename="../src/bioauthwidget.cpp" line="41"/> - <source>Retry</source> -- <translation>ᠳᠠᠬᠢᠨ ᠲᠤᠷᠰᠢᠬᠤ</translation> -+ <translation type="vanished">ᠳᠠᠬᠢᠨ ᠲᠤᠷᠰᠢᠬᠤ</translation> - </message> - <message> - <source>Too many unsuccessful attempts,please enter password.</source> -@@ -28,85 +21,70 @@ - </message> - <message> - <source>Password</source> -- <translation>ᠨᠢᠭᠤᠴᠠ ᠺᠣᠳ᠋</translation> -+ <translation type="vanished">ᠨᠢᠭᠤᠴᠠ ᠺᠣᠳ᠋</translation> - </message> - <message> - <source>Current Device: </source> - <translation type="vanished">当前设备:</translation> - </message> - <message> -- <location filename="../src/bioauthwidget.cpp" line="96"/> -- <location filename="../src/bioauthwidget.cpp" line="212"/> - <source>%1 too many unsuccessful attempts,please enter password.</source> -- <translation>%1 ᠢᠯᠠᠭᠳᠠᠭᠰᠠᠨ ᠲᠤᠷᠰᠢᠬᠤ ᠤᠳᠠᠭᠠ ᠲᠣᠭᠠ ᠬᠡᠳᠦ ᠣᠯᠠᠨ ᠂ ᠨᠢᠭᠤᠴᠠ ᠺᠣᠳ᠋ ᠣᠷᠣᠭᠤᠯᠤᠭᠠᠷᠠᠢ ᠃</translation> -+ <translation type="vanished">%1 ᠢᠯᠠᠭᠳᠠᠭᠰᠠᠨ ᠲᠤᠷᠰᠢᠬᠤ ᠤᠳᠠᠭᠠ ᠲᠣᠭᠠ ᠬᠡᠳᠦ ᠣᠯᠠᠨ ᠂ ᠨᠢᠭᠤᠴᠠ ᠺᠣᠳ᠋ ᠣᠷᠣᠭᠤᠯᠤᠭᠠᠷᠠᠢ ᠃</translation> - </message> - <message> -- <location filename="../src/bioauthwidget.cpp" line="102"/> - <source>%1 authentication failure,there are still %2 remaining opportunities</source> -- <translation>%1 ᠪᠡᠶᠡᠶ᠋ᠢᠨ ᠬᠢᠷᠢᠶ᠋ᠢᠨ ᠰᠢᠯᠭᠠᠨ ᠪᠠᠲᠤᠯᠠᠯᠲᠠ ᠢᠯᠠᠭᠳᠠᠪᠠ ᠂ ᠮᠥᠨ %2 ᠦᠯᠡᠳᠡᠬᠦ ᠲᠣᠬᠢᠶᠠᠯ ᠪᠣᠢ</translation> -+ <translation type="vanished">%1 ᠪᠡᠶᠡᠶ᠋ᠢᠨ ᠬᠢᠷᠢᠶ᠋ᠢᠨ ᠰᠢᠯᠭᠠᠨ ᠪᠠᠲᠤᠯᠠᠯᠲᠠ ᠢᠯᠠᠭᠳᠠᠪᠠ ᠂ ᠮᠥᠨ %2 ᠦᠯᠡᠳᠡᠬᠦ ᠲᠣᠬᠢᠶᠠᠯ ᠪᠣᠢ</translation> - </message> - <message> -- <location filename="../src/bioauthwidget.cpp" line="226"/> - <source>Please use wechat to scan the code</source> -- <translation>ᠸᠢᠴᠠᠲᠢ᠋ᠶ᠋ᠠᠷ ᠦᠰᠦᠭ ᠰᠢᠷᠪᠢᠬᠦ ᠪᠣᠯᠪᠠᠤ</translation> -+ <translation type="vanished">ᠸᠢᠴᠠᠲᠢ᠋ᠶ᠋ᠠᠷ ᠦᠰᠦᠭ ᠰᠢᠷᠪᠢᠬᠦ ᠪᠣᠯᠪᠠᠤ</translation> - </message> - </context> - <context> - <name>BioDevices</name> - <message> -- <location filename="../src/biodevices.cpp" line="78"/> - <source>Unplugging of %1 device detected</source> -- <translation>%1 ᠲᠥᠬᠥᠭᠡᠷᠦᠮᠵᠢᠶ᠋ᠢ ᠰᠤᠭᠤᠯᠵᠤ ᠭᠠᠷᠭᠠᠨ ᠠ</translation> -+ <translation type="vanished">%1 ᠲᠥᠬᠥᠭᠡᠷᠦᠮᠵᠢᠶ᠋ᠢ ᠰᠤᠭᠤᠯᠵᠤ ᠭᠠᠷᠭᠠᠨ ᠠ</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="88"/> - <source>%1 device insertion detected</source> -- <translation>%1 ᠲᠥᠬᠥᠭᠡᠷᠦᠮᠵᠢ ᠬᠠᠪᠴᠢᠭᠤᠯᠤᠭᠰᠠᠨᠢ᠋ ᠪᠠᠢᠴᠠᠭᠠᠨ ᠣᠯᠪᠠ</translation> -+ <translation type="vanished">%1 ᠲᠥᠬᠥᠭᠡᠷᠦᠮᠵᠢ ᠬᠠᠪᠴᠢᠭᠤᠯᠤᠭᠰᠠᠨᠢ᠋ ᠪᠠᠢᠴᠠᠭᠠᠨ ᠣᠯᠪᠠ</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="97"/> - <source>ukui-biometric-manager</source> -- <translation>ᠠᠮᠢᠳᠤ ᠪᠣᠳᠠᠰᠤ᠋ᠨ ᠣᠨᠴᠠᠯᠢᠭ ᠬᠠᠮᠢᠶᠠᠷᠤᠯᠲᠠᠶ᠋ᠢᠨ ᠪᠠᠭᠠᠵᠢ</translation> -+ <translation type="vanished">ᠠᠮᠢᠳᠤ ᠪᠣᠳᠠᠰᠤ᠋ᠨ ᠣᠨᠴᠠᠯᠢᠭ ᠬᠠᠮᠢᠶᠠᠷᠤᠯᠲᠠᠶ᠋ᠢᠨ ᠪᠠᠭᠠᠵᠢ</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="100"/> - <source>biometric</source> -- <translation>ᠠᠮᠢᠳᠤ ᠪᠣᠳᠠᠰᠤ᠋ᠨ ᠣᠨᠴᠠᠯᠢᠭ</translation> -+ <translation type="vanished">ᠠᠮᠢᠳᠤ ᠪᠣᠳᠠᠰᠤ᠋ᠨ ᠣᠨᠴᠠᠯᠢᠭ</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="647"/> - <source>FingerPrint</source> -- <translation>ᠬᠤᠷᠤᠭᠤᠨ ᠬᠡ</translation> -+ <translation type="vanished">ᠬᠤᠷᠤᠭᠤᠨ ᠬᠡ</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="649"/> - <source>FingerVein</source> -- <translation>ᠬᠤᠷᠤᠭᠤᠨ ᠨᠠᠮᠵᠢᠭᠤᠨ ᠰᠤᠳᠠᠰᠤ</translation> -+ <translation type="vanished">ᠬᠤᠷᠤᠭᠤᠨ ᠨᠠᠮᠵᠢᠭᠤᠨ ᠰᠤᠳᠠᠰᠤ</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="651"/> - <source>Iris</source> -- <translation>ᠰᠣᠯᠣᠩᠭᠠ ᠪᠦᠷᠬᠦᠭᠦᠯ</translation> -+ <translation type="vanished">ᠰᠣᠯᠣᠩᠭᠠ ᠪᠦᠷᠬᠦᠭᠦᠯ</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="653"/> - <source>Face</source> -- <translation>ᠬᠥᠮᠦᠨᠦ᠌ ᠨᠢᠭᠤᠷ ᠲᠠᠨᠢᠬᠤ</translation> -+ <translation type="vanished">ᠬᠥᠮᠦᠨᠦ᠌ ᠨᠢᠭᠤᠷ ᠲᠠᠨᠢᠬᠤ</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="655"/> - <source>VoicePrint</source> -- <translation>ᠳᠠᠭᠤᠨ ᠡᠷᠢᠶᠡᠨ</translation> -+ <translation type="vanished">ᠳᠠᠭᠤᠨ ᠡᠷᠢᠶᠡᠨ</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="657"/> - <source>ukey</source> -- <translation>ᠠᠶᠤᠯᠭᠦᠢ ᠨᠢᠭᠤᠴᠠ ᠲᠦᠯᠬᠢᠭᠦᠷ</translation> -+ <translation type="vanished">ᠠᠶᠤᠯᠭᠦᠢ ᠨᠢᠭᠤᠴᠠ ᠲᠦᠯᠬᠢᠭᠦᠷ</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="659"/> - <source>QRCode</source> -- <translation>ᠬᠣᠶᠠᠷ ᠬᠡᠮᠵᠢᠯᠲᠦ ᠺᠣᠳ᠋</translation> -+ <translation type="vanished">ᠬᠣᠶᠠᠷ ᠬᠡᠮᠵᠢᠯᠲᠦ ᠺᠣᠳ᠋</translation> - </message> - <message> - <source>Wechat</source> -@@ -115,11 +93,6 @@ - </context> - <context> - <name>BioDevicesWidget</name> -- <message> -- <location filename="../src/biodeviceswidget.ui" line="14"/> -- <source>Form</source> -- <translation></translation> -- </message> - <message> - <source>Device types:</source> - <translation type="vanished">设备类型:</translation> -@@ -140,14 +113,12 @@ - <context> - <name>LoginOptionsWidget</name> - <message> -- <location filename="../src/loginoptionswidget.cpp" line="61"/> - <source>Login Options</source> -- <translation>ᠲᠡᠮᠳᠡᠭᠯᠡᠬᠦ ᠰᠤᠩᠭᠤᠭᠳᠠᠬᠤᠨ</translation> -+ <translation type="vanished">ᠲᠡᠮᠳᠡᠭᠯᠡᠬᠦ ᠰᠤᠩᠭᠤᠭᠳᠠᠬᠤᠨ</translation> - </message> - <message> -- <location filename="../src/loginoptionswidget.cpp" line="294"/> - <source>Password</source> -- <translation>ᠨᠢᠭᠤᠴᠠ ᠺᠣᠳ᠋</translation> -+ <translation type="vanished">ᠨᠢᠭᠤᠴᠠ ᠺᠣᠳ᠋</translation> - </message> - <message> - <source>Wechat</source> -@@ -180,5 +151,137 @@ - <source>VoicePrint</source> - <translation type="vanished">声纹</translation> - </message> -+ <message> -+ <location filename="../src/main.cpp" line="126"/> -+ <source>Enter the ukey password</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="150"/> -+ <source>Try it again</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="152"/> -+ <source>Use other Devices</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="153"/> -+ <source>Cancel</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="162"/> -+ <source>Choose the option</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="184"/> -+ <location filename="../src/main.cpp" line="219"/> -+ <location filename="../src/main.cpp" line="228"/> -+ <source>Invaild response "</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="184"/> -+ <location filename="../src/main.cpp" line="219"/> -+ <location filename="../src/main.cpp" line="228"/> -+ <source>authentication will be canceld</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="185"/> -+ <location filename="../src/main.cpp" line="220"/> -+ <location filename="../src/main.cpp" line="229"/> -+ <location filename="../src/main.cpp" line="408"/> -+ <source>AUTHENTICATION CANCELED</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="196"/> -+ <source>=== BIOMETRIC DEVICES ===</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="207"/> -+ <source>Choose the device</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="260"/> -+ <source>Sevice Name</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="261"/> -+ <source>DISPLAY env</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="262"/> -+ <source>User</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="263"/> -+ <source>Display debug information</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="264"/> -+ <source>Device short name</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="306"/> -+ <source>UKEY AUTHENTICATION</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="308"/> -+ <source>BIOMETRIC AUTHENTICATION</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="310"/> -+ <source>Press Q or Esc to cancel</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="330"/> -+ <source>BIOMETRIC AUTHENTICATION IS CLOSED</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="334"/> -+ <source>AUTHENTICATION SUCCESS</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="338"/> -+ <source>AUTHENTICATION FAILED</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="348"/> -+ <source>Failed to verify %1, you still have %2 verification opportunities</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="350"/> -+ <source>Unable to verify %1, please enter password.</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="386"/> -+ <source>AUTHENTICATION END</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="388"/> -+ <source>BIOMETRIC AUTHENTICATION END</source> -+ <translation type="unfinished"></translation> -+ </message> - </context> - </TS> -diff --git a/bioauth-bin/i18n_ts/pt.ts b/bioauth-bin/i18n_ts/pt.ts -index a522a78..602680d 100644 ---- a/bioauth-bin/i18n_ts/pt.ts -+++ b/bioauth-bin/i18n_ts/pt.ts -@@ -110,5 +110,21 @@ - <source>Unable to verify %1, please enter password.</source> - <translation type="unfinished"></translation> - </message> -+ <message> -+ <source>Enter the ukey password</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <source>UKEY AUTHENTICATION</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <source>BIOMETRIC AUTHENTICATION IS CLOSED</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <source>AUTHENTICATION END</source> -+ <translation type="unfinished"></translation> -+ </message> - </context> - </TS> -diff --git a/bioauth-bin/i18n_ts/ru.ts b/bioauth-bin/i18n_ts/ru.ts -index 8636509..47e674f 100644 ---- a/bioauth-bin/i18n_ts/ru.ts -+++ b/bioauth-bin/i18n_ts/ru.ts -@@ -110,5 +110,21 @@ - <source>Unable to verify %1, please enter password.</source> - <translation type="unfinished"></translation> - </message> -+ <message> -+ <source>Enter the ukey password</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <source>UKEY AUTHENTICATION</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <source>BIOMETRIC AUTHENTICATION IS CLOSED</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <source>AUTHENTICATION END</source> -+ <translation type="unfinished"></translation> -+ </message> - </context> - </TS> -diff --git a/bioauth-bin/i18n_ts/tr.ts b/bioauth-bin/i18n_ts/tr.ts -index f48b7b9..9c79ff1 100644 ---- a/bioauth-bin/i18n_ts/tr.ts -+++ b/bioauth-bin/i18n_ts/tr.ts -@@ -27,114 +27,134 @@ - <context> - <name>QObject</name> - <message> -- <location filename="../src/main.cpp" line="100"/> -+ <location filename="../src/main.cpp" line="126"/> -+ <source>Enter the ukey password</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="150"/> - <source>Try it again</source> - <translation>Yeniden Dene</translation> - </message> - <message> -- <location filename="../src/main.cpp" line="102"/> -+ <location filename="../src/main.cpp" line="152"/> - <source>Use other Devices</source> - <translation>Diğer Cihazları Kullan</translation> - </message> - <message> -- <location filename="../src/main.cpp" line="103"/> -+ <location filename="../src/main.cpp" line="153"/> - <source>Cancel</source> - <translation>İptal</translation> - </message> - <message> -- <location filename="../src/main.cpp" line="112"/> -+ <location filename="../src/main.cpp" line="162"/> - <source>Choose the option</source> - <translation>Seçeneği seçin</translation> - </message> - <message> -- <location filename="../src/main.cpp" line="134"/> -- <location filename="../src/main.cpp" line="169"/> -- <location filename="../src/main.cpp" line="178"/> -+ <location filename="../src/main.cpp" line="184"/> -+ <location filename="../src/main.cpp" line="219"/> -+ <location filename="../src/main.cpp" line="228"/> - <source>Invaild response "</source> - <translation>Geçersiz cevap "</translation> - </message> - <message> -- <location filename="../src/main.cpp" line="134"/> -- <location filename="../src/main.cpp" line="169"/> -- <location filename="../src/main.cpp" line="178"/> -+ <location filename="../src/main.cpp" line="184"/> -+ <location filename="../src/main.cpp" line="219"/> -+ <location filename="../src/main.cpp" line="228"/> - <source>authentication will be canceld</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/main.cpp" line="135"/> -- <location filename="../src/main.cpp" line="170"/> -- <location filename="../src/main.cpp" line="179"/> -- <location filename="../src/main.cpp" line="315"/> -+ <location filename="../src/main.cpp" line="185"/> -+ <location filename="../src/main.cpp" line="220"/> -+ <location filename="../src/main.cpp" line="229"/> -+ <location filename="../src/main.cpp" line="408"/> - <source>AUTHENTICATION CANCELED</source> - <translation>KİMLİK DOĞRULAMA</translation> - </message> - <message> -- <location filename="../src/main.cpp" line="146"/> -+ <location filename="../src/main.cpp" line="196"/> - <source>=== BIOMETRIC DEVICES ===</source> - <translation>=== BİYOMETRİK CİHAZLAR ===</translation> - </message> - <message> -- <location filename="../src/main.cpp" line="157"/> -+ <location filename="../src/main.cpp" line="207"/> - <source>Choose the device</source> - <translation>Cihazı seçin</translation> - </message> - <message> -- <location filename="../src/main.cpp" line="210"/> -+ <location filename="../src/main.cpp" line="260"/> - <source>Sevice Name</source> - <translation>Servis Adı</translation> - </message> - <message> -- <location filename="../src/main.cpp" line="211"/> -+ <location filename="../src/main.cpp" line="261"/> - <source>DISPLAY env</source> - <translation>EKRAN env</translation> - </message> - <message> -- <location filename="../src/main.cpp" line="212"/> -+ <location filename="../src/main.cpp" line="262"/> - <source>User</source> - <translation type="unfinished">Kullanıcı</translation> - </message> - <message> -- <location filename="../src/main.cpp" line="213"/> -+ <location filename="../src/main.cpp" line="263"/> - <source>Display debug information</source> - <translation>Hata ayıklama bilgilerini görüntüle</translation> - </message> - <message> -- <location filename="../src/main.cpp" line="214"/> -+ <location filename="../src/main.cpp" line="264"/> - <source>Device short name</source> - <translation type="unfinished">Cihaz kısa adı</translation> - </message> - <message> -- <location filename="../src/main.cpp" line="249"/> -+ <location filename="../src/main.cpp" line="306"/> -+ <source>UKEY AUTHENTICATION</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="308"/> - <source>BIOMETRIC AUTHENTICATION</source> - <translation>BİYOMETRİK KİMLİK DOĞRULAMA</translation> - </message> - <message> -- <location filename="../src/main.cpp" line="251"/> -+ <location filename="../src/main.cpp" line="310"/> - <source>Press Q or Esc to cancel</source> - <translation>İptal etmek için Q veya Esc tuşuna basın</translation> - </message> - <message> -- <location filename="../src/main.cpp" line="263"/> -+ <location filename="../src/main.cpp" line="330"/> -+ <source>BIOMETRIC AUTHENTICATION IS CLOSED</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="334"/> - <source>AUTHENTICATION SUCCESS</source> - <translation>KİMLİK DOĞRULAMA</translation> - </message> - <message> -- <location filename="../src/main.cpp" line="267"/> -+ <location filename="../src/main.cpp" line="338"/> - <source>AUTHENTICATION FAILED</source> - <translation>KİMLİK DOĞRULAMA BAŞARISIZ OLDU</translation> - </message> - <message> -- <location filename="../src/main.cpp" line="277"/> -+ <location filename="../src/main.cpp" line="348"/> - <source>Failed to verify %1, you still have %2 verification opportunities</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/main.cpp" line="279"/> -+ <location filename="../src/main.cpp" line="350"/> - <source>Unable to verify %1, please enter password.</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/main.cpp" line="302"/> -+ <location filename="../src/main.cpp" line="386"/> -+ <source>AUTHENTICATION END</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="388"/> - <source>BIOMETRIC AUTHENTICATION END</source> - <translation>BİYOMETRİK KİMLİK DOĞRULAMA SONU</translation> - </message> -diff --git a/bioauth-bin/i18n_ts/ug.ts b/bioauth-bin/i18n_ts/ug.ts -index 99e8e3f..b766cfe 100644 ---- a/bioauth-bin/i18n_ts/ug.ts -+++ b/bioauth-bin/i18n_ts/ug.ts -@@ -3,20 +3,13 @@ - <TS version="2.1" language="ug"> - <context> - <name>BioAuthWidget</name> -- <message> -- <location filename="../src/bioauthwidget.ui" line="14"/> -- <source>Form</source> -- <translation></translation> -- </message> - <message> - <source>More</source> - <translation type="vanished">更多</translation> - </message> - <message> -- <location filename="../src/bioauthwidget.ui" line="146"/> -- <location filename="../src/bioauthwidget.cpp" line="41"/> - <source>Retry</source> -- <translation>قايتا سىناپ بىقىڭ</translation> -+ <translation type="vanished">قايتا سىناپ بىقىڭ</translation> - </message> - <message> - <source>Too many unsuccessful attempts,please enter password.</source> -@@ -28,85 +21,70 @@ - </message> - <message> - <source>Password</source> -- <translation>مەخپىي نومۇر</translation> -+ <translation type="vanished">مەخپىي نومۇر</translation> - </message> - <message> - <source>Current Device: </source> - <translation type="vanished">当前设备:</translation> - </message> - <message> -- <location filename="../src/bioauthwidget.cpp" line="96"/> -- <location filename="../src/bioauthwidget.cpp" line="212"/> - <source>%1 too many unsuccessful attempts,please enter password.</source> -- <translation>1-نومۇر مەغلۇپ بولغان سىناق قېتىم سانى زىيادە كۆپ، مەخپىي نومۇرنى كىرگۈزۈڭ</translation> -+ <translation type="vanished">1-نومۇر مەغلۇپ بولغان سىناق قېتىم سانى زىيادە كۆپ، مەخپىي نومۇرنى كىرگۈزۈڭ</translation> - </message> - <message> -- <location filename="../src/bioauthwidget.cpp" line="102"/> - <source>%1 authentication failure,there are still %2 remaining opportunities</source> -- <translation>بىر كىملىك دەلىللەش مەغلۇپ بولدى، يەنىلا ٪2 ئېشىپ قالغان پۇرسەت بار</translation> -+ <translation type="vanished">بىر كىملىك دەلىللەش مەغلۇپ بولدى، يەنىلا ٪2 ئېشىپ قالغان پۇرسەت بار</translation> - </message> - <message> -- <location filename="../src/bioauthwidget.cpp" line="226"/> - <source>Please use wechat to scan the code</source> -- <translation>ئۈندىداردا كود سۈپۈرۈڭ</translation> -+ <translation type="vanished">ئۈندىداردا كود سۈپۈرۈڭ</translation> - </message> - </context> - <context> - <name>BioDevices</name> - <message> -- <location filename="../src/biodevices.cpp" line="78"/> - <source>Unplugging of %1 device detected</source> -- <translation>تەكشۈرۈپ بايقىغان 1 ئۈسكۈنىنى تارتىپ چىقارماق</translation> -+ <translation type="vanished">تەكشۈرۈپ بايقىغان 1 ئۈسكۈنىنى تارتىپ چىقارماق</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="88"/> - <source>%1 device insertion detected</source> -- <translation>٪1 ئۈسكۈنىنىڭ كىرگۈزۈلگەنلىكىنى تەكشۈرۈپ چىقماق</translation> -+ <translation type="vanished">٪1 ئۈسكۈنىنىڭ كىرگۈزۈلگەنلىكىنى تەكشۈرۈپ چىقماق</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="97"/> - <source>ukui-biometric-manager</source> -- <translation>بىئولوگىيەلىك ئالاھىدىلىك باشقۇرۇش قورالى</translation> -+ <translation type="vanished">بىئولوگىيەلىك ئالاھىدىلىك باشقۇرۇش قورالى</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="100"/> - <source>biometric</source> -- <translation>بىئولوگىيەلىك ئالاھىدىلىك</translation> -+ <translation type="vanished">بىئولوگىيەلىك ئالاھىدىلىك</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="647"/> - <source>FingerPrint</source> -- <translation>بارماق ئىزى</translation> -+ <translation type="vanished">بارماق ئىزى</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="649"/> - <source>FingerVein</source> -- <translation>ۋېنانى كۆرسىتىدۇ</translation> -+ <translation type="vanished">ۋېنانى كۆرسىتىدۇ</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="651"/> - <source>Iris</source> -- <translation>رەڭدار پەردە</translation> -+ <translation type="vanished">رەڭدار پەردە</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="653"/> - <source>Face</source> -- <translation>ئادەم يۈزىنى پەرقلەندۈرۈش</translation> -+ <translation type="vanished">ئادەم يۈزىنى پەرقلەندۈرۈش</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="655"/> - <source>VoicePrint</source> -- <translation>ئاۋاز سىزىقى</translation> -+ <translation type="vanished">ئاۋاز سىزىقى</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="657"/> - <source>ukey</source> -- <translation>بىخەتەر ئاچقۇچ</translation> -+ <translation type="vanished">بىخەتەر ئاچقۇچ</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="659"/> - <source>QRCode</source> -- <translation>ئىككى ئۆلچەملىك كود</translation> -+ <translation type="vanished">ئىككى ئۆلچەملىك كود</translation> - </message> - <message> - <source>Wechat</source> -@@ -115,11 +93,6 @@ - </context> - <context> - <name>BioDevicesWidget</name> -- <message> -- <location filename="../src/biodeviceswidget.ui" line="14"/> -- <source>Form</source> -- <translation></translation> -- </message> - <message> - <source>Device types:</source> - <translation type="vanished">设备类型:</translation> -@@ -140,14 +113,12 @@ - <context> - <name>LoginOptionsWidget</name> - <message> -- <location filename="../src/loginoptionswidget.cpp" line="61"/> - <source>Login Options</source> -- <translation>تاللاش تۈرىگە كىرمەك</translation> -+ <translation type="vanished">تاللاش تۈرىگە كىرمەك</translation> - </message> - <message> -- <location filename="../src/loginoptionswidget.cpp" line="294"/> - <source>Password</source> -- <translation>مەخپىي نومۇر</translation> -+ <translation type="vanished">مەخپىي نومۇر</translation> - </message> - <message> - <source>Wechat</source> -@@ -180,5 +151,137 @@ - <source>VoicePrint</source> - <translation type="vanished">声纹</translation> - </message> -+ <message> -+ <location filename="../src/main.cpp" line="126"/> -+ <source>Enter the ukey password</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="150"/> -+ <source>Try it again</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="152"/> -+ <source>Use other Devices</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="153"/> -+ <source>Cancel</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="162"/> -+ <source>Choose the option</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="184"/> -+ <location filename="../src/main.cpp" line="219"/> -+ <location filename="../src/main.cpp" line="228"/> -+ <source>Invaild response "</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="184"/> -+ <location filename="../src/main.cpp" line="219"/> -+ <location filename="../src/main.cpp" line="228"/> -+ <source>authentication will be canceld</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="185"/> -+ <location filename="../src/main.cpp" line="220"/> -+ <location filename="../src/main.cpp" line="229"/> -+ <location filename="../src/main.cpp" line="408"/> -+ <source>AUTHENTICATION CANCELED</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="196"/> -+ <source>=== BIOMETRIC DEVICES ===</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="207"/> -+ <source>Choose the device</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="260"/> -+ <source>Sevice Name</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="261"/> -+ <source>DISPLAY env</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="262"/> -+ <source>User</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="263"/> -+ <source>Display debug information</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="264"/> -+ <source>Device short name</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="306"/> -+ <source>UKEY AUTHENTICATION</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="308"/> -+ <source>BIOMETRIC AUTHENTICATION</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="310"/> -+ <source>Press Q or Esc to cancel</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="330"/> -+ <source>BIOMETRIC AUTHENTICATION IS CLOSED</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="334"/> -+ <source>AUTHENTICATION SUCCESS</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="338"/> -+ <source>AUTHENTICATION FAILED</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="348"/> -+ <source>Failed to verify %1, you still have %2 verification opportunities</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="350"/> -+ <source>Unable to verify %1, please enter password.</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="386"/> -+ <source>AUTHENTICATION END</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="388"/> -+ <source>BIOMETRIC AUTHENTICATION END</source> -+ <translation type="unfinished"></translation> -+ </message> - </context> - </TS> -diff --git a/bioauth-bin/i18n_ts/zh_CN.ts b/bioauth-bin/i18n_ts/zh_CN.ts -index 3361365..1193c75 100644 ---- a/bioauth-bin/i18n_ts/zh_CN.ts -+++ b/bioauth-bin/i18n_ts/zh_CN.ts -@@ -4,12 +4,14 @@ - <context> - <name>QObject</name> - <message> -+ <location filename="../src/main.cpp" line="126"/> - <source>Enter the ukey password</source> - <translation>输入ukey密码</translation> - </message> - <message> - <location filename="../src/main.cpp" line="110"/> -- <source>Enter the ukey password</source> -+ <source>Enter the ukey password -+</source> - <translation>输入ukey密码\n</translation> - </message> - <message> -@@ -18,124 +20,124 @@ - <translation>再试一次</translation> - </message> - <message> -- <location filename="../src/main.cpp" line="102"/> -+ <location filename="../src/main.cpp" line="152"/> - <source>Use other Devices</source> - <translation>使用其他设备</translation> - </message> - <message> -- <location filename="../src/main.cpp" line="103"/> -+ <location filename="../src/main.cpp" line="153"/> - <source>Cancel</source> - <translation>取消</translation> - </message> - <message> -- <location filename="../src/main.cpp" line="112"/> -+ <location filename="../src/main.cpp" line="162"/> - <source>Choose the option</source> - <translation>选择选项</translation> - </message> - <message> -- <location filename="../src/main.cpp" line="134"/> -- <location filename="../src/main.cpp" line="169"/> -- <location filename="../src/main.cpp" line="178"/> -+ <location filename="../src/main.cpp" line="184"/> -+ <location filename="../src/main.cpp" line="219"/> -+ <location filename="../src/main.cpp" line="228"/> - <source>Invaild response "</source> - <translation>不能识别的响应 "</translation> - </message> - <message> -- <location filename="../src/main.cpp" line="134"/> -- <location filename="../src/main.cpp" line="169"/> -- <location filename="../src/main.cpp" line="178"/> -+ <location filename="../src/main.cpp" line="184"/> -+ <location filename="../src/main.cpp" line="219"/> -+ <location filename="../src/main.cpp" line="228"/> - <source>authentication will be canceld</source> - <translation>认证将要被取消</translation> - </message> - <message> -- <location filename="../src/main.cpp" line="135"/> -- <location filename="../src/main.cpp" line="170"/> -- <location filename="../src/main.cpp" line="179"/> -- <location filename="../src/main.cpp" line="323"/> -+ <location filename="../src/main.cpp" line="185"/> -+ <location filename="../src/main.cpp" line="220"/> -+ <location filename="../src/main.cpp" line="229"/> -+ <location filename="../src/main.cpp" line="408"/> - <source>AUTHENTICATION CANCELED</source> - <translation>认证被取消</translation> - </message> - <message> -- <location filename="../src/main.cpp" line="146"/> -+ <location filename="../src/main.cpp" line="196"/> - <source>=== BIOMETRIC DEVICES ===</source> - <translation>=== 生物识别设备 ===</translation> - </message> - <message> -- <location filename="../src/main.cpp" line="157"/> -+ <location filename="../src/main.cpp" line="207"/> - <source>Choose the device</source> - <translation>选择设备</translation> - </message> - <message> -- <location filename="../src/main.cpp" line="210"/> -+ <location filename="../src/main.cpp" line="260"/> - <source>Sevice Name</source> - <translation></translation> - </message> - <message> -- <location filename="../src/main.cpp" line="211"/> -+ <location filename="../src/main.cpp" line="261"/> - <source>DISPLAY env</source> - <translation></translation> - </message> - <message> -- <location filename="../src/main.cpp" line="212"/> -+ <location filename="../src/main.cpp" line="262"/> - <source>User</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/main.cpp" line="213"/> -+ <location filename="../src/main.cpp" line="263"/> - <source>Display debug information</source> - <translation></translation> - </message> - <message> -- <location filename="../src/main.cpp" line="214"/> -+ <location filename="../src/main.cpp" line="264"/> - <source>Device short name</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/main.cpp" line="282"/> -+ <location filename="../src/main.cpp" line="306"/> - <source>UKEY AUTHENTICATION</source> - <translation>ukey认证</translation> - </message> - <message> -- <location filename="../src/main.cpp" line="284"/> -+ <location filename="../src/main.cpp" line="308"/> - <source>BIOMETRIC AUTHENTICATION</source> - <translation>生物识别认证</translation> - </message> - <message> -- <location filename="../src/main.cpp" line="251"/> -+ <location filename="../src/main.cpp" line="310"/> - <source>Press Q or Esc to cancel</source> - <translation>按Q或者Esc取消</translation> - </message> - <message> -- <location filename="../src/main.cpp" line="267"/> -+ <location filename="../src/main.cpp" line="330"/> - <source>BIOMETRIC AUTHENTICATION IS CLOSED</source> - <translation>生物识别认证已关闭</translation> - </message> - <message> -- <location filename="../src/main.cpp" line="271"/> -+ <location filename="../src/main.cpp" line="334"/> - <source>AUTHENTICATION SUCCESS</source> - <translation>认证成功</translation> - </message> - <message> -- <location filename="../src/main.cpp" line="267"/> -+ <location filename="../src/main.cpp" line="338"/> - <source>AUTHENTICATION FAILED</source> - <translation>认证失败</translation> - </message> - <message> -- <location filename="../src/main.cpp" line="277"/> -+ <location filename="../src/main.cpp" line="348"/> - <source>Failed to verify %1, you still have %2 verification opportunities</source> - <translation>验证%1失败,您还有%2次尝试机会</translation> - </message> - <message> -- <location filename="../src/main.cpp" line="279"/> -+ <location filename="../src/main.cpp" line="350"/> - <source>Unable to verify %1, please enter password.</source> - <translation>无法验证%1,请输入密码.</translation> - </message> - <message> -- <location filename="../src/main.cpp" line="357"/> -+ <location filename="../src/main.cpp" line="386"/> - <source>AUTHENTICATION END</source> - <translation>认证结束</translation> - </message> - <message> -- <location filename="../src/main.cpp" line="359"/> -+ <location filename="../src/main.cpp" line="388"/> - <source>BIOMETRIC AUTHENTICATION END</source> - <translation>生物识别认证结束</translation> - </message> -diff --git a/bioauth-bin/i18n_ts/zh_HK.ts b/bioauth-bin/i18n_ts/zh_HK.ts -index d71eed9..24be1c3 100644 ---- a/bioauth-bin/i18n_ts/zh_HK.ts -+++ b/bioauth-bin/i18n_ts/zh_HK.ts -@@ -3,20 +3,13 @@ - <TS version="2.1" language="zh_Hant"> - <context> - <name>BioAuthWidget</name> -- <message> -- <location filename="../src/bioauthwidget.ui" line="14"/> -- <source>Form</source> -- <translation></translation> -- </message> - <message> - <source>More</source> - <translation type="vanished">更多</translation> - </message> - <message> -- <location filename="../src/bioauthwidget.ui" line="146"/> -- <location filename="../src/bioauthwidget.cpp" line="41"/> - <source>Retry</source> -- <translation>重試</translation> -+ <translation type="vanished">重試</translation> - </message> - <message> - <source>Too many unsuccessful attempts,please enter password.</source> -@@ -28,85 +21,70 @@ - </message> - <message> - <source>Password</source> -- <translation>密碼</translation> -+ <translation type="vanished">密碼</translation> - </message> - <message> - <source>Current Device: </source> - <translation type="vanished">当前设备:</translation> - </message> - <message> -- <location filename="../src/bioauthwidget.cpp" line="96"/> -- <location filename="../src/bioauthwidget.cpp" line="212"/> - <source>%1 too many unsuccessful attempts,please enter password.</source> -- <translation>%1失敗的嘗試次數太多,請輸入密碼</translation> -+ <translation type="vanished">%1失敗的嘗試次數太多,請輸入密碼</translation> - </message> - <message> -- <location filename="../src/bioauthwidget.cpp" line="102"/> - <source>%1 authentication failure,there are still %2 remaining opportunities</source> -- <translation>%1 身份驗證失敗,仍有 %2 個剩餘機會</translation> -+ <translation type="vanished">%1 身份驗證失敗,仍有 %2 個剩餘機會</translation> - </message> - <message> -- <location filename="../src/bioauthwidget.cpp" line="226"/> - <source>Please use wechat to scan the code</source> -- <translation>請使用微信掃碼</translation> -+ <translation type="vanished">請使用微信掃碼</translation> - </message> - </context> - <context> - <name>BioDevices</name> - <message> -- <location filename="../src/biodevices.cpp" line="78"/> - <source>Unplugging of %1 device detected</source> -- <translation>檢測到 %1 設備的拔出</translation> -+ <translation type="vanished">檢測到 %1 設備的拔出</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="88"/> - <source>%1 device insertion detected</source> -- <translation>檢測到 %1 個設備插入</translation> -+ <translation type="vanished">檢測到 %1 個設備插入</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="97"/> - <source>ukui-biometric-manager</source> -- <translation>生物特徵管理工具</translation> -+ <translation type="vanished">生物特徵管理工具</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="100"/> - <source>biometric</source> -- <translation>生物特徵管理工具</translation> -+ <translation type="vanished">生物特徵管理工具</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="647"/> - <source>FingerPrint</source> -- <translation>指紋</translation> -+ <translation type="vanished">指紋</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="649"/> - <source>FingerVein</source> -- <translation>指靜脈</translation> -+ <translation type="vanished">指靜脈</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="651"/> - <source>Iris</source> -- <translation>虹膜</translation> -+ <translation type="vanished">虹膜</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="653"/> - <source>Face</source> -- <translation>人臉</translation> -+ <translation type="vanished">人臉</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="655"/> - <source>VoicePrint</source> -- <translation>聲紋</translation> -+ <translation type="vanished">聲紋</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="657"/> - <source>ukey</source> -- <translation>安全金鑰</translation> -+ <translation type="vanished">安全金鑰</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="659"/> - <source>QRCode</source> -- <translation>微信掃碼</translation> -+ <translation type="vanished">微信掃碼</translation> - </message> - <message> - <source>Wechat</source> -@@ -115,11 +93,6 @@ - </context> - <context> - <name>BioDevicesWidget</name> -- <message> -- <location filename="../src/biodeviceswidget.ui" line="14"/> -- <source>Form</source> -- <translation></translation> -- </message> - <message> - <source>Device types:</source> - <translation type="vanished">设备类型:</translation> -@@ -140,14 +113,12 @@ - <context> - <name>LoginOptionsWidget</name> - <message> -- <location filename="../src/loginoptionswidget.cpp" line="61"/> - <source>Login Options</source> -- <translation>登錄選項</translation> -+ <translation type="vanished">登錄選項</translation> - </message> - <message> -- <location filename="../src/loginoptionswidget.cpp" line="294"/> - <source>Password</source> -- <translation>密碼</translation> -+ <translation type="vanished">密碼</translation> - </message> - <message> - <source>Wechat</source> -@@ -180,5 +151,137 @@ - <source>VoicePrint</source> - <translation type="vanished">声纹</translation> - </message> -+ <message> -+ <location filename="../src/main.cpp" line="126"/> -+ <source>Enter the ukey password</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="150"/> -+ <source>Try it again</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="152"/> -+ <source>Use other Devices</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="153"/> -+ <source>Cancel</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="162"/> -+ <source>Choose the option</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="184"/> -+ <location filename="../src/main.cpp" line="219"/> -+ <location filename="../src/main.cpp" line="228"/> -+ <source>Invaild response "</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="184"/> -+ <location filename="../src/main.cpp" line="219"/> -+ <location filename="../src/main.cpp" line="228"/> -+ <source>authentication will be canceld</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="185"/> -+ <location filename="../src/main.cpp" line="220"/> -+ <location filename="../src/main.cpp" line="229"/> -+ <location filename="../src/main.cpp" line="408"/> -+ <source>AUTHENTICATION CANCELED</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="196"/> -+ <source>=== BIOMETRIC DEVICES ===</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="207"/> -+ <source>Choose the device</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="260"/> -+ <source>Sevice Name</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="261"/> -+ <source>DISPLAY env</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="262"/> -+ <source>User</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="263"/> -+ <source>Display debug information</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="264"/> -+ <source>Device short name</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="306"/> -+ <source>UKEY AUTHENTICATION</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="308"/> -+ <source>BIOMETRIC AUTHENTICATION</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="310"/> -+ <source>Press Q or Esc to cancel</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="330"/> -+ <source>BIOMETRIC AUTHENTICATION IS CLOSED</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="334"/> -+ <source>AUTHENTICATION SUCCESS</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="338"/> -+ <source>AUTHENTICATION FAILED</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="348"/> -+ <source>Failed to verify %1, you still have %2 verification opportunities</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="350"/> -+ <source>Unable to verify %1, please enter password.</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="386"/> -+ <source>AUTHENTICATION END</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/main.cpp" line="388"/> -+ <source>BIOMETRIC AUTHENTICATION END</source> -+ <translation type="unfinished"></translation> -+ </message> - </context> - </TS> -diff --git a/bioauth/i18n_ts/bo.ts b/bioauth/i18n_ts/bo.ts -index 085c291..39ffc1a 100644 ---- a/bioauth/i18n_ts/bo.ts -+++ b/bioauth/i18n_ts/bo.ts -@@ -34,52 +34,57 @@ - <context> - <name>BioDevices</name> - <message> -- <location filename="../src/biodevices.cpp" line="64"/> -+ <location filename="../src/biodevices.cpp" line="78"/> - <source>Unplugging of %1 device detected</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="74"/> -+ <location filename="../src/biodevices.cpp" line="88"/> - <source>%1 device insertion detected</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="83"/> -- <source>ukui-biometric-manager</source> -+ <location filename="../src/biodevices.cpp" line="97"/> -+ <source>Biometric Manager</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="86"/> -+ <location filename="../src/biodevices.cpp" line="100"/> - <source>biometric</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="457"/> -+ <location filename="../src/biodevices.cpp" line="700"/> - <source>FingerPrint</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="459"/> -+ <location filename="../src/biodevices.cpp" line="702"/> - <source>FingerVein</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="461"/> -+ <location filename="../src/biodevices.cpp" line="704"/> - <source>Iris</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="463"/> -+ <location filename="../src/biodevices.cpp" line="706"/> - <source>Face</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="465"/> -+ <location filename="../src/biodevices.cpp" line="708"/> - <source>VoicePrint</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="467"/> -+ <location filename="../src/biodevices.cpp" line="710"/> -+ <source>Ukey</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="712"/> - <source>QRCode</source> - <translation type="unfinished"></translation> - </message> -@@ -95,9 +100,14 @@ - <context> - <name>LoginOptionsWidget</name> - <message> -- <location filename="../src/loginoptionswidget.cpp" line="59"/> -+ <location filename="../src/loginoptionswidget.cpp" line="79"/> - <source>Login Options</source> - <translation type="unfinished"></translation> - </message> -+ <message> -+ <location filename="../src/loginoptionswidget.cpp" line="320"/> -+ <source>Password</source> -+ <translation type="unfinished"></translation> -+ </message> - </context> - </TS> -diff --git a/bioauth/i18n_ts/bo_CN.ts b/bioauth/i18n_ts/bo_CN.ts -index 4afb7e6..ee809cf 100644 ---- a/bioauth/i18n_ts/bo_CN.ts -+++ b/bioauth/i18n_ts/bo_CN.ts -@@ -75,7 +75,7 @@ - <translation>མཛུབ་མོའི་སྡོད་རྩ།</translation> - </message> - <message> -- <source>ukui-biometric-manager</source> -+ <source>Biometric Manager</source> - <translation>སྐྱེ་དངོས་ཁྱབ་རྟགས་དོ་དམ་ལག་ཆ།</translation> - </message> - <message> -@@ -83,8 +83,8 @@ - <translation>ཨང་ཀི་ཕྱག་པ།</translation> - </message> - <message> -- <source>ukey</source> -- <translation type="unfinished"></translation> -+ <source>Ukey</source> -+ <translation>བདེ་འཇགས་གསང་ལྡེ་</translation> - </message> - </context> - <context> -diff --git a/bioauth/i18n_ts/es.ts b/bioauth/i18n_ts/es.ts -index e687d2d..10574c3 100644 ---- a/bioauth/i18n_ts/es.ts -+++ b/bioauth/i18n_ts/es.ts -@@ -71,11 +71,15 @@ - <translation type="unfinished"></translation> - </message> - <message> -- <source>ukui-biometric-manager</source> -+ <source>QRCode</source> - <translation type="unfinished"></translation> - </message> - <message> -- <source>QRCode</source> -+ <source>Biometric Manager</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <source>Ukey</source> - <translation type="unfinished"></translation> - </message> - </context> -@@ -104,5 +108,9 @@ - <source>Login Options</source> - <translation type="unfinished"></translation> - </message> -+ <message> -+ <source>Password</source> -+ <translation type="unfinished">Contraseña</translation> -+ </message> - </context> - </TS> -diff --git a/bioauth/i18n_ts/fr.ts b/bioauth/i18n_ts/fr.ts -index 3961285..33ed54b 100644 ---- a/bioauth/i18n_ts/fr.ts -+++ b/bioauth/i18n_ts/fr.ts -@@ -71,11 +71,15 @@ - <translation type="unfinished"></translation> - </message> - <message> -- <source>ukui-biometric-manager</source> -+ <source>QRCode</source> - <translation type="unfinished"></translation> - </message> - <message> -- <source>QRCode</source> -+ <source>Biometric Manager</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <source>Ukey</source> - <translation type="unfinished"></translation> - </message> - </context> -@@ -104,5 +108,9 @@ - <source>Login Options</source> - <translation type="unfinished"></translation> - </message> -+ <message> -+ <source>Password</source> -+ <translation type="unfinished">Mot de passe</translation> -+ </message> - </context> - </TS> -diff --git a/bioauth/i18n_ts/mn.ts b/bioauth/i18n_ts/mn.ts -index b96b503..86e77c5 100644 ---- a/bioauth/i18n_ts/mn.ts -+++ b/bioauth/i18n_ts/mn.ts -@@ -65,7 +65,7 @@ - </message> - <message> - <location filename="../src/biodevices.cpp" line="97"/> -- <source>ukui-biometric-manager</source> -+ <source>Biometric Manager</source> - <translation>ᠠᠮᠢᠳᠤ ᠪᠣᠳᠠᠰᠤ᠋ᠨ ᠣᠨᠴᠠᠯᠢᠭ ᠬᠠᠮᠢᠶᠠᠷᠤᠯᠲᠠᠶ᠋ᠢᠨ ᠪᠠᠭᠠᠵᠢ</translation> - </message> - <message> -@@ -74,37 +74,41 @@ - <translation>ᠠᠮᠢᠳᠤ ᠪᠣᠳᠠᠰᠤ᠋ᠨ ᠣᠨᠴᠠᠯᠢᠭ</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="647"/> -+ <location filename="../src/biodevices.cpp" line="700"/> - <source>FingerPrint</source> - <translation>ᠬᠤᠷᠤᠭᠤᠨ ᠬᠡ</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="649"/> -+ <location filename="../src/biodevices.cpp" line="702"/> - <source>FingerVein</source> - <translation>ᠬᠤᠷᠤᠭᠤᠨ ᠨᠠᠮᠵᠢᠭᠤᠨ ᠰᠤᠳᠠᠰᠤ</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="651"/> -+ <location filename="../src/biodevices.cpp" line="704"/> - <source>Iris</source> - <translation>ᠰᠣᠯᠣᠩᠭᠠ ᠪᠦᠷᠬᠦᠭᠦᠯ</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="653"/> -+ <location filename="../src/biodevices.cpp" line="706"/> - <source>Face</source> - <translation>ᠬᠥᠮᠦᠨᠦ᠌ ᠨᠢᠭᠤᠷ ᠲᠠᠨᠢᠬᠤ</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="655"/> -+ <location filename="../src/biodevices.cpp" line="708"/> - <source>VoicePrint</source> - <translation>ᠳᠠᠭᠤᠨ ᠡᠷᠢᠶᠡᠨ</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="657"/> -- <source>ukey</source> -+ <location filename="../src/biodevices.cpp" line="710"/> -+ <source>Ukey</source> - <translation>ᠠᠶᠤᠯᠭᠦᠢ ᠨᠢᠭᠤᠴᠠ ᠲᠦᠯᠬᠢᠭᠦᠷ</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="659"/> -+ <source>ukey</source> -+ <translation type="vanished">ᠠᠶᠤᠯᠭᠦᠢ ᠨᠢᠭᠤᠴᠠ ᠲᠦᠯᠬᠢᠭᠦᠷ</translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="712"/> - <source>QRCode</source> - <translation>ᠬᠣᠶᠠᠷ ᠬᠡᠮᠵᠢᠯᠲᠦ ᠺᠣᠳ᠋</translation> - </message> -@@ -140,12 +144,12 @@ - <context> - <name>LoginOptionsWidget</name> - <message> -- <location filename="../src/loginoptionswidget.cpp" line="61"/> -+ <location filename="../src/loginoptionswidget.cpp" line="79"/> - <source>Login Options</source> - <translation>ᠲᠡᠮᠳᠡᠭᠯᠡᠬᠦ ᠰᠤᠩᠭᠤᠭᠳᠠᠬᠤᠨ</translation> - </message> - <message> -- <location filename="../src/loginoptionswidget.cpp" line="294"/> -+ <location filename="../src/loginoptionswidget.cpp" line="320"/> - <source>Password</source> - <translation>ᠨᠢᠭᠤᠴᠠ ᠺᠣᠳ᠋</translation> - </message> -diff --git a/bioauth/i18n_ts/pt.ts b/bioauth/i18n_ts/pt.ts -index de73991..e0b65ef 100644 ---- a/bioauth/i18n_ts/pt.ts -+++ b/bioauth/i18n_ts/pt.ts -@@ -71,11 +71,15 @@ - <translation type="unfinished"></translation> - </message> - <message> -- <source>ukui-biometric-manager</source> -+ <source>QRCode</source> - <translation type="unfinished"></translation> - </message> - <message> -- <source>QRCode</source> -+ <source>Biometric Manager</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <source>Ukey</source> - <translation type="unfinished"></translation> - </message> - </context> -@@ -104,5 +108,9 @@ - <source>Login Options</source> - <translation type="unfinished"></translation> - </message> -+ <message> -+ <source>Password</source> -+ <translation type="unfinished">Senha</translation> -+ </message> - </context> - </TS> -diff --git a/bioauth/i18n_ts/ru.ts b/bioauth/i18n_ts/ru.ts -index 70926ff..a4bb0dc 100644 ---- a/bioauth/i18n_ts/ru.ts -+++ b/bioauth/i18n_ts/ru.ts -@@ -71,11 +71,15 @@ - <translation type="unfinished"></translation> - </message> - <message> -- <source>ukui-biometric-manager</source> -+ <source>QRCode</source> - <translation type="unfinished"></translation> - </message> - <message> -- <source>QRCode</source> -+ <source>Biometric Manager</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <source>Ukey</source> - <translation type="unfinished"></translation> - </message> - </context> -@@ -104,5 +108,9 @@ - <source>Login Options</source> - <translation type="unfinished"></translation> - </message> -+ <message> -+ <source>Password</source> -+ <translation type="unfinished">пароль</translation> -+ </message> - </context> - </TS> -diff --git a/bioauth/i18n_ts/tr.ts b/bioauth/i18n_ts/tr.ts -index c319001..4dee855 100644 ---- a/bioauth/i18n_ts/tr.ts -+++ b/bioauth/i18n_ts/tr.ts -@@ -46,52 +46,57 @@ - <context> - <name>BioDevices</name> - <message> -- <location filename="../src/biodevices.cpp" line="64"/> -+ <location filename="../src/biodevices.cpp" line="78"/> - <source>Unplugging of %1 device detected</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="74"/> -+ <location filename="../src/biodevices.cpp" line="88"/> - <source>%1 device insertion detected</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="83"/> -- <source>ukui-biometric-manager</source> -+ <location filename="../src/biodevices.cpp" line="97"/> -+ <source>Biometric Manager</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="86"/> -+ <location filename="../src/biodevices.cpp" line="100"/> - <source>biometric</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="457"/> -+ <location filename="../src/biodevices.cpp" line="700"/> - <source>FingerPrint</source> - <translation>Parmak İzi</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="459"/> -+ <location filename="../src/biodevices.cpp" line="702"/> - <source>FingerVein</source> - <translation>Damar İzi</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="461"/> -+ <location filename="../src/biodevices.cpp" line="704"/> - <source>Iris</source> - <translation>Göz</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="463"/> -+ <location filename="../src/biodevices.cpp" line="706"/> - <source>Face</source> - <translation>Yüz</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="465"/> -+ <location filename="../src/biodevices.cpp" line="708"/> - <source>VoicePrint</source> - <translation>Ses İzi</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="467"/> -+ <location filename="../src/biodevices.cpp" line="710"/> -+ <source>Ukey</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="712"/> - <source>QRCode</source> - <translation type="unfinished"></translation> - </message> -@@ -123,10 +128,15 @@ - <context> - <name>LoginOptionsWidget</name> - <message> -- <location filename="../src/loginoptionswidget.cpp" line="59"/> -+ <location filename="../src/loginoptionswidget.cpp" line="79"/> - <source>Login Options</source> - <translation type="unfinished"></translation> - </message> -+ <message> -+ <location filename="../src/loginoptionswidget.cpp" line="320"/> -+ <source>Password</source> -+ <translation type="unfinished">Parola</translation> -+ </message> - </context> - <context> - <name>QObject</name> -diff --git a/bioauth/i18n_ts/zh_CN.ts b/bioauth/i18n_ts/zh_CN.ts -index c2c6329..2414a7b 100644 ---- a/bioauth/i18n_ts/zh_CN.ts -+++ b/bioauth/i18n_ts/zh_CN.ts -@@ -28,7 +28,7 @@ - </message> - <message> - <source>Password</source> -- <translation>密码</translation> -+ <translation type="vanished">密码</translation> - </message> - <message> - <source>Current Device: </source> -@@ -54,57 +54,57 @@ - <context> - <name>BioDevices</name> - <message> -- <location filename="../src/biodevices.cpp" line="64"/> -+ <location filename="../src/biodevices.cpp" line="78"/> - <source>Unplugging of %1 device detected</source> - <translation>检测到%1设备拔出</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="74"/> -+ <location filename="../src/biodevices.cpp" line="88"/> - <source>%1 device insertion detected</source> - <translation>检测到%1设备插入</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="83"/> -- <source>ukui-biometric-manager</source> -+ <location filename="../src/biodevices.cpp" line="97"/> -+ <source>Biometric Manager</source> - <translation>生物特征管理工具</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="86"/> -+ <location filename="../src/biodevices.cpp" line="100"/> - <source>biometric</source> - <translation>生物特征</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="457"/> -+ <location filename="../src/biodevices.cpp" line="700"/> - <source>FingerPrint</source> - <translation>指纹</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="459"/> -+ <location filename="../src/biodevices.cpp" line="702"/> - <source>FingerVein</source> - <translation>指静脉</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="461"/> -+ <location filename="../src/biodevices.cpp" line="704"/> - <source>Iris</source> - <translation>虹膜</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="463"/> -+ <location filename="../src/biodevices.cpp" line="706"/> - <source>Face</source> - <translation>人脸识别</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="465"/> -+ <location filename="../src/biodevices.cpp" line="708"/> - <source>VoicePrint</source> - <translation>声纹</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="657"/> -+ <location filename="../src/biodevices.cpp" line="710"/> - <source>Ukey</source> - <translation>安全密钥</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="659"/> -+ <location filename="../src/biodevices.cpp" line="712"/> - <source>QRCode</source> - <translation>二维码</translation> - </message> -@@ -140,12 +140,12 @@ - <context> - <name>LoginOptionsWidget</name> - <message> -- <location filename="../src/loginoptionswidget.cpp" line="59"/> -+ <location filename="../src/loginoptionswidget.cpp" line="79"/> - <source>Login Options</source> - <translation>登录选项</translation> - </message> - <message> -- <location filename="../src/loginoptionswidget.cpp" line="294"/> -+ <location filename="../src/loginoptionswidget.cpp" line="320"/> - <source>Password</source> - <translation>密码</translation> - </message> -diff --git a/bioauth/i18n_ts/zh_HK.ts b/bioauth/i18n_ts/zh_HK.ts -index d71eed9..5baf048 100644 ---- a/bioauth/i18n_ts/zh_HK.ts -+++ b/bioauth/i18n_ts/zh_HK.ts -@@ -65,7 +65,7 @@ - </message> - <message> - <location filename="../src/biodevices.cpp" line="97"/> -- <source>ukui-biometric-manager</source> -+ <source>Biometric Manager</source> - <translation>生物特徵管理工具</translation> - </message> - <message> -@@ -74,37 +74,41 @@ - <translation>生物特徵管理工具</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="647"/> -+ <location filename="../src/biodevices.cpp" line="700"/> - <source>FingerPrint</source> - <translation>指紋</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="649"/> -+ <location filename="../src/biodevices.cpp" line="702"/> - <source>FingerVein</source> - <translation>指靜脈</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="651"/> -+ <location filename="../src/biodevices.cpp" line="704"/> - <source>Iris</source> - <translation>虹膜</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="653"/> -+ <location filename="../src/biodevices.cpp" line="706"/> - <source>Face</source> - <translation>人臉</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="655"/> -+ <location filename="../src/biodevices.cpp" line="708"/> - <source>VoicePrint</source> - <translation>聲紋</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="657"/> -- <source>ukey</source> -+ <location filename="../src/biodevices.cpp" line="710"/> -+ <source>Ukey</source> - <translation>安全金鑰</translation> - </message> - <message> -- <location filename="../src/biodevices.cpp" line="659"/> -+ <source>ukey</source> -+ <translation type="vanished">安全金鑰</translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="712"/> - <source>QRCode</source> - <translation>微信掃碼</translation> - </message> -@@ -140,12 +144,12 @@ - <context> - <name>LoginOptionsWidget</name> - <message> -- <location filename="../src/loginoptionswidget.cpp" line="61"/> -+ <location filename="../src/loginoptionswidget.cpp" line="79"/> - <source>Login Options</source> - <translation>登錄選項</translation> - </message> - <message> -- <location filename="../src/loginoptionswidget.cpp" line="294"/> -+ <location filename="../src/loginoptionswidget.cpp" line="320"/> - <source>Password</source> - <translation>密碼</translation> - </message> -diff --git a/polkit-agent/i18n_ts/bo.ts b/polkit-agent/i18n_ts/bo.ts -index e29f1bf..50e8ba8 100644 ---- a/polkit-agent/i18n_ts/bo.ts -+++ b/polkit-agent/i18n_ts/bo.ts -@@ -9,185 +9,205 @@ - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/mainwindow.ui" line="302"/> -- <location filename="../src/mainwindow.cpp" line="882"/> -- <location filename="../src/mainwindow.cpp" line="948"/> -+ <location filename="../src/mainwindow.ui" line="409"/> -+ <location filename="../src/mainwindow.cpp" line="1075"/> -+ <location filename="../src/mainwindow.cpp" line="1143"/> - <source>Biometric</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/mainwindow.ui" line="373"/> -+ <location filename="../src/mainwindow.ui" line="480"/> - <source>use password</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/mainwindow.ui" line="334"/> -- <location filename="../src/mainwindow.cpp" line="884"/> -+ <location filename="../src/mainwindow.ui" line="441"/> -+ <location filename="../src/mainwindow.cpp" line="1077"/> - <source>Cancel</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/mainwindow.ui" line="353"/> -- <location filename="../src/mainwindow.cpp" line="880"/> -+ <location filename="../src/mainwindow.ui" line="460"/> -+ <location filename="../src/mainwindow.cpp" line="1073"/> - <source>Authenticate</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="65"/> -+ <location filename="../src/mainwindow.cpp" line="66"/> - <source>Authentication</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="164"/> -- <location filename="../src/mainwindow.cpp" line="1176"/> -+ <location filename="../src/mainwindow.cpp" line="105"/> -+ <source>Insert the ukey into the USB port</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="107"/> -+ <source>Enter the ukey password</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="226"/> -+ <location filename="../src/mainwindow.cpp" line="1415"/> -+ <location filename="../src/mainwindow.cpp" line="1417"/> - <source>Failed to verify %1, please enter password to unlock</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="168"/> -- <location filename="../src/mainwindow.cpp" line="1178"/> -+ <location filename="../src/mainwindow.cpp" line="231"/> -+ <location filename="../src/mainwindow.cpp" line="233"/> -+ <location filename="../src/mainwindow.cpp" line="1419"/> - <source>Unable to verify %1, please enter password to unlock</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="175"/> -+ <location filename="../src/mainwindow.cpp" line="242"/> -+ <location filename="../src/mainwindow.cpp" line="246"/> - <source>Failed to verify %1, you still have %2 verification opportunities</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="261"/> -+ <location filename="../src/mainwindow.cpp" line="335"/> - <source>Please enter your password or enroll your fingerprint </source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="511"/> -+ <location filename="../src/mainwindow.cpp" line="665"/> - <source>This operation requires the administrator's authorization. Please enter your password to allow this operation.</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="517"/> -+ <location filename="../src/mainwindow.cpp" line="671"/> - <source>A program is attempting to perform an action that requires privileges.It requires authorization to perform the action.</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="578"/> -+ <location filename="../src/mainwindow.cpp" line="731"/> - <source>Password: </source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="580"/> -+ <location filename="../src/mainwindow.cpp" line="733"/> - <source>_Password: </source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="582"/> -+ <location filename="../src/mainwindow.cpp" line="735"/> - <source>_Password:</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="623"/> -- <location filename="../src/mainwindow.cpp" line="627"/> -- <location filename="../src/mainwindow.cpp" line="631"/> -- <location filename="../src/mainwindow.cpp" line="635"/> -+ <location filename="../src/mainwindow.cpp" line="779"/> -+ <location filename="../src/mainwindow.cpp" line="783"/> -+ <location filename="../src/mainwindow.cpp" line="787"/> -+ <location filename="../src/mainwindow.cpp" line="791"/> - <source>Account locked,</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="623"/> -+ <location filename="../src/mainwindow.cpp" line="779"/> - <source>days left</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="627"/> -+ <location filename="../src/mainwindow.cpp" line="783"/> - <source>hours left</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="631"/> -+ <location filename="../src/mainwindow.cpp" line="787"/> - <source>minutes left</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="635"/> -+ <location filename="../src/mainwindow.cpp" line="791"/> - <source>seconds left</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="675"/> -- <location filename="../src/mainwindow.cpp" line="676"/> -+ <location filename="../src/mainwindow.cpp" line="834"/> -+ <location filename="../src/mainwindow.cpp" line="835"/> - <source>Password cannot be empty</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="886"/> -- <location filename="../src/mainwindow.cpp" line="991"/> -+ <location filename="../src/mainwindow.cpp" line="880"/> -+ <location filename="../src/mainwindow.cpp" line="888"/> -+ <source>Input your password to authentication</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="1079"/> -+ <location filename="../src/mainwindow.cpp" line="1183"/> - <source>Use password</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1026"/> -- <location filename="../src/mainwindow.cpp" line="1093"/> -- <location filename="../src/mainwindow.cpp" line="1094"/> -+ <location filename="../src/mainwindow.cpp" line="1219"/> -+ <location filename="../src/mainwindow.cpp" line="1292"/> -+ <location filename="../src/mainwindow.cpp" line="1293"/> - <source>Please try again in %1 minutes.</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1036"/> -- <location filename="../src/mainwindow.cpp" line="1103"/> -- <location filename="../src/mainwindow.cpp" line="1104"/> -+ <location filename="../src/mainwindow.cpp" line="1230"/> -+ <location filename="../src/mainwindow.cpp" line="1302"/> -+ <location filename="../src/mainwindow.cpp" line="1303"/> - <source>Please try again in %1 seconds.</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1045"/> -- <location filename="../src/mainwindow.cpp" line="1046"/> -- <location filename="../src/mainwindow.cpp" line="1112"/> -- <location filename="../src/mainwindow.cpp" line="1113"/> -+ <location filename="../src/mainwindow.cpp" line="1240"/> -+ <location filename="../src/mainwindow.cpp" line="1241"/> -+ <location filename="../src/mainwindow.cpp" line="1311"/> -+ <location filename="../src/mainwindow.cpp" line="1312"/> - <source>Account locked permanently.</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1193"/> -+ <location filename="../src/mainwindow.cpp" line="1434"/> - <source>Verify face recognition or enter password to unlock</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1198"/> -+ <location filename="../src/mainwindow.cpp" line="1439"/> - <source>Press fingerprint or enter password to unlock</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1203"/> -+ <location filename="../src/mainwindow.cpp" line="1444"/> - <source>Verify voiceprint or enter password to unlock</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1208"/> -+ <location filename="../src/mainwindow.cpp" line="1449"/> - <source>Verify finger vein or enter password to unlock</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1213"/> -+ <location filename="../src/mainwindow.cpp" line="1454"/> - <source>Verify iris or enter password to unlock</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1218"/> -+ <location filename="../src/mainwindow.cpp" line="1459"/> - <source>Use the bound wechat scanning code or enter the password to unlock</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="576"/> -+ <location filename="../src/mainwindow.cpp" line="108"/> -+ <location filename="../src/mainwindow.cpp" line="729"/> - <source>Input Password</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="187"/> -+ <location filename="../src/mainwindow.cpp" line="259"/> - <source>Abnormal network</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="691"/> -+ <location filename="../src/mainwindow.cpp" line="850"/> - <source>Authentication failed, please try again.</source> - <translation type="unfinished"></translation> - </message> -@@ -200,12 +220,12 @@ - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/PolkitListener.cpp" line="257"/> -+ <location filename="../src/PolkitListener.cpp" line="265"/> - <source>Authentication failure, please try again.</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/PolkitListener.cpp" line="264"/> -+ <location filename="../src/PolkitListener.cpp" line="272"/> - <source>Password input error!</source> - <translation type="unfinished"></translation> - </message> -diff --git a/polkit-agent/i18n_ts/bo_CN.ts b/polkit-agent/i18n_ts/bo_CN.ts -index 2b67f3f..e0a54e7 100644 ---- a/polkit-agent/i18n_ts/bo_CN.ts -+++ b/polkit-agent/i18n_ts/bo_CN.ts -@@ -65,7 +65,7 @@ - <context> - <name>MainWindow</name> - <message> -- <location filename="../src/mainwindow.cpp" line="65"/> -+ <location filename="../src/mainwindow.cpp" line="66"/> - <source>Authentication</source> - <translation>དབང་བསྐུར།</translation> - </message> -@@ -91,14 +91,14 @@ - <translation type="vanished">密码</translation> - </message> - <message> -- <location filename="../src/mainwindow.ui" line="302"/> -- <location filename="../src/mainwindow.cpp" line="882"/> -- <location filename="../src/mainwindow.cpp" line="948"/> -+ <location filename="../src/mainwindow.ui" line="409"/> -+ <location filename="../src/mainwindow.cpp" line="1075"/> -+ <location filename="../src/mainwindow.cpp" line="1143"/> - <source>Biometric</source> - <translation>སྐྱེ་དངོས་དབྱེ་འབྱེད་བཀོལ་བ།</translation> - </message> - <message> -- <location filename="../src/mainwindow.ui" line="373"/> -+ <location filename="../src/mainwindow.ui" line="480"/> - <source>use password</source> - <translation>གསང་གྲངས་བེད་སྤྱོད་བྱ་དགོས།</translation> - </message> -@@ -147,20 +147,20 @@ - <translation type="vanished">Polkit.caller-pid:</translation> - </message> - <message> -- <location filename="../src/mainwindow.ui" line="334"/> -- <location filename="../src/mainwindow.cpp" line="884"/> -+ <location filename="../src/mainwindow.ui" line="441"/> -+ <location filename="../src/mainwindow.cpp" line="1077"/> - <source>Cancel</source> - <translation>ཕྱིར་འཐེན།</translation> - </message> - <message> -- <location filename="../src/mainwindow.ui" line="353"/> -- <location filename="../src/mainwindow.cpp" line="880"/> -+ <location filename="../src/mainwindow.ui" line="460"/> -+ <location filename="../src/mainwindow.cpp" line="1073"/> - <source>Authenticate</source> - <translation>དབང་བསྐུར་བ།</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="886"/> -- <location filename="../src/mainwindow.cpp" line="991"/> -+ <location filename="../src/mainwindow.cpp" line="1079"/> -+ <location filename="../src/mainwindow.cpp" line="1183"/> - <source>Use password</source> - <translation>གསང་གྲངས་བེད་སྤྱོད་བྱ་དགོས།</translation> - </message> -@@ -185,30 +185,30 @@ - <translation type="vanished">认证中,请稍等...</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1026"/> -- <location filename="../src/mainwindow.cpp" line="1093"/> -- <location filename="../src/mainwindow.cpp" line="1094"/> -+ <location filename="../src/mainwindow.cpp" line="1219"/> -+ <location filename="../src/mainwindow.cpp" line="1292"/> -+ <location filename="../src/mainwindow.cpp" line="1293"/> - <source>Please try again in %1 minutes.</source> - <translation>%1ཡང་བསྐྱར་ཚོད་ལྟ་ཞིག་བྱེད་རོགས།</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1036"/> -- <location filename="../src/mainwindow.cpp" line="1103"/> -- <location filename="../src/mainwindow.cpp" line="1104"/> -+ <location filename="../src/mainwindow.cpp" line="1230"/> -+ <location filename="../src/mainwindow.cpp" line="1302"/> -+ <location filename="../src/mainwindow.cpp" line="1303"/> - <source>Please try again in %1 seconds.</source> - <translation>ཁྱོད་ཀྱིས་དུས་ཚོད་སྐར་ཆ་གཅིག་གི་ནང་དུ་ཡང་བསྐྱར་ཚོད་ལྟ་ཞིག་བྱེད་རོགས།</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1045"/> -- <location filename="../src/mainwindow.cpp" line="1046"/> -- <location filename="../src/mainwindow.cpp" line="1112"/> -- <location filename="../src/mainwindow.cpp" line="1113"/> -+ <location filename="../src/mainwindow.cpp" line="1240"/> -+ <location filename="../src/mainwindow.cpp" line="1241"/> -+ <location filename="../src/mainwindow.cpp" line="1311"/> -+ <location filename="../src/mainwindow.cpp" line="1312"/> - <source>Account locked permanently.</source> - <translation>དུས་གཏན་དུ་ཟྭ་བརྒྱབ་པའི་རྩིས་ཐོ།</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="675"/> -- <location filename="../src/mainwindow.cpp" line="676"/> -+ <location filename="../src/mainwindow.cpp" line="834"/> -+ <location filename="../src/mainwindow.cpp" line="835"/> - <source>Password cannot be empty</source> - <translation>གསང་གྲངས་སྟོང་པ་ཡིན་མི་སྲིད།</translation> - </message> -@@ -221,7 +221,8 @@ - <translation type="vanished">无法验证%1,请输入密码.</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="175"/> -+ <location filename="../src/mainwindow.cpp" line="242"/> -+ <location filename="../src/mainwindow.cpp" line="246"/> - <source>Failed to verify %1, you still have %2 verification opportunities</source> - <translation>%1ལ་ཞིབ་བཤེར་བྱེད་མ་ཐུབ་ན། ཁྱེད་ཚོར་ད་དུང་%2ལ་ཞིབ་བཤེར་བྱེད་པའི་གོ་སྐབས་ཡོད།</translation> - </message> -@@ -230,42 +231,42 @@ - <translation type="vanished">一个程序正试图执行一个需要特权的动作。要求授权以执行该动作。</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="578"/> -+ <location filename="../src/mainwindow.cpp" line="731"/> - <source>Password: </source> - <translation>གསང་གྲངས་ནི། </translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="261"/> -+ <location filename="../src/mainwindow.cpp" line="335"/> - <source>Please enter your password or enroll your fingerprint </source> - <translation>ཁྱེད་ཀྱི་གསང་གྲངས་ནང་འཇུག་བྱེད་པའམ་ཡང་ན་ཁྱེད་ཀྱི་མཛུབ་རིས་ནང་འཇུག་བྱེད་པ། </translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="187"/> -+ <location filename="../src/mainwindow.cpp" line="259"/> - <source>Abnormal network</source> - <translation>རྒྱུན་ལྡན་མིན་པའི་དྲ་བ།</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="511"/> -+ <location filename="../src/mainwindow.cpp" line="665"/> - <source>This operation requires the administrator's authorization. Please enter your password to allow this operation.</source> - <translation>ཐེངས་འདིའི་བཀོལ་སྤྱོད་ལ་དོ་དམ་པའི་དབང་ཆ་ཐོབ་ན་ད་གཟོད་མུ་མཐུད་དུ་ལག་བསྟར་བྱེད་ཐུབ།གསང་གྲངས་ནང་འཇུག་བྱས་ནས་ཐེངས་འདིའི་བཀོལ་སྤྱོད་བྱེད་ཆོག</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="580"/> -+ <location filename="../src/mainwindow.cpp" line="733"/> - <source>_Password: </source> - <translation>གསང་གྲངས། </translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="582"/> -+ <location filename="../src/mainwindow.cpp" line="735"/> - <source>_Password:</source> - <translation>གསང་གྲངས།:</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="691"/> -+ <location filename="../src/mainwindow.cpp" line="850"/> - <source>Authentication failed, please try again.</source> - <translation>བདེན་དཔང་ར་སྤྲོད་ལ་ཕམ་ཁ་བྱུང་བས་ཡང་བསྐྱར་ཚོད་ལྟ་བྱོས།</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="623"/> -+ <location filename="../src/mainwindow.cpp" line="779"/> - <source>days left</source> - <translation>གནམ་རྒྱབ་ཟྭ་འབྱེད།</translation> - </message> -@@ -278,14 +279,16 @@ - <translation type="vanished">生物/扫码验证失败,您还有%1次尝试机会</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="164"/> -- <location filename="../src/mainwindow.cpp" line="1176"/> -+ <location filename="../src/mainwindow.cpp" line="226"/> -+ <location filename="../src/mainwindow.cpp" line="1415"/> -+ <location filename="../src/mainwindow.cpp" line="1417"/> - <source>Failed to verify %1, please enter password to unlock</source> - <translation>%1ལ་ཞིབ་བཤེར་བྱེད་མ་ཐུབ་ན། གསང་གྲངས་ནང་འཇུག་བྱས་ནས་ཟྭ་རྒྱག་རོགས།</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="168"/> -- <location filename="../src/mainwindow.cpp" line="1178"/> -+ <location filename="../src/mainwindow.cpp" line="231"/> -+ <location filename="../src/mainwindow.cpp" line="233"/> -+ <location filename="../src/mainwindow.cpp" line="1419"/> - <source>Unable to verify %1, please enter password to unlock</source> - <translation>%1ལ་ཞིབ་བཤེར་བྱེད་ཐབས་བྲལ་བ་དང་། གསང་གྲངས་ནང་འཇུག་བྱས་ནས་ཟྭ་རྒྱག་རོགས།</translation> - </message> -@@ -294,57 +297,74 @@ - <translation type="vanished">网络异常</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="517"/> -+ <location filename="../src/mainwindow.cpp" line="671"/> - <source>A program is attempting to perform an action that requires privileges.It requires authorization to perform the action.</source> - <translation>གོ་རིམ་ཞིག་གིས་ཁྱད་དབང་དགོས་པའི་འགུལ་སྟངས་ཤིག་ལག་བསྟར་བྱེད་པར་ཚོད་ལྟ་བྱེད་བཞིན་ཡོད་པ་དང་།་འགུལ་སྟངས་འདི་ལག་བསྟར་བྱེད་པའི་དབང་ཆ་སྤྲོད་དགོས་པའི་རེ་བ་བཏོན།</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="576"/> -+ <location filename="../src/mainwindow.cpp" line="108"/> -+ <location filename="../src/mainwindow.cpp" line="729"/> - <source>Input Password</source> - <translation>ནང་འཇུག་གི་གསང་གྲངས།</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="627"/> -+ <location filename="../src/mainwindow.cpp" line="105"/> -+ <source>Insert the ukey into the USB port</source> -+ <translation>བདེ་འཇགས་ཀྱི་གསང་བའི་ལྡེ་མིག་དེ་USBཡི་སྣེ་འདྲེན་དུ་འཇུག་རོགས།</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="107"/> -+ <source>Enter the ukey password</source> -+ <translation>གསང་བའི་ཨང་གྲངས་ནང་འཇུག་བྱེད་པ།</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="783"/> - <source>hours left</source> - <translation>དུས་ཚོད་འགའ་ལས་ལྷག་མེད</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="631"/> -+ <location filename="../src/mainwindow.cpp" line="787"/> - <source>minutes left</source> - <translation>སྐར་མ་རྗེས་ནས་ཟྭ་ཕྱེ།</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="635"/> -+ <location filename="../src/mainwindow.cpp" line="791"/> - <source>seconds left</source> - <translation>སྐར་ཆའི་རྗེས་ནས་ཟྭ་ཕྱེ་བ།</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1193"/> -+ <location filename="../src/mainwindow.cpp" line="880"/> -+ <location filename="../src/mainwindow.cpp" line="888"/> -+ <source>Input your password to authentication</source> -+ <translation>གསང་བའི་ཨང་གྲངས་ནང་འཇུག་བྱེད་དབང་ཡོད།</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="1434"/> - <source>Verify face recognition or enter password to unlock</source> - <translation>དཔང་མིའི་གདོང་ལ་ཞིབ་བཤེར་བྱེད་པའམ་ཡང་ན་གསང་གྲངས་བསྣན་ནས་ཟྭ་འབྱེད་པ།</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1198"/> -+ <location filename="../src/mainwindow.cpp" line="1439"/> - <source>Press fingerprint or enter password to unlock</source> - <translation>མཛུབ་རིས་མནན་པའམ་ཡང་ན་གསང་གྲངས་བསྣན་ནས་ཟྭ་འབྱེད་པ།</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1203"/> -+ <location filename="../src/mainwindow.cpp" line="1444"/> - <source>Verify voiceprint or enter password to unlock</source> - <translation>སྒྲ་རིས་ར་སྤྲོད་བྱེད་པའམ་ཡང་ན་གསང་གྲངས་བསྣན་ནས་ཟྭ་འབྱེད་པ།</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1208"/> -+ <location filename="../src/mainwindow.cpp" line="1449"/> - <source>Verify finger vein or enter password to unlock</source> - <translation>ཚོད་ལྟས་ར་སྤྲོད་བྱེད་པ་ནི་སྡོད་རྩ་དང་གསང་གྲངས་བསྣན་ནས་ཟྭ་འབྱེད་པ་དེ་ཡིན།</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1213"/> -+ <location filename="../src/mainwindow.cpp" line="1454"/> - <source>Verify iris or enter password to unlock</source> - <translation>འཇའ་སྐྱི་ར་སྤྲོད་བྱེད་པའམ་ཡང་ན་གསང་གྲངས་བསྣན་ནས་ཟྭ་འབྱེད་པ།</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1218"/> -+ <location filename="../src/mainwindow.cpp" line="1459"/> - <source>Use the bound wechat scanning code or enter the password to unlock</source> - <translation>སྦྲེལ་ཡོད་པའི་སྐད་འཕྲིན་གྱི་ཨང་གྲངས་སམ་གསང་གྲངས་བསྣན་ནས་ཟྭ་འབྱེད་དགོས།</translation> - </message> -@@ -353,10 +373,10 @@ - <translation type="vanished">使用绑定的微信扫码或输入密码登录</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="623"/> -- <location filename="../src/mainwindow.cpp" line="627"/> -- <location filename="../src/mainwindow.cpp" line="631"/> -- <location filename="../src/mainwindow.cpp" line="635"/> -+ <location filename="../src/mainwindow.cpp" line="779"/> -+ <location filename="../src/mainwindow.cpp" line="783"/> -+ <location filename="../src/mainwindow.cpp" line="787"/> -+ <location filename="../src/mainwindow.cpp" line="791"/> - <source>Account locked,</source> - <translation>རྩིས་ཐོ་ཟྭ་བརྒྱབ་པ།</translation> - </message> -@@ -373,12 +393,12 @@ - <translation>མཁོ་མཁན་གཞན་པ་ཞིག་གིས་བདེན་དཔང་ར་སྤྲོད་བྱེད་བཞིན་ཡོད།ཅུང་ཙམ་འགོར་རྗེས་ཡང་བསྐྱར་ཚོད་ལྟ་བྱོས།</translation> - </message> - <message> -- <location filename="../src/PolkitListener.cpp" line="257"/> -+ <location filename="../src/PolkitListener.cpp" line="265"/> - <source>Authentication failure, please try again.</source> - <translation>བདེན་དཔང་ར་སྤྲོད་བྱེད་མ་ཐུབ་ན་ཁྱེད་ཀྱིས་ཡང་བསྐྱར་ཚོད་ལྟ་བྱེད།</translation> - </message> - <message> -- <location filename="../src/PolkitListener.cpp" line="264"/> -+ <location filename="../src/PolkitListener.cpp" line="272"/> - <source>Password input error!</source> - <translation>གསང་གྲངས་ནང་འཇུག་ནོར་འཁྲུལ་བྱུང་བ་རེད།</translation> - </message> -diff --git a/polkit-agent/i18n_ts/de.ts b/polkit-agent/i18n_ts/de.ts -index 8017b6c..8521a6d 100644 ---- a/polkit-agent/i18n_ts/de.ts -+++ b/polkit-agent/i18n_ts/de.ts -@@ -65,7 +65,7 @@ - <context> - <name>MainWindow</name> - <message> -- <location filename="../src/mainwindow.cpp" line="65"/> -+ <location filename="../src/mainwindow.cpp" line="66"/> - <source>Authentication</source> - <translation>Authentifizierung</translation> - </message> -@@ -91,14 +91,14 @@ - <translation type="vanished">密码</translation> - </message> - <message> -- <location filename="../src/mainwindow.ui" line="302"/> -- <location filename="../src/mainwindow.cpp" line="882"/> -- <location filename="../src/mainwindow.cpp" line="948"/> -+ <location filename="../src/mainwindow.ui" line="409"/> -+ <location filename="../src/mainwindow.cpp" line="1075"/> -+ <location filename="../src/mainwindow.cpp" line="1143"/> - <source>Biometric</source> - <translation>Biometrisch</translation> - </message> - <message> -- <location filename="../src/mainwindow.ui" line="373"/> -+ <location filename="../src/mainwindow.ui" line="480"/> - <source>use password</source> - <translation>Passwort verwenden</translation> - </message> -@@ -147,20 +147,20 @@ - <translation type="vanished">Polkit.caller-pid:</translation> - </message> - <message> -- <location filename="../src/mainwindow.ui" line="334"/> -- <location filename="../src/mainwindow.cpp" line="884"/> -+ <location filename="../src/mainwindow.ui" line="441"/> -+ <location filename="../src/mainwindow.cpp" line="1077"/> - <source>Cancel</source> - <translation>Abbrechen</translation> - </message> - <message> -- <location filename="../src/mainwindow.ui" line="353"/> -- <location filename="../src/mainwindow.cpp" line="880"/> -+ <location filename="../src/mainwindow.ui" line="460"/> -+ <location filename="../src/mainwindow.cpp" line="1073"/> - <source>Authenticate</source> - <translation>Beglaubigen</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="886"/> -- <location filename="../src/mainwindow.cpp" line="991"/> -+ <location filename="../src/mainwindow.cpp" line="1079"/> -+ <location filename="../src/mainwindow.cpp" line="1183"/> - <source>Use password</source> - <translation>Passwort verwenden</translation> - </message> -@@ -185,30 +185,30 @@ - <translation type="vanished">认证中,请稍等...</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1026"/> -- <location filename="../src/mainwindow.cpp" line="1093"/> -- <location filename="../src/mainwindow.cpp" line="1094"/> -+ <location filename="../src/mainwindow.cpp" line="1219"/> -+ <location filename="../src/mainwindow.cpp" line="1292"/> -+ <location filename="../src/mainwindow.cpp" line="1293"/> - <source>Please try again in %1 minutes.</source> - <translation>Versuchen Sie es in %1 Minuten erneut.</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1036"/> -- <location filename="../src/mainwindow.cpp" line="1103"/> -- <location filename="../src/mainwindow.cpp" line="1104"/> -+ <location filename="../src/mainwindow.cpp" line="1230"/> -+ <location filename="../src/mainwindow.cpp" line="1302"/> -+ <location filename="../src/mainwindow.cpp" line="1303"/> - <source>Please try again in %1 seconds.</source> - <translation>Bitte versuchen Sie es in %1 Sekunden erneut.</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1045"/> -- <location filename="../src/mainwindow.cpp" line="1046"/> -- <location filename="../src/mainwindow.cpp" line="1112"/> -- <location filename="../src/mainwindow.cpp" line="1113"/> -+ <location filename="../src/mainwindow.cpp" line="1240"/> -+ <location filename="../src/mainwindow.cpp" line="1241"/> -+ <location filename="../src/mainwindow.cpp" line="1311"/> -+ <location filename="../src/mainwindow.cpp" line="1312"/> - <source>Account locked permanently.</source> - <translation>Das Konto wurde dauerhaft gesperrt.</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="675"/> -- <location filename="../src/mainwindow.cpp" line="676"/> -+ <location filename="../src/mainwindow.cpp" line="834"/> -+ <location filename="../src/mainwindow.cpp" line="835"/> - <source>Password cannot be empty</source> - <translation>Das Kennwort darf nicht leer sein.</translation> - </message> -@@ -221,7 +221,8 @@ - <translation type="vanished">无法验证%1,请输入密码.</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="175"/> -+ <location filename="../src/mainwindow.cpp" line="242"/> -+ <location filename="../src/mainwindow.cpp" line="246"/> - <source>Failed to verify %1, you still have %2 verification opportunities</source> - <translation>%1 konnte nicht verifiziert werden, Sie haben immer noch %2 Überprüfungsmöglichkeiten</translation> - </message> -@@ -230,42 +231,42 @@ - <translation type="vanished">一个程序正试图执行一个需要特权的动作。要求授权以执行该动作。</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="578"/> -+ <location filename="../src/mainwindow.cpp" line="731"/> - <source>Password: </source> - <translation>Passwort: </translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="261"/> -+ <location filename="../src/mainwindow.cpp" line="335"/> - <source>Please enter your password or enroll your fingerprint </source> - <translation>Bitte geben Sie Ihr Passwort ein oder registrieren Sie Ihren Fingerabdruck </translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="187"/> -+ <location filename="../src/mainwindow.cpp" line="259"/> - <source>Abnormal network</source> - <translation>Ungewöhnliches Netzwerk</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="511"/> -+ <location filename="../src/mainwindow.cpp" line="665"/> - <source>This operation requires the administrator's authorization. Please enter your password to allow this operation.</source> - <translation>Für diesen Vorgang ist die Autorisierung des Administrators erforderlich. Bitte geben Sie Ihr Passwort ein, um diesen Vorgang zuzulassen.</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="580"/> -+ <location filename="../src/mainwindow.cpp" line="733"/> - <source>_Password: </source> - <translation>_Passwort: </translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="582"/> -+ <location filename="../src/mainwindow.cpp" line="735"/> - <source>_Password:</source> - <translation>_Passwort:</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="691"/> -+ <location filename="../src/mainwindow.cpp" line="850"/> - <source>Authentication failed, please try again.</source> - <translation>Authentifizierung fehlgeschlagen, bitte versuchen Sie es erneut.</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="623"/> -+ <location filename="../src/mainwindow.cpp" line="779"/> - <source>days left</source> - <translation>Verbleibende Tage</translation> - </message> -@@ -278,14 +279,16 @@ - <translation type="vanished">生物/扫码验证失败,您还有%1次尝试机会</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="164"/> -- <location filename="../src/mainwindow.cpp" line="1176"/> -+ <location filename="../src/mainwindow.cpp" line="226"/> -+ <location filename="../src/mainwindow.cpp" line="1415"/> -+ <location filename="../src/mainwindow.cpp" line="1417"/> - <source>Failed to verify %1, please enter password to unlock</source> - <translation>%1 konnte nicht verifiziert werden, bitte geben Sie das Kennwort zum Entsperren ein</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="168"/> -- <location filename="../src/mainwindow.cpp" line="1178"/> -+ <location filename="../src/mainwindow.cpp" line="231"/> -+ <location filename="../src/mainwindow.cpp" line="233"/> -+ <location filename="../src/mainwindow.cpp" line="1419"/> - <source>Unable to verify %1, please enter password to unlock</source> - <translation>%1 kann nicht verifiziert werden, bitte geben Sie das Kennwort zum Entsperren ein</translation> - </message> -@@ -294,57 +297,74 @@ - <translation type="vanished">网络异常</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="517"/> -+ <location filename="../src/mainwindow.cpp" line="671"/> - <source>A program is attempting to perform an action that requires privileges.It requires authorization to perform the action.</source> - <translation>Ein Programm versucht, eine Aktion auszuführen, für die Berechtigungen erforderlich sind. Zum Ausführen der Aktion ist eine Autorisierung erforderlich.</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="576"/> -+ <location filename="../src/mainwindow.cpp" line="108"/> -+ <location filename="../src/mainwindow.cpp" line="729"/> - <source>Input Password</source> - <translation>Passwort eingeben</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="627"/> -+ <location filename="../src/mainwindow.cpp" line="105"/> -+ <source>Insert the ukey into the USB port</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="107"/> -+ <source>Enter the ukey password</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="783"/> - <source>hours left</source> - <translation>Verbleibende Stunden</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="631"/> -+ <location filename="../src/mainwindow.cpp" line="787"/> - <source>minutes left</source> - <translation>Noch Minuten</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="635"/> -+ <location filename="../src/mainwindow.cpp" line="791"/> - <source>seconds left</source> - <translation>Verbleibende Sekunden</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1193"/> -+ <location filename="../src/mainwindow.cpp" line="880"/> -+ <location filename="../src/mainwindow.cpp" line="888"/> -+ <source>Input your password to authentication</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="1434"/> - <source>Verify face recognition or enter password to unlock</source> - <translation>Überprüfen Sie die Gesichtserkennung oder geben Sie das Passwort ein, um zu entsperren</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1198"/> -+ <location filename="../src/mainwindow.cpp" line="1439"/> - <source>Press fingerprint or enter password to unlock</source> - <translation>Drücken Sie den Fingerabdruck oder geben Sie das Passwort ein, um zu entsperren</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1203"/> -+ <location filename="../src/mainwindow.cpp" line="1444"/> - <source>Verify voiceprint or enter password to unlock</source> - <translation>Überprüfen Sie den Stimmabdruck oder geben Sie das Passwort ein, um zu entsperren</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1208"/> -+ <location filename="../src/mainwindow.cpp" line="1449"/> - <source>Verify finger vein or enter password to unlock</source> - <translation>Überprüfen Sie die Fingervene oder geben Sie das Passwort ein, um zu entsperren</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1213"/> -+ <location filename="../src/mainwindow.cpp" line="1454"/> - <source>Verify iris or enter password to unlock</source> - <translation>Überprüfen Sie die Iris oder geben Sie das Passwort ein, um zu entsperren</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1218"/> -+ <location filename="../src/mainwindow.cpp" line="1459"/> - <source>Use the bound wechat scanning code or enter the password to unlock</source> - <translation>Verwenden Sie den gebundenen Wechat-Scan-Code oder geben Sie das Passwort zum Entsperren ein</translation> - </message> -@@ -353,10 +373,10 @@ - <translation type="vanished">使用绑定的微信扫码或输入密码登录</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="623"/> -- <location filename="../src/mainwindow.cpp" line="627"/> -- <location filename="../src/mainwindow.cpp" line="631"/> -- <location filename="../src/mainwindow.cpp" line="635"/> -+ <location filename="../src/mainwindow.cpp" line="779"/> -+ <location filename="../src/mainwindow.cpp" line="783"/> -+ <location filename="../src/mainwindow.cpp" line="787"/> -+ <location filename="../src/mainwindow.cpp" line="791"/> - <source>Account locked,</source> - <translation>Konto gesperrt,</translation> - </message> -@@ -373,12 +393,12 @@ - <translation>Ein anderer Client authentifiziert sich bereits, bitte versuchen Sie es später noch einmal.</translation> - </message> - <message> -- <location filename="../src/PolkitListener.cpp" line="257"/> -+ <location filename="../src/PolkitListener.cpp" line="265"/> - <source>Authentication failure, please try again.</source> - <translation>Authentifizierungsfehler, bitte versuchen Sie es erneut.</translation> - </message> - <message> -- <location filename="../src/PolkitListener.cpp" line="264"/> -+ <location filename="../src/PolkitListener.cpp" line="272"/> - <source>Password input error!</source> - <translation>Fehler bei der Passworteingabe!</translation> - </message> -diff --git a/polkit-agent/i18n_ts/es.ts b/polkit-agent/i18n_ts/es.ts -index a395a53..133ff59 100644 ---- a/polkit-agent/i18n_ts/es.ts -+++ b/polkit-agent/i18n_ts/es.ts -@@ -65,7 +65,7 @@ - <context> - <name>MainWindow</name> - <message> -- <location filename="../src/mainwindow.cpp" line="65"/> -+ <location filename="../src/mainwindow.cpp" line="66"/> - <source>Authentication</source> - <translation>Autenticación</translation> - </message> -@@ -91,14 +91,14 @@ - <translation type="vanished">密码</translation> - </message> - <message> -- <location filename="../src/mainwindow.ui" line="302"/> -- <location filename="../src/mainwindow.cpp" line="882"/> -- <location filename="../src/mainwindow.cpp" line="948"/> -+ <location filename="../src/mainwindow.ui" line="409"/> -+ <location filename="../src/mainwindow.cpp" line="1075"/> -+ <location filename="../src/mainwindow.cpp" line="1143"/> - <source>Biometric</source> - <translation>Biométrico</translation> - </message> - <message> -- <location filename="../src/mainwindow.ui" line="373"/> -+ <location filename="../src/mainwindow.ui" line="480"/> - <source>use password</source> - <translation>Usar contraseña</translation> - </message> -@@ -147,20 +147,20 @@ - <translation type="vanished">Polkit.caller-pid:</translation> - </message> - <message> -- <location filename="../src/mainwindow.ui" line="334"/> -- <location filename="../src/mainwindow.cpp" line="884"/> -+ <location filename="../src/mainwindow.ui" line="441"/> -+ <location filename="../src/mainwindow.cpp" line="1077"/> - <source>Cancel</source> - <translation>Cancelar</translation> - </message> - <message> -- <location filename="../src/mainwindow.ui" line="353"/> -- <location filename="../src/mainwindow.cpp" line="880"/> -+ <location filename="../src/mainwindow.ui" line="460"/> -+ <location filename="../src/mainwindow.cpp" line="1073"/> - <source>Authenticate</source> - <translation>Autentificar</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="886"/> -- <location filename="../src/mainwindow.cpp" line="991"/> -+ <location filename="../src/mainwindow.cpp" line="1079"/> -+ <location filename="../src/mainwindow.cpp" line="1183"/> - <source>Use password</source> - <translation>Usar contraseña</translation> - </message> -@@ -185,30 +185,30 @@ - <translation type="vanished">认证中,请稍等...</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1026"/> -- <location filename="../src/mainwindow.cpp" line="1093"/> -- <location filename="../src/mainwindow.cpp" line="1094"/> -+ <location filename="../src/mainwindow.cpp" line="1219"/> -+ <location filename="../src/mainwindow.cpp" line="1292"/> -+ <location filename="../src/mainwindow.cpp" line="1293"/> - <source>Please try again in %1 minutes.</source> - <translation>Inténtelo de nuevo en %1 minutos.</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1036"/> -- <location filename="../src/mainwindow.cpp" line="1103"/> -- <location filename="../src/mainwindow.cpp" line="1104"/> -+ <location filename="../src/mainwindow.cpp" line="1230"/> -+ <location filename="../src/mainwindow.cpp" line="1302"/> -+ <location filename="../src/mainwindow.cpp" line="1303"/> - <source>Please try again in %1 seconds.</source> - <translation>Inténtelo de nuevo en %1 segundos.</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1045"/> -- <location filename="../src/mainwindow.cpp" line="1046"/> -- <location filename="../src/mainwindow.cpp" line="1112"/> -- <location filename="../src/mainwindow.cpp" line="1113"/> -+ <location filename="../src/mainwindow.cpp" line="1240"/> -+ <location filename="../src/mainwindow.cpp" line="1241"/> -+ <location filename="../src/mainwindow.cpp" line="1311"/> -+ <location filename="../src/mainwindow.cpp" line="1312"/> - <source>Account locked permanently.</source> - <translation>Cuenta bloqueada permanentemente.</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="675"/> -- <location filename="../src/mainwindow.cpp" line="676"/> -+ <location filename="../src/mainwindow.cpp" line="834"/> -+ <location filename="../src/mainwindow.cpp" line="835"/> - <source>Password cannot be empty</source> - <translation>La contraseña no puede estar vacía</translation> - </message> -@@ -221,7 +221,8 @@ - <translation type="vanished">无法验证%1,请输入密码.</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="175"/> -+ <location filename="../src/mainwindow.cpp" line="242"/> -+ <location filename="../src/mainwindow.cpp" line="246"/> - <source>Failed to verify %1, you still have %2 verification opportunities</source> - <translation>No se pudo verificar %1, todavía tiene %2 oportunidades de verificación</translation> - </message> -@@ -230,42 +231,42 @@ - <translation type="vanished">一个程序正试图执行一个需要特权的动作。要求授权以执行该动作。</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="578"/> -+ <location filename="../src/mainwindow.cpp" line="731"/> - <source>Password: </source> - <translation>Contraseña: </translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="261"/> -+ <location filename="../src/mainwindow.cpp" line="335"/> - <source>Please enter your password or enroll your fingerprint </source> - <translation>Ingrese su contraseña o registre su huella dactilar </translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="187"/> -+ <location filename="../src/mainwindow.cpp" line="259"/> - <source>Abnormal network</source> - <translation>Red anormal</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="511"/> -+ <location filename="../src/mainwindow.cpp" line="665"/> - <source>This operation requires the administrator's authorization. Please enter your password to allow this operation.</source> - <translation>Esta operación requiere la autorización del administrador. Introduzca su contraseña para permitir esta operación.</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="580"/> -+ <location filename="../src/mainwindow.cpp" line="733"/> - <source>_Password: </source> - <translation>_Contraseña: </translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="582"/> -+ <location filename="../src/mainwindow.cpp" line="735"/> - <source>_Password:</source> - <translation>_Contraseña:</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="691"/> -+ <location filename="../src/mainwindow.cpp" line="850"/> - <source>Authentication failed, please try again.</source> - <translation>Error de autenticación, inténtelo de nuevo.</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="623"/> -+ <location filename="../src/mainwindow.cpp" line="779"/> - <source>days left</source> - <translation>Días restantes</translation> - </message> -@@ -278,14 +279,16 @@ - <translation type="vanished">生物/扫码验证失败,您还有%1次尝试机会</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="164"/> -- <location filename="../src/mainwindow.cpp" line="1176"/> -+ <location filename="../src/mainwindow.cpp" line="226"/> -+ <location filename="../src/mainwindow.cpp" line="1415"/> -+ <location filename="../src/mainwindow.cpp" line="1417"/> - <source>Failed to verify %1, please enter password to unlock</source> - <translation>No se pudo verificar %1, ingrese la contraseña para desbloquear</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="168"/> -- <location filename="../src/mainwindow.cpp" line="1178"/> -+ <location filename="../src/mainwindow.cpp" line="231"/> -+ <location filename="../src/mainwindow.cpp" line="233"/> -+ <location filename="../src/mainwindow.cpp" line="1419"/> - <source>Unable to verify %1, please enter password to unlock</source> - <translation>No se puede verificar %1, ingrese la contraseña para desbloquear</translation> - </message> -@@ -294,57 +297,74 @@ - <translation type="vanished">网络异常</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="517"/> -+ <location filename="../src/mainwindow.cpp" line="671"/> - <source>A program is attempting to perform an action that requires privileges.It requires authorization to perform the action.</source> - <translation>Un programa está intentando realizar una acción que requiere privilegios. Requiere autorización para realizar la acción.</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="576"/> -+ <location filename="../src/mainwindow.cpp" line="108"/> -+ <location filename="../src/mainwindow.cpp" line="729"/> - <source>Input Password</source> - <translation>Contraseña de entrada</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="627"/> -+ <location filename="../src/mainwindow.cpp" line="105"/> -+ <source>Insert the ukey into the USB port</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="107"/> -+ <source>Enter the ukey password</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="783"/> - <source>hours left</source> - <translation>horas restantes</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="631"/> -+ <location filename="../src/mainwindow.cpp" line="787"/> - <source>minutes left</source> - <translation>Quedan minutos</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="635"/> -+ <location filename="../src/mainwindow.cpp" line="791"/> - <source>seconds left</source> - <translation>segundos restantes</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1193"/> -+ <location filename="../src/mainwindow.cpp" line="880"/> -+ <location filename="../src/mainwindow.cpp" line="888"/> -+ <source>Input your password to authentication</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="1434"/> - <source>Verify face recognition or enter password to unlock</source> - <translation>Verifique el reconocimiento facial o ingrese la contraseña para desbloquear</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1198"/> -+ <location filename="../src/mainwindow.cpp" line="1439"/> - <source>Press fingerprint or enter password to unlock</source> - <translation>Presione la huella dactilar o ingrese la contraseña para desbloquear</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1203"/> -+ <location filename="../src/mainwindow.cpp" line="1444"/> - <source>Verify voiceprint or enter password to unlock</source> - <translation>Verifica la huella de voz o ingresa la contraseña para desbloquear</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1208"/> -+ <location filename="../src/mainwindow.cpp" line="1449"/> - <source>Verify finger vein or enter password to unlock</source> - <translation>Verifique la vena del dedo o ingrese la contraseña para desbloquear</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1213"/> -+ <location filename="../src/mainwindow.cpp" line="1454"/> - <source>Verify iris or enter password to unlock</source> - <translation>Verifique el iris o ingrese la contraseña para desbloquear</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1218"/> -+ <location filename="../src/mainwindow.cpp" line="1459"/> - <source>Use the bound wechat scanning code or enter the password to unlock</source> - <translation>Use el código de escaneo de wechat vinculado o ingrese la contraseña para desbloquear</translation> - </message> -@@ -353,10 +373,10 @@ - <translation type="vanished">使用绑定的微信扫码或输入密码登录</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="623"/> -- <location filename="../src/mainwindow.cpp" line="627"/> -- <location filename="../src/mainwindow.cpp" line="631"/> -- <location filename="../src/mainwindow.cpp" line="635"/> -+ <location filename="../src/mainwindow.cpp" line="779"/> -+ <location filename="../src/mainwindow.cpp" line="783"/> -+ <location filename="../src/mainwindow.cpp" line="787"/> -+ <location filename="../src/mainwindow.cpp" line="791"/> - <source>Account locked,</source> - <translation>Cuenta bloqueada,</translation> - </message> -@@ -373,12 +393,12 @@ - <translation>Otro cliente ya se está autenticando, inténtelo de nuevo más tarde.</translation> - </message> - <message> -- <location filename="../src/PolkitListener.cpp" line="257"/> -+ <location filename="../src/PolkitListener.cpp" line="265"/> - <source>Authentication failure, please try again.</source> - <translation>Error de autenticación, inténtelo de nuevo.</translation> - </message> - <message> -- <location filename="../src/PolkitListener.cpp" line="264"/> -+ <location filename="../src/PolkitListener.cpp" line="272"/> - <source>Password input error!</source> - <translation>¡Error de entrada de contraseña!</translation> - </message> -diff --git a/polkit-agent/i18n_ts/fr.ts b/polkit-agent/i18n_ts/fr.ts -index 6ac2c2b..357fb71 100644 ---- a/polkit-agent/i18n_ts/fr.ts -+++ b/polkit-agent/i18n_ts/fr.ts -@@ -65,7 +65,7 @@ - <context> - <name>MainWindow</name> - <message> -- <location filename="../src/mainwindow.cpp" line="65"/> -+ <location filename="../src/mainwindow.cpp" line="66"/> - <source>Authentication</source> - <translation>Authentification</translation> - </message> -@@ -91,14 +91,14 @@ - <translation type="vanished">密码</translation> - </message> - <message> -- <location filename="../src/mainwindow.ui" line="302"/> -- <location filename="../src/mainwindow.cpp" line="882"/> -- <location filename="../src/mainwindow.cpp" line="948"/> -+ <location filename="../src/mainwindow.ui" line="409"/> -+ <location filename="../src/mainwindow.cpp" line="1075"/> -+ <location filename="../src/mainwindow.cpp" line="1143"/> - <source>Biometric</source> - <translation>Biométrique</translation> - </message> - <message> -- <location filename="../src/mainwindow.ui" line="373"/> -+ <location filename="../src/mainwindow.ui" line="480"/> - <source>use password</source> - <translation>Utiliser le mot de passe</translation> - </message> -@@ -147,20 +147,20 @@ - <translation type="vanished">Polkit.caller-pid:</translation> - </message> - <message> -- <location filename="../src/mainwindow.ui" line="334"/> -- <location filename="../src/mainwindow.cpp" line="884"/> -+ <location filename="../src/mainwindow.ui" line="441"/> -+ <location filename="../src/mainwindow.cpp" line="1077"/> - <source>Cancel</source> - <translation>Annuler</translation> - </message> - <message> -- <location filename="../src/mainwindow.ui" line="353"/> -- <location filename="../src/mainwindow.cpp" line="880"/> -+ <location filename="../src/mainwindow.ui" line="460"/> -+ <location filename="../src/mainwindow.cpp" line="1073"/> - <source>Authenticate</source> - <translation>Authentifier</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="886"/> -- <location filename="../src/mainwindow.cpp" line="991"/> -+ <location filename="../src/mainwindow.cpp" line="1079"/> -+ <location filename="../src/mainwindow.cpp" line="1183"/> - <source>Use password</source> - <translation>Utiliser le mot de passe</translation> - </message> -@@ -185,30 +185,30 @@ - <translation type="vanished">认证中,请稍等...</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1026"/> -- <location filename="../src/mainwindow.cpp" line="1093"/> -- <location filename="../src/mainwindow.cpp" line="1094"/> -+ <location filename="../src/mainwindow.cpp" line="1219"/> -+ <location filename="../src/mainwindow.cpp" line="1292"/> -+ <location filename="../src/mainwindow.cpp" line="1293"/> - <source>Please try again in %1 minutes.</source> - <translation>Veuillez réessayer dans %1 minutes.</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1036"/> -- <location filename="../src/mainwindow.cpp" line="1103"/> -- <location filename="../src/mainwindow.cpp" line="1104"/> -+ <location filename="../src/mainwindow.cpp" line="1230"/> -+ <location filename="../src/mainwindow.cpp" line="1302"/> -+ <location filename="../src/mainwindow.cpp" line="1303"/> - <source>Please try again in %1 seconds.</source> - <translation>Veuillez réessayer dans %1 secondes.</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1045"/> -- <location filename="../src/mainwindow.cpp" line="1046"/> -- <location filename="../src/mainwindow.cpp" line="1112"/> -- <location filename="../src/mainwindow.cpp" line="1113"/> -+ <location filename="../src/mainwindow.cpp" line="1240"/> -+ <location filename="../src/mainwindow.cpp" line="1241"/> -+ <location filename="../src/mainwindow.cpp" line="1311"/> -+ <location filename="../src/mainwindow.cpp" line="1312"/> - <source>Account locked permanently.</source> - <translation>Compte verrouillé définitivement.</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="675"/> -- <location filename="../src/mainwindow.cpp" line="676"/> -+ <location filename="../src/mainwindow.cpp" line="834"/> -+ <location filename="../src/mainwindow.cpp" line="835"/> - <source>Password cannot be empty</source> - <translation>Le mot de passe ne peut pas être vide</translation> - </message> -@@ -221,7 +221,8 @@ - <translation type="vanished">无法验证%1,请输入密码.</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="175"/> -+ <location filename="../src/mainwindow.cpp" line="242"/> -+ <location filename="../src/mainwindow.cpp" line="246"/> - <source>Failed to verify %1, you still have %2 verification opportunities</source> - <translation>Échec de la vérification %1, vous avez encore %2 possibilités de vérification</translation> - </message> -@@ -230,42 +231,42 @@ - <translation type="vanished">一个程序正试图执行一个需要特权的动作。要求授权以执行该动作。</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="578"/> -+ <location filename="../src/mainwindow.cpp" line="731"/> - <source>Password: </source> - <translation>Mot de passe: </translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="261"/> -+ <location filename="../src/mainwindow.cpp" line="335"/> - <source>Please enter your password or enroll your fingerprint </source> - <translation>Veuillez saisir votre mot de passe ou enregistrer votre empreinte digitale </translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="187"/> -+ <location filename="../src/mainwindow.cpp" line="259"/> - <source>Abnormal network</source> - <translation>Réseau anormal</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="511"/> -+ <location filename="../src/mainwindow.cpp" line="665"/> - <source>This operation requires the administrator's authorization. Please enter your password to allow this operation.</source> - <translation>Cette opération nécessite l’autorisation de l’administrateur. Veuillez saisir votre mot de passe pour autoriser cette opération.</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="580"/> -+ <location filename="../src/mainwindow.cpp" line="733"/> - <source>_Password: </source> - <translation>_Mot de passe: </translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="582"/> -+ <location filename="../src/mainwindow.cpp" line="735"/> - <source>_Password:</source> - <translation>_Mot de passe:</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="691"/> -+ <location filename="../src/mainwindow.cpp" line="850"/> - <source>Authentication failed, please try again.</source> - <translation>L’authentification a échoué, veuillez réessayer.</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="623"/> -+ <location filename="../src/mainwindow.cpp" line="779"/> - <source>days left</source> - <translation>jours restants</translation> - </message> -@@ -278,14 +279,16 @@ - <translation type="vanished">生物/扫码验证失败,您还有%1次尝试机会</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="164"/> -- <location filename="../src/mainwindow.cpp" line="1176"/> -+ <location filename="../src/mainwindow.cpp" line="226"/> -+ <location filename="../src/mainwindow.cpp" line="1415"/> -+ <location filename="../src/mainwindow.cpp" line="1417"/> - <source>Failed to verify %1, please enter password to unlock</source> - <translation>Impossible de vérifier %1, veuillez entrer le mot de passe pour déverrouiller</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="168"/> -- <location filename="../src/mainwindow.cpp" line="1178"/> -+ <location filename="../src/mainwindow.cpp" line="231"/> -+ <location filename="../src/mainwindow.cpp" line="233"/> -+ <location filename="../src/mainwindow.cpp" line="1419"/> - <source>Unable to verify %1, please enter password to unlock</source> - <translation>Impossible de vérifier %1, veuillez entrer le mot de passe pour déverrouiller</translation> - </message> -@@ -294,57 +297,74 @@ - <translation type="vanished">网络异常</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="517"/> -+ <location filename="../src/mainwindow.cpp" line="671"/> - <source>A program is attempting to perform an action that requires privileges.It requires authorization to perform the action.</source> - <translation>Un programme tente d’effectuer une action qui nécessite des privilèges. Il nécessite une autorisation pour effectuer l’action.</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="576"/> -+ <location filename="../src/mainwindow.cpp" line="108"/> -+ <location filename="../src/mainwindow.cpp" line="729"/> - <source>Input Password</source> - <translation>Mot de passe d’entrée</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="627"/> -+ <location filename="../src/mainwindow.cpp" line="105"/> -+ <source>Insert the ukey into the USB port</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="107"/> -+ <source>Enter the ukey password</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="783"/> - <source>hours left</source> - <translation>Heures restantes</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="631"/> -+ <location filename="../src/mainwindow.cpp" line="787"/> - <source>minutes left</source> - <translation>minutes restantes</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="635"/> -+ <location filename="../src/mainwindow.cpp" line="791"/> - <source>seconds left</source> - <translation>secondes restantes</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1193"/> -+ <location filename="../src/mainwindow.cpp" line="880"/> -+ <location filename="../src/mainwindow.cpp" line="888"/> -+ <source>Input your password to authentication</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="1434"/> - <source>Verify face recognition or enter password to unlock</source> - <translation>Vérifier la reconnaissance faciale ou saisir le mot de passe pour déverrouiller</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1198"/> -+ <location filename="../src/mainwindow.cpp" line="1439"/> - <source>Press fingerprint or enter password to unlock</source> - <translation>Appuyez sur l’empreinte digitale ou entrez le mot de passe pour déverrouiller</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1203"/> -+ <location filename="../src/mainwindow.cpp" line="1444"/> - <source>Verify voiceprint or enter password to unlock</source> - <translation>Vérifier l’empreinte vocale ou saisir le mot de passe pour déverrouiller</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1208"/> -+ <location filename="../src/mainwindow.cpp" line="1449"/> - <source>Verify finger vein or enter password to unlock</source> - <translation>Vérifiez la veine du doigt ou entrez le mot de passe pour déverrouiller</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1213"/> -+ <location filename="../src/mainwindow.cpp" line="1454"/> - <source>Verify iris or enter password to unlock</source> - <translation>Vérifiez l’iris ou entrez le mot de passe pour déverrouiller</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1218"/> -+ <location filename="../src/mainwindow.cpp" line="1459"/> - <source>Use the bound wechat scanning code or enter the password to unlock</source> - <translation>Utilisez le code d’analyse wechat lié ou entrez le mot de passe pour déverrouiller</translation> - </message> -@@ -353,10 +373,10 @@ - <translation type="vanished">使用绑定的微信扫码或输入密码登录</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="623"/> -- <location filename="../src/mainwindow.cpp" line="627"/> -- <location filename="../src/mainwindow.cpp" line="631"/> -- <location filename="../src/mainwindow.cpp" line="635"/> -+ <location filename="../src/mainwindow.cpp" line="779"/> -+ <location filename="../src/mainwindow.cpp" line="783"/> -+ <location filename="../src/mainwindow.cpp" line="787"/> -+ <location filename="../src/mainwindow.cpp" line="791"/> - <source>Account locked,</source> - <translation>Compte verrouillé,</translation> - </message> -@@ -373,12 +393,12 @@ - <translation>Un autre client est déjà en train de s’authentifier, veuillez réessayer plus tard.</translation> - </message> - <message> -- <location filename="../src/PolkitListener.cpp" line="257"/> -+ <location filename="../src/PolkitListener.cpp" line="265"/> - <source>Authentication failure, please try again.</source> - <translation>Échec de l’authentification, veuillez réessayer.</translation> - </message> - <message> -- <location filename="../src/PolkitListener.cpp" line="264"/> -+ <location filename="../src/PolkitListener.cpp" line="272"/> - <source>Password input error!</source> - <translation>Erreur de saisie du mot de passe !</translation> - </message> -diff --git a/polkit-agent/i18n_ts/kk.ts b/polkit-agent/i18n_ts/kk.ts -index f2eb55e..f3a13b3 100644 ---- a/polkit-agent/i18n_ts/kk.ts -+++ b/polkit-agent/i18n_ts/kk.ts -@@ -65,7 +65,7 @@ - <context> - <name>MainWindow</name> - <message> -- <location filename="../src/mainwindow.cpp" line="65"/> -+ <location filename="../src/mainwindow.cpp" line="66"/> - <source>Authentication</source> - <translation>Аутентификация</translation> - </message> -@@ -91,14 +91,14 @@ - <translation type="vanished">密码</translation> - </message> - <message> -- <location filename="../src/mainwindow.ui" line="302"/> -- <location filename="../src/mainwindow.cpp" line="882"/> -- <location filename="../src/mainwindow.cpp" line="948"/> -+ <location filename="../src/mainwindow.ui" line="409"/> -+ <location filename="../src/mainwindow.cpp" line="1075"/> -+ <location filename="../src/mainwindow.cpp" line="1143"/> - <source>Biometric</source> - <translation>Биометриялық</translation> - </message> - <message> -- <location filename="../src/mainwindow.ui" line="373"/> -+ <location filename="../src/mainwindow.ui" line="480"/> - <source>use password</source> - <translation>құпия сөзді пайдалану</translation> - </message> -@@ -147,20 +147,20 @@ - <translation type="vanished">Polkit.caller-pid:</translation> - </message> - <message> -- <location filename="../src/mainwindow.ui" line="334"/> -- <location filename="../src/mainwindow.cpp" line="884"/> -+ <location filename="../src/mainwindow.ui" line="441"/> -+ <location filename="../src/mainwindow.cpp" line="1077"/> - <source>Cancel</source> - <translation>Болдырмау</translation> - </message> - <message> -- <location filename="../src/mainwindow.ui" line="353"/> -- <location filename="../src/mainwindow.cpp" line="880"/> -+ <location filename="../src/mainwindow.ui" line="460"/> -+ <location filename="../src/mainwindow.cpp" line="1073"/> - <source>Authenticate</source> - <translation>Аутентификация</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="886"/> -- <location filename="../src/mainwindow.cpp" line="991"/> -+ <location filename="../src/mainwindow.cpp" line="1079"/> -+ <location filename="../src/mainwindow.cpp" line="1183"/> - <source>Use password</source> - <translation>Құпиясөзді пайдалану</translation> - </message> -@@ -185,30 +185,30 @@ - <translation type="vanished">认证中,请稍等...</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1026"/> -- <location filename="../src/mainwindow.cpp" line="1093"/> -- <location filename="../src/mainwindow.cpp" line="1094"/> -+ <location filename="../src/mainwindow.cpp" line="1219"/> -+ <location filename="../src/mainwindow.cpp" line="1292"/> -+ <location filename="../src/mainwindow.cpp" line="1293"/> - <source>Please try again in %1 minutes.</source> - <translation>% 1 минутта қайталап көріңіз.</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1036"/> -- <location filename="../src/mainwindow.cpp" line="1103"/> -- <location filename="../src/mainwindow.cpp" line="1104"/> -+ <location filename="../src/mainwindow.cpp" line="1230"/> -+ <location filename="../src/mainwindow.cpp" line="1302"/> -+ <location filename="../src/mainwindow.cpp" line="1303"/> - <source>Please try again in %1 seconds.</source> - <translation>% 1 секундта қайталап көріңіз.</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1045"/> -- <location filename="../src/mainwindow.cpp" line="1046"/> -- <location filename="../src/mainwindow.cpp" line="1112"/> -- <location filename="../src/mainwindow.cpp" line="1113"/> -+ <location filename="../src/mainwindow.cpp" line="1240"/> -+ <location filename="../src/mainwindow.cpp" line="1241"/> -+ <location filename="../src/mainwindow.cpp" line="1311"/> -+ <location filename="../src/mainwindow.cpp" line="1312"/> - <source>Account locked permanently.</source> - <translation>Тіркелгі біржолата құлыпталады.</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="675"/> -- <location filename="../src/mainwindow.cpp" line="676"/> -+ <location filename="../src/mainwindow.cpp" line="834"/> -+ <location filename="../src/mainwindow.cpp" line="835"/> - <source>Password cannot be empty</source> - <translation>Құпия сөз бос болмады</translation> - </message> -@@ -221,7 +221,8 @@ - <translation type="vanished">无法验证%1,请输入密码.</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="175"/> -+ <location filename="../src/mainwindow.cpp" line="242"/> -+ <location filename="../src/mainwindow.cpp" line="246"/> - <source>Failed to verify %1, you still have %2 verification opportunities</source> - <translation>% 1 дегенді тексеру мүмкін болмады, сізде әлі де% 2 тексеру мүмкіндіктері бар</translation> - </message> -@@ -230,42 +231,42 @@ - <translation type="vanished">一个程序正试图执行一个需要特权的动作。要求授权以执行该动作。</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="578"/> -+ <location filename="../src/mainwindow.cpp" line="731"/> - <source>Password: </source> - <translation>Құпия сөз: </translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="261"/> -+ <location filename="../src/mainwindow.cpp" line="335"/> - <source>Please enter your password or enroll your fingerprint </source> - <translation>Құпия сөзді енгізіңіз немесе саусақ ізін жазыңыз </translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="187"/> -+ <location filename="../src/mainwindow.cpp" line="259"/> - <source>Abnormal network</source> - <translation>Аномальды желі</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="511"/> -+ <location filename="../src/mainwindow.cpp" line="665"/> - <source>This operation requires the administrator's authorization. Please enter your password to allow this operation.</source> - <translation>Бұл операция әкімшінің рұқсатын талап етеді. Осы операцияға рұқсат ету үшін құпия сөзіңізді енгізіңіз.</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="580"/> -+ <location filename="../src/mainwindow.cpp" line="733"/> - <source>_Password: </source> - <translation>_Password: </translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="582"/> -+ <location filename="../src/mainwindow.cpp" line="735"/> - <source>_Password:</source> - <translation>_Password:</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="691"/> -+ <location filename="../src/mainwindow.cpp" line="850"/> - <source>Authentication failed, please try again.</source> - <translation>Аутентификация сәтсіз аяқталды, қайталап көріңіз.</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="623"/> -+ <location filename="../src/mainwindow.cpp" line="779"/> - <source>days left</source> - <translation>қалған күндер</translation> - </message> -@@ -278,14 +279,16 @@ - <translation type="vanished">生物/扫码验证失败,您还有%1次尝试机会</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="164"/> -- <location filename="../src/mainwindow.cpp" line="1176"/> -+ <location filename="../src/mainwindow.cpp" line="226"/> -+ <location filename="../src/mainwindow.cpp" line="1415"/> -+ <location filename="../src/mainwindow.cpp" line="1417"/> - <source>Failed to verify %1, please enter password to unlock</source> - <translation>% 1 дегенді тексеру мүмкін болмады, құлыптан босату үшін құпия сөзді енгізіңіз</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="168"/> -- <location filename="../src/mainwindow.cpp" line="1178"/> -+ <location filename="../src/mainwindow.cpp" line="231"/> -+ <location filename="../src/mainwindow.cpp" line="233"/> -+ <location filename="../src/mainwindow.cpp" line="1419"/> - <source>Unable to verify %1, please enter password to unlock</source> - <translation>% 1 дегенді тексеру мүмкін болмады, құлыптан босату үшін құпия сөзді енгізіңіз</translation> - </message> -@@ -294,57 +297,74 @@ - <translation type="vanished">网络异常</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="517"/> -+ <location filename="../src/mainwindow.cpp" line="671"/> - <source>A program is attempting to perform an action that requires privileges.It requires authorization to perform the action.</source> - <translation>Бағдарлама артықшылықтарды талап ететін әрекетті орындауға талпыныс жасайды. Іс-әрекетті орындау үшін рұқсат талап етуге болады.</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="576"/> -+ <location filename="../src/mainwindow.cpp" line="108"/> -+ <location filename="../src/mainwindow.cpp" line="729"/> - <source>Input Password</source> - <translation>Құпиясөзді енгізу</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="627"/> -+ <location filename="../src/mainwindow.cpp" line="105"/> -+ <source>Insert the ukey into the USB port</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="107"/> -+ <source>Enter the ukey password</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="783"/> - <source>hours left</source> - <translation>сағаттар қалды</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="631"/> -+ <location filename="../src/mainwindow.cpp" line="787"/> - <source>minutes left</source> - <translation>минуттар қалды</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="635"/> -+ <location filename="../src/mainwindow.cpp" line="791"/> - <source>seconds left</source> - <translation>секундтар қалды</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1193"/> -+ <location filename="../src/mainwindow.cpp" line="880"/> -+ <location filename="../src/mainwindow.cpp" line="888"/> -+ <source>Input your password to authentication</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="1434"/> - <source>Verify face recognition or enter password to unlock</source> - <translation>Бет тануды тексеру немесе құлыптан босату үшін құпия сөзді енгізу</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1198"/> -+ <location filename="../src/mainwindow.cpp" line="1439"/> - <source>Press fingerprint or enter password to unlock</source> - <translation>Құлыптан босату үшін дактилоскопияны басу немесе құпия сөзді енгізу</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1203"/> -+ <location filename="../src/mainwindow.cpp" line="1444"/> - <source>Verify voiceprint or enter password to unlock</source> - <translation>Құлыптан босату үшін дауыстық ізді тексеру немесе құпия сөзді енгізу</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1208"/> -+ <location filename="../src/mainwindow.cpp" line="1449"/> - <source>Verify finger vein or enter password to unlock</source> - <translation>Құлыптан босату үшін саусақ көктамырын тексеру немесе құпия сөзді енгізу</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1213"/> -+ <location filename="../src/mainwindow.cpp" line="1454"/> - <source>Verify iris or enter password to unlock</source> - <translation>Құлыптан босату үшін IRIS тексеру немесе құпиясөзді енгізу</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1218"/> -+ <location filename="../src/mainwindow.cpp" line="1459"/> - <source>Use the bound wechat scanning code or enter the password to unlock</source> - <translation>Байланыстыратын wechat сканерлеу кодын пайдаланыңыз немесе құлыптан босату үшін құпия сөзді енгізіңіз</translation> - </message> -@@ -353,10 +373,10 @@ - <translation type="vanished">使用绑定的微信扫码或输入密码登录</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="623"/> -- <location filename="../src/mainwindow.cpp" line="627"/> -- <location filename="../src/mainwindow.cpp" line="631"/> -- <location filename="../src/mainwindow.cpp" line="635"/> -+ <location filename="../src/mainwindow.cpp" line="779"/> -+ <location filename="../src/mainwindow.cpp" line="783"/> -+ <location filename="../src/mainwindow.cpp" line="787"/> -+ <location filename="../src/mainwindow.cpp" line="791"/> - <source>Account locked,</source> - <translation>Тіркелгі құлыпталған,</translation> - </message> -@@ -373,12 +393,12 @@ - <translation>Басқа клиент қазірдің өзінде аутентификацияда, кейінірек қайталап көріңіз.</translation> - </message> - <message> -- <location filename="../src/PolkitListener.cpp" line="257"/> -+ <location filename="../src/PolkitListener.cpp" line="265"/> - <source>Authentication failure, please try again.</source> - <translation>Аутентификация сәтсіздігі, қайталап көріңіз.</translation> - </message> - <message> -- <location filename="../src/PolkitListener.cpp" line="264"/> -+ <location filename="../src/PolkitListener.cpp" line="272"/> - <source>Password input error!</source> - <translation>Құпия сөзді енгізу қатесі!</translation> - </message> -diff --git a/polkit-agent/i18n_ts/ky.ts b/polkit-agent/i18n_ts/ky.ts -index a761425..7841ff1 100644 ---- a/polkit-agent/i18n_ts/ky.ts -+++ b/polkit-agent/i18n_ts/ky.ts -@@ -65,7 +65,7 @@ - <context> - <name>MainWindow</name> - <message> -- <location filename="../src/mainwindow.cpp" line="65"/> -+ <location filename="../src/mainwindow.cpp" line="66"/> - <source>Authentication</source> - <translation>Аутентификация</translation> - </message> -@@ -91,14 +91,14 @@ - <translation type="vanished">密码</translation> - </message> - <message> -- <location filename="../src/mainwindow.ui" line="302"/> -- <location filename="../src/mainwindow.cpp" line="882"/> -- <location filename="../src/mainwindow.cpp" line="948"/> -+ <location filename="../src/mainwindow.ui" line="409"/> -+ <location filename="../src/mainwindow.cpp" line="1075"/> -+ <location filename="../src/mainwindow.cpp" line="1143"/> - <source>Biometric</source> - <translation>Биометрия</translation> - </message> - <message> -- <location filename="../src/mainwindow.ui" line="373"/> -+ <location filename="../src/mainwindow.ui" line="480"/> - <source>use password</source> - <translation>сырсөз колдонуу</translation> - </message> -@@ -147,20 +147,20 @@ - <translation type="vanished">Polkit.caller-pid:</translation> - </message> - <message> -- <location filename="../src/mainwindow.ui" line="334"/> -- <location filename="../src/mainwindow.cpp" line="884"/> -+ <location filename="../src/mainwindow.ui" line="441"/> -+ <location filename="../src/mainwindow.cpp" line="1077"/> - <source>Cancel</source> - <translation>Жокко чыгаруу</translation> - </message> - <message> -- <location filename="../src/mainwindow.ui" line="353"/> -- <location filename="../src/mainwindow.cpp" line="880"/> -+ <location filename="../src/mainwindow.ui" line="460"/> -+ <location filename="../src/mainwindow.cpp" line="1073"/> - <source>Authenticate</source> - <translation>Аутентификация</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="886"/> -- <location filename="../src/mainwindow.cpp" line="991"/> -+ <location filename="../src/mainwindow.cpp" line="1079"/> -+ <location filename="../src/mainwindow.cpp" line="1183"/> - <source>Use password</source> - <translation>Сырсөз колдонуу</translation> - </message> -@@ -185,30 +185,30 @@ - <translation type="vanished">认证中,请稍等...</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1026"/> -- <location filename="../src/mainwindow.cpp" line="1093"/> -- <location filename="../src/mainwindow.cpp" line="1094"/> -+ <location filename="../src/mainwindow.cpp" line="1219"/> -+ <location filename="../src/mainwindow.cpp" line="1292"/> -+ <location filename="../src/mainwindow.cpp" line="1293"/> - <source>Please try again in %1 minutes.</source> - <translation>%1 мүнөттө кайра аракет кылыңыз.</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1036"/> -- <location filename="../src/mainwindow.cpp" line="1103"/> -- <location filename="../src/mainwindow.cpp" line="1104"/> -+ <location filename="../src/mainwindow.cpp" line="1230"/> -+ <location filename="../src/mainwindow.cpp" line="1302"/> -+ <location filename="../src/mainwindow.cpp" line="1303"/> - <source>Please try again in %1 seconds.</source> - <translation>%1 секунданын ичинде кайра аракет кылыңыз.</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1045"/> -- <location filename="../src/mainwindow.cpp" line="1046"/> -- <location filename="../src/mainwindow.cpp" line="1112"/> -- <location filename="../src/mainwindow.cpp" line="1113"/> -+ <location filename="../src/mainwindow.cpp" line="1240"/> -+ <location filename="../src/mainwindow.cpp" line="1241"/> -+ <location filename="../src/mainwindow.cpp" line="1311"/> -+ <location filename="../src/mainwindow.cpp" line="1312"/> - <source>Account locked permanently.</source> - <translation>Эсеп биротоло кулпуланган.</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="675"/> -- <location filename="../src/mainwindow.cpp" line="676"/> -+ <location filename="../src/mainwindow.cpp" line="834"/> -+ <location filename="../src/mainwindow.cpp" line="835"/> - <source>Password cannot be empty</source> - <translation>Сырсөз бош болушу мүмкүн эмес</translation> - </message> -@@ -221,7 +221,8 @@ - <translation type="vanished">无法验证%1,请输入密码.</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="175"/> -+ <location filename="../src/mainwindow.cpp" line="242"/> -+ <location filename="../src/mainwindow.cpp" line="246"/> - <source>Failed to verify %1, you still have %2 verification opportunities</source> - <translation>%1 текшерүүгө болбоду, сизде дагы эле %2 текшерүү мүмкүнчүлүктөрү бар</translation> - </message> -@@ -230,42 +231,42 @@ - <translation type="vanished">一个程序正试图执行一个需要特权的动作。要求授权以执行该动作。</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="578"/> -+ <location filename="../src/mainwindow.cpp" line="731"/> - <source>Password: </source> - <translation>Сырсөз: </translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="261"/> -+ <location filename="../src/mainwindow.cpp" line="335"/> - <source>Please enter your password or enroll your fingerprint </source> - <translation>Сырсөзүңөрдү киргизиңиз же манжа изин жазыңыз </translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="187"/> -+ <location filename="../src/mainwindow.cpp" line="259"/> - <source>Abnormal network</source> - <translation>Аномалдуу тармак</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="511"/> -+ <location filename="../src/mainwindow.cpp" line="665"/> - <source>This operation requires the administrator's authorization. Please enter your password to allow this operation.</source> - <translation>Бул операция администратордун уруксатын талап кылат. Бул операцияга уруксат берүү үчүн сырсөздү киргизиңиз.</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="580"/> -+ <location filename="../src/mainwindow.cpp" line="733"/> - <source>_Password: </source> - <translation>_Password: </translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="582"/> -+ <location filename="../src/mainwindow.cpp" line="735"/> - <source>_Password:</source> - <translation>_Password:</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="691"/> -+ <location filename="../src/mainwindow.cpp" line="850"/> - <source>Authentication failed, please try again.</source> - <translation>Аутентификация ишке ашпады, кайра аракет кылыңыз.</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="623"/> -+ <location filename="../src/mainwindow.cpp" line="779"/> - <source>days left</source> - <translation>калган күндөр</translation> - </message> -@@ -278,14 +279,16 @@ - <translation type="vanished">生物/扫码验证失败,您还有%1次尝试机会</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="164"/> -- <location filename="../src/mainwindow.cpp" line="1176"/> -+ <location filename="../src/mainwindow.cpp" line="226"/> -+ <location filename="../src/mainwindow.cpp" line="1415"/> -+ <location filename="../src/mainwindow.cpp" line="1417"/> - <source>Failed to verify %1, please enter password to unlock</source> - <translation>%1 текшерүүгө болбоду, кулпусун ачуу үчүн сырсөздү киргизиңиз</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="168"/> -- <location filename="../src/mainwindow.cpp" line="1178"/> -+ <location filename="../src/mainwindow.cpp" line="231"/> -+ <location filename="../src/mainwindow.cpp" line="233"/> -+ <location filename="../src/mainwindow.cpp" line="1419"/> - <source>Unable to verify %1, please enter password to unlock</source> - <translation>%1 текшерүүгө болбоду, кулпусун ачуу үчүн сырсөздү киргизиңиз</translation> - </message> -@@ -294,57 +297,74 @@ - <translation type="vanished">网络异常</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="517"/> -+ <location filename="../src/mainwindow.cpp" line="671"/> - <source>A program is attempting to perform an action that requires privileges.It requires authorization to perform the action.</source> - <translation>Программа артыкчылыктарды талап кылган акцияны аткарууга аракет кылат. Акцияны аткарууга уруксат талап кылынат.</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="576"/> -+ <location filename="../src/mainwindow.cpp" line="108"/> -+ <location filename="../src/mainwindow.cpp" line="729"/> - <source>Input Password</source> - <translation>Сырсөз киргизүү</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="627"/> -+ <location filename="../src/mainwindow.cpp" line="105"/> -+ <source>Insert the ukey into the USB port</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="107"/> -+ <source>Enter the ukey password</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="783"/> - <source>hours left</source> - <translation>саат калды</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="631"/> -+ <location filename="../src/mainwindow.cpp" line="787"/> - <source>minutes left</source> - <translation>мүнөт калды</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="635"/> -+ <location filename="../src/mainwindow.cpp" line="791"/> - <source>seconds left</source> - <translation>секуд калды</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1193"/> -+ <location filename="../src/mainwindow.cpp" line="880"/> -+ <location filename="../src/mainwindow.cpp" line="888"/> -+ <source>Input your password to authentication</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="1434"/> - <source>Verify face recognition or enter password to unlock</source> - <translation>Беттин таанылышын текшерүү же кулпуну ачуу үчүн сырсөз киргизүү</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1198"/> -+ <location filename="../src/mainwindow.cpp" line="1439"/> - <source>Press fingerprint or enter password to unlock</source> - <translation>Манжа изин басуу же кулпуну ачуу үчүн сырсөз киргизүү</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1203"/> -+ <location filename="../src/mainwindow.cpp" line="1444"/> - <source>Verify voiceprint or enter password to unlock</source> - <translation>Үн изин текшерүү же сырсөз киргизүү</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1208"/> -+ <location filename="../src/mainwindow.cpp" line="1449"/> - <source>Verify finger vein or enter password to unlock</source> - <translation>Манжа тамырын текшерүү же кулпуну ачуу үчүн сырсөз киргизүү</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1213"/> -+ <location filename="../src/mainwindow.cpp" line="1454"/> - <source>Verify iris or enter password to unlock</source> - <translation>Ирис текшерүү же кулпусун ачуу үчүн сырсөз киргизүү</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1218"/> -+ <location filename="../src/mainwindow.cpp" line="1459"/> - <source>Use the bound wechat scanning code or enter the password to unlock</source> - <translation>Чектелген вечат сканерлеу кодын колдонуңуз же сырсөздү ачуу үчүн киргизиңиз</translation> - </message> -@@ -353,10 +373,10 @@ - <translation type="vanished">使用绑定的微信扫码或输入密码登录</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="623"/> -- <location filename="../src/mainwindow.cpp" line="627"/> -- <location filename="../src/mainwindow.cpp" line="631"/> -- <location filename="../src/mainwindow.cpp" line="635"/> -+ <location filename="../src/mainwindow.cpp" line="779"/> -+ <location filename="../src/mainwindow.cpp" line="783"/> -+ <location filename="../src/mainwindow.cpp" line="787"/> -+ <location filename="../src/mainwindow.cpp" line="791"/> - <source>Account locked,</source> - <translation>Эсеп кулпуланган,</translation> - </message> -@@ -373,12 +393,12 @@ - <translation>Дагы бир кардар буга чейин аутентификацияланган, кийин кайра аракет кылыңыз.</translation> - </message> - <message> -- <location filename="../src/PolkitListener.cpp" line="257"/> -+ <location filename="../src/PolkitListener.cpp" line="265"/> - <source>Authentication failure, please try again.</source> - <translation>Аутентификациянын жетишсиздиги, сураныч, кайрадан аракет кылыңыз.</translation> - </message> - <message> -- <location filename="../src/PolkitListener.cpp" line="264"/> -+ <location filename="../src/PolkitListener.cpp" line="272"/> - <source>Password input error!</source> - <translation>Сырсөз киргизүү катасы!</translation> - </message> -diff --git a/polkit-agent/i18n_ts/mn.ts b/polkit-agent/i18n_ts/mn.ts -index ddf8371..4f8ed3c 100644 ---- a/polkit-agent/i18n_ts/mn.ts -+++ b/polkit-agent/i18n_ts/mn.ts -@@ -65,7 +65,7 @@ - <context> - <name>MainWindow</name> - <message> -- <location filename="../src/mainwindow.cpp" line="65"/> -+ <location filename="../src/mainwindow.cpp" line="66"/> - <source>Authentication</source> - <translation>ᠡᠷᠬᠡ ᠤᠯᠭᠤᠬᠤ</translation> - </message> -@@ -93,7 +93,7 @@ - <message> - <location filename="../src/mainwindow.ui" line="409"/> - <location filename="../src/mainwindow.cpp" line="1075"/> -- <location filename="../src/mainwindow.cpp" line="1146"/> -+ <location filename="../src/mainwindow.cpp" line="1143"/> - <source>Biometric</source> - <translation>ᠠᠮᠢᠳᠤ ᠪᠤᠳᠠᠰ ᠢ᠋ ᠬᠡᠷᠡᠭᠯᠡᠵᠤ ᠢᠯᠭᠠᠨ ᠳᠠᠨᠢᠬᠤ</translation> - </message> -@@ -160,7 +160,7 @@ - </message> - <message> - <location filename="../src/mainwindow.cpp" line="1079"/> -- <location filename="../src/mainwindow.cpp" line="1189"/> -+ <location filename="../src/mainwindow.cpp" line="1183"/> - <source>Use password</source> - <translation>ᠰᠢᠯᠭᠠᠨ ᠪᠠᠳᠤᠯᠠᠭᠰᠠᠨ ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋ ᠢ᠋ ᠬᠡᠷᠡᠭᠯᠡᠬᠦ</translation> - </message> -@@ -185,24 +185,24 @@ - <translation type="vanished">认证中,请稍等...</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1225"/> -- <location filename="../src/mainwindow.cpp" line="1298"/> -- <location filename="../src/mainwindow.cpp" line="1299"/> -+ <location filename="../src/mainwindow.cpp" line="1219"/> -+ <location filename="../src/mainwindow.cpp" line="1292"/> -+ <location filename="../src/mainwindow.cpp" line="1293"/> - <source>Please try again in %1 minutes.</source> - <translation>%1 ᠮᠢᠨᠦ᠋ᠲᠦᠨ ᠳᠠᠷᠠᠭᠠ ᠳᠠᠬᠢᠵᠤ ᠳᠤᠷᠱᠢᠭᠠᠷᠠᠢ.</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1236"/> -- <location filename="../src/mainwindow.cpp" line="1308"/> -- <location filename="../src/mainwindow.cpp" line="1309"/> -+ <location filename="../src/mainwindow.cpp" line="1230"/> -+ <location filename="../src/mainwindow.cpp" line="1302"/> -+ <location filename="../src/mainwindow.cpp" line="1303"/> - <source>Please try again in %1 seconds.</source> - <translation>%1 ᠮᠢᠨᠦ᠋ᠲᠦᠨ ᠳᠠᠷᠠᠭᠠ ᠳᠠᠬᠢᠵᠤ ᠳᠤᠷᠱᠢᠭᠠᠷᠠᠢ.</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1246"/> -- <location filename="../src/mainwindow.cpp" line="1247"/> -- <location filename="../src/mainwindow.cpp" line="1317"/> -- <location filename="../src/mainwindow.cpp" line="1318"/> -+ <location filename="../src/mainwindow.cpp" line="1240"/> -+ <location filename="../src/mainwindow.cpp" line="1241"/> -+ <location filename="../src/mainwindow.cpp" line="1311"/> -+ <location filename="../src/mainwindow.cpp" line="1312"/> - <source>Account locked permanently.</source> - <translation>ᠳᠠᠩᠰᠠ ᠨᠢᠭᠡᠨᠳᠡ ᠦᠨᠢᠳᠡ ᠤᠨᠢᠰᠤᠯᠠᠭᠳᠠᠪᠠ.</translation> - </message> -@@ -280,15 +280,15 @@ - </message> - <message> - <location filename="../src/mainwindow.cpp" line="226"/> -- <location filename="../src/mainwindow.cpp" line="1421"/> -- <location filename="../src/mainwindow.cpp" line="1423"/> -+ <location filename="../src/mainwindow.cpp" line="1415"/> -+ <location filename="../src/mainwindow.cpp" line="1417"/> - <source>Failed to verify %1, please enter password to unlock</source> - <translation>%1ᠶᠢ/ᠢ ᠪᠠᠳᠤᠯᠭᠠᠵᠢᠭᠤᠯᠬᠤ ᠠᠷᠭᠠ ᠦᠬᠡᠢ ᠂ ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋ ᠤᠷᠤᠭᠤᠯᠵᠤ ᠤᠨᠢᠰᠤᠶᠢ ᠳᠠᠢᠯᠤᠭᠠᠷᠠᠢ</translation> - </message> - <message> - <location filename="../src/mainwindow.cpp" line="231"/> - <location filename="../src/mainwindow.cpp" line="233"/> -- <location filename="../src/mainwindow.cpp" line="1425"/> -+ <location filename="../src/mainwindow.cpp" line="1419"/> - <source>Unable to verify %1, please enter password to unlock</source> - <translation>%1ᠶᠢ/ᠢ ᠪᠠᠳᠤᠯᠭᠠᠵᠢᠭᠤᠯᠬᠤ ᠠᠷᠭᠠ ᠦᠬᠡᠢ ᠂ ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋ ᠤᠷᠤᠭᠤᠯᠵᠤ ᠤᠨᠢᠰᠤᠶᠢ ᠳᠠᠢᠯᠤᠭᠠᠷᠠᠢ</translation> - </message> -@@ -339,32 +339,32 @@ - <translation>ᠨᠢᠭᠤᠴᠠ ᠨᠣᠮᠧᠷ ᠣᠷᠣᠭᠤᠯᠬᠤ ᠳᠤ ᠡᠷᠬᠡ ᠣᠯᠭᠣᠨᠠ ᠃</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1440"/> -+ <location filename="../src/mainwindow.cpp" line="1434"/> - <source>Verify face recognition or enter password to unlock</source> - <translation>ᠨᠢᠭᠤᠷ ᠱᠢᠷᠪᠢᠵᠤ ᠪᠠᠳᠤᠯᠭᠠᠵᠢᠭᠤᠯᠬᠤ ᠪᠤᠶᠤ ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋ ᠤᠷᠤᠭᠤᠯᠵᠤ ᠤᠨᠢᠰᠤᠶᠢ ᠳᠠᠢᠯᠤᠭᠠᠷᠠᠢ</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1445"/> -+ <location filename="../src/mainwindow.cpp" line="1439"/> - <source>Press fingerprint or enter password to unlock</source> - <translation>ᠬᠤᠷᠤᠭᠤᠨᠤ ᠤᠷᠤᠮ ᠳᠠᠷᠤᠬᠤ ᠪᠤᠶᠤ ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋ ᠤᠷᠤᠭᠤᠯᠵᠤ ᠤᠨᠢᠰᠤᠶᠢ ᠳᠠᠢᠯᠤᠭᠠᠷᠠᠢ</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1450"/> -+ <location filename="../src/mainwindow.cpp" line="1444"/> - <source>Verify voiceprint or enter password to unlock</source> - <translation>ᠳᠠᠭᠤᠪᠠᠷ ᠰᠢᠯᠭᠠᠨ ᠪᠠᠳᠤᠯᠠᠬᠤ ᠪᠤᠶᠤ ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋ ᠤᠷᠤᠭᠤᠯᠵᠤ ᠤᠨᠢᠰᠤᠶᠢ ᠳᠠᠢᠯᠤᠭᠠᠷᠠᠢ</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1455"/> -+ <location filename="../src/mainwindow.cpp" line="1449"/> - <source>Verify finger vein or enter password to unlock</source> - <translation>ᠬᠤᠷᠤᠭᠤᠨᠤ ᠨᠠᠮᠵᠢᠭᠤᠨ ᠰᠤᠳᠠᠯᠢᠶᠠᠷ ᠰᠢᠯᠭᠠᠨ ᠪᠠᠳᠤᠯᠠᠬᠤ ᠪᠤᠶᠤ ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋ ᠤᠷᠤᠭᠤᠯᠵᠤ ᠤᠨᠢᠰᠤᠶᠢ ᠳᠠᠢᠯᠤᠭᠠᠷᠠᠢ</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1460"/> -+ <location filename="../src/mainwindow.cpp" line="1454"/> - <source>Verify iris or enter password to unlock</source> - <translation>ᠰᠤᠯᠤᠩᠭᠠ ᠪᠦᠷᠬᠦᠪᠴᠢᠶᠢ ᠰᠢᠯᠭᠠᠨ ᠪᠠᠳᠤᠯᠠᠬᠤ ᠪᠤᠶᠤ ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋ ᠤᠷᠤᠭᠤᠯᠵᠤ ᠤᠨᠢᠰᠤᠶᠢ ᠳᠠᠢᠯᠤᠭᠠᠷᠠᠢ</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1465"/> -+ <location filename="../src/mainwindow.cpp" line="1459"/> - <source>Use the bound wechat scanning code or enter the password to unlock</source> - <translation>ᠤᠶᠠᠭᠰᠠᠨ ᠸᠢᠴᠠᠲᠢᠶᠠᠷ ᠺᠤᠳ᠋ ᠱᠢᠷᠪᠢᠬᠦ᠌ ᠪᠤᠶᠤ ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋ ᠤᠷᠤᠭᠤᠯᠵᠤ ᠤᠨᠢᠰᠤᠶᠢ ᠳᠠᠢᠯᠤᠭᠠᠷᠠᠢ</translation> - </message> -@@ -393,12 +393,12 @@ - <translation>ᠦᠬᠡᠷᠡ ᠨᠢᠭᠡ ᠬᠡᠷᠡᠭᠯᠡᠭᠴᠢ ᠵᠢᠨ ᠦᠵᠦᠬᠦᠷᠯᠢᠭ ᠢ᠋ ᠶᠠᠭ ᠨᠤᠳᠠᠯᠠᠵᠤ ᠪᠠᠢᠨᠠ᠂ ᠤᠳᠠᠰᠬᠢᠭᠠᠳ ᠳᠠᠬᠢᠨ ᠳᠤᠷᠰᠢᠭᠠᠷᠠᠢ.</translation> - </message> - <message> -- <location filename="../src/PolkitListener.cpp" line="261"/> -+ <location filename="../src/PolkitListener.cpp" line="265"/> - <source>Authentication failure, please try again.</source> - <translation>ᠰᠢᠯᠭᠠᠨ ᠪᠠᠳᠤᠯᠠᠵᠤ ᠴᠢᠳᠠᠭᠰᠠᠨ ᠦᠬᠡᠢ᠂ ᠳᠠᠬᠢᠵᠤ ᠳᠤᠷᠰᠢᠭᠠᠷᠠᠢ.</translation> - </message> - <message> -- <location filename="../src/PolkitListener.cpp" line="268"/> -+ <location filename="../src/PolkitListener.cpp" line="272"/> - <source>Password input error!</source> - <translation>ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋ ᠢ᠋ ᠪᠤᠷᠤᠭᠤ ᠤᠷᠤᠭᠤᠯᠪᠠ!</translation> - </message> -diff --git a/polkit-agent/i18n_ts/pt.ts b/polkit-agent/i18n_ts/pt.ts -index b24dbb2..155dec7 100644 ---- a/polkit-agent/i18n_ts/pt.ts -+++ b/polkit-agent/i18n_ts/pt.ts -@@ -185,6 +185,18 @@ - <source>This operation requires the administrator's authorization. Please enter your password to allow this operation.</source> - <translation type="unfinished"></translation> - </message> -+ <message> -+ <source>Insert the ukey into the USB port</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <source>Enter the ukey password</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <source>Input your password to authentication</source> -+ <translation type="unfinished"></translation> -+ </message> - </context> - <context> - <name>PolkitListener</name> -diff --git a/polkit-agent/i18n_ts/ru.ts b/polkit-agent/i18n_ts/ru.ts -index 6ceb7d7..c75c155 100644 ---- a/polkit-agent/i18n_ts/ru.ts -+++ b/polkit-agent/i18n_ts/ru.ts -@@ -185,6 +185,18 @@ - <source>This operation requires the administrator's authorization. Please enter your password to allow this operation.</source> - <translation type="unfinished"></translation> - </message> -+ <message> -+ <source>Insert the ukey into the USB port</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <source>Enter the ukey password</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <source>Input your password to authentication</source> -+ <translation type="unfinished"></translation> -+ </message> - </context> - <context> - <name>PolkitListener</name> -diff --git a/polkit-agent/i18n_ts/tr.ts b/polkit-agent/i18n_ts/tr.ts -index 33848d7..f59c7a3 100644 ---- a/polkit-agent/i18n_ts/tr.ts -+++ b/polkit-agent/i18n_ts/tr.ts -@@ -34,136 +34,156 @@ - <context> - <name>MainWindow</name> - <message> -- <location filename="../src/mainwindow.cpp" line="65"/> -+ <location filename="../src/mainwindow.cpp" line="66"/> - <source>Authentication</source> - <translation>Kimlik Doğrulama</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="164"/> -- <location filename="../src/mainwindow.cpp" line="1176"/> -+ <location filename="../src/mainwindow.cpp" line="226"/> -+ <location filename="../src/mainwindow.cpp" line="1415"/> -+ <location filename="../src/mainwindow.cpp" line="1417"/> - <source>Failed to verify %1, please enter password to unlock</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="168"/> -- <location filename="../src/mainwindow.cpp" line="1178"/> -+ <location filename="../src/mainwindow.cpp" line="231"/> -+ <location filename="../src/mainwindow.cpp" line="233"/> -+ <location filename="../src/mainwindow.cpp" line="1419"/> - <source>Unable to verify %1, please enter password to unlock</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="175"/> -+ <location filename="../src/mainwindow.cpp" line="242"/> -+ <location filename="../src/mainwindow.cpp" line="246"/> - <source>Failed to verify %1, you still have %2 verification opportunities</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="187"/> -+ <location filename="../src/mainwindow.cpp" line="259"/> - <source>Abnormal network</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="511"/> -+ <location filename="../src/mainwindow.cpp" line="665"/> - <source>This operation requires the administrator's authorization. Please enter your password to allow this operation.</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="517"/> -+ <location filename="../src/mainwindow.cpp" line="671"/> - <source>A program is attempting to perform an action that requires privileges.It requires authorization to perform the action.</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="576"/> -+ <location filename="../src/mainwindow.cpp" line="108"/> -+ <location filename="../src/mainwindow.cpp" line="729"/> - <source>Input Password</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="623"/> -- <location filename="../src/mainwindow.cpp" line="627"/> -- <location filename="../src/mainwindow.cpp" line="631"/> -- <location filename="../src/mainwindow.cpp" line="635"/> -+ <location filename="../src/mainwindow.cpp" line="105"/> -+ <source>Insert the ukey into the USB port</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="107"/> -+ <source>Enter the ukey password</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="779"/> -+ <location filename="../src/mainwindow.cpp" line="783"/> -+ <location filename="../src/mainwindow.cpp" line="787"/> -+ <location filename="../src/mainwindow.cpp" line="791"/> - <source>Account locked,</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="623"/> -+ <location filename="../src/mainwindow.cpp" line="779"/> - <source>days left</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="627"/> -+ <location filename="../src/mainwindow.cpp" line="783"/> - <source>hours left</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="631"/> -+ <location filename="../src/mainwindow.cpp" line="787"/> - <source>minutes left</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="635"/> -+ <location filename="../src/mainwindow.cpp" line="791"/> - <source>seconds left</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="675"/> -- <location filename="../src/mainwindow.cpp" line="676"/> -+ <location filename="../src/mainwindow.cpp" line="834"/> -+ <location filename="../src/mainwindow.cpp" line="835"/> - <source>Password cannot be empty</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="886"/> -- <location filename="../src/mainwindow.cpp" line="991"/> -+ <location filename="../src/mainwindow.cpp" line="880"/> -+ <location filename="../src/mainwindow.cpp" line="888"/> -+ <source>Input your password to authentication</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="1079"/> -+ <location filename="../src/mainwindow.cpp" line="1183"/> - <source>Use password</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1026"/> -- <location filename="../src/mainwindow.cpp" line="1093"/> -- <location filename="../src/mainwindow.cpp" line="1094"/> -+ <location filename="../src/mainwindow.cpp" line="1219"/> -+ <location filename="../src/mainwindow.cpp" line="1292"/> -+ <location filename="../src/mainwindow.cpp" line="1293"/> - <source>Please try again in %1 minutes.</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1036"/> -- <location filename="../src/mainwindow.cpp" line="1103"/> -- <location filename="../src/mainwindow.cpp" line="1104"/> -+ <location filename="../src/mainwindow.cpp" line="1230"/> -+ <location filename="../src/mainwindow.cpp" line="1302"/> -+ <location filename="../src/mainwindow.cpp" line="1303"/> - <source>Please try again in %1 seconds.</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1045"/> -- <location filename="../src/mainwindow.cpp" line="1046"/> -- <location filename="../src/mainwindow.cpp" line="1112"/> -- <location filename="../src/mainwindow.cpp" line="1113"/> -+ <location filename="../src/mainwindow.cpp" line="1240"/> -+ <location filename="../src/mainwindow.cpp" line="1241"/> -+ <location filename="../src/mainwindow.cpp" line="1311"/> -+ <location filename="../src/mainwindow.cpp" line="1312"/> - <source>Account locked permanently.</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1193"/> -+ <location filename="../src/mainwindow.cpp" line="1434"/> - <source>Verify face recognition or enter password to unlock</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1198"/> -+ <location filename="../src/mainwindow.cpp" line="1439"/> - <source>Press fingerprint or enter password to unlock</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1203"/> -+ <location filename="../src/mainwindow.cpp" line="1444"/> - <source>Verify voiceprint or enter password to unlock</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1208"/> -+ <location filename="../src/mainwindow.cpp" line="1449"/> - <source>Verify finger vein or enter password to unlock</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1213"/> -+ <location filename="../src/mainwindow.cpp" line="1454"/> - <source>Verify iris or enter password to unlock</source> - <translation type="unfinished"></translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1218"/> -+ <location filename="../src/mainwindow.cpp" line="1459"/> - <source>Use the bound wechat scanning code or enter the password to unlock</source> - <translation type="unfinished"></translation> - </message> -@@ -185,9 +205,9 @@ - <translation type="obsolete">Parola</translation> - </message> - <message> -- <location filename="../src/mainwindow.ui" line="302"/> -- <location filename="../src/mainwindow.cpp" line="882"/> -- <location filename="../src/mainwindow.cpp" line="948"/> -+ <location filename="../src/mainwindow.ui" line="409"/> -+ <location filename="../src/mainwindow.cpp" line="1075"/> -+ <location filename="../src/mainwindow.cpp" line="1143"/> - <source>Biometric</source> - <translation>Biyometrik</translation> - </message> -@@ -236,19 +256,19 @@ - <translation type="vanished">Polkit.caller-pid:</translation> - </message> - <message> -- <location filename="../src/mainwindow.ui" line="334"/> -- <location filename="../src/mainwindow.cpp" line="884"/> -+ <location filename="../src/mainwindow.ui" line="441"/> -+ <location filename="../src/mainwindow.cpp" line="1077"/> - <source>Cancel</source> - <translation>İptal</translation> - </message> - <message> -- <location filename="../src/mainwindow.ui" line="353"/> -- <location filename="../src/mainwindow.cpp" line="880"/> -+ <location filename="../src/mainwindow.ui" line="460"/> -+ <location filename="../src/mainwindow.cpp" line="1073"/> - <source>Authenticate</source> - <translation>Kimlik Doğrulaması</translation> - </message> - <message> -- <location filename="../src/mainwindow.ui" line="373"/> -+ <location filename="../src/mainwindow.ui" line="480"/> - <source>use password</source> - <translation type="unfinished"></translation> - </message> -@@ -257,7 +277,7 @@ - <translation type="obsolete">Kimlik Doğrulaması</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="261"/> -+ <location filename="../src/mainwindow.cpp" line="335"/> - <source>Please enter your password or enroll your fingerprint </source> - <translation type="unfinished"></translation> - </message> -@@ -270,22 +290,22 @@ - <translation type="vanished">Bir uygulama, ayrıcalıklar gerektiren bir eylem gerçekleştirmeye çalışıyor. Bu işlemi gerçekleştirmek için kimlik doğrulaması gerekiyor.</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="578"/> -+ <location filename="../src/mainwindow.cpp" line="731"/> - <source>Password: </source> - <translation type="unfinished">Parola: </translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="580"/> -+ <location filename="../src/mainwindow.cpp" line="733"/> - <source>_Password: </source> - <translation type="unfinished">_Parola: </translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="582"/> -+ <location filename="../src/mainwindow.cpp" line="735"/> - <source>_Password:</source> - <translation type="unfinished">_Parola:</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="691"/> -+ <location filename="../src/mainwindow.cpp" line="850"/> - <source>Authentication failed, please try again.</source> - <translation>Kimlik doğrulama başarısız, lütfen tekrar deneyin.</translation> - </message> -@@ -302,12 +322,12 @@ - <translation>Başka bir hesap zaten kimlik doğrulaması yapıyor, lütfen daha sonra tekrar deneyin.</translation> - </message> - <message> -- <location filename="../src/PolkitListener.cpp" line="257"/> -+ <location filename="../src/PolkitListener.cpp" line="265"/> - <source>Authentication failure, please try again.</source> - <translation>Kimlik doğrulama hatalı, lütfen tekrar deneyin.</translation> - </message> - <message> -- <location filename="../src/PolkitListener.cpp" line="264"/> -+ <location filename="../src/PolkitListener.cpp" line="272"/> - <source>Password input error!</source> - <translation type="unfinished"></translation> - </message> -diff --git a/polkit-agent/i18n_ts/ug.ts b/polkit-agent/i18n_ts/ug.ts -index 628eadd..3b2d973 100644 ---- a/polkit-agent/i18n_ts/ug.ts -+++ b/polkit-agent/i18n_ts/ug.ts -@@ -65,7 +65,7 @@ - <context> - <name>MainWindow</name> - <message> -- <location filename="../src/mainwindow.cpp" line="65"/> -+ <location filename="../src/mainwindow.cpp" line="66"/> - <source>Authentication</source> - <translation>راستىنى دەلىللەش</translation> - </message> -@@ -91,14 +91,14 @@ - <translation type="vanished">密码</translation> - </message> - <message> -- <location filename="../src/mainwindow.ui" line="302"/> -- <location filename="../src/mainwindow.cpp" line="882"/> -- <location filename="../src/mainwindow.cpp" line="948"/> -+ <location filename="../src/mainwindow.ui" line="409"/> -+ <location filename="../src/mainwindow.cpp" line="1075"/> -+ <location filename="../src/mainwindow.cpp" line="1143"/> - <source>Biometric</source> - <translation>بىئومېتىرىيە</translation> - </message> - <message> -- <location filename="../src/mainwindow.ui" line="373"/> -+ <location filename="../src/mainwindow.ui" line="480"/> - <source>use password</source> - <translation>مەخپىي نومۇر ئىشلىتىش</translation> - </message> -@@ -147,20 +147,20 @@ - <translation type="vanished">Polkit.caller-pid:</translation> - </message> - <message> -- <location filename="../src/mainwindow.ui" line="334"/> -- <location filename="../src/mainwindow.cpp" line="884"/> -+ <location filename="../src/mainwindow.ui" line="441"/> -+ <location filename="../src/mainwindow.cpp" line="1077"/> - <source>Cancel</source> - <translation>ئەمەلدىن قالدۇرۇش</translation> - </message> - <message> -- <location filename="../src/mainwindow.ui" line="353"/> -- <location filename="../src/mainwindow.cpp" line="880"/> -+ <location filename="../src/mainwindow.ui" line="460"/> -+ <location filename="../src/mainwindow.cpp" line="1073"/> - <source>Authenticate</source> - <translation>چىنلىق دەلىللەش</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="886"/> -- <location filename="../src/mainwindow.cpp" line="991"/> -+ <location filename="../src/mainwindow.cpp" line="1079"/> -+ <location filename="../src/mainwindow.cpp" line="1183"/> - <source>Use password</source> - <translation>پارول ئىشلىتىش</translation> - </message> -@@ -185,30 +185,30 @@ - <translation type="vanished">认证中,请稍等...</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1026"/> -- <location filename="../src/mainwindow.cpp" line="1093"/> -- <location filename="../src/mainwindow.cpp" line="1094"/> -+ <location filename="../src/mainwindow.cpp" line="1219"/> -+ <location filename="../src/mainwindow.cpp" line="1292"/> -+ <location filename="../src/mainwindow.cpp" line="1293"/> - <source>Please try again in %1 minutes.</source> - <translation>٪1 مىنۇت ئىچىدە قايتا سىناپ بېقىڭ.</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1036"/> -- <location filename="../src/mainwindow.cpp" line="1103"/> -- <location filename="../src/mainwindow.cpp" line="1104"/> -+ <location filename="../src/mainwindow.cpp" line="1230"/> -+ <location filename="../src/mainwindow.cpp" line="1302"/> -+ <location filename="../src/mainwindow.cpp" line="1303"/> - <source>Please try again in %1 seconds.</source> - <translation>٪1 سېكۇنت ئىچىدە قايتا سىناپ بېقىڭ.</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1045"/> -- <location filename="../src/mainwindow.cpp" line="1046"/> -- <location filename="../src/mainwindow.cpp" line="1112"/> -- <location filename="../src/mainwindow.cpp" line="1113"/> -+ <location filename="../src/mainwindow.cpp" line="1240"/> -+ <location filename="../src/mainwindow.cpp" line="1241"/> -+ <location filename="../src/mainwindow.cpp" line="1311"/> -+ <location filename="../src/mainwindow.cpp" line="1312"/> - <source>Account locked permanently.</source> - <translation>ھېسابات مەڭگۈلۈك قۇلۇپلىنىدۇ.</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="675"/> -- <location filename="../src/mainwindow.cpp" line="676"/> -+ <location filename="../src/mainwindow.cpp" line="834"/> -+ <location filename="../src/mainwindow.cpp" line="835"/> - <source>Password cannot be empty</source> - <translation>مەخپىي نومۇرنى بوش قويۇشقا بولمايدۇ</translation> - </message> -@@ -221,7 +221,8 @@ - <translation type="vanished">无法验证%1,请输入密码.</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="175"/> -+ <location filename="../src/mainwindow.cpp" line="242"/> -+ <location filename="../src/mainwindow.cpp" line="246"/> - <source>Failed to verify %1, you still have %2 verification opportunities</source> - <translation>٪1 نى دەلىللەش مەغلۇپ بولدى، سىزدە يەنىلا ٪2 دەلىللەش پۇرسىتى بار</translation> - </message> -@@ -230,42 +231,42 @@ - <translation type="vanished">一个程序正试图执行一个需要特权的动作。要求授权以执行该动作。</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="578"/> -+ <location filename="../src/mainwindow.cpp" line="731"/> - <source>Password: </source> - <translation>مەخپىي نومۇرى: </translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="261"/> -+ <location filename="../src/mainwindow.cpp" line="335"/> - <source>Please enter your password or enroll your fingerprint </source> - <translation>مەخپىي نومۇرىڭىزنى كىرگۈزۈڭ ياكى بارماق ئىزىڭىزنى تىزىملىتىڭ </translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="187"/> -+ <location filename="../src/mainwindow.cpp" line="259"/> - <source>Abnormal network</source> - <translation>بىنورمال تور</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="511"/> -+ <location filename="../src/mainwindow.cpp" line="665"/> - <source>This operation requires the administrator's authorization. Please enter your password to allow this operation.</source> - <translation>بۇ مەشغۇلات باشقۇرغۇچىنىڭ ھوقۇق بېرىشىنى تەلەپ قىلىدۇ. بۇ مەشغۇلاتقا رۇخسەت قىلىش ئۈچۈن پارولىڭىزنى كىرگۈزۈڭ.</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="580"/> -+ <location filename="../src/mainwindow.cpp" line="733"/> - <source>_Password: </source> - <translation>_Password: </translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="582"/> -+ <location filename="../src/mainwindow.cpp" line="735"/> - <source>_Password:</source> - <translation>_Password:</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="691"/> -+ <location filename="../src/mainwindow.cpp" line="850"/> - <source>Authentication failed, please try again.</source> - <translation>دەلىللەش مەغلۇپ بولدى، قايتا سىناپ بېقىڭ.</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="623"/> -+ <location filename="../src/mainwindow.cpp" line="779"/> - <source>days left</source> - <translation>قالغان كۈنلەر</translation> - </message> -@@ -278,14 +279,16 @@ - <translation type="vanished">生物/扫码验证失败,您还有%1次尝试机会</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="164"/> -- <location filename="../src/mainwindow.cpp" line="1176"/> -+ <location filename="../src/mainwindow.cpp" line="226"/> -+ <location filename="../src/mainwindow.cpp" line="1415"/> -+ <location filename="../src/mainwindow.cpp" line="1417"/> - <source>Failed to verify %1, please enter password to unlock</source> - <translation>٪1 نى دەلىللەش مەغلۇپ بولدى، مەخپى نۇمۇر كىرگۈزۈڭ</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="168"/> -- <location filename="../src/mainwindow.cpp" line="1178"/> -+ <location filename="../src/mainwindow.cpp" line="231"/> -+ <location filename="../src/mainwindow.cpp" line="233"/> -+ <location filename="../src/mainwindow.cpp" line="1419"/> - <source>Unable to verify %1, please enter password to unlock</source> - <translation>٪1 نى دەلىللەشكە ئامالسىز، مەخپىي نومۇرنى كىرگۈزۈپ قۇلۇپنى ئاچ</translation> - </message> -@@ -294,57 +297,74 @@ - <translation type="vanished">网络异常</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="517"/> -+ <location filename="../src/mainwindow.cpp" line="671"/> - <source>A program is attempting to perform an action that requires privileges.It requires authorization to perform the action.</source> - <translation>بىر پروگرامما ئىمتىياز تەلەپ قىلىدىغان ھەرىكەتنى قىلىشقا ئۇرۇنماقتا. بۇ ھەرىكەتنى ئىجرا قىلىش ئۈچۈن ھوقۇق تەلەپ قىلىدۇ.</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="576"/> -+ <location filename="../src/mainwindow.cpp" line="108"/> -+ <location filename="../src/mainwindow.cpp" line="729"/> - <source>Input Password</source> - <translation>ئىم كىرگۈزۈش</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="627"/> -+ <location filename="../src/mainwindow.cpp" line="105"/> -+ <source>Insert the ukey into the USB port</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="107"/> -+ <source>Enter the ukey password</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="783"/> - <source>hours left</source> - <translation>قالغان سائەتلەر</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="631"/> -+ <location filename="../src/mainwindow.cpp" line="787"/> - <source>minutes left</source> - <translation>مىنۇت قالدى</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="635"/> -+ <location filename="../src/mainwindow.cpp" line="791"/> - <source>seconds left</source> - <translation>سېكۇنت قالدى</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1193"/> -+ <location filename="../src/mainwindow.cpp" line="880"/> -+ <location filename="../src/mainwindow.cpp" line="888"/> -+ <source>Input your password to authentication</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="1434"/> - <source>Verify face recognition or enter password to unlock</source> - <translation>چىراي تونۇشنى دەلىللەش ياكى مەخپىي نومۇر كىرگۈزۈش ئارقىلىق قۇلۇپ ئېچىش</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1198"/> -+ <location filename="../src/mainwindow.cpp" line="1439"/> - <source>Press fingerprint or enter password to unlock</source> - <translation>بارماق ئىزىنى بېسىش ياكى مەخپىي نومۇر كىرگۈزۈش ئارقىلىق قۇلۇپ ئېچىش</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1203"/> -+ <location filename="../src/mainwindow.cpp" line="1444"/> - <source>Verify voiceprint or enter password to unlock</source> - <translation>ئاۋاز ئىزىنى دەلىللەش ياكى مەخپىي نومۇر كىرگۈزۈش ئارقىلىق قۇلۇپ ئېچىش</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1208"/> -+ <location filename="../src/mainwindow.cpp" line="1449"/> - <source>Verify finger vein or enter password to unlock</source> - <translation>بارماق تومۇرىنى ئېنىقلاش ياكى مەخپىي نومۇر كىرگۈزۈش ئارقىلىق قۇلۇپ ئېچىش</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1213"/> -+ <location filename="../src/mainwindow.cpp" line="1454"/> - <source>Verify iris or enter password to unlock</source> - <translation>Iris نى ئېنىقلاش ياكى مەخپىي نومۇر كىرگۈزۈش ئارقىلىق قۇلۇپ ئېچىش</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1218"/> -+ <location filename="../src/mainwindow.cpp" line="1459"/> - <source>Use the bound wechat scanning code or enter the password to unlock</source> - <translation>باغلانغان ئۈندىدارنى سىكاننېرلاش كودى ياكى مەخپىي نومۇرىنى كىرگۈزۈپ قۇلۇپ ئېچىش</translation> - </message> -@@ -353,10 +373,10 @@ - <translation type="vanished">使用绑定的微信扫码或输入密码登录</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="623"/> -- <location filename="../src/mainwindow.cpp" line="627"/> -- <location filename="../src/mainwindow.cpp" line="631"/> -- <location filename="../src/mainwindow.cpp" line="635"/> -+ <location filename="../src/mainwindow.cpp" line="779"/> -+ <location filename="../src/mainwindow.cpp" line="783"/> -+ <location filename="../src/mainwindow.cpp" line="787"/> -+ <location filename="../src/mainwindow.cpp" line="791"/> - <source>Account locked,</source> - <translation>ھېسابات قۇلۇپلانغان ،</translation> - </message> -@@ -373,12 +393,12 @@ - <translation>يەنە بىر خېرىدار ئاللىقاچان دەلىللەشكە باشلىدى، سەل تۇرۇپ قايتا سىناپ بېقىڭ.</translation> - </message> - <message> -- <location filename="../src/PolkitListener.cpp" line="257"/> -+ <location filename="../src/PolkitListener.cpp" line="265"/> - <source>Authentication failure, please try again.</source> - <translation>دەلىللەش مەغلۇپ بولدى، قايتا سىناپ بېقىڭ.</translation> - </message> - <message> -- <location filename="../src/PolkitListener.cpp" line="264"/> -+ <location filename="../src/PolkitListener.cpp" line="272"/> - <source>Password input error!</source> - <translation>پارول كىرگۈزۈش خاتالىقى!</translation> - </message> -diff --git a/polkit-agent/i18n_ts/zh_CN.ts b/polkit-agent/i18n_ts/zh_CN.ts -index 34b82ac..070732c 100644 ---- a/polkit-agent/i18n_ts/zh_CN.ts -+++ b/polkit-agent/i18n_ts/zh_CN.ts -@@ -65,7 +65,7 @@ - <context> - <name>MainWindow</name> - <message> -- <location filename="../src/mainwindow.cpp" line="65"/> -+ <location filename="../src/mainwindow.cpp" line="66"/> - <source>Authentication</source> - <translation>授权</translation> - </message> -@@ -88,17 +88,17 @@ - </message> - <message> - <source>Password</source> -- <translation>密码</translation> -+ <translation type="vanished">密码</translation> - </message> - <message> -- <location filename="../src/mainwindow.ui" line="302"/> -- <location filename="../src/mainwindow.cpp" line="882"/> -- <location filename="../src/mainwindow.cpp" line="948"/> -+ <location filename="../src/mainwindow.ui" line="409"/> -+ <location filename="../src/mainwindow.cpp" line="1075"/> -+ <location filename="../src/mainwindow.cpp" line="1143"/> - <source>Biometric</source> - <translation>使用生物识别</translation> - </message> - <message> -- <location filename="../src/mainwindow.ui" line="373"/> -+ <location filename="../src/mainwindow.ui" line="480"/> - <source>use password</source> - <translation>使用密码验证</translation> - </message> -@@ -147,20 +147,20 @@ - <translation type="vanished">Polkit.caller-pid:</translation> - </message> - <message> -- <location filename="../src/mainwindow.ui" line="334"/> -- <location filename="../src/mainwindow.cpp" line="884"/> -+ <location filename="../src/mainwindow.ui" line="441"/> -+ <location filename="../src/mainwindow.cpp" line="1077"/> - <source>Cancel</source> - <translation>取消</translation> - </message> - <message> -- <location filename="../src/mainwindow.ui" line="353"/> -- <location filename="../src/mainwindow.cpp" line="880"/> -+ <location filename="../src/mainwindow.ui" line="460"/> -+ <location filename="../src/mainwindow.cpp" line="1073"/> - <source>Authenticate</source> - <translation>授权</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="886"/> -- <location filename="../src/mainwindow.cpp" line="991"/> -+ <location filename="../src/mainwindow.cpp" line="1079"/> -+ <location filename="../src/mainwindow.cpp" line="1183"/> - <source>Use password</source> - <translation>使用密码验证</translation> - </message> -@@ -185,30 +185,30 @@ - <translation type="vanished">认证中,请稍等...</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1026"/> -- <location filename="../src/mainwindow.cpp" line="1093"/> -- <location filename="../src/mainwindow.cpp" line="1094"/> -+ <location filename="../src/mainwindow.cpp" line="1219"/> -+ <location filename="../src/mainwindow.cpp" line="1292"/> -+ <location filename="../src/mainwindow.cpp" line="1293"/> - <source>Please try again in %1 minutes.</source> - <translation>请%1分钟后再试</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1036"/> -- <location filename="../src/mainwindow.cpp" line="1103"/> -- <location filename="../src/mainwindow.cpp" line="1104"/> -+ <location filename="../src/mainwindow.cpp" line="1230"/> -+ <location filename="../src/mainwindow.cpp" line="1302"/> -+ <location filename="../src/mainwindow.cpp" line="1303"/> - <source>Please try again in %1 seconds.</source> - <translation>请%1秒后再试</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1045"/> -- <location filename="../src/mainwindow.cpp" line="1046"/> -- <location filename="../src/mainwindow.cpp" line="1112"/> -- <location filename="../src/mainwindow.cpp" line="1113"/> -+ <location filename="../src/mainwindow.cpp" line="1240"/> -+ <location filename="../src/mainwindow.cpp" line="1241"/> -+ <location filename="../src/mainwindow.cpp" line="1311"/> -+ <location filename="../src/mainwindow.cpp" line="1312"/> - <source>Account locked permanently.</source> - <translation>账号已被永久锁定</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="675"/> -- <location filename="../src/mainwindow.cpp" line="676"/> -+ <location filename="../src/mainwindow.cpp" line="834"/> -+ <location filename="../src/mainwindow.cpp" line="835"/> - <source>Password cannot be empty</source> - <translation>密码不能为空</translation> - </message> -@@ -221,7 +221,8 @@ - <translation type="vanished">无法验证%1,请输入密码.</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="175"/> -+ <location filename="../src/mainwindow.cpp" line="242"/> -+ <location filename="../src/mainwindow.cpp" line="246"/> - <source>Failed to verify %1, you still have %2 verification opportunities</source> - <translation>验证%1失败,您还有%2次尝试机会</translation> - </message> -@@ -230,42 +231,42 @@ - <translation type="vanished">一个程序正试图执行一个需要特权的动作。要求授权以执行该动作。</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="578"/> -+ <location filename="../src/mainwindow.cpp" line="731"/> - <source>Password: </source> - <translation>密码: </translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="261"/> -+ <location filename="../src/mainwindow.cpp" line="335"/> - <source>Please enter your password or enroll your fingerprint </source> - <translation>请输入密码或者录入指纹</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="187"/> -+ <location filename="../src/mainwindow.cpp" line="259"/> - <source>Abnormal network</source> - <translation>网络异常</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="511"/> -+ <location filename="../src/mainwindow.cpp" line="665"/> - <source>This operation requires the administrator's authorization. Please enter your password to allow this operation.</source> - <translation>本次操作需要通过管理员的授权才能继续执行,请输入密码以允许本次操作。</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="580"/> -+ <location filename="../src/mainwindow.cpp" line="733"/> - <source>_Password: </source> - <translation>密码: </translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="582"/> -+ <location filename="../src/mainwindow.cpp" line="735"/> - <source>_Password:</source> - <translation>密码:</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="691"/> -+ <location filename="../src/mainwindow.cpp" line="850"/> - <source>Authentication failed, please try again.</source> - <translation>认证失败,请重试。</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="623"/> -+ <location filename="../src/mainwindow.cpp" line="779"/> - <source>days left</source> - <translation>天后解锁</translation> - </message> -@@ -278,14 +279,16 @@ - <translation type="vanished">生物/扫码验证失败,您还有%1次尝试机会</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="164"/> -- <location filename="../src/mainwindow.cpp" line="1176"/> -+ <location filename="../src/mainwindow.cpp" line="226"/> -+ <location filename="../src/mainwindow.cpp" line="1415"/> -+ <location filename="../src/mainwindow.cpp" line="1417"/> - <source>Failed to verify %1, please enter password to unlock</source> - <translation>验证%1失败,请输入密码解锁</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="168"/> -- <location filename="../src/mainwindow.cpp" line="1178"/> -+ <location filename="../src/mainwindow.cpp" line="231"/> -+ <location filename="../src/mainwindow.cpp" line="233"/> -+ <location filename="../src/mainwindow.cpp" line="1419"/> - <source>Unable to verify %1, please enter password to unlock</source> - <translation>无法验证%1,请输入密码解锁</translation> - </message> -@@ -294,67 +297,74 @@ - <translation type="vanished">网络异常</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="517"/> -+ <location filename="../src/mainwindow.cpp" line="671"/> - <source>A program is attempting to perform an action that requires privileges.It requires authorization to perform the action.</source> - <translation>一个程序正试图执行一个需要特权的动作,要求授权以执行该动作。</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="576"/> -+ <location filename="../src/mainwindow.cpp" line="108"/> -+ <location filename="../src/mainwindow.cpp" line="729"/> - <source>Input Password</source> - <translation>输入密码</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="104"/> -+ <location filename="../src/mainwindow.cpp" line="105"/> - <source>Insert the ukey into the USB port</source> - <translation>请将安全密钥插入USB端口</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="106"/> -+ <location filename="../src/mainwindow.cpp" line="107"/> - <source>Enter the ukey password</source> - <translation>输入安全密钥密码</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="764"/> -+ <location filename="../src/mainwindow.cpp" line="783"/> - <source>hours left</source> - <translation>小时后解锁</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="631"/> -+ <location filename="../src/mainwindow.cpp" line="787"/> - <source>minutes left</source> - <translation>分钟后解锁</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="635"/> -+ <location filename="../src/mainwindow.cpp" line="791"/> - <source>seconds left</source> - <translation>秒后解锁</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1193"/> -+ <location filename="../src/mainwindow.cpp" line="880"/> -+ <location filename="../src/mainwindow.cpp" line="888"/> -+ <source>Input your password to authentication</source> -+ <translation>输入密码以授权</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="1434"/> - <source>Verify face recognition or enter password to unlock</source> - <translation>验证人脸识别或输入密码解锁</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1198"/> -+ <location filename="../src/mainwindow.cpp" line="1439"/> - <source>Press fingerprint or enter password to unlock</source> - <translation>按压指纹或输入密码解锁</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1203"/> -+ <location filename="../src/mainwindow.cpp" line="1444"/> - <source>Verify voiceprint or enter password to unlock</source> - <translation>验证声纹或输入密码解锁</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1208"/> -+ <location filename="../src/mainwindow.cpp" line="1449"/> - <source>Verify finger vein or enter password to unlock</source> - <translation>验证指静脉或输入密码解锁</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1213"/> -+ <location filename="../src/mainwindow.cpp" line="1454"/> - <source>Verify iris or enter password to unlock</source> - <translation>验证虹膜或输入密码解锁</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1218"/> -+ <location filename="../src/mainwindow.cpp" line="1459"/> - <source>Use the bound wechat scanning code or enter the password to unlock</source> - <translation>使用绑定的微信扫码或输入密码解锁</translation> - </message> -@@ -363,10 +373,10 @@ - <translation type="vanished">使用绑定的微信扫码或输入密码登录</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="623"/> -- <location filename="../src/mainwindow.cpp" line="627"/> -- <location filename="../src/mainwindow.cpp" line="631"/> -- <location filename="../src/mainwindow.cpp" line="635"/> -+ <location filename="../src/mainwindow.cpp" line="779"/> -+ <location filename="../src/mainwindow.cpp" line="783"/> -+ <location filename="../src/mainwindow.cpp" line="787"/> -+ <location filename="../src/mainwindow.cpp" line="791"/> - <source>Account locked,</source> - <translation>账户已锁定,</translation> - </message> -@@ -383,12 +393,12 @@ - <translation>有另外一个客户端正在认证,请稍后重试。</translation> - </message> - <message> -- <location filename="../src/PolkitListener.cpp" line="257"/> -+ <location filename="../src/PolkitListener.cpp" line="265"/> - <source>Authentication failure, please try again.</source> - <translation>认证失败,请重试。</translation> - </message> - <message> -- <location filename="../src/PolkitListener.cpp" line="264"/> -+ <location filename="../src/PolkitListener.cpp" line="272"/> - <source>Password input error!</source> - <translation>密码输入错误!</translation> - </message> -diff --git a/polkit-agent/i18n_ts/zh_HK.ts b/polkit-agent/i18n_ts/zh_HK.ts -index aea8f94..95c8c43 100644 ---- a/polkit-agent/i18n_ts/zh_HK.ts -+++ b/polkit-agent/i18n_ts/zh_HK.ts -@@ -65,7 +65,7 @@ - <context> - <name>MainWindow</name> - <message> -- <location filename="../src/mainwindow.cpp" line="67"/> -+ <location filename="../src/mainwindow.cpp" line="66"/> - <source>Authentication</source> - <translation>授權</translation> - </message> -@@ -92,8 +92,8 @@ - </message> - <message> - <location filename="../src/mainwindow.ui" line="409"/> -- <location filename="../src/mainwindow.cpp" line="1077"/> -- <location filename="../src/mainwindow.cpp" line="1145"/> -+ <location filename="../src/mainwindow.cpp" line="1075"/> -+ <location filename="../src/mainwindow.cpp" line="1143"/> - <source>Biometric</source> - <translation>使用生物識別</translation> - </message> -@@ -148,19 +148,19 @@ - </message> - <message> - <location filename="../src/mainwindow.ui" line="441"/> -- <location filename="../src/mainwindow.cpp" line="1079"/> -+ <location filename="../src/mainwindow.cpp" line="1077"/> - <source>Cancel</source> - <translation>取消</translation> - </message> - <message> - <location filename="../src/mainwindow.ui" line="460"/> -- <location filename="../src/mainwindow.cpp" line="1075"/> -+ <location filename="../src/mainwindow.cpp" line="1073"/> - <source>Authenticate</source> - <translation>授權</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1081"/> -- <location filename="../src/mainwindow.cpp" line="1185"/> -+ <location filename="../src/mainwindow.cpp" line="1079"/> -+ <location filename="../src/mainwindow.cpp" line="1183"/> - <source>Use password</source> - <translation>使用密碼驗證</translation> - </message> -@@ -185,30 +185,30 @@ - <translation type="vanished">认证中,请稍等...</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1221"/> -- <location filename="../src/mainwindow.cpp" line="1294"/> -- <location filename="../src/mainwindow.cpp" line="1295"/> -+ <location filename="../src/mainwindow.cpp" line="1219"/> -+ <location filename="../src/mainwindow.cpp" line="1292"/> -+ <location filename="../src/mainwindow.cpp" line="1293"/> - <source>Please try again in %1 minutes.</source> - <translation>請%1分鐘后再試</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1232"/> -- <location filename="../src/mainwindow.cpp" line="1304"/> -- <location filename="../src/mainwindow.cpp" line="1305"/> -+ <location filename="../src/mainwindow.cpp" line="1230"/> -+ <location filename="../src/mainwindow.cpp" line="1302"/> -+ <location filename="../src/mainwindow.cpp" line="1303"/> - <source>Please try again in %1 seconds.</source> - <translation>請%1秒後再試</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1242"/> -- <location filename="../src/mainwindow.cpp" line="1243"/> -- <location filename="../src/mainwindow.cpp" line="1313"/> -- <location filename="../src/mainwindow.cpp" line="1314"/> -+ <location filename="../src/mainwindow.cpp" line="1240"/> -+ <location filename="../src/mainwindow.cpp" line="1241"/> -+ <location filename="../src/mainwindow.cpp" line="1311"/> -+ <location filename="../src/mainwindow.cpp" line="1312"/> - <source>Account locked permanently.</source> - <translation>帳號已被永久鎖定</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="836"/> -- <location filename="../src/mainwindow.cpp" line="837"/> -+ <location filename="../src/mainwindow.cpp" line="834"/> -+ <location filename="../src/mainwindow.cpp" line="835"/> - <source>Password cannot be empty</source> - <translation>密碼不能為空</translation> - </message> -@@ -221,8 +221,8 @@ - <translation type="vanished">无法验证%1,请输入密码.</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="244"/> -- <location filename="../src/mainwindow.cpp" line="248"/> -+ <location filename="../src/mainwindow.cpp" line="242"/> -+ <location filename="../src/mainwindow.cpp" line="246"/> - <source>Failed to verify %1, you still have %2 verification opportunities</source> - <translation>驗證%1失敗,您還有%2次嘗試機會</translation> - </message> -@@ -231,42 +231,42 @@ - <translation type="vanished">一个程序正试图执行一个需要特权的动作。要求授权以执行该动作。</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="733"/> -+ <location filename="../src/mainwindow.cpp" line="731"/> - <source>Password: </source> - <translation>密碼: </translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="337"/> -+ <location filename="../src/mainwindow.cpp" line="335"/> - <source>Please enter your password or enroll your fingerprint </source> - <translation>請輸入密碼或者錄入指紋 </translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="261"/> -+ <location filename="../src/mainwindow.cpp" line="259"/> - <source>Abnormal network</source> - <translation>網路異常</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="511"/> -+ <location filename="../src/mainwindow.cpp" line="665"/> - <source>This operation requires the administrator's authorization. Please enter your password to allow this operation.</source> - <translation>本次操作需要通過管理員的授權才能繼續執行,請輸入密碼以允許本次操作。</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="735"/> -+ <location filename="../src/mainwindow.cpp" line="733"/> - <source>_Password: </source> - <translation>密碼: </translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="737"/> -+ <location filename="../src/mainwindow.cpp" line="735"/> - <source>_Password:</source> - <translation>密碼:</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="852"/> -+ <location filename="../src/mainwindow.cpp" line="850"/> - <source>Authentication failed, please try again.</source> - <translation>認證失敗,請重試。</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="781"/> -+ <location filename="../src/mainwindow.cpp" line="779"/> - <source>days left</source> - <translation>天后解鎖</translation> - </message> -@@ -279,16 +279,16 @@ - <translation type="vanished">生物/扫码验证失败,您还有%1次尝试机会</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="228"/> -+ <location filename="../src/mainwindow.cpp" line="226"/> -+ <location filename="../src/mainwindow.cpp" line="1415"/> - <location filename="../src/mainwindow.cpp" line="1417"/> -- <location filename="../src/mainwindow.cpp" line="1419"/> - <source>Failed to verify %1, please enter password to unlock</source> - <translation>驗證%1失敗,請輸入密碼解鎖</translation> - </message> - <message> -+ <location filename="../src/mainwindow.cpp" line="231"/> - <location filename="../src/mainwindow.cpp" line="233"/> -- <location filename="../src/mainwindow.cpp" line="235"/> -- <location filename="../src/mainwindow.cpp" line="1421"/> -+ <location filename="../src/mainwindow.cpp" line="1419"/> - <source>Unable to verify %1, please enter password to unlock</source> - <translation>無法驗證%1,請輸入密碼解鎖</translation> - </message> -@@ -297,74 +297,74 @@ - <translation type="vanished">网络异常</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="673"/> -+ <location filename="../src/mainwindow.cpp" line="671"/> - <source>A program is attempting to perform an action that requires privileges.It requires authorization to perform the action.</source> - <translation>一個程式正試圖執行一個需要特權的動作,要求授權以執行該動作。</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="110"/> -- <location filename="../src/mainwindow.cpp" line="731"/> -+ <location filename="../src/mainwindow.cpp" line="108"/> -+ <location filename="../src/mainwindow.cpp" line="729"/> - <source>Input Password</source> - <translation>輸入密碼</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="107"/> -+ <location filename="../src/mainwindow.cpp" line="105"/> - <source>Insert the ukey into the USB port</source> - <translation>請將安全金鑰插入USB埠</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="109"/> -+ <location filename="../src/mainwindow.cpp" line="107"/> - <source>Enter the ukey password</source> - <translation>輸入安全金鑰密碼</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="785"/> -+ <location filename="../src/mainwindow.cpp" line="783"/> - <source>hours left</source> - <translation>小時後解鎖</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="789"/> -+ <location filename="../src/mainwindow.cpp" line="787"/> - <source>minutes left</source> - <translation>分鐘後解鎖</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="793"/> -+ <location filename="../src/mainwindow.cpp" line="791"/> - <source>seconds left</source> - <translation>秒後解鎖</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="882"/> -- <location filename="../src/mainwindow.cpp" line="890"/> -+ <location filename="../src/mainwindow.cpp" line="880"/> -+ <location filename="../src/mainwindow.cpp" line="888"/> - <source>Input your password to authentication</source> - <translation>輸入密碼以認證</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1436"/> -+ <location filename="../src/mainwindow.cpp" line="1434"/> - <source>Verify face recognition or enter password to unlock</source> - <translation>驗證人臉識別或輸入密碼解鎖</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1441"/> -+ <location filename="../src/mainwindow.cpp" line="1439"/> - <source>Press fingerprint or enter password to unlock</source> - <translation>按壓指紋或輸入密碼解鎖</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1446"/> -+ <location filename="../src/mainwindow.cpp" line="1444"/> - <source>Verify voiceprint or enter password to unlock</source> - <translation>驗證聲紋或輸入密碼解鎖</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1451"/> -+ <location filename="../src/mainwindow.cpp" line="1449"/> - <source>Verify finger vein or enter password to unlock</source> - <translation>驗證指靜脈或輸入密碼解鎖</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1456"/> -+ <location filename="../src/mainwindow.cpp" line="1454"/> - <source>Verify iris or enter password to unlock</source> - <translation>驗證虹膜或輸入密碼解鎖</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="1461"/> -+ <location filename="../src/mainwindow.cpp" line="1459"/> - <source>Use the bound wechat scanning code or enter the password to unlock</source> - <translation>使用綁定的微信掃碼或輸入密碼解鎖</translation> - </message> -@@ -373,10 +373,10 @@ - <translation type="vanished">使用绑定的微信扫码或输入密码登录</translation> - </message> - <message> -- <location filename="../src/mainwindow.cpp" line="781"/> -- <location filename="../src/mainwindow.cpp" line="785"/> -- <location filename="../src/mainwindow.cpp" line="789"/> -- <location filename="../src/mainwindow.cpp" line="793"/> -+ <location filename="../src/mainwindow.cpp" line="779"/> -+ <location filename="../src/mainwindow.cpp" line="783"/> -+ <location filename="../src/mainwindow.cpp" line="787"/> -+ <location filename="../src/mainwindow.cpp" line="791"/> - <source>Account locked,</source> - <translation>帳戶已鎖定,</translation> - </message> -@@ -388,7 +388,7 @@ - <context> - <name>PolkitListener</name> - <message> -- <location filename="../src/PolkitListener.cpp" line="90"/> -+ <location filename="../src/PolkitListener.cpp" line="88"/> - <source>Another client is already authenticating, please try again later.</source> - <translation>有另外一個用戶端正在認證,請稍後重試。</translation> - </message> -diff --git a/polkit-agent/src/PolkitListener.cpp b/polkit-agent/src/PolkitListener.cpp -index 67fe34c..26b0f9a 100644 ---- a/polkit-agent/src/PolkitListener.cpp -+++ b/polkit-agent/src/PolkitListener.cpp -@@ -146,12 +146,12 @@ void PolkitListener::initiateAuthentication( - // hints.functions = MWM_FUNC_ALL; - // hints.decorations = MWM_DECOR_BORDER; - // XAtomHelper::getInstance()->setWindowMotifHint(mainWindow->winId(), hints); -- mainWindow->setWindowFlags(Qt::WindowCloseButtonHint | Qt::WindowStaysOnTopHint); - mainWindow->setIcon(iconName); - mainWindow->setCurProject(m_isMavis); - mainWindow->setHeader(message); - mainWindow->setUsers(usersList); - mainWindow->setEditInputMethod(m_isSupportTableMode); -+ mainWindow->setFixedSize(420, 297); - /* - mainWindow->setDetails(subjectPid, callerPid, - actionDesc.actionId(), -@@ -161,15 +161,19 @@ void PolkitListener::initiateAuthentication( - */ - /* set the position of the mainwindow */ - QPoint pos = QCursor::pos(); -- for(auto screen : QGuiApplication::screens()) -- { -- if(screen->geometry().contains(pos)) -- { -- mainWindow->move(screen->geometry().left() + (screen->geometry().width() - mainWindow->width()) / 2, -- screen->geometry().top() + (screen->geometry().height() - mainWindow->height()) / 2); -+ QRect desScreenGeometry; -+ for (QScreen *screen : qApp->screens()) { -+ if (screen->geometry().contains(pos)) { -+ desScreenGeometry = screen->geometry(); - } - } - -+ if (desScreenGeometry.isEmpty()) { -+ desScreenGeometry = qApp->primaryScreen()->geometry(); -+ } -+ mainWindow->move(desScreenGeometry.x() + (desScreenGeometry.width() - mainWindow->width())/2, -+ desScreenGeometry.y() + (desScreenGeometry.height() - mainWindow->height())/2); -+ qDebug()<<"MoveWindow to center1:"<<desScreenGeometry<<","<<mainWindow->geometry()<<QGuiApplication::platformName();; - connect(mainWindow, &MainWindow::accept, this, &PolkitListener::onResponse); - connect(mainWindow, &MainWindow::canceled, this, [&]{ - wasCancelled = true; -diff --git a/polkit-agent/src/mainwindow.cpp b/polkit-agent/src/mainwindow.cpp -index bbc327f..401700d 100644 ---- a/polkit-agent/src/mainwindow.cpp -+++ b/polkit-agent/src/mainwindow.cpp -@@ -61,9 +61,9 @@ MainWindow::MainWindow(QWidget *parent) : - m_nCurLockMin(0), - isbioSuccess(false) - { -+ setWindowFlags(Qt::Tool | Qt::WindowCloseButtonHint | Qt::WindowStaysOnTopHint); - ui->setupUi(this); - setWindowTitle(tr("Authentication")); -- setWindowFlags(Qt::WindowCloseButtonHint | Qt::WindowStaysOnTopHint); - - pam_tally_init(); // - diff -Nru ukui-biometric-auth-4.10.0.0/debian/patches/0004-udpate-changelog.patch ukui-biometric-auth-4.20.0.0/debian/patches/0004-udpate-changelog.patch --- ukui-biometric-auth-4.10.0.0/debian/patches/0004-udpate-changelog.patch 2024-04-23 10:31:46.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/debian/patches/0004-udpate-changelog.patch 1970-01-01 08:00:00.000000000 +0800 @@ -1,50 +0,0 @@ -From: yangmin <winner_yangmin@163.com> -Date: Tue, 12 Dec 2023 16:08:43 +0800 -Subject: udpate changelog - ---- - pam-biometric/pam_biometric.c | 24 +++++++++++++++++++++++- - 1 file changed, 23 insertions(+), 1 deletion(-) - -diff --git a/pam-biometric/pam_biometric.c b/pam-biometric/pam_biometric.c -index 68f6aab..c639e53 100644 ---- a/pam-biometric/pam_biometric.c -+++ b/pam-biometric/pam_biometric.c -@@ -463,6 +463,28 @@ void get_greeter_session(char buf[], int len) - if (stdout_pidof) - g_free(stdout_pidof); - g_ptr_array_free (args_pidof, TRUE); -+ -+ //如果ukui-greeter进程不存在,进而判断ukui-screensaver-backend进程 -+ args_pidof = g_ptr_array_new (); -+ g_ptr_array_add(args_pidof, (gpointer)"/usr/bin/pidof"); -+ g_ptr_array_add(args_pidof, (gpointer)"ukui-screensaver-backend"); -+ g_ptr_array_add(args_pidof, NULL); -+ -+ if (!g_spawn_sync(NULL, (char**)args_pidof->pdata, NULL, G_SPAWN_STDERR_TO_DEV_NULL, NULL, NULL, &stdout_pidof, NULL, NULL, NULL)) { -+ if (stdout_pidof) -+ g_free(stdout_pidof); -+ g_ptr_array_free (args_pidof, TRUE); -+ } -+ -+ if (stdout_pidof) { -+ if (strlen(stdout_pidof) > 0 && atoi(stdout_pidof) > 0) { -+ g_strlcpy(buf, "ukui-screensaver-backend", len); -+ } -+ g_free(stdout_pidof); -+ } -+ -+ g_ptr_array_free (args_pidof, TRUE); -+ - return ; - } - if (stdout_pidof) { -@@ -668,7 +690,7 @@ int pam_sm_authenticate(pam_handle_t *pamh, int flags, int argc, - get_greeter_session(buf, sizeof(buf)); - pam_logger("current greeter: %s\n", buf); - -- if(strcmp(buf, "ukui-greeter") == 0 || strcmp(buf, "ukui-greeter-wayland") == 0) -+ if(strcmp(buf, "ukui-greeter") == 0 || strcmp(buf, "ukui-greeter-wayland") == 0 || strcmp(buf, "ukui-session") == 0 || strcmp(buf,"ukui-screensaver-backend")) - return biometric_auth_embeded(pamh); - // else - // return biometric_auth_independent(pamh, "lightdm", 1); diff -Nru ukui-biometric-auth-4.10.0.0/debian/patches/0005-16-task-190787-UKUI-Kylin-biometric-auth-screensaver.patch ukui-biometric-auth-4.20.0.0/debian/patches/0005-16-task-190787-UKUI-Kylin-biometric-auth-screensaver.patch --- ukui-biometric-auth-4.10.0.0/debian/patches/0005-16-task-190787-UKUI-Kylin-biometric-auth-screensaver.patch 2024-04-23 10:31:46.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/debian/patches/0005-16-task-190787-UKUI-Kylin-biometric-auth-screensaver.patch 1970-01-01 08:00:00.000000000 +0800 @@ -1,772 +0,0 @@ -From: =?utf-8?b?5p2o5pWP?= <yangmin@kylinos.cn> -Date: Fri, 5 Jan 2024 09:28:51 +0000 -Subject: =?utf-8?b?ITE2IHRhc2sjMTkwNzg3IOWtkCBVS1VJJkt5bGlu5bqU55So5o2Q6LWg?= - =?utf-8?b?5LqL5a6cIC8gYmlvbWV0cmljLWF1dGgtICYgc2NyZWVuc2F2ZXLlkIjop4TmgKc=?= - =?utf-8?b?5L+u5pS5IE1lcmdlIHB1bGwgcmVxdWVzdCAhMTYgZnJvbSBsaXVkdW5mYS9vcGVu?= - =?utf-8?b?a3lsaW4vbmlsZQ==?= - ---- - bioauth-bin/src/keywatcher.cpp | 2 +- - bioauth-bin/src/keywatcher.h | 2 +- - bioauth-bin/src/main.cpp | 2 +- - bioauth/include/bioauth.h | 2 +- - bioauth/include/bioauthwidget.h | 2 +- - bioauth/include/biodevices.h | 2 +- - bioauth/include/biodeviceswidget.h | 2 +- - bioauth/include/biometric.h | 2 +- - bioauth/include/biotypes.h | 2 +- - bioauth/include/giodbus.h | 2 +- - bioauth/include/loginoptionswidget.h | 2 +- - bioauth/include/uniauthservice.h | 2 +- - bioauth/src/bioauth.cpp | 2 +- - bioauth/src/bioauthwidget.cpp | 2 +- - bioauth/src/biodevices.cpp | 2 +- - bioauth/src/biodeviceswidget.cpp | 2 +- - bioauth/src/biotypes.cpp | 2 +- - bioauth/src/giodbus.cpp | 2 +- - bioauth/src/loginoptionswidget.cpp | 2 +- - bioauth/src/uniauthservice.cpp | 2 +- - common/generic.cpp | 2 +- - common/generic.h | 2 +- - pam-biometric/biotest.c | 2 +- - pam-biometric/logger.c | 2 +- - pam-biometric/pam_biometric.c | 2 +- - polkit-agent/src/PolkitAgent.cpp | 2 +- - polkit-agent/src/PolkitListener.cpp | 2 +- - polkit-agent/src/PolkitListener.h | 2 +- - polkit-agent/src/kalabel.cpp | 17 +++++++++++++++++ - polkit-agent/src/kalabel.h | 17 +++++++++++++++++ - polkit-agent/src/mainwindow.cpp | 2 +- - polkit-agent/src/mainwindow.h | 2 +- - polkit-agent/src/modeButton.cpp | 17 +++++++++++++++++ - polkit-agent/src/modeButton.h | 17 +++++++++++++++++ - polkit-agent/src/pam-tally.c | 2 +- - polkit-agent/src/pam-tally.h | 2 +- - polkit-agent/src/sessionmanager.cpp | 2 +- - polkit-agent/src/sessionmanager.h | 2 +- - polkit-agent/src/types.h | 2 +- - polkit-agent/src/users.cpp | 2 +- - polkit-agent/src/users.h | 2 +- - uniauth-backend/src/CSingleton.h | 17 +++++++++++++++++ - uniauth-backend/src/biodeviceinfo.cpp | 2 +- - uniauth-backend/src/biodeviceinfo.h | 2 +- - uniauth-backend/src/main.cpp | 2 +- - uniauth-backend/src/personalizeddata.cpp | 17 +++++++++++++++++ - uniauth-backend/src/personalizeddata.h | 17 +++++++++++++++++ - uniauth-backend/src/rsac.cpp | 17 +++++++++++++++++ - uniauth-backend/src/rsac.h | 17 +++++++++++++++++ - uniauth-backend/src/serviceinterface.cpp | 2 +- - uniauth-backend/src/serviceinterface.h | 2 +- - uniauth-backend/src/servicemanager.cpp | 2 +- - uniauth-backend/src/servicemanager.h | 2 +- - 53 files changed, 197 insertions(+), 44 deletions(-) - -diff --git a/bioauth-bin/src/keywatcher.cpp b/bioauth-bin/src/keywatcher.cpp -index aaa4398..a2cf2f9 100644 ---- a/bioauth-bin/src/keywatcher.cpp -+++ b/bioauth-bin/src/keywatcher.cpp -@@ -1,5 +1,5 @@ - /* -- * Copyright (C) 2018 Tianjin KYLIN Information Technology Co., Ltd. -+ * Copyright (C) 2023 KylinSoftCo., Ltd. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by -diff --git a/bioauth-bin/src/keywatcher.h b/bioauth-bin/src/keywatcher.h -index 31db81e..ded83e3 100644 ---- a/bioauth-bin/src/keywatcher.h -+++ b/bioauth-bin/src/keywatcher.h -@@ -1,5 +1,5 @@ - /* -- * Copyright (C) 2018 Tianjin KYLIN Information Technology Co., Ltd. -+ * Copyright (C) 2023 KylinSoftCo., Ltd. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by -diff --git a/bioauth-bin/src/main.cpp b/bioauth-bin/src/main.cpp -index ae13ec6..81ffdb4 100644 ---- a/bioauth-bin/src/main.cpp -+++ b/bioauth-bin/src/main.cpp -@@ -1,5 +1,5 @@ - /* -- * Copyright (C) 2018 Tianjin KYLIN Information Technology Co., Ltd. -+ * Copyright (C) 2023 KylinSoftCo., Ltd. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by -diff --git a/bioauth/include/bioauth.h b/bioauth/include/bioauth.h -index 56588f7..477d3b3 100644 ---- a/bioauth/include/bioauth.h -+++ b/bioauth/include/bioauth.h -@@ -1,5 +1,5 @@ - /* -- * Copyright (C) 2018 Tianjin KYLIN Information Technology Co., Ltd. -+ * Copyright (C) 2023 KylinSoftCo., Ltd. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by -diff --git a/bioauth/include/bioauthwidget.h b/bioauth/include/bioauthwidget.h -index 6779f48..a017080 100644 ---- a/bioauth/include/bioauthwidget.h -+++ b/bioauth/include/bioauthwidget.h -@@ -1,5 +1,5 @@ - /* -- * Copyright (C) 2018 Tianjin KYLIN Information Technology Co., Ltd. -+ * Copyright (C) 2023 KylinSoftCo., Ltd. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by -diff --git a/bioauth/include/biodevices.h b/bioauth/include/biodevices.h -index 630f25f..59c2785 100644 ---- a/bioauth/include/biodevices.h -+++ b/bioauth/include/biodevices.h -@@ -1,5 +1,5 @@ - /* -- * Copyright (C) 2018 Tianjin KYLIN Information Technology Co., Ltd. -+ * Copyright (C) 2023 KylinSoftCo., Ltd. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by -diff --git a/bioauth/include/biodeviceswidget.h b/bioauth/include/biodeviceswidget.h -index b4267de..711af03 100644 ---- a/bioauth/include/biodeviceswidget.h -+++ b/bioauth/include/biodeviceswidget.h -@@ -1,5 +1,5 @@ - /* -- * Copyright (C) 2018 Tianjin KYLIN Information Technology Co., Ltd. -+ * Copyright (C) 2023 KylinSoftCo., Ltd. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by -diff --git a/bioauth/include/biometric.h b/bioauth/include/biometric.h -index 8d606a7..dfab2fa 100644 ---- a/bioauth/include/biometric.h -+++ b/bioauth/include/biometric.h -@@ -1,5 +1,5 @@ - /* -- * Copyright (C) 2018 Tianjin KYLIN Information Technology Co., Ltd. -+ * Copyright (C) 2023 KylinSoftCo., Ltd. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by -diff --git a/bioauth/include/biotypes.h b/bioauth/include/biotypes.h -index b286edb..e37ace0 100644 ---- a/bioauth/include/biotypes.h -+++ b/bioauth/include/biotypes.h -@@ -1,5 +1,5 @@ - /* -- * Copyright (C) 2018 Tianjin KYLIN Information Technology Co., Ltd. -+ * Copyright (C) 2023 KylinSoftCo., Ltd. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by -diff --git a/bioauth/include/giodbus.h b/bioauth/include/giodbus.h -index 9ae3213..9bdcc4e 100644 ---- a/bioauth/include/giodbus.h -+++ b/bioauth/include/giodbus.h -@@ -1,5 +1,5 @@ - /* -- * Copyright (C) 2023 Tianjin KYLIN Information Technology Co., Ltd. -+ * Copyright (C) 2023 KylinSoftCo., Ltd. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by -diff --git a/bioauth/include/loginoptionswidget.h b/bioauth/include/loginoptionswidget.h -index 7ef3db9..dbbe1af 100644 ---- a/bioauth/include/loginoptionswidget.h -+++ b/bioauth/include/loginoptionswidget.h -@@ -1,5 +1,5 @@ - /* -- * Copyright (C) 2023 Tianjin KYLIN Information Technology Co., Ltd. -+ * Copyright (C) 2023 KylinSoftCo., Ltd. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by -diff --git a/bioauth/include/uniauthservice.h b/bioauth/include/uniauthservice.h -index 3ed8707..774c646 100644 ---- a/bioauth/include/uniauthservice.h -+++ b/bioauth/include/uniauthservice.h -@@ -1,5 +1,5 @@ - /* -- * Copyright (C) 2022 Tianjin KYLIN Information Technology Co., Ltd. -+ * Copyright (C) 2023 KylinSoftCo., Ltd. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by -diff --git a/bioauth/src/bioauth.cpp b/bioauth/src/bioauth.cpp -index bf725dc..98143e6 100644 ---- a/bioauth/src/bioauth.cpp -+++ b/bioauth/src/bioauth.cpp -@@ -1,5 +1,5 @@ - /* -- * Copyright (C) 2018 Tianjin KYLIN Information Technology Co., Ltd. -+ * Copyright (C) 2023 KylinSoftCo., Ltd. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by -diff --git a/bioauth/src/bioauthwidget.cpp b/bioauth/src/bioauthwidget.cpp -index 9bacd6b..f163fae 100644 ---- a/bioauth/src/bioauthwidget.cpp -+++ b/bioauth/src/bioauthwidget.cpp -@@ -1,5 +1,5 @@ - /* -- * Copyright (C) 2018 Tianjin KYLIN Information Technology Co., Ltd. -+ * Copyright (C) 2023 KylinSoftCo., Ltd. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by -diff --git a/bioauth/src/biodevices.cpp b/bioauth/src/biodevices.cpp -index 2f6a366..e1287b0 100644 ---- a/bioauth/src/biodevices.cpp -+++ b/bioauth/src/biodevices.cpp -@@ -1,5 +1,5 @@ - /* -- * Copyright (C) 2018 Tianjin KYLIN Information Technology Co., Ltd. -+ * Copyright (C) 2023 KylinSoftCo., Ltd. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by -diff --git a/bioauth/src/biodeviceswidget.cpp b/bioauth/src/biodeviceswidget.cpp -index 7011361..bc83d0a 100644 ---- a/bioauth/src/biodeviceswidget.cpp -+++ b/bioauth/src/biodeviceswidget.cpp -@@ -1,5 +1,5 @@ - /* -- * Copyright (C) 2018 Tianjin KYLIN Information Technology Co., Ltd. -+ * Copyright (C) 2023 KylinSoftCo., Ltd. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by -diff --git a/bioauth/src/biotypes.cpp b/bioauth/src/biotypes.cpp -index 3a52a85..7ea5518 100644 ---- a/bioauth/src/biotypes.cpp -+++ b/bioauth/src/biotypes.cpp -@@ -1,5 +1,5 @@ - /* -- * Copyright (C) 2018 Tianjin KYLIN Information Technology Co., Ltd. -+ * Copyright (C) 2023 KylinSoftCo., Ltd. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by -diff --git a/bioauth/src/giodbus.cpp b/bioauth/src/giodbus.cpp -index c30098b..524734d 100644 ---- a/bioauth/src/giodbus.cpp -+++ b/bioauth/src/giodbus.cpp -@@ -1,5 +1,5 @@ - /* -- * Copyright (C) 2023 Tianjin KYLIN Information Technology Co., Ltd. -+ * Copyright (C) 2023 KylinSoftCo., Ltd. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by -diff --git a/bioauth/src/loginoptionswidget.cpp b/bioauth/src/loginoptionswidget.cpp -index b089b33..bc54363 100644 ---- a/bioauth/src/loginoptionswidget.cpp -+++ b/bioauth/src/loginoptionswidget.cpp -@@ -1,5 +1,5 @@ - /* -- * Copyright (C) 2023 Tianjin KYLIN Information Technology Co., Ltd. -+ * Copyright (C) 2023 KylinSoftCo., Ltd. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by -diff --git a/bioauth/src/uniauthservice.cpp b/bioauth/src/uniauthservice.cpp -index 8032cea..3996e34 100644 ---- a/bioauth/src/uniauthservice.cpp -+++ b/bioauth/src/uniauthservice.cpp -@@ -1,5 +1,5 @@ - /* -- * Copyright (C) 2022 Tianjin KYLIN Information Technology Co., Ltd. -+ * Copyright (C) 2023 KylinSoftCo., Ltd. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by -diff --git a/common/generic.cpp b/common/generic.cpp -index 9e94b4a..76be0e4 100644 ---- a/common/generic.cpp -+++ b/common/generic.cpp -@@ -1,5 +1,5 @@ - /* -- * Copyright (C) 2018 Tianjin KYLIN Information Technology Co., Ltd. -+ * Copyright (C) 2023 KylinSoftCo., Ltd. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by -diff --git a/common/generic.h b/common/generic.h -index 7d08d40..b00f6af 100644 ---- a/common/generic.h -+++ b/common/generic.h -@@ -1,5 +1,5 @@ - /* -- * Copyright (C) 2018 Tianjin KYLIN Information Technology Co., Ltd. -+ * Copyright (C) 2023 KylinSoftCo., Ltd. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by -diff --git a/pam-biometric/biotest.c b/pam-biometric/biotest.c -index f938f13..d15ae4d 100644 ---- a/pam-biometric/biotest.c -+++ b/pam-biometric/biotest.c -@@ -1,5 +1,5 @@ - /* -- * Copyright (C) 2018 Tianjin KYLIN Information Technology Co., Ltd. -+ * Copyright (C) 2023 KylinSoftCo., Ltd. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by -diff --git a/pam-biometric/logger.c b/pam-biometric/logger.c -index 47f70ce..6edce70 100644 ---- a/pam-biometric/logger.c -+++ b/pam-biometric/logger.c -@@ -1,5 +1,5 @@ - /* -- * Copyright (C) 2018 Tianjin KYLIN Information Technology Co., Ltd. -+ * Copyright (C) 2023 KylinSoftCo., Ltd. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by -diff --git a/pam-biometric/pam_biometric.c b/pam-biometric/pam_biometric.c -index c639e53..6c1b054 100644 ---- a/pam-biometric/pam_biometric.c -+++ b/pam-biometric/pam_biometric.c -@@ -1,5 +1,5 @@ - /* -- * Copyright (C) 2018 Tianjin KYLIN Information Technology Co., Ltd. -+ * Copyright (C) 2023 KylinSoftCo., Ltd. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by -diff --git a/polkit-agent/src/PolkitAgent.cpp b/polkit-agent/src/PolkitAgent.cpp -index aa9d5c7..183d17e 100644 ---- a/polkit-agent/src/PolkitAgent.cpp -+++ b/polkit-agent/src/PolkitAgent.cpp -@@ -1,5 +1,5 @@ - /* -- * Copyright (C) 2018 Tianjin KYLIN Information Technology Co., Ltd. -+ * Copyright (C) 2023 KylinSoftCo., Ltd. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by -diff --git a/polkit-agent/src/PolkitListener.cpp b/polkit-agent/src/PolkitListener.cpp -index 26b0f9a..f15c9c9 100644 ---- a/polkit-agent/src/PolkitListener.cpp -+++ b/polkit-agent/src/PolkitListener.cpp -@@ -1,5 +1,5 @@ - /* -- * Copyright (C) 2018 Tianjin KYLIN Information Technology Co., Ltd. -+ * Copyright (C) 2023 KylinSoftCo., Ltd. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by -diff --git a/polkit-agent/src/PolkitListener.h b/polkit-agent/src/PolkitListener.h -index 0f2420e..850077c 100644 ---- a/polkit-agent/src/PolkitListener.h -+++ b/polkit-agent/src/PolkitListener.h -@@ -1,5 +1,5 @@ - /* -- * Copyright (C) 2018 Tianjin KYLIN Information Technology Co., Ltd. -+ * Copyright (C) 2023 KylinSoftCo., Ltd. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by -diff --git a/polkit-agent/src/kalabel.cpp b/polkit-agent/src/kalabel.cpp -index 2666f0b..a74f9da 100644 ---- a/polkit-agent/src/kalabel.cpp -+++ b/polkit-agent/src/kalabel.cpp -@@ -1,3 +1,20 @@ -+/* -+ * Copyright (C) 2023 KylinSoftCo., Ltd. -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 3, or (at your option) -+ * any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, see <http://www.gnu.org/licenses/>. -+ * -+**/ - #include "kalabel.h" - - -diff --git a/polkit-agent/src/kalabel.h b/polkit-agent/src/kalabel.h -index f2678ac..8fc9b53 100644 ---- a/polkit-agent/src/kalabel.h -+++ b/polkit-agent/src/kalabel.h -@@ -1,3 +1,20 @@ -+/* -+ * Copyright (C) 2023 KylinSoftCo., Ltd. -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 3, or (at your option) -+ * any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, see <http://www.gnu.org/licenses/>. -+ * -+**/ - #ifndef KALABEL_H - #define KALABEL_H - -diff --git a/polkit-agent/src/mainwindow.cpp b/polkit-agent/src/mainwindow.cpp -index 401700d..74a0730 100644 ---- a/polkit-agent/src/mainwindow.cpp -+++ b/polkit-agent/src/mainwindow.cpp -@@ -1,5 +1,5 @@ - /* -- * Copyright (C) 2018 Tianjin KYLIN Information Technology Co., Ltd. -+ * Copyright (C) 2023 KylinSoftCo., Ltd. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by -diff --git a/polkit-agent/src/mainwindow.h b/polkit-agent/src/mainwindow.h -index 8b3dbd2..898f2d0 100644 ---- a/polkit-agent/src/mainwindow.h -+++ b/polkit-agent/src/mainwindow.h -@@ -1,5 +1,5 @@ - /* -- * Copyright (C) 2018 Tianjin KYLIN Information Technology Co., Ltd. -+ * Copyright (C) 2023 KylinSoftCo., Ltd. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by -diff --git a/polkit-agent/src/modeButton.cpp b/polkit-agent/src/modeButton.cpp -index 66f712c..66fd94d 100644 ---- a/polkit-agent/src/modeButton.cpp -+++ b/polkit-agent/src/modeButton.cpp -@@ -1,3 +1,20 @@ -+/* -+ * Copyright (C) 2023 KylinSoftCo., Ltd. -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 3, or (at your option) -+ * any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, see <http://www.gnu.org/licenses/>. -+ * -+**/ - #include "modeButton.h" - - #include <QIcon> -diff --git a/polkit-agent/src/modeButton.h b/polkit-agent/src/modeButton.h -index b8fa08f..51ab67f 100644 ---- a/polkit-agent/src/modeButton.h -+++ b/polkit-agent/src/modeButton.h -@@ -1,3 +1,20 @@ -+/* -+ * Copyright (C) 2023 KylinSoftCo., Ltd. -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 3, or (at your option) -+ * any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, see <http://www.gnu.org/licenses/>. -+ * -+**/ - #ifndef MODEBUTTON_H - #define MODEBUTTON_H - -diff --git a/polkit-agent/src/pam-tally.c b/polkit-agent/src/pam-tally.c -index 50a3055..da2651b 100644 ---- a/polkit-agent/src/pam-tally.c -+++ b/polkit-agent/src/pam-tally.c -@@ -1,5 +1,5 @@ - /* -- * Copyright (C) 2018 Tianjin KYLIN Information Technology Co., Ltd. -+ * Copyright (C) 2023 KylinSoftCo., Ltd. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by -diff --git a/polkit-agent/src/pam-tally.h b/polkit-agent/src/pam-tally.h -index 0e27338..2585f56 100644 ---- a/polkit-agent/src/pam-tally.h -+++ b/polkit-agent/src/pam-tally.h -@@ -1,5 +1,5 @@ - /* -- * Copyright (C) 2018 Tianjin KYLIN Information Technology Co., Ltd. -+ * Copyright (C) 2023 KylinSoftCo., Ltd. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by -diff --git a/polkit-agent/src/sessionmanager.cpp b/polkit-agent/src/sessionmanager.cpp -index ddec665..61d4ace 100644 ---- a/polkit-agent/src/sessionmanager.cpp -+++ b/polkit-agent/src/sessionmanager.cpp -@@ -1,5 +1,5 @@ - /* -- * Copyright (C) 2018 Tianjin KYLIN Information Technology Co., Ltd. -+ * Copyright (C) 2023 KylinSoftCo., Ltd. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by -diff --git a/polkit-agent/src/sessionmanager.h b/polkit-agent/src/sessionmanager.h -index 8898901..8192193 100644 ---- a/polkit-agent/src/sessionmanager.h -+++ b/polkit-agent/src/sessionmanager.h -@@ -1,5 +1,5 @@ - /* -- * Copyright (C) 2018 Tianjin KYLIN Information Technology Co., Ltd. -+ * Copyright (C) 2023 KylinSoftCo., Ltd. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by -diff --git a/polkit-agent/src/types.h b/polkit-agent/src/types.h -index 87fcc29..ded7185 100644 ---- a/polkit-agent/src/types.h -+++ b/polkit-agent/src/types.h -@@ -1,5 +1,5 @@ - /* -- * Copyright (C) 2018 Tianjin KYLIN Information Technology Co., Ltd. -+ * Copyright (C) 2023 KylinSoftCo., Ltd. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by -diff --git a/polkit-agent/src/users.cpp b/polkit-agent/src/users.cpp -index 956a9d9..64395c5 100644 ---- a/polkit-agent/src/users.cpp -+++ b/polkit-agent/src/users.cpp -@@ -1,5 +1,5 @@ - /* -- * Copyright (C) 2018 Tianjin KYLIN Information Technology Co., Ltd. -+ * Copyright (C) 2023 KylinSoftCo., Ltd. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by -diff --git a/polkit-agent/src/users.h b/polkit-agent/src/users.h -index d43a01d..509cb3f 100644 ---- a/polkit-agent/src/users.h -+++ b/polkit-agent/src/users.h -@@ -1,5 +1,5 @@ - /* -- * Copyright (C) 2018 Tianjin KYLIN Information Technology Co., Ltd. -+ * Copyright (C) 2023 KylinSoftCo., Ltd. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by -diff --git a/uniauth-backend/src/CSingleton.h b/uniauth-backend/src/CSingleton.h -index 99c42d8..42d6aee 100644 ---- a/uniauth-backend/src/CSingleton.h -+++ b/uniauth-backend/src/CSingleton.h -@@ -1,3 +1,20 @@ -+/* -+ * Copyright (C) 2023 KylinSoftCo., Ltd. -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 3, or (at your option) -+ * any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, see <http://www.gnu.org/licenses/>. -+ * -+**/ - #ifndef CSINGLETON_H - #define CSINGLETON_H - -diff --git a/uniauth-backend/src/biodeviceinfo.cpp b/uniauth-backend/src/biodeviceinfo.cpp -index d386d2b..b9782df 100644 ---- a/uniauth-backend/src/biodeviceinfo.cpp -+++ b/uniauth-backend/src/biodeviceinfo.cpp -@@ -1,5 +1,5 @@ - /* -- * Copyright (C) 2022 Tianjin KYLIN Information Technology Co., Ltd. -+ * Copyright (C) 2023 KylinSoftCo., Ltd. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by -diff --git a/uniauth-backend/src/biodeviceinfo.h b/uniauth-backend/src/biodeviceinfo.h -index 87c5f87..55195f6 100644 ---- a/uniauth-backend/src/biodeviceinfo.h -+++ b/uniauth-backend/src/biodeviceinfo.h -@@ -1,5 +1,5 @@ - /* -- * Copyright (C) 2022 Tianjin KYLIN Information Technology Co., Ltd. -+ * Copyright (C) 2023 KylinSoftCo., Ltd. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by -diff --git a/uniauth-backend/src/main.cpp b/uniauth-backend/src/main.cpp -index f719754..b472046 100644 ---- a/uniauth-backend/src/main.cpp -+++ b/uniauth-backend/src/main.cpp -@@ -1,5 +1,5 @@ - /* -- * Copyright (C) 2022 Tianjin KYLIN Information Technology Co., Ltd. -+ * Copyright (C) 2023 KylinSoftCo., Ltd. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by -diff --git a/uniauth-backend/src/personalizeddata.cpp b/uniauth-backend/src/personalizeddata.cpp -index d093977..a5a0a97 100644 ---- a/uniauth-backend/src/personalizeddata.cpp -+++ b/uniauth-backend/src/personalizeddata.cpp -@@ -1,3 +1,20 @@ -+/* -+ * Copyright (C) 2023 KylinSoftCo., Ltd. -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 3, or (at your option) -+ * any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, see <http://www.gnu.org/licenses/>. -+ * -+**/ - #include "personalizeddata.h" - - #include <QJsonDocument> -diff --git a/uniauth-backend/src/personalizeddata.h b/uniauth-backend/src/personalizeddata.h -index b8fb872..1c6dafc 100644 ---- a/uniauth-backend/src/personalizeddata.h -+++ b/uniauth-backend/src/personalizeddata.h -@@ -1,3 +1,20 @@ -+/* -+ * Copyright (C) 2023 KylinSoftCo., Ltd. -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 3, or (at your option) -+ * any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, see <http://www.gnu.org/licenses/>. -+ * -+**/ - #ifndef PERSONALIZEDDATA_H - #define PERSONALIZEDDATA_H - -diff --git a/uniauth-backend/src/rsac.cpp b/uniauth-backend/src/rsac.cpp -index 0c6877d..5590c6f 100644 ---- a/uniauth-backend/src/rsac.cpp -+++ b/uniauth-backend/src/rsac.cpp -@@ -1,3 +1,20 @@ -+/* -+ * Copyright (C) 2023 KylinSoftCo., Ltd. -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 3, or (at your option) -+ * any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, see <http://www.gnu.org/licenses/>. -+ * -+**/ - #include "rsac.h" - #include <openssl/rsa.h> - #include <openssl/pem.h> -diff --git a/uniauth-backend/src/rsac.h b/uniauth-backend/src/rsac.h -index 93d4678..f51c31a 100644 ---- a/uniauth-backend/src/rsac.h -+++ b/uniauth-backend/src/rsac.h -@@ -1,3 +1,20 @@ -+/* -+ * Copyright (C) 2023 KylinSoftCo., Ltd. -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 3, or (at your option) -+ * any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, see <http://www.gnu.org/licenses/>. -+ * -+**/ - #ifndef RSAC_H - #define RSAC_H - -diff --git a/uniauth-backend/src/serviceinterface.cpp b/uniauth-backend/src/serviceinterface.cpp -index 58670dd..6969efb 100644 ---- a/uniauth-backend/src/serviceinterface.cpp -+++ b/uniauth-backend/src/serviceinterface.cpp -@@ -1,5 +1,5 @@ - /* -- * Copyright (C) 2022 Tianjin KYLIN Information Technology Co., Ltd. -+ * Copyright (C) 2023 KylinSoftCo., Ltd. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by -diff --git a/uniauth-backend/src/serviceinterface.h b/uniauth-backend/src/serviceinterface.h -index cf13d8c..6edf7b6 100644 ---- a/uniauth-backend/src/serviceinterface.h -+++ b/uniauth-backend/src/serviceinterface.h -@@ -1,5 +1,5 @@ - /* -- * Copyright (C) 2022 Tianjin KYLIN Information Technology Co., Ltd. -+ * Copyright (C) 2023 KylinSoftCo., Ltd. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by -diff --git a/uniauth-backend/src/servicemanager.cpp b/uniauth-backend/src/servicemanager.cpp -index a9b61c3..daacec5 100644 ---- a/uniauth-backend/src/servicemanager.cpp -+++ b/uniauth-backend/src/servicemanager.cpp -@@ -1,5 +1,5 @@ - /* -- * Copyright (C) 2018 Tianjin KYLIN Information Technology Co., Ltd. -+ * Copyright (C) 2023 KylinSoftCo., Ltd. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by -diff --git a/uniauth-backend/src/servicemanager.h b/uniauth-backend/src/servicemanager.h -index 6c85df3..a4bbbb8 100644 ---- a/uniauth-backend/src/servicemanager.h -+++ b/uniauth-backend/src/servicemanager.h -@@ -1,5 +1,5 @@ - /* -- * Copyright (C) 2018 Tianjin KYLIN Information Technology Co., Ltd. -+ * Copyright (C) 2023 KylinSoftCo., Ltd. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by diff -Nru ukui-biometric-auth-4.10.0.0/debian/patches/0006-COPYING-LICENSE.patch ukui-biometric-auth-4.20.0.0/debian/patches/0006-COPYING-LICENSE.patch --- ukui-biometric-auth-4.10.0.0/debian/patches/0006-COPYING-LICENSE.patch 2024-04-23 10:31:46.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/debian/patches/0006-COPYING-LICENSE.patch 1970-01-01 08:00:00.000000000 +0800 @@ -1,1371 +0,0 @@ -From: handsome_feng <jianfengli@ubuntukylin.com> -Date: Sat, 16 Mar 2024 15:31:53 +0800 -Subject: COPYING -> LICENSE - ---- - COPYING | 674 ---------------------------------------------------------------- - LICENSE | 674 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - 2 files changed, 674 insertions(+), 674 deletions(-) - delete mode 100644 COPYING - create mode 100644 LICENSE - -diff --git a/COPYING b/COPYING -deleted file mode 100644 -index 94a9ed0..0000000 ---- a/COPYING -+++ /dev/null -@@ -1,674 +0,0 @@ -- GNU GENERAL PUBLIC LICENSE -- Version 3, 29 June 2007 -- -- Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> -- Everyone is permitted to copy and distribute verbatim copies -- of this license document, but changing it is not allowed. -- -- Preamble -- -- The GNU General Public License is a free, copyleft license for --software and other kinds of works. -- -- The licenses for most software and other practical works are designed --to take away your freedom to share and change the works. By contrast, --the GNU General Public License is intended to guarantee your freedom to --share and change all versions of a program--to make sure it remains free --software for all its users. We, the Free Software Foundation, use the --GNU General Public License for most of our software; it applies also to --any other work released this way by its authors. You can apply it to --your programs, too. -- -- When we speak of free software, we are referring to freedom, not --price. Our General Public Licenses are designed to make sure that you --have the freedom to distribute copies of free software (and charge for --them if you wish), that you receive source code or can get it if you --want it, that you can change the software or use pieces of it in new --free programs, and that you know you can do these things. -- -- To protect your rights, we need to prevent others from denying you --these rights or asking you to surrender the rights. Therefore, you have --certain responsibilities if you distribute copies of the software, or if --you modify it: responsibilities to respect the freedom of others. -- -- For example, if you distribute copies of such a program, whether --gratis or for a fee, you must pass on to the recipients the same --freedoms that you received. You must make sure that they, too, receive --or can get the source code. And you must show them these terms so they --know their rights. -- -- Developers that use the GNU GPL protect your rights with two steps: --(1) assert copyright on the software, and (2) offer you this License --giving you legal permission to copy, distribute and/or modify it. -- -- For the developers' and authors' protection, the GPL clearly explains --that there is no warranty for this free software. For both users' and --authors' sake, the GPL requires that modified versions be marked as --changed, so that their problems will not be attributed erroneously to --authors of previous versions. -- -- Some devices are designed to deny users access to install or run --modified versions of the software inside them, although the manufacturer --can do so. This is fundamentally incompatible with the aim of --protecting users' freedom to change the software. The systematic --pattern of such abuse occurs in the area of products for individuals to --use, which is precisely where it is most unacceptable. Therefore, we --have designed this version of the GPL to prohibit the practice for those --products. If such problems arise substantially in other domains, we --stand ready to extend this provision to those domains in future versions --of the GPL, as needed to protect the freedom of users. -- -- Finally, every program is threatened constantly by software patents. --States should not allow patents to restrict development and use of --software on general-purpose computers, but in those that do, we wish to --avoid the special danger that patents applied to a free program could --make it effectively proprietary. To prevent this, the GPL assures that --patents cannot be used to render the program non-free. -- -- The precise terms and conditions for copying, distribution and --modification follow. -- -- TERMS AND CONDITIONS -- -- 0. Definitions. -- -- "This License" refers to version 3 of the GNU General Public License. -- -- "Copyright" also means copyright-like laws that apply to other kinds of --works, such as semiconductor masks. -- -- "The Program" refers to any copyrightable work licensed under this --License. Each licensee is addressed as "you". "Licensees" and --"recipients" may be individuals or organizations. -- -- To "modify" a work means to copy from or adapt all or part of the work --in a fashion requiring copyright permission, other than the making of an --exact copy. The resulting work is called a "modified version" of the --earlier work or a work "based on" the earlier work. -- -- A "covered work" means either the unmodified Program or a work based --on the Program. -- -- To "propagate" a work means to do anything with it that, without --permission, would make you directly or secondarily liable for --infringement under applicable copyright law, except executing it on a --computer or modifying a private copy. Propagation includes copying, --distribution (with or without modification), making available to the --public, and in some countries other activities as well. -- -- To "convey" a work means any kind of propagation that enables other --parties to make or receive copies. Mere interaction with a user through --a computer network, with no transfer of a copy, is not conveying. -- -- An interactive user interface displays "Appropriate Legal Notices" --to the extent that it includes a convenient and prominently visible --feature that (1) displays an appropriate copyright notice, and (2) --tells the user that there is no warranty for the work (except to the --extent that warranties are provided), that licensees may convey the --work under this License, and how to view a copy of this License. If --the interface presents a list of user commands or options, such as a --menu, a prominent item in the list meets this criterion. -- -- 1. Source Code. -- -- The "source code" for a work means the preferred form of the work --for making modifications to it. "Object code" means any non-source --form of a work. -- -- A "Standard Interface" means an interface that either is an official --standard defined by a recognized standards body, or, in the case of --interfaces specified for a particular programming language, one that --is widely used among developers working in that language. -- -- The "System Libraries" of an executable work include anything, other --than the work as a whole, that (a) is included in the normal form of --packaging a Major Component, but which is not part of that Major --Component, and (b) serves only to enable use of the work with that --Major Component, or to implement a Standard Interface for which an --implementation is available to the public in source code form. A --"Major Component", in this context, means a major essential component --(kernel, window system, and so on) of the specific operating system --(if any) on which the executable work runs, or a compiler used to --produce the work, or an object code interpreter used to run it. -- -- The "Corresponding Source" for a work in object code form means all --the source code needed to generate, install, and (for an executable --work) run the object code and to modify the work, including scripts to --control those activities. However, it does not include the work's --System Libraries, or general-purpose tools or generally available free --programs which are used unmodified in performing those activities but --which are not part of the work. For example, Corresponding Source --includes interface definition files associated with source files for --the work, and the source code for shared libraries and dynamically --linked subprograms that the work is specifically designed to require, --such as by intimate data communication or control flow between those --subprograms and other parts of the work. -- -- The Corresponding Source need not include anything that users --can regenerate automatically from other parts of the Corresponding --Source. -- -- The Corresponding Source for a work in source code form is that --same work. -- -- 2. Basic Permissions. -- -- All rights granted under this License are granted for the term of --copyright on the Program, and are irrevocable provided the stated --conditions are met. This License explicitly affirms your unlimited --permission to run the unmodified Program. The output from running a --covered work is covered by this License only if the output, given its --content, constitutes a covered work. This License acknowledges your --rights of fair use or other equivalent, as provided by copyright law. -- -- You may make, run and propagate covered works that you do not --convey, without conditions so long as your license otherwise remains --in force. You may convey covered works to others for the sole purpose --of having them make modifications exclusively for you, or provide you --with facilities for running those works, provided that you comply with --the terms of this License in conveying all material for which you do --not control copyright. Those thus making or running the covered works --for you must do so exclusively on your behalf, under your direction --and control, on terms that prohibit them from making any copies of --your copyrighted material outside their relationship with you. -- -- Conveying under any other circumstances is permitted solely under --the conditions stated below. Sublicensing is not allowed; section 10 --makes it unnecessary. -- -- 3. Protecting Users' Legal Rights From Anti-Circumvention Law. -- -- No covered work shall be deemed part of an effective technological --measure under any applicable law fulfilling obligations under article --11 of the WIPO copyright treaty adopted on 20 December 1996, or --similar laws prohibiting or restricting circumvention of such --measures. -- -- When you convey a covered work, you waive any legal power to forbid --circumvention of technological measures to the extent such circumvention --is effected by exercising rights under this License with respect to --the covered work, and you disclaim any intention to limit operation or --modification of the work as a means of enforcing, against the work's --users, your or third parties' legal rights to forbid circumvention of --technological measures. -- -- 4. Conveying Verbatim Copies. -- -- You may convey verbatim copies of the Program's source code as you --receive it, in any medium, provided that you conspicuously and --appropriately publish on each copy an appropriate copyright notice; --keep intact all notices stating that this License and any --non-permissive terms added in accord with section 7 apply to the code; --keep intact all notices of the absence of any warranty; and give all --recipients a copy of this License along with the Program. -- -- You may charge any price or no price for each copy that you convey, --and you may offer support or warranty protection for a fee. -- -- 5. Conveying Modified Source Versions. -- -- You may convey a work based on the Program, or the modifications to --produce it from the Program, in the form of source code under the --terms of section 4, provided that you also meet all of these conditions: -- -- a) The work must carry prominent notices stating that you modified -- it, and giving a relevant date. -- -- b) The work must carry prominent notices stating that it is -- released under this License and any conditions added under section -- 7. This requirement modifies the requirement in section 4 to -- "keep intact all notices". -- -- c) You must license the entire work, as a whole, under this -- License to anyone who comes into possession of a copy. This -- License will therefore apply, along with any applicable section 7 -- additional terms, to the whole of the work, and all its parts, -- regardless of how they are packaged. This License gives no -- permission to license the work in any other way, but it does not -- invalidate such permission if you have separately received it. -- -- d) If the work has interactive user interfaces, each must display -- Appropriate Legal Notices; however, if the Program has interactive -- interfaces that do not display Appropriate Legal Notices, your -- work need not make them do so. -- -- A compilation of a covered work with other separate and independent --works, which are not by their nature extensions of the covered work, --and which are not combined with it such as to form a larger program, --in or on a volume of a storage or distribution medium, is called an --"aggregate" if the compilation and its resulting copyright are not --used to limit the access or legal rights of the compilation's users --beyond what the individual works permit. Inclusion of a covered work --in an aggregate does not cause this License to apply to the other --parts of the aggregate. -- -- 6. Conveying Non-Source Forms. -- -- You may convey a covered work in object code form under the terms --of sections 4 and 5, provided that you also convey the --machine-readable Corresponding Source under the terms of this License, --in one of these ways: -- -- a) Convey the object code in, or embodied in, a physical product -- (including a physical distribution medium), accompanied by the -- Corresponding Source fixed on a durable physical medium -- customarily used for software interchange. -- -- b) Convey the object code in, or embodied in, a physical product -- (including a physical distribution medium), accompanied by a -- written offer, valid for at least three years and valid for as -- long as you offer spare parts or customer support for that product -- model, to give anyone who possesses the object code either (1) a -- copy of the Corresponding Source for all the software in the -- product that is covered by this License, on a durable physical -- medium customarily used for software interchange, for a price no -- more than your reasonable cost of physically performing this -- conveying of source, or (2) access to copy the -- Corresponding Source from a network server at no charge. -- -- c) Convey individual copies of the object code with a copy of the -- written offer to provide the Corresponding Source. This -- alternative is allowed only occasionally and noncommercially, and -- only if you received the object code with such an offer, in accord -- with subsection 6b. -- -- d) Convey the object code by offering access from a designated -- place (gratis or for a charge), and offer equivalent access to the -- Corresponding Source in the same way through the same place at no -- further charge. You need not require recipients to copy the -- Corresponding Source along with the object code. If the place to -- copy the object code is a network server, the Corresponding Source -- may be on a different server (operated by you or a third party) -- that supports equivalent copying facilities, provided you maintain -- clear directions next to the object code saying where to find the -- Corresponding Source. Regardless of what server hosts the -- Corresponding Source, you remain obligated to ensure that it is -- available for as long as needed to satisfy these requirements. -- -- e) Convey the object code using peer-to-peer transmission, provided -- you inform other peers where the object code and Corresponding -- Source of the work are being offered to the general public at no -- charge under subsection 6d. -- -- A separable portion of the object code, whose source code is excluded --from the Corresponding Source as a System Library, need not be --included in conveying the object code work. -- -- A "User Product" is either (1) a "consumer product", which means any --tangible personal property which is normally used for personal, family, --or household purposes, or (2) anything designed or sold for incorporation --into a dwelling. In determining whether a product is a consumer product, --doubtful cases shall be resolved in favor of coverage. For a particular --product received by a particular user, "normally used" refers to a --typical or common use of that class of product, regardless of the status --of the particular user or of the way in which the particular user --actually uses, or expects or is expected to use, the product. A product --is a consumer product regardless of whether the product has substantial --commercial, industrial or non-consumer uses, unless such uses represent --the only significant mode of use of the product. -- -- "Installation Information" for a User Product means any methods, --procedures, authorization keys, or other information required to install --and execute modified versions of a covered work in that User Product from --a modified version of its Corresponding Source. The information must --suffice to ensure that the continued functioning of the modified object --code is in no case prevented or interfered with solely because --modification has been made. -- -- If you convey an object code work under this section in, or with, or --specifically for use in, a User Product, and the conveying occurs as --part of a transaction in which the right of possession and use of the --User Product is transferred to the recipient in perpetuity or for a --fixed term (regardless of how the transaction is characterized), the --Corresponding Source conveyed under this section must be accompanied --by the Installation Information. But this requirement does not apply --if neither you nor any third party retains the ability to install --modified object code on the User Product (for example, the work has --been installed in ROM). -- -- The requirement to provide Installation Information does not include a --requirement to continue to provide support service, warranty, or updates --for a work that has been modified or installed by the recipient, or for --the User Product in which it has been modified or installed. Access to a --network may be denied when the modification itself materially and --adversely affects the operation of the network or violates the rules and --protocols for communication across the network. -- -- Corresponding Source conveyed, and Installation Information provided, --in accord with this section must be in a format that is publicly --documented (and with an implementation available to the public in --source code form), and must require no special password or key for --unpacking, reading or copying. -- -- 7. Additional Terms. -- -- "Additional permissions" are terms that supplement the terms of this --License by making exceptions from one or more of its conditions. --Additional permissions that are applicable to the entire Program shall --be treated as though they were included in this License, to the extent --that they are valid under applicable law. If additional permissions --apply only to part of the Program, that part may be used separately --under those permissions, but the entire Program remains governed by --this License without regard to the additional permissions. -- -- When you convey a copy of a covered work, you may at your option --remove any additional permissions from that copy, or from any part of --it. (Additional permissions may be written to require their own --removal in certain cases when you modify the work.) You may place --additional permissions on material, added by you to a covered work, --for which you have or can give appropriate copyright permission. -- -- Notwithstanding any other provision of this License, for material you --add to a covered work, you may (if authorized by the copyright holders of --that material) supplement the terms of this License with terms: -- -- a) Disclaiming warranty or limiting liability differently from the -- terms of sections 15 and 16 of this License; or -- -- b) Requiring preservation of specified reasonable legal notices or -- author attributions in that material or in the Appropriate Legal -- Notices displayed by works containing it; or -- -- c) Prohibiting misrepresentation of the origin of that material, or -- requiring that modified versions of such material be marked in -- reasonable ways as different from the original version; or -- -- d) Limiting the use for publicity purposes of names of licensors or -- authors of the material; or -- -- e) Declining to grant rights under trademark law for use of some -- trade names, trademarks, or service marks; or -- -- f) Requiring indemnification of licensors and authors of that -- material by anyone who conveys the material (or modified versions of -- it) with contractual assumptions of liability to the recipient, for -- any liability that these contractual assumptions directly impose on -- those licensors and authors. -- -- All other non-permissive additional terms are considered "further --restrictions" within the meaning of section 10. If the Program as you --received it, or any part of it, contains a notice stating that it is --governed by this License along with a term that is a further --restriction, you may remove that term. If a license document contains --a further restriction but permits relicensing or conveying under this --License, you may add to a covered work material governed by the terms --of that license document, provided that the further restriction does --not survive such relicensing or conveying. -- -- If you add terms to a covered work in accord with this section, you --must place, in the relevant source files, a statement of the --additional terms that apply to those files, or a notice indicating --where to find the applicable terms. -- -- Additional terms, permissive or non-permissive, may be stated in the --form of a separately written license, or stated as exceptions; --the above requirements apply either way. -- -- 8. Termination. -- -- You may not propagate or modify a covered work except as expressly --provided under this License. Any attempt otherwise to propagate or --modify it is void, and will automatically terminate your rights under --this License (including any patent licenses granted under the third --paragraph of section 11). -- -- However, if you cease all violation of this License, then your --license from a particular copyright holder is reinstated (a) --provisionally, unless and until the copyright holder explicitly and --finally terminates your license, and (b) permanently, if the copyright --holder fails to notify you of the violation by some reasonable means --prior to 60 days after the cessation. -- -- Moreover, your license from a particular copyright holder is --reinstated permanently if the copyright holder notifies you of the --violation by some reasonable means, this is the first time you have --received notice of violation of this License (for any work) from that --copyright holder, and you cure the violation prior to 30 days after --your receipt of the notice. -- -- Termination of your rights under this section does not terminate the --licenses of parties who have received copies or rights from you under --this License. If your rights have been terminated and not permanently --reinstated, you do not qualify to receive new licenses for the same --material under section 10. -- -- 9. Acceptance Not Required for Having Copies. -- -- You are not required to accept this License in order to receive or --run a copy of the Program. Ancillary propagation of a covered work --occurring solely as a consequence of using peer-to-peer transmission --to receive a copy likewise does not require acceptance. However, --nothing other than this License grants you permission to propagate or --modify any covered work. These actions infringe copyright if you do --not accept this License. Therefore, by modifying or propagating a --covered work, you indicate your acceptance of this License to do so. -- -- 10. Automatic Licensing of Downstream Recipients. -- -- Each time you convey a covered work, the recipient automatically --receives a license from the original licensors, to run, modify and --propagate that work, subject to this License. You are not responsible --for enforcing compliance by third parties with this License. -- -- An "entity transaction" is a transaction transferring control of an --organization, or substantially all assets of one, or subdividing an --organization, or merging organizations. If propagation of a covered --work results from an entity transaction, each party to that --transaction who receives a copy of the work also receives whatever --licenses to the work the party's predecessor in interest had or could --give under the previous paragraph, plus a right to possession of the --Corresponding Source of the work from the predecessor in interest, if --the predecessor has it or can get it with reasonable efforts. -- -- You may not impose any further restrictions on the exercise of the --rights granted or affirmed under this License. For example, you may --not impose a license fee, royalty, or other charge for exercise of --rights granted under this License, and you may not initiate litigation --(including a cross-claim or counterclaim in a lawsuit) alleging that --any patent claim is infringed by making, using, selling, offering for --sale, or importing the Program or any portion of it. -- -- 11. Patents. -- -- A "contributor" is a copyright holder who authorizes use under this --License of the Program or a work on which the Program is based. The --work thus licensed is called the contributor's "contributor version". -- -- A contributor's "essential patent claims" are all patent claims --owned or controlled by the contributor, whether already acquired or --hereafter acquired, that would be infringed by some manner, permitted --by this License, of making, using, or selling its contributor version, --but do not include claims that would be infringed only as a --consequence of further modification of the contributor version. For --purposes of this definition, "control" includes the right to grant --patent sublicenses in a manner consistent with the requirements of --this License. -- -- Each contributor grants you a non-exclusive, worldwide, royalty-free --patent license under the contributor's essential patent claims, to --make, use, sell, offer for sale, import and otherwise run, modify and --propagate the contents of its contributor version. -- -- In the following three paragraphs, a "patent license" is any express --agreement or commitment, however denominated, not to enforce a patent --(such as an express permission to practice a patent or covenant not to --sue for patent infringement). To "grant" such a patent license to a --party means to make such an agreement or commitment not to enforce a --patent against the party. -- -- If you convey a covered work, knowingly relying on a patent license, --and the Corresponding Source of the work is not available for anyone --to copy, free of charge and under the terms of this License, through a --publicly available network server or other readily accessible means, --then you must either (1) cause the Corresponding Source to be so --available, or (2) arrange to deprive yourself of the benefit of the --patent license for this particular work, or (3) arrange, in a manner --consistent with the requirements of this License, to extend the patent --license to downstream recipients. "Knowingly relying" means you have --actual knowledge that, but for the patent license, your conveying the --covered work in a country, or your recipient's use of the covered work --in a country, would infringe one or more identifiable patents in that --country that you have reason to believe are valid. -- -- If, pursuant to or in connection with a single transaction or --arrangement, you convey, or propagate by procuring conveyance of, a --covered work, and grant a patent license to some of the parties --receiving the covered work authorizing them to use, propagate, modify --or convey a specific copy of the covered work, then the patent license --you grant is automatically extended to all recipients of the covered --work and works based on it. -- -- A patent license is "discriminatory" if it does not include within --the scope of its coverage, prohibits the exercise of, or is --conditioned on the non-exercise of one or more of the rights that are --specifically granted under this License. You may not convey a covered --work if you are a party to an arrangement with a third party that is --in the business of distributing software, under which you make payment --to the third party based on the extent of your activity of conveying --the work, and under which the third party grants, to any of the --parties who would receive the covered work from you, a discriminatory --patent license (a) in connection with copies of the covered work --conveyed by you (or copies made from those copies), or (b) primarily --for and in connection with specific products or compilations that --contain the covered work, unless you entered into that arrangement, --or that patent license was granted, prior to 28 March 2007. -- -- Nothing in this License shall be construed as excluding or limiting --any implied license or other defenses to infringement that may --otherwise be available to you under applicable patent law. -- -- 12. No Surrender of Others' Freedom. -- -- If conditions are imposed on you (whether by court order, agreement or --otherwise) that contradict the conditions of this License, they do not --excuse you from the conditions of this License. If you cannot convey a --covered work so as to satisfy simultaneously your obligations under this --License and any other pertinent obligations, then as a consequence you may --not convey it at all. For example, if you agree to terms that obligate you --to collect a royalty for further conveying from those to whom you convey --the Program, the only way you could satisfy both those terms and this --License would be to refrain entirely from conveying the Program. -- -- 13. Use with the GNU Affero General Public License. -- -- Notwithstanding any other provision of this License, you have --permission to link or combine any covered work with a work licensed --under version 3 of the GNU Affero General Public License into a single --combined work, and to convey the resulting work. The terms of this --License will continue to apply to the part which is the covered work, --but the special requirements of the GNU Affero General Public License, --section 13, concerning interaction through a network will apply to the --combination as such. -- -- 14. Revised Versions of this License. -- -- The Free Software Foundation may publish revised and/or new versions of --the GNU General Public License from time to time. Such new versions will --be similar in spirit to the present version, but may differ in detail to --address new problems or concerns. -- -- Each version is given a distinguishing version number. If the --Program specifies that a certain numbered version of the GNU General --Public License "or any later version" applies to it, you have the --option of following the terms and conditions either of that numbered --version or of any later version published by the Free Software --Foundation. If the Program does not specify a version number of the --GNU General Public License, you may choose any version ever published --by the Free Software Foundation. -- -- If the Program specifies that a proxy can decide which future --versions of the GNU General Public License can be used, that proxy's --public statement of acceptance of a version permanently authorizes you --to choose that version for the Program. -- -- Later license versions may give you additional or different --permissions. However, no additional obligations are imposed on any --author or copyright holder as a result of your choosing to follow a --later version. -- -- 15. Disclaimer of Warranty. -- -- THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY --APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT --HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY --OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, --THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR --PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM --IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF --ALL NECESSARY SERVICING, REPAIR OR CORRECTION. -- -- 16. Limitation of Liability. -- -- IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING --WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS --THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY --GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE --USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF --DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD --PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), --EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF --SUCH DAMAGES. -- -- 17. Interpretation of Sections 15 and 16. -- -- If the disclaimer of warranty and limitation of liability provided --above cannot be given local legal effect according to their terms, --reviewing courts shall apply local law that most closely approximates --an absolute waiver of all civil liability in connection with the --Program, unless a warranty or assumption of liability accompanies a --copy of the Program in return for a fee. -- -- END OF TERMS AND CONDITIONS -- -- How to Apply These Terms to Your New Programs -- -- If you develop a new program, and you want it to be of the greatest --possible use to the public, the best way to achieve this is to make it --free software which everyone can redistribute and change under these terms. -- -- To do so, attach the following notices to the program. It is safest --to attach them to the start of each source file to most effectively --state the exclusion of warranty; and each file should have at least --the "copyright" line and a pointer to where the full notice is found. -- -- <one line to give the program's name and a brief idea of what it does.> -- Copyright (C) <year> <name of author> -- -- This program is free software: you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by -- the Free Software Foundation, either version 3 of the License, or -- (at your option) any later version. -- -- This program is distributed in the hope that it will be useful, -- but WITHOUT ANY WARRANTY; without even the implied warranty of -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -- GNU General Public License for more details. -- -- You should have received a copy of the GNU General Public License -- along with this program. If not, see <http://www.gnu.org/licenses/>. -- --Also add information on how to contact you by electronic and paper mail. -- -- If the program does terminal interaction, make it output a short --notice like this when it starts in an interactive mode: -- -- <program> Copyright (C) <year> <name of author> -- This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. -- This is free software, and you are welcome to redistribute it -- under certain conditions; type `show c' for details. -- --The hypothetical commands `show w' and `show c' should show the appropriate --parts of the General Public License. Of course, your program's commands --might be different; for a GUI interface, you would use an "about box". -- -- You should also get your employer (if you work as a programmer) or school, --if any, to sign a "copyright disclaimer" for the program, if necessary. --For more information on this, and how to apply and follow the GNU GPL, see --<http://www.gnu.org/licenses/>. -- -- The GNU General Public License does not permit incorporating your program --into proprietary programs. If your program is a subroutine library, you --may consider it more useful to permit linking proprietary applications with --the library. If this is what you want to do, use the GNU Lesser General --Public License instead of this License. But first, please read --<http://www.gnu.org/philosophy/why-not-lgpl.html>. -diff --git a/LICENSE b/LICENSE -new file mode 100644 -index 0000000..818433e ---- /dev/null -+++ b/LICENSE -@@ -0,0 +1,674 @@ -+ GNU GENERAL PUBLIC LICENSE -+ Version 3, 29 June 2007 -+ -+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> -+ Everyone is permitted to copy and distribute verbatim copies -+ of this license document, but changing it is not allowed. -+ -+ Preamble -+ -+ The GNU General Public License is a free, copyleft license for -+software and other kinds of works. -+ -+ The licenses for most software and other practical works are designed -+to take away your freedom to share and change the works. By contrast, -+the GNU General Public License is intended to guarantee your freedom to -+share and change all versions of a program--to make sure it remains free -+software for all its users. We, the Free Software Foundation, use the -+GNU General Public License for most of our software; it applies also to -+any other work released this way by its authors. You can apply it to -+your programs, too. -+ -+ When we speak of free software, we are referring to freedom, not -+price. Our General Public Licenses are designed to make sure that you -+have the freedom to distribute copies of free software (and charge for -+them if you wish), that you receive source code or can get it if you -+want it, that you can change the software or use pieces of it in new -+free programs, and that you know you can do these things. -+ -+ To protect your rights, we need to prevent others from denying you -+these rights or asking you to surrender the rights. Therefore, you have -+certain responsibilities if you distribute copies of the software, or if -+you modify it: responsibilities to respect the freedom of others. -+ -+ For example, if you distribute copies of such a program, whether -+gratis or for a fee, you must pass on to the recipients the same -+freedoms that you received. You must make sure that they, too, receive -+or can get the source code. And you must show them these terms so they -+know their rights. -+ -+ Developers that use the GNU GPL protect your rights with two steps: -+(1) assert copyright on the software, and (2) offer you this License -+giving you legal permission to copy, distribute and/or modify it. -+ -+ For the developers' and authors' protection, the GPL clearly explains -+that there is no warranty for this free software. For both users' and -+authors' sake, the GPL requires that modified versions be marked as -+changed, so that their problems will not be attributed erroneously to -+authors of previous versions. -+ -+ Some devices are designed to deny users access to install or run -+modified versions of the software inside them, although the manufacturer -+can do so. This is fundamentally incompatible with the aim of -+protecting users' freedom to change the software. The systematic -+pattern of such abuse occurs in the area of products for individuals to -+use, which is precisely where it is most unacceptable. Therefore, we -+have designed this version of the GPL to prohibit the practice for those -+products. If such problems arise substantially in other domains, we -+stand ready to extend this provision to those domains in future versions -+of the GPL, as needed to protect the freedom of users. -+ -+ Finally, every program is threatened constantly by software patents. -+States should not allow patents to restrict development and use of -+software on general-purpose computers, but in those that do, we wish to -+avoid the special danger that patents applied to a free program could -+make it effectively proprietary. To prevent this, the GPL assures that -+patents cannot be used to render the program non-free. -+ -+ The precise terms and conditions for copying, distribution and -+modification follow. -+ -+ TERMS AND CONDITIONS -+ -+ 0. Definitions. -+ -+ "This License" refers to version 3 of the GNU General Public License. -+ -+ "Copyright" also means copyright-like laws that apply to other kinds of -+works, such as semiconductor masks. -+ -+ "The Program" refers to any copyrightable work licensed under this -+License. Each licensee is addressed as "you". "Licensees" and -+"recipients" may be individuals or organizations. -+ -+ To "modify" a work means to copy from or adapt all or part of the work -+in a fashion requiring copyright permission, other than the making of an -+exact copy. The resulting work is called a "modified version" of the -+earlier work or a work "based on" the earlier work. -+ -+ A "covered work" means either the unmodified Program or a work based -+on the Program. -+ -+ To "propagate" a work means to do anything with it that, without -+permission, would make you directly or secondarily liable for -+infringement under applicable copyright law, except executing it on a -+computer or modifying a private copy. Propagation includes copying, -+distribution (with or without modification), making available to the -+public, and in some countries other activities as well. -+ -+ To "convey" a work means any kind of propagation that enables other -+parties to make or receive copies. Mere interaction with a user through -+a computer network, with no transfer of a copy, is not conveying. -+ -+ An interactive user interface displays "Appropriate Legal Notices" -+to the extent that it includes a convenient and prominently visible -+feature that (1) displays an appropriate copyright notice, and (2) -+tells the user that there is no warranty for the work (except to the -+extent that warranties are provided), that licensees may convey the -+work under this License, and how to view a copy of this License. If -+the interface presents a list of user commands or options, such as a -+menu, a prominent item in the list meets this criterion. -+ -+ 1. Source Code. -+ -+ The "source code" for a work means the preferred form of the work -+for making modifications to it. "Object code" means any non-source -+form of a work. -+ -+ A "Standard Interface" means an interface that either is an official -+standard defined by a recognized standards body, or, in the case of -+interfaces specified for a particular programming language, one that -+is widely used among developers working in that language. -+ -+ The "System Libraries" of an executable work include anything, other -+than the work as a whole, that (a) is included in the normal form of -+packaging a Major Component, but which is not part of that Major -+Component, and (b) serves only to enable use of the work with that -+Major Component, or to implement a Standard Interface for which an -+implementation is available to the public in source code form. A -+"Major Component", in this context, means a major essential component -+(kernel, window system, and so on) of the specific operating system -+(if any) on which the executable work runs, or a compiler used to -+produce the work, or an object code interpreter used to run it. -+ -+ The "Corresponding Source" for a work in object code form means all -+the source code needed to generate, install, and (for an executable -+work) run the object code and to modify the work, including scripts to -+control those activities. However, it does not include the work's -+System Libraries, or general-purpose tools or generally available free -+programs which are used unmodified in performing those activities but -+which are not part of the work. For example, Corresponding Source -+includes interface definition files associated with source files for -+the work, and the source code for shared libraries and dynamically -+linked subprograms that the work is specifically designed to require, -+such as by intimate data communication or control flow between those -+subprograms and other parts of the work. -+ -+ The Corresponding Source need not include anything that users -+can regenerate automatically from other parts of the Corresponding -+Source. -+ -+ The Corresponding Source for a work in source code form is that -+same work. -+ -+ 2. Basic Permissions. -+ -+ All rights granted under this License are granted for the term of -+copyright on the Program, and are irrevocable provided the stated -+conditions are met. This License explicitly affirms your unlimited -+permission to run the unmodified Program. The output from running a -+covered work is covered by this License only if the output, given its -+content, constitutes a covered work. This License acknowledges your -+rights of fair use or other equivalent, as provided by copyright law. -+ -+ You may make, run and propagate covered works that you do not -+convey, without conditions so long as your license otherwise remains -+in force. You may convey covered works to others for the sole purpose -+of having them make modifications exclusively for you, or provide you -+with facilities for running those works, provided that you comply with -+the terms of this License in conveying all material for which you do -+not control copyright. Those thus making or running the covered works -+for you must do so exclusively on your behalf, under your direction -+and control, on terms that prohibit them from making any copies of -+your copyrighted material outside their relationship with you. -+ -+ Conveying under any other circumstances is permitted solely under -+the conditions stated below. Sublicensing is not allowed; section 10 -+makes it unnecessary. -+ -+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law. -+ -+ No covered work shall be deemed part of an effective technological -+measure under any applicable law fulfilling obligations under article -+11 of the WIPO copyright treaty adopted on 20 December 1996, or -+similar laws prohibiting or restricting circumvention of such -+measures. -+ -+ When you convey a covered work, you waive any legal power to forbid -+circumvention of technological measures to the extent such circumvention -+is effected by exercising rights under this License with respect to -+the covered work, and you disclaim any intention to limit operation or -+modification of the work as a means of enforcing, against the work's -+users, your or third parties' legal rights to forbid circumvention of -+technological measures. -+ -+ 4. Conveying Verbatim Copies. -+ -+ You may convey verbatim copies of the Program's source code as you -+receive it, in any medium, provided that you conspicuously and -+appropriately publish on each copy an appropriate copyright notice; -+keep intact all notices stating that this License and any -+non-permissive terms added in accord with section 7 apply to the code; -+keep intact all notices of the absence of any warranty; and give all -+recipients a copy of this License along with the Program. -+ -+ You may charge any price or no price for each copy that you convey, -+and you may offer support or warranty protection for a fee. -+ -+ 5. Conveying Modified Source Versions. -+ -+ You may convey a work based on the Program, or the modifications to -+produce it from the Program, in the form of source code under the -+terms of section 4, provided that you also meet all of these conditions: -+ -+ a) The work must carry prominent notices stating that you modified -+ it, and giving a relevant date. -+ -+ b) The work must carry prominent notices stating that it is -+ released under this License and any conditions added under section -+ 7. This requirement modifies the requirement in section 4 to -+ "keep intact all notices". -+ -+ c) You must license the entire work, as a whole, under this -+ License to anyone who comes into possession of a copy. This -+ License will therefore apply, along with any applicable section 7 -+ additional terms, to the whole of the work, and all its parts, -+ regardless of how they are packaged. This License gives no -+ permission to license the work in any other way, but it does not -+ invalidate such permission if you have separately received it. -+ -+ d) If the work has interactive user interfaces, each must display -+ Appropriate Legal Notices; however, if the Program has interactive -+ interfaces that do not display Appropriate Legal Notices, your -+ work need not make them do so. -+ -+ A compilation of a covered work with other separate and independent -+works, which are not by their nature extensions of the covered work, -+and which are not combined with it such as to form a larger program, -+in or on a volume of a storage or distribution medium, is called an -+"aggregate" if the compilation and its resulting copyright are not -+used to limit the access or legal rights of the compilation's users -+beyond what the individual works permit. Inclusion of a covered work -+in an aggregate does not cause this License to apply to the other -+parts of the aggregate. -+ -+ 6. Conveying Non-Source Forms. -+ -+ You may convey a covered work in object code form under the terms -+of sections 4 and 5, provided that you also convey the -+machine-readable Corresponding Source under the terms of this License, -+in one of these ways: -+ -+ a) Convey the object code in, or embodied in, a physical product -+ (including a physical distribution medium), accompanied by the -+ Corresponding Source fixed on a durable physical medium -+ customarily used for software interchange. -+ -+ b) Convey the object code in, or embodied in, a physical product -+ (including a physical distribution medium), accompanied by a -+ written offer, valid for at least three years and valid for as -+ long as you offer spare parts or customer support for that product -+ model, to give anyone who possesses the object code either (1) a -+ copy of the Corresponding Source for all the software in the -+ product that is covered by this License, on a durable physical -+ medium customarily used for software interchange, for a price no -+ more than your reasonable cost of physically performing this -+ conveying of source, or (2) access to copy the -+ Corresponding Source from a network server at no charge. -+ -+ c) Convey individual copies of the object code with a copy of the -+ written offer to provide the Corresponding Source. This -+ alternative is allowed only occasionally and noncommercially, and -+ only if you received the object code with such an offer, in accord -+ with subsection 6b. -+ -+ d) Convey the object code by offering access from a designated -+ place (gratis or for a charge), and offer equivalent access to the -+ Corresponding Source in the same way through the same place at no -+ further charge. You need not require recipients to copy the -+ Corresponding Source along with the object code. If the place to -+ copy the object code is a network server, the Corresponding Source -+ may be on a different server (operated by you or a third party) -+ that supports equivalent copying facilities, provided you maintain -+ clear directions next to the object code saying where to find the -+ Corresponding Source. Regardless of what server hosts the -+ Corresponding Source, you remain obligated to ensure that it is -+ available for as long as needed to satisfy these requirements. -+ -+ e) Convey the object code using peer-to-peer transmission, provided -+ you inform other peers where the object code and Corresponding -+ Source of the work are being offered to the general public at no -+ charge under subsection 6d. -+ -+ A separable portion of the object code, whose source code is excluded -+from the Corresponding Source as a System Library, need not be -+included in conveying the object code work. -+ -+ A "User Product" is either (1) a "consumer product", which means any -+tangible personal property which is normally used for personal, family, -+or household purposes, or (2) anything designed or sold for incorporation -+into a dwelling. In determining whether a product is a consumer product, -+doubtful cases shall be resolved in favor of coverage. For a particular -+product received by a particular user, "normally used" refers to a -+typical or common use of that class of product, regardless of the status -+of the particular user or of the way in which the particular user -+actually uses, or expects or is expected to use, the product. A product -+is a consumer product regardless of whether the product has substantial -+commercial, industrial or non-consumer uses, unless such uses represent -+the only significant mode of use of the product. -+ -+ "Installation Information" for a User Product means any methods, -+procedures, authorization keys, or other information required to install -+and execute modified versions of a covered work in that User Product from -+a modified version of its Corresponding Source. The information must -+suffice to ensure that the continued functioning of the modified object -+code is in no case prevented or interfered with solely because -+modification has been made. -+ -+ If you convey an object code work under this section in, or with, or -+specifically for use in, a User Product, and the conveying occurs as -+part of a transaction in which the right of possession and use of the -+User Product is transferred to the recipient in perpetuity or for a -+fixed term (regardless of how the transaction is characterized), the -+Corresponding Source conveyed under this section must be accompanied -+by the Installation Information. But this requirement does not apply -+if neither you nor any third party retains the ability to install -+modified object code on the User Product (for example, the work has -+been installed in ROM). -+ -+ The requirement to provide Installation Information does not include a -+requirement to continue to provide support service, warranty, or updates -+for a work that has been modified or installed by the recipient, or for -+the User Product in which it has been modified or installed. Access to a -+network may be denied when the modification itself materially and -+adversely affects the operation of the network or violates the rules and -+protocols for communication across the network. -+ -+ Corresponding Source conveyed, and Installation Information provided, -+in accord with this section must be in a format that is publicly -+documented (and with an implementation available to the public in -+source code form), and must require no special password or key for -+unpacking, reading or copying. -+ -+ 7. Additional Terms. -+ -+ "Additional permissions" are terms that supplement the terms of this -+License by making exceptions from one or more of its conditions. -+Additional permissions that are applicable to the entire Program shall -+be treated as though they were included in this License, to the extent -+that they are valid under applicable law. If additional permissions -+apply only to part of the Program, that part may be used separately -+under those permissions, but the entire Program remains governed by -+this License without regard to the additional permissions. -+ -+ When you convey a copy of a covered work, you may at your option -+remove any additional permissions from that copy, or from any part of -+it. (Additional permissions may be written to require their own -+removal in certain cases when you modify the work.) You may place -+additional permissions on material, added by you to a covered work, -+for which you have or can give appropriate copyright permission. -+ -+ Notwithstanding any other provision of this License, for material you -+add to a covered work, you may (if authorized by the copyright holders of -+that material) supplement the terms of this License with terms: -+ -+ a) Disclaiming warranty or limiting liability differently from the -+ terms of sections 15 and 16 of this License; or -+ -+ b) Requiring preservation of specified reasonable legal notices or -+ author attributions in that material or in the Appropriate Legal -+ Notices displayed by works containing it; or -+ -+ c) Prohibiting misrepresentation of the origin of that material, or -+ requiring that modified versions of such material be marked in -+ reasonable ways as different from the original version; or -+ -+ d) Limiting the use for publicity purposes of names of licensors or -+ authors of the material; or -+ -+ e) Declining to grant rights under trademark law for use of some -+ trade names, trademarks, or service marks; or -+ -+ f) Requiring indemnification of licensors and authors of that -+ material by anyone who conveys the material (or modified versions of -+ it) with contractual assumptions of liability to the recipient, for -+ any liability that these contractual assumptions directly impose on -+ those licensors and authors. -+ -+ All other non-permissive additional terms are considered "further -+restrictions" within the meaning of section 10. If the Program as you -+received it, or any part of it, contains a notice stating that it is -+governed by this License along with a term that is a further -+restriction, you may remove that term. If a license document contains -+a further restriction but permits relicensing or conveying under this -+License, you may add to a covered work material governed by the terms -+of that license document, provided that the further restriction does -+not survive such relicensing or conveying. -+ -+ If you add terms to a covered work in accord with this section, you -+must place, in the relevant source files, a statement of the -+additional terms that apply to those files, or a notice indicating -+where to find the applicable terms. -+ -+ Additional terms, permissive or non-permissive, may be stated in the -+form of a separately written license, or stated as exceptions; -+the above requirements apply either way. -+ -+ 8. Termination. -+ -+ You may not propagate or modify a covered work except as expressly -+provided under this License. Any attempt otherwise to propagate or -+modify it is void, and will automatically terminate your rights under -+this License (including any patent licenses granted under the third -+paragraph of section 11). -+ -+ However, if you cease all violation of this License, then your -+license from a particular copyright holder is reinstated (a) -+provisionally, unless and until the copyright holder explicitly and -+finally terminates your license, and (b) permanently, if the copyright -+holder fails to notify you of the violation by some reasonable means -+prior to 60 days after the cessation. -+ -+ Moreover, your license from a particular copyright holder is -+reinstated permanently if the copyright holder notifies you of the -+violation by some reasonable means, this is the first time you have -+received notice of violation of this License (for any work) from that -+copyright holder, and you cure the violation prior to 30 days after -+your receipt of the notice. -+ -+ Termination of your rights under this section does not terminate the -+licenses of parties who have received copies or rights from you under -+this License. If your rights have been terminated and not permanently -+reinstated, you do not qualify to receive new licenses for the same -+material under section 10. -+ -+ 9. Acceptance Not Required for Having Copies. -+ -+ You are not required to accept this License in order to receive or -+run a copy of the Program. Ancillary propagation of a covered work -+occurring solely as a consequence of using peer-to-peer transmission -+to receive a copy likewise does not require acceptance. However, -+nothing other than this License grants you permission to propagate or -+modify any covered work. These actions infringe copyright if you do -+not accept this License. Therefore, by modifying or propagating a -+covered work, you indicate your acceptance of this License to do so. -+ -+ 10. Automatic Licensing of Downstream Recipients. -+ -+ Each time you convey a covered work, the recipient automatically -+receives a license from the original licensors, to run, modify and -+propagate that work, subject to this License. You are not responsible -+for enforcing compliance by third parties with this License. -+ -+ An "entity transaction" is a transaction transferring control of an -+organization, or substantially all assets of one, or subdividing an -+organization, or merging organizations. If propagation of a covered -+work results from an entity transaction, each party to that -+transaction who receives a copy of the work also receives whatever -+licenses to the work the party's predecessor in interest had or could -+give under the previous paragraph, plus a right to possession of the -+Corresponding Source of the work from the predecessor in interest, if -+the predecessor has it or can get it with reasonable efforts. -+ -+ You may not impose any further restrictions on the exercise of the -+rights granted or affirmed under this License. For example, you may -+not impose a license fee, royalty, or other charge for exercise of -+rights granted under this License, and you may not initiate litigation -+(including a cross-claim or counterclaim in a lawsuit) alleging that -+any patent claim is infringed by making, using, selling, offering for -+sale, or importing the Program or any portion of it. -+ -+ 11. Patents. -+ -+ A "contributor" is a copyright holder who authorizes use under this -+License of the Program or a work on which the Program is based. The -+work thus licensed is called the contributor's "contributor version". -+ -+ A contributor's "essential patent claims" are all patent claims -+owned or controlled by the contributor, whether already acquired or -+hereafter acquired, that would be infringed by some manner, permitted -+by this License, of making, using, or selling its contributor version, -+but do not include claims that would be infringed only as a -+consequence of further modification of the contributor version. For -+purposes of this definition, "control" includes the right to grant -+patent sublicenses in a manner consistent with the requirements of -+this License. -+ -+ Each contributor grants you a non-exclusive, worldwide, royalty-free -+patent license under the contributor's essential patent claims, to -+make, use, sell, offer for sale, import and otherwise run, modify and -+propagate the contents of its contributor version. -+ -+ In the following three paragraphs, a "patent license" is any express -+agreement or commitment, however denominated, not to enforce a patent -+(such as an express permission to practice a patent or covenant not to -+sue for patent infringement). To "grant" such a patent license to a -+party means to make such an agreement or commitment not to enforce a -+patent against the party. -+ -+ If you convey a covered work, knowingly relying on a patent license, -+and the Corresponding Source of the work is not available for anyone -+to copy, free of charge and under the terms of this License, through a -+publicly available network server or other readily accessible means, -+then you must either (1) cause the Corresponding Source to be so -+available, or (2) arrange to deprive yourself of the benefit of the -+patent license for this particular work, or (3) arrange, in a manner -+consistent with the requirements of this License, to extend the patent -+license to downstream recipients. "Knowingly relying" means you have -+actual knowledge that, but for the patent license, your conveying the -+covered work in a country, or your recipient's use of the covered work -+in a country, would infringe one or more identifiable patents in that -+country that you have reason to believe are valid. -+ -+ If, pursuant to or in connection with a single transaction or -+arrangement, you convey, or propagate by procuring conveyance of, a -+covered work, and grant a patent license to some of the parties -+receiving the covered work authorizing them to use, propagate, modify -+or convey a specific copy of the covered work, then the patent license -+you grant is automatically extended to all recipients of the covered -+work and works based on it. -+ -+ A patent license is "discriminatory" if it does not include within -+the scope of its coverage, prohibits the exercise of, or is -+conditioned on the non-exercise of one or more of the rights that are -+specifically granted under this License. You may not convey a covered -+work if you are a party to an arrangement with a third party that is -+in the business of distributing software, under which you make payment -+to the third party based on the extent of your activity of conveying -+the work, and under which the third party grants, to any of the -+parties who would receive the covered work from you, a discriminatory -+patent license (a) in connection with copies of the covered work -+conveyed by you (or copies made from those copies), or (b) primarily -+for and in connection with specific products or compilations that -+contain the covered work, unless you entered into that arrangement, -+or that patent license was granted, prior to 28 March 2007. -+ -+ Nothing in this License shall be construed as excluding or limiting -+any implied license or other defenses to infringement that may -+otherwise be available to you under applicable patent law. -+ -+ 12. No Surrender of Others' Freedom. -+ -+ If conditions are imposed on you (whether by court order, agreement or -+otherwise) that contradict the conditions of this License, they do not -+excuse you from the conditions of this License. If you cannot convey a -+covered work so as to satisfy simultaneously your obligations under this -+License and any other pertinent obligations, then as a consequence you may -+not convey it at all. For example, if you agree to terms that obligate you -+to collect a royalty for further conveying from those to whom you convey -+the Program, the only way you could satisfy both those terms and this -+License would be to refrain entirely from conveying the Program. -+ -+ 13. Use with the GNU Affero General Public License. -+ -+ Notwithstanding any other provision of this License, you have -+permission to link or combine any covered work with a work licensed -+under version 3 of the GNU Affero General Public License into a single -+combined work, and to convey the resulting work. The terms of this -+License will continue to apply to the part which is the covered work, -+but the special requirements of the GNU Affero General Public License, -+section 13, concerning interaction through a network will apply to the -+combination as such. -+ -+ 14. Revised Versions of this License. -+ -+ The Free Software Foundation may publish revised and/or new versions of -+the GNU General Public License from time to time. Such new versions will -+be similar in spirit to the present version, but may differ in detail to -+address new problems or concerns. -+ -+ Each version is given a distinguishing version number. If the -+Program specifies that a certain numbered version of the GNU General -+Public License "or any later version" applies to it, you have the -+option of following the terms and conditions either of that numbered -+version or of any later version published by the Free Software -+Foundation. If the Program does not specify a version number of the -+GNU General Public License, you may choose any version ever published -+by the Free Software Foundation. -+ -+ If the Program specifies that a proxy can decide which future -+versions of the GNU General Public License can be used, that proxy's -+public statement of acceptance of a version permanently authorizes you -+to choose that version for the Program. -+ -+ Later license versions may give you additional or different -+permissions. However, no additional obligations are imposed on any -+author or copyright holder as a result of your choosing to follow a -+later version. -+ -+ 15. Disclaimer of Warranty. -+ -+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -+ALL NECESSARY SERVICING, REPAIR OR CORRECTION. -+ -+ 16. Limitation of Liability. -+ -+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -+SUCH DAMAGES. -+ -+ 17. Interpretation of Sections 15 and 16. -+ -+ If the disclaimer of warranty and limitation of liability provided -+above cannot be given local legal effect according to their terms, -+reviewing courts shall apply local law that most closely approximates -+an absolute waiver of all civil liability in connection with the -+Program, unless a warranty or assumption of liability accompanies a -+copy of the Program in return for a fee. -+ -+ END OF TERMS AND CONDITIONS -+ -+ How to Apply These Terms to Your New Programs -+ -+ If you develop a new program, and you want it to be of the greatest -+possible use to the public, the best way to achieve this is to make it -+free software which everyone can redistribute and change under these terms. -+ -+ To do so, attach the following notices to the program. It is safest -+to attach them to the start of each source file to most effectively -+state the exclusion of warranty; and each file should have at least -+the "copyright" line and a pointer to where the full notice is found. -+ -+ <one line to give the program's name and a brief idea of what it does.> -+ Copyright (C) <year> <name of author> -+ -+ This program is free software: you can redistribute it and/or modify -+ it under the terms of the GNU General Public License as published by -+ the Free Software Foundation, either version 3 of the License, or -+ (at your option) any later version. -+ -+ This program is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ GNU General Public License for more details. -+ -+ You should have received a copy of the GNU General Public License -+ along with this program. If not, see <http://www.gnu.org/licenses/>. -+ -+Also add information on how to contact you by electronic and paper mail. -+ -+ If the program does terminal interaction, make it output a short -+notice like this when it starts in an interactive mode: -+ -+ <program> Copyright (C) <year> <name of author> -+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. -+ This is free software, and you are welcome to redistribute it -+ under certain conditions; type `show c' for details. -+ -+The hypothetical commands `show w' and `show c' should show the appropriate -+parts of the General Public License. Of course, your program's commands -+might be different; for a GUI interface, you would use an "about box". -+ -+ You should also get your employer (if you work as a programmer) or school, -+if any, to sign a "copyright disclaimer" for the program, if necessary. -+For more information on this, and how to apply and follow the GNU GPL, see -+<http://www.gnu.org/licenses/>. -+ -+ The GNU General Public License does not permit incorporating your program -+into proprietary programs. If your program is a subroutine library, you -+may consider it more useful to permit linking proprietary applications with -+the library. If this is what you want to do, use the GNU Lesser General -+Public License instead of this License. But first, please read -+<http://www.gnu.org/philosophy/why-not-lgpl.html>. diff -Nru ukui-biometric-auth-4.10.0.0/debian/patches/0007-17.patch ukui-biometric-auth-4.20.0.0/debian/patches/0007-17.patch --- ukui-biometric-auth-4.10.0.0/debian/patches/0007-17.patch 2024-04-23 10:31:46.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/debian/patches/0007-17.patch 1970-01-01 08:00:00.000000000 +0800 @@ -1,78 +0,0 @@ -From: =?utf-8?b?5p2o5pWP?= <yangmin@kylinos.cn> -Date: Tue, 23 Apr 2024 02:22:36 +0000 -Subject: =?utf-8?b?ITE3IOWNleeCueeZu+W9lei/geenu+WIsOWQjuerryBNZXJnZSBwdWxs?= - =?utf-8?b?IHJlcXVlc3QgITE3IGZyb20g5YiY6L+c6bmPL29wZW5reWxpbi9uaWxl?= - ---- - uniauth-backend/src/serviceinterface.cpp | 21 ++++++++++++++------- - 1 file changed, 14 insertions(+), 7 deletions(-) - -diff --git a/uniauth-backend/src/serviceinterface.cpp b/uniauth-backend/src/serviceinterface.cpp -index 6969efb..1399dae 100644 ---- a/uniauth-backend/src/serviceinterface.cpp -+++ b/uniauth-backend/src/serviceinterface.cpp -@@ -41,7 +41,7 @@ - #include <openssl/pem.h> - - #define UKUI_GREETER "/usr/sbin/ukui-greeter" --#define UKUI_SCREENSAVER "/usr/bin/ukui-screensaver-dialog" -+#define UKUI_SCREENSAVER "/usr/bin/ukui-screensaver-backend" - - #define GREETER_DBUS_PATH "/" - #define GREETER_DBUS_INTERFACE "org.ukui.greeter" -@@ -916,13 +916,13 @@ bool ServiceInterface::sendPassword(QString username,QByteArray password) - rsac.decrypt(password, decryptText, priKey); // 解密 - //如果处于登录状态 - -- qDebug()<<"sendPassword"<<loginAppList.count(); -+ qDebug()<<"sendPassword"<<loginAppList.count()<<loginAppList; - if(loginAppList.contains("lightdm")){ - qDebug()<<"login:"; - isFirstLogin = false; -- QString publicKey = getLoginPubKey(loginAppList.value("lightdm"),GREETER_DBUS_PATH,GREETER_DBUS_INTERFACE); -+ QString publicKey = getLoginPubKey(loginAppList.value("lightdm"),SCREENSAVER_DBUS_PATH,SCREENSAVER_DBUS_INTERFACE); - rsac.encrypt(decryptText, encryptText, publicKey.toLatin1()); -- return sendLoginPassword(loginAppList.value("lightdm"),GREETER_DBUS_PATH,GREETER_DBUS_INTERFACE,username,encryptText); -+ return sendLoginPassword(loginAppList.value("lightdm"),SCREENSAVER_DBUS_PATH,SCREENSAVER_DBUS_INTERFACE,username,encryptText); - } - - //处于锁屏状态 -@@ -934,6 +934,14 @@ bool ServiceInterface::sendPassword(QString username,QByteArray password) - return sendLoginPassword(loginAppList.value(username),SCREENSAVER_DBUS_PATH,SCREENSAVER_DBUS_INTERFACE,username,encryptText); - } - -+ if(loginAppList.count()>0){ -+ qDebug()<<"login by screensaver:"; -+ isFirstLogin = false; -+ QString publicKey = getLoginPubKey(loginAppList.value(loginAppList.firstKey()),SCREENSAVER_DBUS_PATH,SCREENSAVER_DBUS_INTERFACE); -+ rsac.encrypt(decryptText, encryptText, publicKey.toLatin1()); -+ return sendLoginPassword(loginAppList.value(loginAppList.firstKey()),SCREENSAVER_DBUS_PATH,SCREENSAVER_DBUS_INTERFACE,username,encryptText); -+ } -+ - //如果是第一次调用,则配置自动登录 - if(isFirstLogin){ - qDebug()<<"isFirstLogin:"; -@@ -965,13 +973,13 @@ bool ServiceInterface::handleFirstSingleLogn(QString username,QByteArray decrypt - qDebug()<<loginAppList.count(); - if(loginAppList.contains("lightdm")){ - isFirstLogin = false; -- QString publicKey = getLoginPubKey(loginAppList.value("lightdm"),GREETER_DBUS_PATH,GREETER_DBUS_INTERFACE); -+ QString publicKey = getLoginPubKey(loginAppList.value("lightdm"),SCREENSAVER_DBUS_PATH,SCREENSAVER_DBUS_INTERFACE); - if(publicKey.isEmpty()){ - qDebug()<<"get Login PubKey failed!"; - return false; - } - rsac.encrypt(decryptText, encryptText, publicKey.toLatin1()); -- return sendLoginPassword(loginAppList.value("lightdm"),GREETER_DBUS_PATH,GREETER_DBUS_INTERFACE,username,encryptText); -+ return sendLoginPassword(loginAppList.value("lightdm"),SCREENSAVER_DBUS_PATH,SCREENSAVER_DBUS_INTERFACE,username,encryptText); - } - return ret; - } -@@ -1018,7 +1026,6 @@ bool ServiceInterface::sendLoginPassword(QString service,QString path,QString i - path, - interface, - QDBusConnection::systemBus()); -- - QDBusReply<bool> stateReply = iface.call("sendPassword",username,array); - if(!stateReply.isValid()){ - disconnect(connection); diff -Nru ukui-biometric-auth-4.10.0.0/debian/patches/0008-21.patch ukui-biometric-auth-4.20.0.0/debian/patches/0008-21.patch --- ukui-biometric-auth-4.10.0.0/debian/patches/0008-21.patch 2024-04-23 10:31:46.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/debian/patches/0008-21.patch 1970-01-01 08:00:00.000000000 +0800 @@ -1,107 +0,0 @@ -From: =?utf-8?b?5p2o5pWP?= <yangmin@kylinos.cn> -Date: Tue, 23 Apr 2024 02:23:54 +0000 -Subject: =?utf-8?b?ITIxIOmcgOimgeaPkOadg+ahhui/m+ihjOaOiOadg+aXtu+8iOWmgg==?= - =?utf-8?b?5re75Yqg5paw55So5oi344CB55Sf54mp54m55b6B566h55CG5bel5YW35Lit5b2V?= - =?utf-8?b?5YWl5oyH57q55o+Q5p2D77yJ77yM5o6I5p2D5qGG5Ye6546w5Zyo5bem5LiK6KeS?= - =?utf-8?b?5LiN5bGF5LitIE1lcmdlIHB1bGwgcmVxdWVzdCAhMjEgZnJvbSBsaXVkdW5mYS9v?= - =?utf-8?b?cGVua3lsaW4vbmlsZQ==?= - ---- - polkit-agent/CMakeLists.txt | 7 +++++++ - polkit-agent/src/PolkitListener.cpp | 31 +++++++++++++++++++++++++++---- - 2 files changed, 34 insertions(+), 4 deletions(-) - -diff --git a/polkit-agent/CMakeLists.txt b/polkit-agent/CMakeLists.txt -index fa7768e..cb8e3e9 100644 ---- a/polkit-agent/CMakeLists.txt -+++ b/polkit-agent/CMakeLists.txt -@@ -3,9 +3,12 @@ project(ukui-polkit-agent) - - pkg_check_modules(QGS REQUIRED gsettings-qt) - pkg_check_modules(KDKINFO REQUIRED kysdk-sysinfo) -+pkg_check_modules(KYSDKWAYLANDHELPER_PKG REQUIRED kysdk-waylandhelper) - - find_package(PolkitQt5-1 REQUIRED 0.103.0) - find_package(Qt5 COMPONENTS Core Widgets DBus X11Extras Xml Network Svg) -+find_package(KF5WindowSystem) -+find_package(X11 REQUIRED) - set(CMAKE_AUTOMOC ON) - set(CMAKE_AUTOUIC ON) - set(CMAKE_AUTORCC ON) -@@ -58,10 +61,14 @@ set(polkit_SRCS - ) - - add_executable(polkit-ukui-authentication-agent-1 ${polkit_SRCS}) -+target_include_directories(polkit-ukui-authentication-agent-1 PRIVATE ${KYSDKWAYLANDHELPER_PKG_INCLUDE_DIRS}) -+target_link_directories(polkit-ukui-authentication-agent-1 PRIVATE ${KYSDKWAYLANDHELPER_PKG_LIBRARY_DIRS}) - target_link_libraries(polkit-ukui-authentication-agent-1 - Qt5::Core Qt5::Widgets Qt5::DBus ${EXTRA_LIBS} - ${POLKITQT-1_LIBRARIES} -+ ${KYSDKWAYLANDHELPER_PKG_LIBRARIES} - BioAuthWidgets -+ KF5::WindowSystem - -lrt - -lukui-log4qt - ) -diff --git a/polkit-agent/src/PolkitListener.cpp b/polkit-agent/src/PolkitListener.cpp -index f15c9c9..749e551 100644 ---- a/polkit-agent/src/PolkitListener.cpp -+++ b/polkit-agent/src/PolkitListener.cpp -@@ -31,11 +31,13 @@ - #include <QApplication> - #include <QScreen> - #include <fcntl.h> -+#include <kysdk/kysdk-system/libkysysinfo.h> - - #include "PolkitListener.h" - #include "mainwindow.h" - #include "generic.h" - #include <libkysysinfo.h> -+#include "windowmanager/windowmanager.h" - - PolkitListener::PolkitListener(QObject *parent) - : Listener(parent), -@@ -171,9 +173,12 @@ void PolkitListener::initiateAuthentication( - if (desScreenGeometry.isEmpty()) { - desScreenGeometry = qApp->primaryScreen()->geometry(); - } -- mainWindow->move(desScreenGeometry.x() + (desScreenGeometry.width() - mainWindow->width())/2, -- desScreenGeometry.y() + (desScreenGeometry.height() - mainWindow->height())/2); -- qDebug()<<"MoveWindow to center1:"<<desScreenGeometry<<","<<mainWindow->geometry()<<QGuiApplication::platformName();; -+// mainWindow->move(desScreenGeometry.x() + (desScreenGeometry.width() - mainWindow->width())/2, -+// desScreenGeometry.y() + (desScreenGeometry.height() - mainWindow->height())/2); -+// qDebug()<<"MoveWindow to center1:"<<desScreenGeometry<<","<<mainWindow->geometry()<<QGuiApplication::platformName();; -+ -+ -+ - connect(mainWindow, &MainWindow::accept, this, &PolkitListener::onResponse); - connect(mainWindow, &MainWindow::canceled, this, [&]{ - wasCancelled = true; -@@ -360,8 +365,26 @@ void PolkitListener::onShowPrompt(const QString &prompt, bool echo) - mainWindow->switchAuthMode(MainWindow::PASSWORD); - mainWindow->setPrompt(prompt, echo); - } -- - mainWindow->setFixedSize(mainWindow->width(),mainWindow->height()); -+ -+ /* set the position of the mainwindow */ -+ QPoint pos = QCursor::pos(); -+ QRect desScreenGeometry; -+ for (QScreen *screen : qApp->screens()) { -+ if (screen->geometry().contains(pos)) { -+ desScreenGeometry = screen->geometry(); -+ } -+ } -+ -+ if (desScreenGeometry.isEmpty()) { -+ desScreenGeometry = qApp->primaryScreen()->geometry(); -+ } -+ -+ kdk::WindowManager::setGeometry(mainWindow->windowHandle(), -+ QRect(desScreenGeometry.left() + (desScreenGeometry.width() - mainWindow->width())/2, -+ desScreenGeometry.top() + (desScreenGeometry.height() - mainWindow->height())/2, -+ mainWindow->width(), mainWindow->height())); -+ - mainWindow->show(); - // 重新开始认证不调整窗口位置 - // QPoint pos = QCursor::pos(); diff -Nru ukui-biometric-auth-4.10.0.0/debian/patches/0009-Added-translation-using-Weblate-Uyghur.patch ukui-biometric-auth-4.20.0.0/debian/patches/0009-Added-translation-using-Weblate-Uyghur.patch --- ukui-biometric-auth-4.10.0.0/debian/patches/0009-Added-translation-using-Weblate-Uyghur.patch 2024-04-23 10:31:46.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/debian/patches/0009-Added-translation-using-Weblate-Uyghur.patch 1970-01-01 08:00:00.000000000 +0800 @@ -1,583 +0,0 @@ -From: KevinDuan <duankaiwen@kylinos.com> -Date: Wed, 8 May 2024 10:08:51 +0800 -Subject: Added translation using Weblate (Uyghur) - ---- - bioauth/i18n_ts/kk.ts | 184 ++++++++++++++++++++++++++++++++++++++++++++++++++ - bioauth/i18n_ts/ky.ts | 184 ++++++++++++++++++++++++++++++++++++++++++++++++++ - bioauth/i18n_ts/ug.ts | 184 ++++++++++++++++++++++++++++++++++++++++++++++++++ - 3 files changed, 552 insertions(+) - create mode 100644 bioauth/i18n_ts/kk.ts - create mode 100644 bioauth/i18n_ts/ky.ts - create mode 100644 bioauth/i18n_ts/ug.ts - -diff --git a/bioauth/i18n_ts/kk.ts b/bioauth/i18n_ts/kk.ts -new file mode 100644 -index 0000000..458186e ---- /dev/null -+++ b/bioauth/i18n_ts/kk.ts -@@ -0,0 +1,184 @@ -+<?xml version="1.0" encoding="utf-8"?> -+<!DOCTYPE TS> -+<TS version="2.1" language="kk"> -+<context> -+ <name>BioAuthWidget</name> -+ <message> -+ <location filename="../src/bioauthwidget.ui" line="14"/> -+ <source>Form</source> -+ <translation></translation> -+ </message> -+ <message> -+ <source>More</source> -+ <translation type="vanished">更多</translation> -+ </message> -+ <message> -+ <location filename="../src/bioauthwidget.ui" line="146"/> -+ <location filename="../src/bioauthwidget.cpp" line="41"/> -+ <source>Retry</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <source>Too many unsuccessful attempts,please enter password.</source> -+ <translation type="vanished">验证失败达最大次数,请使用密码解锁</translation> -+ </message> -+ <message> -+ <source>Bioauth authentication failed, you still have %1 verification opportunities</source> -+ <translation type="vanished">生物认证失败,您还有%1次尝试机会</translation> -+ </message> -+ <message> -+ <source>Password</source> -+ <translation type="vanished">密码</translation> -+ </message> -+ <message> -+ <source>Current Device: </source> -+ <translation type="vanished">当前设备:</translation> -+ </message> -+ <message> -+ <location filename="../src/bioauthwidget.cpp" line="96"/> -+ <location filename="../src/bioauthwidget.cpp" line="212"/> -+ <source>%1 too many unsuccessful attempts,please enter password.</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/bioauthwidget.cpp" line="102"/> -+ <source>%1 authentication failure,there are still %2 remaining opportunities</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/bioauthwidget.cpp" line="226"/> -+ <source>Please use wechat to scan the code</source> -+ <translation type="unfinished"></translation> -+ </message> -+</context> -+<context> -+ <name>BioDevices</name> -+ <message> -+ <location filename="../src/biodevices.cpp" line="78"/> -+ <source>Unplugging of %1 device detected</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="88"/> -+ <source>%1 device insertion detected</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="97"/> -+ <source>Biometric Manager</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="100"/> -+ <source>biometric</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="700"/> -+ <source>FingerPrint</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="702"/> -+ <source>FingerVein</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="704"/> -+ <source>Iris</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="706"/> -+ <source>Face</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="708"/> -+ <source>VoicePrint</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="710"/> -+ <source>Ukey</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="712"/> -+ <source>QRCode</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <source>Wechat</source> -+ <translation type="vanished">微信</translation> -+ </message> -+</context> -+<context> -+ <name>BioDevicesWidget</name> -+ <message> -+ <location filename="../src/biodeviceswidget.ui" line="14"/> -+ <source>Form</source> -+ <translation></translation> -+ </message> -+ <message> -+ <source>Device types:</source> -+ <translation type="vanished">设备类型:</translation> -+ </message> -+ <message> -+ <source>Back</source> -+ <translation type="vanished">返回</translation> -+ </message> -+ <message> -+ <source>OK</source> -+ <translation type="vanished">确定</translation> -+ </message> -+ <message> -+ <source>FingerPrint</source> -+ <translation type="vanished">指纹</translation> -+ </message> -+</context> -+<context> -+ <name>LoginOptionsWidget</name> -+ <message> -+ <location filename="../src/loginoptionswidget.cpp" line="79"/> -+ <source>Login Options</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/loginoptionswidget.cpp" line="320"/> -+ <source>Password</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <source>Wechat</source> -+ <translation type="vanished">微信</translation> -+ </message> -+ <message> -+ <source>Biometric</source> -+ <translation type="vanished">生物识别</translation> -+ </message> -+</context> -+<context> -+ <name>QObject</name> -+ <message> -+ <source>FingerPrint</source> -+ <translation type="vanished">指纹</translation> -+ </message> -+ <message> -+ <source>FingerVein</source> -+ <translation type="vanished">指静脉</translation> -+ </message> -+ <message> -+ <source>Iris</source> -+ <translation type="vanished">虹膜</translation> -+ </message> -+ <message> -+ <source>Face</source> -+ <translation type="vanished">人脸</translation> -+ </message> -+ <message> -+ <source>VoicePrint</source> -+ <translation type="vanished">声纹</translation> -+ </message> -+</context> -+</TS> -diff --git a/bioauth/i18n_ts/ky.ts b/bioauth/i18n_ts/ky.ts -new file mode 100644 -index 0000000..8cda500 ---- /dev/null -+++ b/bioauth/i18n_ts/ky.ts -@@ -0,0 +1,184 @@ -+<?xml version="1.0" encoding="utf-8"?> -+<!DOCTYPE TS> -+<TS version="2.1" language="ky"> -+<context> -+ <name>BioAuthWidget</name> -+ <message> -+ <location filename="../src/bioauthwidget.ui" line="14"/> -+ <source>Form</source> -+ <translation></translation> -+ </message> -+ <message> -+ <source>More</source> -+ <translation type="vanished">更多</translation> -+ </message> -+ <message> -+ <location filename="../src/bioauthwidget.ui" line="146"/> -+ <location filename="../src/bioauthwidget.cpp" line="41"/> -+ <source>Retry</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <source>Too many unsuccessful attempts,please enter password.</source> -+ <translation type="vanished">验证失败达最大次数,请使用密码解锁</translation> -+ </message> -+ <message> -+ <source>Bioauth authentication failed, you still have %1 verification opportunities</source> -+ <translation type="vanished">生物认证失败,您还有%1次尝试机会</translation> -+ </message> -+ <message> -+ <source>Password</source> -+ <translation type="vanished">密码</translation> -+ </message> -+ <message> -+ <source>Current Device: </source> -+ <translation type="vanished">当前设备:</translation> -+ </message> -+ <message> -+ <location filename="../src/bioauthwidget.cpp" line="96"/> -+ <location filename="../src/bioauthwidget.cpp" line="212"/> -+ <source>%1 too many unsuccessful attempts,please enter password.</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/bioauthwidget.cpp" line="102"/> -+ <source>%1 authentication failure,there are still %2 remaining opportunities</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/bioauthwidget.cpp" line="226"/> -+ <source>Please use wechat to scan the code</source> -+ <translation type="unfinished"></translation> -+ </message> -+</context> -+<context> -+ <name>BioDevices</name> -+ <message> -+ <location filename="../src/biodevices.cpp" line="78"/> -+ <source>Unplugging of %1 device detected</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="88"/> -+ <source>%1 device insertion detected</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="97"/> -+ <source>Biometric Manager</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="100"/> -+ <source>biometric</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="700"/> -+ <source>FingerPrint</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="702"/> -+ <source>FingerVein</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="704"/> -+ <source>Iris</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="706"/> -+ <source>Face</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="708"/> -+ <source>VoicePrint</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="710"/> -+ <source>Ukey</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="712"/> -+ <source>QRCode</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <source>Wechat</source> -+ <translation type="vanished">微信</translation> -+ </message> -+</context> -+<context> -+ <name>BioDevicesWidget</name> -+ <message> -+ <location filename="../src/biodeviceswidget.ui" line="14"/> -+ <source>Form</source> -+ <translation></translation> -+ </message> -+ <message> -+ <source>Device types:</source> -+ <translation type="vanished">设备类型:</translation> -+ </message> -+ <message> -+ <source>Back</source> -+ <translation type="vanished">返回</translation> -+ </message> -+ <message> -+ <source>OK</source> -+ <translation type="vanished">确定</translation> -+ </message> -+ <message> -+ <source>FingerPrint</source> -+ <translation type="vanished">指纹</translation> -+ </message> -+</context> -+<context> -+ <name>LoginOptionsWidget</name> -+ <message> -+ <location filename="../src/loginoptionswidget.cpp" line="79"/> -+ <source>Login Options</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/loginoptionswidget.cpp" line="320"/> -+ <source>Password</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <source>Wechat</source> -+ <translation type="vanished">微信</translation> -+ </message> -+ <message> -+ <source>Biometric</source> -+ <translation type="vanished">生物识别</translation> -+ </message> -+</context> -+<context> -+ <name>QObject</name> -+ <message> -+ <source>FingerPrint</source> -+ <translation type="vanished">指纹</translation> -+ </message> -+ <message> -+ <source>FingerVein</source> -+ <translation type="vanished">指静脉</translation> -+ </message> -+ <message> -+ <source>Iris</source> -+ <translation type="vanished">虹膜</translation> -+ </message> -+ <message> -+ <source>Face</source> -+ <translation type="vanished">人脸</translation> -+ </message> -+ <message> -+ <source>VoicePrint</source> -+ <translation type="vanished">声纹</translation> -+ </message> -+</context> -+</TS> -diff --git a/bioauth/i18n_ts/ug.ts b/bioauth/i18n_ts/ug.ts -new file mode 100644 -index 0000000..8a4c988 ---- /dev/null -+++ b/bioauth/i18n_ts/ug.ts -@@ -0,0 +1,184 @@ -+<?xml version="1.0" encoding="utf-8"?> -+<!DOCTYPE TS> -+<TS version="2.1" language="ug"> -+<context> -+ <name>BioAuthWidget</name> -+ <message> -+ <location filename="../src/bioauthwidget.ui" line="14"/> -+ <source>Form</source> -+ <translation></translation> -+ </message> -+ <message> -+ <source>More</source> -+ <translation type="vanished">更多</translation> -+ </message> -+ <message> -+ <location filename="../src/bioauthwidget.ui" line="146"/> -+ <location filename="../src/bioauthwidget.cpp" line="41"/> -+ <source>Retry</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <source>Too many unsuccessful attempts,please enter password.</source> -+ <translation type="vanished">验证失败达最大次数,请使用密码解锁</translation> -+ </message> -+ <message> -+ <source>Bioauth authentication failed, you still have %1 verification opportunities</source> -+ <translation type="vanished">生物认证失败,您还有%1次尝试机会</translation> -+ </message> -+ <message> -+ <source>Password</source> -+ <translation type="vanished">密码</translation> -+ </message> -+ <message> -+ <source>Current Device: </source> -+ <translation type="vanished">当前设备:</translation> -+ </message> -+ <message> -+ <location filename="../src/bioauthwidget.cpp" line="96"/> -+ <location filename="../src/bioauthwidget.cpp" line="212"/> -+ <source>%1 too many unsuccessful attempts,please enter password.</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/bioauthwidget.cpp" line="102"/> -+ <source>%1 authentication failure,there are still %2 remaining opportunities</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/bioauthwidget.cpp" line="226"/> -+ <source>Please use wechat to scan the code</source> -+ <translation type="unfinished"></translation> -+ </message> -+</context> -+<context> -+ <name>BioDevices</name> -+ <message> -+ <location filename="../src/biodevices.cpp" line="78"/> -+ <source>Unplugging of %1 device detected</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="88"/> -+ <source>%1 device insertion detected</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="97"/> -+ <source>Biometric Manager</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="100"/> -+ <source>biometric</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="700"/> -+ <source>FingerPrint</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="702"/> -+ <source>FingerVein</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="704"/> -+ <source>Iris</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="706"/> -+ <source>Face</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="708"/> -+ <source>VoicePrint</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="710"/> -+ <source>Ukey</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/biodevices.cpp" line="712"/> -+ <source>QRCode</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <source>Wechat</source> -+ <translation type="vanished">微信</translation> -+ </message> -+</context> -+<context> -+ <name>BioDevicesWidget</name> -+ <message> -+ <location filename="../src/biodeviceswidget.ui" line="14"/> -+ <source>Form</source> -+ <translation></translation> -+ </message> -+ <message> -+ <source>Device types:</source> -+ <translation type="vanished">设备类型:</translation> -+ </message> -+ <message> -+ <source>Back</source> -+ <translation type="vanished">返回</translation> -+ </message> -+ <message> -+ <source>OK</source> -+ <translation type="vanished">确定</translation> -+ </message> -+ <message> -+ <source>FingerPrint</source> -+ <translation type="vanished">指纹</translation> -+ </message> -+</context> -+<context> -+ <name>LoginOptionsWidget</name> -+ <message> -+ <location filename="../src/loginoptionswidget.cpp" line="79"/> -+ <source>Login Options</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/loginoptionswidget.cpp" line="320"/> -+ <source>Password</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <source>Wechat</source> -+ <translation type="vanished">微信</translation> -+ </message> -+ <message> -+ <source>Biometric</source> -+ <translation type="vanished">生物识别</translation> -+ </message> -+</context> -+<context> -+ <name>QObject</name> -+ <message> -+ <source>FingerPrint</source> -+ <translation type="vanished">指纹</translation> -+ </message> -+ <message> -+ <source>FingerVein</source> -+ <translation type="vanished">指静脉</translation> -+ </message> -+ <message> -+ <source>Iris</source> -+ <translation type="vanished">虹膜</translation> -+ </message> -+ <message> -+ <source>Face</source> -+ <translation type="vanished">人脸</translation> -+ </message> -+ <message> -+ <source>VoicePrint</source> -+ <translation type="vanished">声纹</translation> -+ </message> -+</context> -+</TS> diff -Nru ukui-biometric-auth-4.10.0.0/debian/patches/0010-Deleted-translation-using-Weblate-Kazakh.patch ukui-biometric-auth-4.20.0.0/debian/patches/0010-Deleted-translation-using-Weblate-Kazakh.patch --- ukui-biometric-auth-4.10.0.0/debian/patches/0010-Deleted-translation-using-Weblate-Kazakh.patch 2024-04-23 10:31:46.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/debian/patches/0010-Deleted-translation-using-Weblate-Kazakh.patch 1970-01-01 08:00:00.000000000 +0800 @@ -1,456 +0,0 @@ -From: KevinDuan <duankaiwen@kylinos.com> -Date: Wed, 8 May 2024 10:18:12 +0800 -Subject: Deleted translation using Weblate (Kazakh) - ---- - polkit-agent/i18n_ts/kk.ts | 441 --------------------------------------------- - 1 file changed, 441 deletions(-) - delete mode 100644 polkit-agent/i18n_ts/kk.ts - -diff --git a/polkit-agent/i18n_ts/kk.ts b/polkit-agent/i18n_ts/kk.ts -deleted file mode 100644 -index f3a13b3..0000000 ---- a/polkit-agent/i18n_ts/kk.ts -+++ /dev/null -@@ -1,441 +0,0 @@ --<?xml version="1.0" encoding="utf-8"?> --<!DOCTYPE TS> --<TS version="2.1" language="kk"> --<context> -- <name>BioAuthWidget</name> -- <message> -- <source>Retry</source> -- <translation type="obsolete">重试</translation> -- </message> -- <message> -- <source>%1 too many unsuccessful attempts,please enter password.</source> -- <translation type="obsolete">%1验证失败达最大次数,请使用密码登录</translation> -- </message> -- <message> -- <source>%1 authentication failure,there are still %2 remaining opportunities</source> -- <translation type="obsolete">%1认证失败,还剩%2次尝试机会</translation> -- </message> -- <message> -- <source>Please use wechat to scan the code</source> -- <translation type="vanished">请使用微信扫码</translation> -- </message> --</context> --<context> -- <name>BioDevices</name> -- <message> -- <source>FingerPrint</source> -- <translation type="obsolete">指纹</translation> -- </message> -- <message> -- <source>FingerVein</source> -- <translation type="obsolete">指静脉</translation> -- </message> -- <message> -- <source>Iris</source> -- <translation type="obsolete">虹膜</translation> -- </message> -- <message> -- <source>Face</source> -- <translation type="obsolete">人脸</translation> -- </message> -- <message> -- <source>VoicePrint</source> -- <translation type="obsolete">声纹</translation> -- </message> -- <message> -- <source>Wechat</source> -- <translation type="vanished">微信</translation> -- </message> -- <message> -- <source>QRCode</source> -- <translation type="vanished">二维码</translation> -- </message> --</context> --<context> -- <name>LoginOptionsWidget</name> -- <message> -- <source>Login Options</source> -- <translation type="vanished">登录选项</translation> -- </message> -- <message> -- <source>Wechat</source> -- <translation type="vanished">微信</translation> -- </message> --</context> --<context> -- <name>MainWindow</name> -- <message> -- <location filename="../src/mainwindow.cpp" line="66"/> -- <source>Authentication</source> -- <translation>Аутентификация</translation> -- </message> -- <message> -- <source>Fingerprint authentication failed, you still have %1 verification opportunities</source> -- <translation type="vanished">指纹验证失败,您还有%1次尝试机会</translation> -- </message> -- <message> -- <location filename="../src/mainwindow.ui" line="26"/> -- <source>Form</source> -- <translation></translation> -- </message> -- <message> -- <source>More</source> -- <translation type="obsolete">更多</translation> -- </message> -- <message> -- <source>Restart</source> -- <translation type="obsolete">重新开始</translation> -- </message> -- <message> -- <source>Password</source> -- <translation type="vanished">密码</translation> -- </message> -- <message> -- <location filename="../src/mainwindow.ui" line="409"/> -- <location filename="../src/mainwindow.cpp" line="1075"/> -- <location filename="../src/mainwindow.cpp" line="1143"/> -- <source>Biometric</source> -- <translation>Биометриялық</translation> -- </message> -- <message> -- <location filename="../src/mainwindow.ui" line="480"/> -- <source>use password</source> -- <translation>құпия сөзді пайдалану</translation> -- </message> -- <message> -- <source>DeviceType:</source> -- <translation type="obsolete">设备类型:</translation> -- </message> -- <message> -- <source>Back</source> -- <translation type="obsolete">返回</translation> -- </message> -- <message> -- <source>Details</source> -- <translation type="vanished">详细</translation> -- </message> -- <message> -- <source>Action Id:</source> -- <translation type="obsolete">动作:</translation> -- </message> -- <message> -- <source>Description:</source> -- <translation type="vanished">描述:</translation> -- </message> -- <message> -- <source>Polkit.subject-pid:</source> -- <translation type="vanished">Polkit.subject-pid:</translation> -- </message> -- <message> -- <source>Retry</source> -- <translation type="obsolete">重试</translation> -- </message> -- <message> -- <source>Device types:</source> -- <translation type="obsolete">设备类型:</translation> -- </message> -- <message> -- <source>Vendor:</source> -- <translation type="vanished">发行商:</translation> -- </message> -- <message> -- <source>Action:</source> -- <translation type="vanished">动作:</translation> -- </message> -- <message> -- <source>Polkit.caller-pid:</source> -- <translation type="vanished">Polkit.caller-pid:</translation> -- </message> -- <message> -- <location filename="../src/mainwindow.ui" line="441"/> -- <location filename="../src/mainwindow.cpp" line="1077"/> -- <source>Cancel</source> -- <translation>Болдырмау</translation> -- </message> -- <message> -- <location filename="../src/mainwindow.ui" line="460"/> -- <location filename="../src/mainwindow.cpp" line="1073"/> -- <source>Authenticate</source> -- <translation>Аутентификация</translation> -- </message> -- <message> -- <location filename="../src/mainwindow.cpp" line="1079"/> -- <location filename="../src/mainwindow.cpp" line="1183"/> -- <source>Use password</source> -- <translation>Құпиясөзді пайдалану</translation> -- </message> -- <message> -- <source>Auth</source> -- <translation type="obsolete">授权</translation> -- </message> -- <message> -- <source>Too many unsuccessful attempts,please enter password.</source> -- <translation type="vanished">指纹验证失败达最大次数,请使用密码解锁</translation> -- </message> -- <message> -- <source>%1 authentication failure,there are still %2 remaining opportunities</source> -- <translation type="vanished">%1认证失败,还剩%2次尝试机会</translation> -- </message> -- <message> -- <source>%1 too many unsuccessful attempts,please enter password.</source> -- <translation type="vanished">%1验证失败达最大次数,请使用密码登录</translation> -- </message> -- <message> -- <source>in authentication, please wait...</source> -- <translation type="vanished">认证中,请稍等...</translation> -- </message> -- <message> -- <location filename="../src/mainwindow.cpp" line="1219"/> -- <location filename="../src/mainwindow.cpp" line="1292"/> -- <location filename="../src/mainwindow.cpp" line="1293"/> -- <source>Please try again in %1 minutes.</source> -- <translation>% 1 минутта қайталап көріңіз.</translation> -- </message> -- <message> -- <location filename="../src/mainwindow.cpp" line="1230"/> -- <location filename="../src/mainwindow.cpp" line="1302"/> -- <location filename="../src/mainwindow.cpp" line="1303"/> -- <source>Please try again in %1 seconds.</source> -- <translation>% 1 секундта қайталап көріңіз.</translation> -- </message> -- <message> -- <location filename="../src/mainwindow.cpp" line="1240"/> -- <location filename="../src/mainwindow.cpp" line="1241"/> -- <location filename="../src/mainwindow.cpp" line="1311"/> -- <location filename="../src/mainwindow.cpp" line="1312"/> -- <source>Account locked permanently.</source> -- <translation>Тіркелгі біржолата құлыпталады.</translation> -- </message> -- <message> -- <location filename="../src/mainwindow.cpp" line="834"/> -- <location filename="../src/mainwindow.cpp" line="835"/> -- <source>Password cannot be empty</source> -- <translation>Құпия сөз бос болмады</translation> -- </message> -- <message> -- <source>Failed to verify %1, please enter password.</source> -- <translation type="vanished">验证%1失败,请输入密码.</translation> -- </message> -- <message> -- <source>Unable to verify %1, please enter password.</source> -- <translation type="vanished">无法验证%1,请输入密码.</translation> -- </message> -- <message> -- <location filename="../src/mainwindow.cpp" line="242"/> -- <location filename="../src/mainwindow.cpp" line="246"/> -- <source>Failed to verify %1, you still have %2 verification opportunities</source> -- <translation>% 1 дегенді тексеру мүмкін болмады, сізде әлі де% 2 тексеру мүмкіндіктері бар</translation> -- </message> -- <message> -- <source>An application is attempting to perform an action that requires privileges. Authentication is required to perform this action.</source> -- <translation type="vanished">一个程序正试图执行一个需要特权的动作。要求授权以执行该动作。</translation> -- </message> -- <message> -- <location filename="../src/mainwindow.cpp" line="731"/> -- <source>Password: </source> -- <translation>Құпия сөз: </translation> -- </message> -- <message> -- <location filename="../src/mainwindow.cpp" line="335"/> -- <source>Please enter your password or enroll your fingerprint </source> -- <translation>Құпия сөзді енгізіңіз немесе саусақ ізін жазыңыз </translation> -- </message> -- <message> -- <location filename="../src/mainwindow.cpp" line="259"/> -- <source>Abnormal network</source> -- <translation>Аномальды желі</translation> -- </message> -- <message> -- <location filename="../src/mainwindow.cpp" line="665"/> -- <source>This operation requires the administrator's authorization. Please enter your password to allow this operation.</source> -- <translation>Бұл операция әкімшінің рұқсатын талап етеді. Осы операцияға рұқсат ету үшін құпия сөзіңізді енгізіңіз.</translation> -- </message> -- <message> -- <location filename="../src/mainwindow.cpp" line="733"/> -- <source>_Password: </source> -- <translation>_Password: </translation> -- </message> -- <message> -- <location filename="../src/mainwindow.cpp" line="735"/> -- <source>_Password:</source> -- <translation>_Password:</translation> -- </message> -- <message> -- <location filename="../src/mainwindow.cpp" line="850"/> -- <source>Authentication failed, please try again.</source> -- <translation>Аутентификация сәтсіз аяқталды, қайталап көріңіз.</translation> -- </message> -- <message> -- <location filename="../src/mainwindow.cpp" line="779"/> -- <source>days left</source> -- <translation>қалған күндер</translation> -- </message> -- <message> -- <source>Biometric/code scan authentication failed too many times, please enter the password.</source> -- <translation type="vanished">生物/扫码验证失败达最大次数,请使用密码解锁.</translation> -- </message> -- <message> -- <source>Bioauth/code scan authentication failed, you still have %1 verification opportunities</source> -- <translation type="vanished">生物/扫码验证失败,您还有%1次尝试机会</translation> -- </message> -- <message> -- <location filename="../src/mainwindow.cpp" line="226"/> -- <location filename="../src/mainwindow.cpp" line="1415"/> -- <location filename="../src/mainwindow.cpp" line="1417"/> -- <source>Failed to verify %1, please enter password to unlock</source> -- <translation>% 1 дегенді тексеру мүмкін болмады, құлыптан босату үшін құпия сөзді енгізіңіз</translation> -- </message> -- <message> -- <location filename="../src/mainwindow.cpp" line="231"/> -- <location filename="../src/mainwindow.cpp" line="233"/> -- <location filename="../src/mainwindow.cpp" line="1419"/> -- <source>Unable to verify %1, please enter password to unlock</source> -- <translation>% 1 дегенді тексеру мүмкін болмады, құлыптан босату үшін құпия сөзді енгізіңіз</translation> -- </message> -- <message> -- <source>NET Exception</source> -- <translation type="vanished">网络异常</translation> -- </message> -- <message> -- <location filename="../src/mainwindow.cpp" line="671"/> -- <source>A program is attempting to perform an action that requires privileges.It requires authorization to perform the action.</source> -- <translation>Бағдарлама артықшылықтарды талап ететін әрекетті орындауға талпыныс жасайды. Іс-әрекетті орындау үшін рұқсат талап етуге болады.</translation> -- </message> -- <message> -- <location filename="../src/mainwindow.cpp" line="108"/> -- <location filename="../src/mainwindow.cpp" line="729"/> -- <source>Input Password</source> -- <translation>Құпиясөзді енгізу</translation> -- </message> -- <message> -- <location filename="../src/mainwindow.cpp" line="105"/> -- <source>Insert the ukey into the USB port</source> -- <translation type="unfinished"></translation> -- </message> -- <message> -- <location filename="../src/mainwindow.cpp" line="107"/> -- <source>Enter the ukey password</source> -- <translation type="unfinished"></translation> -- </message> -- <message> -- <location filename="../src/mainwindow.cpp" line="783"/> -- <source>hours left</source> -- <translation>сағаттар қалды</translation> -- </message> -- <message> -- <location filename="../src/mainwindow.cpp" line="787"/> -- <source>minutes left</source> -- <translation>минуттар қалды</translation> -- </message> -- <message> -- <location filename="../src/mainwindow.cpp" line="791"/> -- <source>seconds left</source> -- <translation>секундтар қалды</translation> -- </message> -- <message> -- <location filename="../src/mainwindow.cpp" line="880"/> -- <location filename="../src/mainwindow.cpp" line="888"/> -- <source>Input your password to authentication</source> -- <translation type="unfinished"></translation> -- </message> -- <message> -- <location filename="../src/mainwindow.cpp" line="1434"/> -- <source>Verify face recognition or enter password to unlock</source> -- <translation>Бет тануды тексеру немесе құлыптан босату үшін құпия сөзді енгізу</translation> -- </message> -- <message> -- <location filename="../src/mainwindow.cpp" line="1439"/> -- <source>Press fingerprint or enter password to unlock</source> -- <translation>Құлыптан босату үшін дактилоскопияны басу немесе құпия сөзді енгізу</translation> -- </message> -- <message> -- <location filename="../src/mainwindow.cpp" line="1444"/> -- <source>Verify voiceprint or enter password to unlock</source> -- <translation>Құлыптан босату үшін дауыстық ізді тексеру немесе құпия сөзді енгізу</translation> -- </message> -- <message> -- <location filename="../src/mainwindow.cpp" line="1449"/> -- <source>Verify finger vein or enter password to unlock</source> -- <translation>Құлыптан босату үшін саусақ көктамырын тексеру немесе құпия сөзді енгізу</translation> -- </message> -- <message> -- <location filename="../src/mainwindow.cpp" line="1454"/> -- <source>Verify iris or enter password to unlock</source> -- <translation>Құлыптан босату үшін IRIS тексеру немесе құпиясөзді енгізу</translation> -- </message> -- <message> -- <location filename="../src/mainwindow.cpp" line="1459"/> -- <source>Use the bound wechat scanning code or enter the password to unlock</source> -- <translation>Байланыстыратын wechat сканерлеу кодын пайдаланыңыз немесе құлыптан босату үшін құпия сөзді енгізіңіз</translation> -- </message> -- <message> -- <source>Use the bound wechat scanning code or enter the password to log in</source> -- <translation type="vanished">使用绑定的微信扫码或输入密码登录</translation> -- </message> -- <message> -- <location filename="../src/mainwindow.cpp" line="779"/> -- <location filename="../src/mainwindow.cpp" line="783"/> -- <location filename="../src/mainwindow.cpp" line="787"/> -- <location filename="../src/mainwindow.cpp" line="791"/> -- <source>Account locked,</source> -- <translation>Тіркелгі құлыпталған,</translation> -- </message> -- <message> -- <source>Authentication failed, please try again</source> -- <translation type="obsolete">认证失败,请重试</translation> -- </message> --</context> --<context> -- <name>PolkitListener</name> -- <message> -- <location filename="../src/PolkitListener.cpp" line="88"/> -- <source>Another client is already authenticating, please try again later.</source> -- <translation>Басқа клиент қазірдің өзінде аутентификацияда, кейінірек қайталап көріңіз.</translation> -- </message> -- <message> -- <location filename="../src/PolkitListener.cpp" line="265"/> -- <source>Authentication failure, please try again.</source> -- <translation>Аутентификация сәтсіздігі, қайталап көріңіз.</translation> -- </message> -- <message> -- <location filename="../src/PolkitListener.cpp" line="272"/> -- <source>Password input error!</source> -- <translation>Құпия сөзді енгізу қатесі!</translation> -- </message> -- <message> -- <source>Account locked %1 minutes due to %2 fail attempts</source> -- <translation type="vanished">账户锁定%1分钟由于%2次错误尝试</translation> -- </message> -- <message> -- <source>Authentication failure,there are still %1 remaining opportunities</source> -- <translation type="vanished">认证失败,还剩余%1次尝试机会</translation> -- </message> --</context> --<context> -- <name>QObject</name> -- <message> -- <source>FingerPrint</source> -- <translation type="obsolete">指纹</translation> -- </message> -- <message> -- <source>FingerVein</source> -- <translation type="obsolete">指静脉</translation> -- </message> -- <message> -- <source>Iris</source> -- <translation type="obsolete">虹膜</translation> -- </message> -- <message> -- <source>Face</source> -- <translation type="obsolete">人脸</translation> -- </message> -- <message> -- <source>VoicePrint</source> -- <translation type="obsolete">声纹</translation> -- </message> -- <message> -- <source>Cancel</source> -- <translation type="obsolete">取消</translation> -- </message> --</context> --</TS> diff -Nru ukui-biometric-auth-4.10.0.0/debian/patches/0011-Deleted-translation-using-Weblate-Uyghur.patch ukui-biometric-auth-4.20.0.0/debian/patches/0011-Deleted-translation-using-Weblate-Uyghur.patch --- ukui-biometric-auth-4.10.0.0/debian/patches/0011-Deleted-translation-using-Weblate-Uyghur.patch 2024-04-23 10:31:46.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/debian/patches/0011-Deleted-translation-using-Weblate-Uyghur.patch 1970-01-01 08:00:00.000000000 +0800 @@ -1,456 +0,0 @@ -From: KevinDuan <duankaiwen@kylinos.com> -Date: Wed, 8 May 2024 10:18:25 +0800 -Subject: Deleted translation using Weblate (Uyghur) - ---- - polkit-agent/i18n_ts/ug.ts | 441 --------------------------------------------- - 1 file changed, 441 deletions(-) - delete mode 100644 polkit-agent/i18n_ts/ug.ts - -diff --git a/polkit-agent/i18n_ts/ug.ts b/polkit-agent/i18n_ts/ug.ts -deleted file mode 100644 -index 3b2d973..0000000 ---- a/polkit-agent/i18n_ts/ug.ts -+++ /dev/null -@@ -1,441 +0,0 @@ --<?xml version="1.0" encoding="utf-8"?> --<!DOCTYPE TS> --<TS version="2.1" language="ug"> --<context> -- <name>BioAuthWidget</name> -- <message> -- <source>Retry</source> -- <translation type="obsolete">重试</translation> -- </message> -- <message> -- <source>%1 too many unsuccessful attempts,please enter password.</source> -- <translation type="obsolete">%1验证失败达最大次数,请使用密码登录</translation> -- </message> -- <message> -- <source>%1 authentication failure,there are still %2 remaining opportunities</source> -- <translation type="obsolete">%1认证失败,还剩%2次尝试机会</translation> -- </message> -- <message> -- <source>Please use wechat to scan the code</source> -- <translation type="vanished">请使用微信扫码</translation> -- </message> --</context> --<context> -- <name>BioDevices</name> -- <message> -- <source>FingerPrint</source> -- <translation type="obsolete">指纹</translation> -- </message> -- <message> -- <source>FingerVein</source> -- <translation type="obsolete">指静脉</translation> -- </message> -- <message> -- <source>Iris</source> -- <translation type="obsolete">虹膜</translation> -- </message> -- <message> -- <source>Face</source> -- <translation type="obsolete">人脸</translation> -- </message> -- <message> -- <source>VoicePrint</source> -- <translation type="obsolete">声纹</translation> -- </message> -- <message> -- <source>Wechat</source> -- <translation type="vanished">微信</translation> -- </message> -- <message> -- <source>QRCode</source> -- <translation type="vanished">二维码</translation> -- </message> --</context> --<context> -- <name>LoginOptionsWidget</name> -- <message> -- <source>Login Options</source> -- <translation type="vanished">登录选项</translation> -- </message> -- <message> -- <source>Wechat</source> -- <translation type="vanished">微信</translation> -- </message> --</context> --<context> -- <name>MainWindow</name> -- <message> -- <location filename="../src/mainwindow.cpp" line="66"/> -- <source>Authentication</source> -- <translation>راستىنى دەلىللەش</translation> -- </message> -- <message> -- <source>Fingerprint authentication failed, you still have %1 verification opportunities</source> -- <translation type="vanished">指纹验证失败,您还有%1次尝试机会</translation> -- </message> -- <message> -- <location filename="../src/mainwindow.ui" line="26"/> -- <source>Form</source> -- <translation></translation> -- </message> -- <message> -- <source>More</source> -- <translation type="obsolete">更多</translation> -- </message> -- <message> -- <source>Restart</source> -- <translation type="obsolete">重新开始</translation> -- </message> -- <message> -- <source>Password</source> -- <translation type="vanished">密码</translation> -- </message> -- <message> -- <location filename="../src/mainwindow.ui" line="409"/> -- <location filename="../src/mainwindow.cpp" line="1075"/> -- <location filename="../src/mainwindow.cpp" line="1143"/> -- <source>Biometric</source> -- <translation>بىئومېتىرىيە</translation> -- </message> -- <message> -- <location filename="../src/mainwindow.ui" line="480"/> -- <source>use password</source> -- <translation>مەخپىي نومۇر ئىشلىتىش</translation> -- </message> -- <message> -- <source>DeviceType:</source> -- <translation type="obsolete">设备类型:</translation> -- </message> -- <message> -- <source>Back</source> -- <translation type="obsolete">返回</translation> -- </message> -- <message> -- <source>Details</source> -- <translation type="vanished">详细</translation> -- </message> -- <message> -- <source>Action Id:</source> -- <translation type="obsolete">动作:</translation> -- </message> -- <message> -- <source>Description:</source> -- <translation type="vanished">描述:</translation> -- </message> -- <message> -- <source>Polkit.subject-pid:</source> -- <translation type="vanished">Polkit.subject-pid:</translation> -- </message> -- <message> -- <source>Retry</source> -- <translation type="obsolete">重试</translation> -- </message> -- <message> -- <source>Device types:</source> -- <translation type="obsolete">设备类型:</translation> -- </message> -- <message> -- <source>Vendor:</source> -- <translation type="vanished">发行商:</translation> -- </message> -- <message> -- <source>Action:</source> -- <translation type="vanished">动作:</translation> -- </message> -- <message> -- <source>Polkit.caller-pid:</source> -- <translation type="vanished">Polkit.caller-pid:</translation> -- </message> -- <message> -- <location filename="../src/mainwindow.ui" line="441"/> -- <location filename="../src/mainwindow.cpp" line="1077"/> -- <source>Cancel</source> -- <translation>ئەمەلدىن قالدۇرۇش</translation> -- </message> -- <message> -- <location filename="../src/mainwindow.ui" line="460"/> -- <location filename="../src/mainwindow.cpp" line="1073"/> -- <source>Authenticate</source> -- <translation>چىنلىق دەلىللەش</translation> -- </message> -- <message> -- <location filename="../src/mainwindow.cpp" line="1079"/> -- <location filename="../src/mainwindow.cpp" line="1183"/> -- <source>Use password</source> -- <translation>پارول ئىشلىتىش</translation> -- </message> -- <message> -- <source>Auth</source> -- <translation type="obsolete">授权</translation> -- </message> -- <message> -- <source>Too many unsuccessful attempts,please enter password.</source> -- <translation type="vanished">指纹验证失败达最大次数,请使用密码解锁</translation> -- </message> -- <message> -- <source>%1 authentication failure,there are still %2 remaining opportunities</source> -- <translation type="vanished">%1认证失败,还剩%2次尝试机会</translation> -- </message> -- <message> -- <source>%1 too many unsuccessful attempts,please enter password.</source> -- <translation type="vanished">%1验证失败达最大次数,请使用密码登录</translation> -- </message> -- <message> -- <source>in authentication, please wait...</source> -- <translation type="vanished">认证中,请稍等...</translation> -- </message> -- <message> -- <location filename="../src/mainwindow.cpp" line="1219"/> -- <location filename="../src/mainwindow.cpp" line="1292"/> -- <location filename="../src/mainwindow.cpp" line="1293"/> -- <source>Please try again in %1 minutes.</source> -- <translation>٪1 مىنۇت ئىچىدە قايتا سىناپ بېقىڭ.</translation> -- </message> -- <message> -- <location filename="../src/mainwindow.cpp" line="1230"/> -- <location filename="../src/mainwindow.cpp" line="1302"/> -- <location filename="../src/mainwindow.cpp" line="1303"/> -- <source>Please try again in %1 seconds.</source> -- <translation>٪1 سېكۇنت ئىچىدە قايتا سىناپ بېقىڭ.</translation> -- </message> -- <message> -- <location filename="../src/mainwindow.cpp" line="1240"/> -- <location filename="../src/mainwindow.cpp" line="1241"/> -- <location filename="../src/mainwindow.cpp" line="1311"/> -- <location filename="../src/mainwindow.cpp" line="1312"/> -- <source>Account locked permanently.</source> -- <translation>ھېسابات مەڭگۈلۈك قۇلۇپلىنىدۇ.</translation> -- </message> -- <message> -- <location filename="../src/mainwindow.cpp" line="834"/> -- <location filename="../src/mainwindow.cpp" line="835"/> -- <source>Password cannot be empty</source> -- <translation>مەخپىي نومۇرنى بوش قويۇشقا بولمايدۇ</translation> -- </message> -- <message> -- <source>Failed to verify %1, please enter password.</source> -- <translation type="vanished">验证%1失败,请输入密码.</translation> -- </message> -- <message> -- <source>Unable to verify %1, please enter password.</source> -- <translation type="vanished">无法验证%1,请输入密码.</translation> -- </message> -- <message> -- <location filename="../src/mainwindow.cpp" line="242"/> -- <location filename="../src/mainwindow.cpp" line="246"/> -- <source>Failed to verify %1, you still have %2 verification opportunities</source> -- <translation>٪1 نى دەلىللەش مەغلۇپ بولدى، سىزدە يەنىلا ٪2 دەلىللەش پۇرسىتى بار</translation> -- </message> -- <message> -- <source>An application is attempting to perform an action that requires privileges. Authentication is required to perform this action.</source> -- <translation type="vanished">一个程序正试图执行一个需要特权的动作。要求授权以执行该动作。</translation> -- </message> -- <message> -- <location filename="../src/mainwindow.cpp" line="731"/> -- <source>Password: </source> -- <translation>مەخپىي نومۇرى: </translation> -- </message> -- <message> -- <location filename="../src/mainwindow.cpp" line="335"/> -- <source>Please enter your password or enroll your fingerprint </source> -- <translation>مەخپىي نومۇرىڭىزنى كىرگۈزۈڭ ياكى بارماق ئىزىڭىزنى تىزىملىتىڭ </translation> -- </message> -- <message> -- <location filename="../src/mainwindow.cpp" line="259"/> -- <source>Abnormal network</source> -- <translation>بىنورمال تور</translation> -- </message> -- <message> -- <location filename="../src/mainwindow.cpp" line="665"/> -- <source>This operation requires the administrator's authorization. Please enter your password to allow this operation.</source> -- <translation>بۇ مەشغۇلات باشقۇرغۇچىنىڭ ھوقۇق بېرىشىنى تەلەپ قىلىدۇ. بۇ مەشغۇلاتقا رۇخسەت قىلىش ئۈچۈن پارولىڭىزنى كىرگۈزۈڭ.</translation> -- </message> -- <message> -- <location filename="../src/mainwindow.cpp" line="733"/> -- <source>_Password: </source> -- <translation>_Password: </translation> -- </message> -- <message> -- <location filename="../src/mainwindow.cpp" line="735"/> -- <source>_Password:</source> -- <translation>_Password:</translation> -- </message> -- <message> -- <location filename="../src/mainwindow.cpp" line="850"/> -- <source>Authentication failed, please try again.</source> -- <translation>دەلىللەش مەغلۇپ بولدى، قايتا سىناپ بېقىڭ.</translation> -- </message> -- <message> -- <location filename="../src/mainwindow.cpp" line="779"/> -- <source>days left</source> -- <translation>قالغان كۈنلەر</translation> -- </message> -- <message> -- <source>Biometric/code scan authentication failed too many times, please enter the password.</source> -- <translation type="vanished">生物/扫码验证失败达最大次数,请使用密码解锁.</translation> -- </message> -- <message> -- <source>Bioauth/code scan authentication failed, you still have %1 verification opportunities</source> -- <translation type="vanished">生物/扫码验证失败,您还有%1次尝试机会</translation> -- </message> -- <message> -- <location filename="../src/mainwindow.cpp" line="226"/> -- <location filename="../src/mainwindow.cpp" line="1415"/> -- <location filename="../src/mainwindow.cpp" line="1417"/> -- <source>Failed to verify %1, please enter password to unlock</source> -- <translation>٪1 نى دەلىللەش مەغلۇپ بولدى، مەخپى نۇمۇر كىرگۈزۈڭ</translation> -- </message> -- <message> -- <location filename="../src/mainwindow.cpp" line="231"/> -- <location filename="../src/mainwindow.cpp" line="233"/> -- <location filename="../src/mainwindow.cpp" line="1419"/> -- <source>Unable to verify %1, please enter password to unlock</source> -- <translation>٪1 نى دەلىللەشكە ئامالسىز، مەخپىي نومۇرنى كىرگۈزۈپ قۇلۇپنى ئاچ</translation> -- </message> -- <message> -- <source>NET Exception</source> -- <translation type="vanished">网络异常</translation> -- </message> -- <message> -- <location filename="../src/mainwindow.cpp" line="671"/> -- <source>A program is attempting to perform an action that requires privileges.It requires authorization to perform the action.</source> -- <translation>بىر پروگرامما ئىمتىياز تەلەپ قىلىدىغان ھەرىكەتنى قىلىشقا ئۇرۇنماقتا. بۇ ھەرىكەتنى ئىجرا قىلىش ئۈچۈن ھوقۇق تەلەپ قىلىدۇ.</translation> -- </message> -- <message> -- <location filename="../src/mainwindow.cpp" line="108"/> -- <location filename="../src/mainwindow.cpp" line="729"/> -- <source>Input Password</source> -- <translation>ئىم كىرگۈزۈش</translation> -- </message> -- <message> -- <location filename="../src/mainwindow.cpp" line="105"/> -- <source>Insert the ukey into the USB port</source> -- <translation type="unfinished"></translation> -- </message> -- <message> -- <location filename="../src/mainwindow.cpp" line="107"/> -- <source>Enter the ukey password</source> -- <translation type="unfinished"></translation> -- </message> -- <message> -- <location filename="../src/mainwindow.cpp" line="783"/> -- <source>hours left</source> -- <translation>قالغان سائەتلەر</translation> -- </message> -- <message> -- <location filename="../src/mainwindow.cpp" line="787"/> -- <source>minutes left</source> -- <translation>مىنۇت قالدى</translation> -- </message> -- <message> -- <location filename="../src/mainwindow.cpp" line="791"/> -- <source>seconds left</source> -- <translation>سېكۇنت قالدى</translation> -- </message> -- <message> -- <location filename="../src/mainwindow.cpp" line="880"/> -- <location filename="../src/mainwindow.cpp" line="888"/> -- <source>Input your password to authentication</source> -- <translation type="unfinished"></translation> -- </message> -- <message> -- <location filename="../src/mainwindow.cpp" line="1434"/> -- <source>Verify face recognition or enter password to unlock</source> -- <translation>چىراي تونۇشنى دەلىللەش ياكى مەخپىي نومۇر كىرگۈزۈش ئارقىلىق قۇلۇپ ئېچىش</translation> -- </message> -- <message> -- <location filename="../src/mainwindow.cpp" line="1439"/> -- <source>Press fingerprint or enter password to unlock</source> -- <translation>بارماق ئىزىنى بېسىش ياكى مەخپىي نومۇر كىرگۈزۈش ئارقىلىق قۇلۇپ ئېچىش</translation> -- </message> -- <message> -- <location filename="../src/mainwindow.cpp" line="1444"/> -- <source>Verify voiceprint or enter password to unlock</source> -- <translation>ئاۋاز ئىزىنى دەلىللەش ياكى مەخپىي نومۇر كىرگۈزۈش ئارقىلىق قۇلۇپ ئېچىش</translation> -- </message> -- <message> -- <location filename="../src/mainwindow.cpp" line="1449"/> -- <source>Verify finger vein or enter password to unlock</source> -- <translation>بارماق تومۇرىنى ئېنىقلاش ياكى مەخپىي نومۇر كىرگۈزۈش ئارقىلىق قۇلۇپ ئېچىش</translation> -- </message> -- <message> -- <location filename="../src/mainwindow.cpp" line="1454"/> -- <source>Verify iris or enter password to unlock</source> -- <translation>Iris نى ئېنىقلاش ياكى مەخپىي نومۇر كىرگۈزۈش ئارقىلىق قۇلۇپ ئېچىش</translation> -- </message> -- <message> -- <location filename="../src/mainwindow.cpp" line="1459"/> -- <source>Use the bound wechat scanning code or enter the password to unlock</source> -- <translation>باغلانغان ئۈندىدارنى سىكاننېرلاش كودى ياكى مەخپىي نومۇرىنى كىرگۈزۈپ قۇلۇپ ئېچىش</translation> -- </message> -- <message> -- <source>Use the bound wechat scanning code or enter the password to log in</source> -- <translation type="vanished">使用绑定的微信扫码或输入密码登录</translation> -- </message> -- <message> -- <location filename="../src/mainwindow.cpp" line="779"/> -- <location filename="../src/mainwindow.cpp" line="783"/> -- <location filename="../src/mainwindow.cpp" line="787"/> -- <location filename="../src/mainwindow.cpp" line="791"/> -- <source>Account locked,</source> -- <translation>ھېسابات قۇلۇپلانغان ،</translation> -- </message> -- <message> -- <source>Authentication failed, please try again</source> -- <translation type="obsolete">认证失败,请重试</translation> -- </message> --</context> --<context> -- <name>PolkitListener</name> -- <message> -- <location filename="../src/PolkitListener.cpp" line="88"/> -- <source>Another client is already authenticating, please try again later.</source> -- <translation>يەنە بىر خېرىدار ئاللىقاچان دەلىللەشكە باشلىدى، سەل تۇرۇپ قايتا سىناپ بېقىڭ.</translation> -- </message> -- <message> -- <location filename="../src/PolkitListener.cpp" line="265"/> -- <source>Authentication failure, please try again.</source> -- <translation>دەلىللەش مەغلۇپ بولدى، قايتا سىناپ بېقىڭ.</translation> -- </message> -- <message> -- <location filename="../src/PolkitListener.cpp" line="272"/> -- <source>Password input error!</source> -- <translation>پارول كىرگۈزۈش خاتالىقى!</translation> -- </message> -- <message> -- <source>Account locked %1 minutes due to %2 fail attempts</source> -- <translation type="vanished">账户锁定%1分钟由于%2次错误尝试</translation> -- </message> -- <message> -- <source>Authentication failure,there are still %1 remaining opportunities</source> -- <translation type="vanished">认证失败,还剩余%1次尝试机会</translation> -- </message> --</context> --<context> -- <name>QObject</name> -- <message> -- <source>FingerPrint</source> -- <translation type="obsolete">指纹</translation> -- </message> -- <message> -- <source>FingerVein</source> -- <translation type="obsolete">指静脉</translation> -- </message> -- <message> -- <source>Iris</source> -- <translation type="obsolete">虹膜</translation> -- </message> -- <message> -- <source>Face</source> -- <translation type="obsolete">人脸</translation> -- </message> -- <message> -- <source>VoicePrint</source> -- <translation type="obsolete">声纹</translation> -- </message> -- <message> -- <source>Cancel</source> -- <translation type="obsolete">取消</translation> -- </message> --</context> --</TS> diff -Nru ukui-biometric-auth-4.10.0.0/debian/patches/0012-Added-translation-using-Weblate-Uyghur.patch ukui-biometric-auth-4.20.0.0/debian/patches/0012-Added-translation-using-Weblate-Uyghur.patch --- ukui-biometric-auth-4.10.0.0/debian/patches/0012-Added-translation-using-Weblate-Uyghur.patch 2024-04-23 10:31:46.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/debian/patches/0012-Added-translation-using-Weblate-Uyghur.patch 1970-01-01 08:00:00.000000000 +0800 @@ -1,1173 +0,0 @@ -From: KevinDuan <duankaiwen@kylinos.com> -Date: Wed, 8 May 2024 10:18:52 +0800 -Subject: Added translation using Weblate (Uyghur) - ---- - polkit-agent/i18n_ts/kk.ts | 441 +++++++++++++++++++++++++++++++++++++++++++++ - polkit-agent/i18n_ts/ky.ts | 72 ++++---- - polkit-agent/i18n_ts/ug.ts | 441 +++++++++++++++++++++++++++++++++++++++++++++ - 3 files changed, 918 insertions(+), 36 deletions(-) - create mode 100644 polkit-agent/i18n_ts/kk.ts - create mode 100644 polkit-agent/i18n_ts/ug.ts - -diff --git a/polkit-agent/i18n_ts/kk.ts b/polkit-agent/i18n_ts/kk.ts -new file mode 100644 -index 0000000..80308b0 ---- /dev/null -+++ b/polkit-agent/i18n_ts/kk.ts -@@ -0,0 +1,441 @@ -+<?xml version="1.0" encoding="utf-8"?> -+<!DOCTYPE TS> -+<TS version="2.1" language="kk"> -+<context> -+ <name>BioAuthWidget</name> -+ <message> -+ <source>Retry</source> -+ <translation type="obsolete">重试</translation> -+ </message> -+ <message> -+ <source>%1 too many unsuccessful attempts,please enter password.</source> -+ <translation type="obsolete">%1验证失败达最大次数,请使用密码登录</translation> -+ </message> -+ <message> -+ <source>%1 authentication failure,there are still %2 remaining opportunities</source> -+ <translation type="obsolete">%1认证失败,还剩%2次尝试机会</translation> -+ </message> -+ <message> -+ <source>Please use wechat to scan the code</source> -+ <translation type="vanished">请使用微信扫码</translation> -+ </message> -+</context> -+<context> -+ <name>BioDevices</name> -+ <message> -+ <source>FingerPrint</source> -+ <translation type="obsolete">指纹</translation> -+ </message> -+ <message> -+ <source>FingerVein</source> -+ <translation type="obsolete">指静脉</translation> -+ </message> -+ <message> -+ <source>Iris</source> -+ <translation type="obsolete">虹膜</translation> -+ </message> -+ <message> -+ <source>Face</source> -+ <translation type="obsolete">人脸</translation> -+ </message> -+ <message> -+ <source>VoicePrint</source> -+ <translation type="obsolete">声纹</translation> -+ </message> -+ <message> -+ <source>Wechat</source> -+ <translation type="vanished">微信</translation> -+ </message> -+ <message> -+ <source>QRCode</source> -+ <translation type="vanished">二维码</translation> -+ </message> -+</context> -+<context> -+ <name>LoginOptionsWidget</name> -+ <message> -+ <source>Login Options</source> -+ <translation type="vanished">登录选项</translation> -+ </message> -+ <message> -+ <source>Wechat</source> -+ <translation type="vanished">微信</translation> -+ </message> -+</context> -+<context> -+ <name>MainWindow</name> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="66"/> -+ <source>Authentication</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <source>Fingerprint authentication failed, you still have %1 verification opportunities</source> -+ <translation type="vanished">指纹验证失败,您还有%1次尝试机会</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.ui" line="26"/> -+ <source>Form</source> -+ <translation></translation> -+ </message> -+ <message> -+ <source>More</source> -+ <translation type="obsolete">更多</translation> -+ </message> -+ <message> -+ <source>Restart</source> -+ <translation type="obsolete">重新开始</translation> -+ </message> -+ <message> -+ <source>Password</source> -+ <translation type="vanished">密码</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.ui" line="409"/> -+ <location filename="../src/mainwindow.cpp" line="1075"/> -+ <location filename="../src/mainwindow.cpp" line="1143"/> -+ <source>Biometric</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.ui" line="480"/> -+ <source>use password</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <source>DeviceType:</source> -+ <translation type="obsolete">设备类型:</translation> -+ </message> -+ <message> -+ <source>Back</source> -+ <translation type="obsolete">返回</translation> -+ </message> -+ <message> -+ <source>Details</source> -+ <translation type="vanished">详细</translation> -+ </message> -+ <message> -+ <source>Action Id:</source> -+ <translation type="obsolete">动作:</translation> -+ </message> -+ <message> -+ <source>Description:</source> -+ <translation type="vanished">描述:</translation> -+ </message> -+ <message> -+ <source>Polkit.subject-pid:</source> -+ <translation type="vanished">Polkit.subject-pid:</translation> -+ </message> -+ <message> -+ <source>Retry</source> -+ <translation type="obsolete">重试</translation> -+ </message> -+ <message> -+ <source>Device types:</source> -+ <translation type="obsolete">设备类型:</translation> -+ </message> -+ <message> -+ <source>Vendor:</source> -+ <translation type="vanished">发行商:</translation> -+ </message> -+ <message> -+ <source>Action:</source> -+ <translation type="vanished">动作:</translation> -+ </message> -+ <message> -+ <source>Polkit.caller-pid:</source> -+ <translation type="vanished">Polkit.caller-pid:</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.ui" line="441"/> -+ <location filename="../src/mainwindow.cpp" line="1077"/> -+ <source>Cancel</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.ui" line="460"/> -+ <location filename="../src/mainwindow.cpp" line="1073"/> -+ <source>Authenticate</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="1079"/> -+ <location filename="../src/mainwindow.cpp" line="1183"/> -+ <source>Use password</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <source>Auth</source> -+ <translation type="obsolete">授权</translation> -+ </message> -+ <message> -+ <source>Too many unsuccessful attempts,please enter password.</source> -+ <translation type="vanished">指纹验证失败达最大次数,请使用密码解锁</translation> -+ </message> -+ <message> -+ <source>%1 authentication failure,there are still %2 remaining opportunities</source> -+ <translation type="vanished">%1认证失败,还剩%2次尝试机会</translation> -+ </message> -+ <message> -+ <source>%1 too many unsuccessful attempts,please enter password.</source> -+ <translation type="vanished">%1验证失败达最大次数,请使用密码登录</translation> -+ </message> -+ <message> -+ <source>in authentication, please wait...</source> -+ <translation type="vanished">认证中,请稍等...</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="1219"/> -+ <location filename="../src/mainwindow.cpp" line="1292"/> -+ <location filename="../src/mainwindow.cpp" line="1293"/> -+ <source>Please try again in %1 minutes.</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="1230"/> -+ <location filename="../src/mainwindow.cpp" line="1302"/> -+ <location filename="../src/mainwindow.cpp" line="1303"/> -+ <source>Please try again in %1 seconds.</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="1240"/> -+ <location filename="../src/mainwindow.cpp" line="1241"/> -+ <location filename="../src/mainwindow.cpp" line="1311"/> -+ <location filename="../src/mainwindow.cpp" line="1312"/> -+ <source>Account locked permanently.</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="834"/> -+ <location filename="../src/mainwindow.cpp" line="835"/> -+ <source>Password cannot be empty</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <source>Failed to verify %1, please enter password.</source> -+ <translation type="vanished">验证%1失败,请输入密码.</translation> -+ </message> -+ <message> -+ <source>Unable to verify %1, please enter password.</source> -+ <translation type="vanished">无法验证%1,请输入密码.</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="242"/> -+ <location filename="../src/mainwindow.cpp" line="246"/> -+ <source>Failed to verify %1, you still have %2 verification opportunities</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <source>An application is attempting to perform an action that requires privileges. Authentication is required to perform this action.</source> -+ <translation type="vanished">一个程序正试图执行一个需要特权的动作。要求授权以执行该动作。</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="731"/> -+ <source>Password: </source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="335"/> -+ <source>Please enter your password or enroll your fingerprint </source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="259"/> -+ <source>Abnormal network</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="665"/> -+ <source>This operation requires the administrator's authorization. Please enter your password to allow this operation.</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="733"/> -+ <source>_Password: </source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="735"/> -+ <source>_Password:</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="850"/> -+ <source>Authentication failed, please try again.</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="779"/> -+ <source>days left</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <source>Biometric/code scan authentication failed too many times, please enter the password.</source> -+ <translation type="vanished">生物/扫码验证失败达最大次数,请使用密码解锁.</translation> -+ </message> -+ <message> -+ <source>Bioauth/code scan authentication failed, you still have %1 verification opportunities</source> -+ <translation type="vanished">生物/扫码验证失败,您还有%1次尝试机会</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="226"/> -+ <location filename="../src/mainwindow.cpp" line="1415"/> -+ <location filename="../src/mainwindow.cpp" line="1417"/> -+ <source>Failed to verify %1, please enter password to unlock</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="231"/> -+ <location filename="../src/mainwindow.cpp" line="233"/> -+ <location filename="../src/mainwindow.cpp" line="1419"/> -+ <source>Unable to verify %1, please enter password to unlock</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <source>NET Exception</source> -+ <translation type="vanished">网络异常</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="671"/> -+ <source>A program is attempting to perform an action that requires privileges.It requires authorization to perform the action.</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="108"/> -+ <location filename="../src/mainwindow.cpp" line="729"/> -+ <source>Input Password</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="105"/> -+ <source>Insert the ukey into the USB port</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="107"/> -+ <source>Enter the ukey password</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="783"/> -+ <source>hours left</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="787"/> -+ <source>minutes left</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="791"/> -+ <source>seconds left</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="880"/> -+ <location filename="../src/mainwindow.cpp" line="888"/> -+ <source>Input your password to authentication</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="1434"/> -+ <source>Verify face recognition or enter password to unlock</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="1439"/> -+ <source>Press fingerprint or enter password to unlock</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="1444"/> -+ <source>Verify voiceprint or enter password to unlock</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="1449"/> -+ <source>Verify finger vein or enter password to unlock</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="1454"/> -+ <source>Verify iris or enter password to unlock</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="1459"/> -+ <source>Use the bound wechat scanning code or enter the password to unlock</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <source>Use the bound wechat scanning code or enter the password to log in</source> -+ <translation type="vanished">使用绑定的微信扫码或输入密码登录</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="779"/> -+ <location filename="../src/mainwindow.cpp" line="783"/> -+ <location filename="../src/mainwindow.cpp" line="787"/> -+ <location filename="../src/mainwindow.cpp" line="791"/> -+ <source>Account locked,</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <source>Authentication failed, please try again</source> -+ <translation type="obsolete">认证失败,请重试</translation> -+ </message> -+</context> -+<context> -+ <name>PolkitListener</name> -+ <message> -+ <location filename="../src/PolkitListener.cpp" line="88"/> -+ <source>Another client is already authenticating, please try again later.</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/PolkitListener.cpp" line="265"/> -+ <source>Authentication failure, please try again.</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/PolkitListener.cpp" line="272"/> -+ <source>Password input error!</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <source>Account locked %1 minutes due to %2 fail attempts</source> -+ <translation type="vanished">账户锁定%1分钟由于%2次错误尝试</translation> -+ </message> -+ <message> -+ <source>Authentication failure,there are still %1 remaining opportunities</source> -+ <translation type="vanished">认证失败,还剩余%1次尝试机会</translation> -+ </message> -+</context> -+<context> -+ <name>QObject</name> -+ <message> -+ <source>FingerPrint</source> -+ <translation type="obsolete">指纹</translation> -+ </message> -+ <message> -+ <source>FingerVein</source> -+ <translation type="obsolete">指静脉</translation> -+ </message> -+ <message> -+ <source>Iris</source> -+ <translation type="obsolete">虹膜</translation> -+ </message> -+ <message> -+ <source>Face</source> -+ <translation type="obsolete">人脸</translation> -+ </message> -+ <message> -+ <source>VoicePrint</source> -+ <translation type="obsolete">声纹</translation> -+ </message> -+ <message> -+ <source>Cancel</source> -+ <translation type="obsolete">取消</translation> -+ </message> -+</context> -+</TS> -diff --git a/polkit-agent/i18n_ts/ky.ts b/polkit-agent/i18n_ts/ky.ts -index 7841ff1..c5cd060 100644 ---- a/polkit-agent/i18n_ts/ky.ts -+++ b/polkit-agent/i18n_ts/ky.ts -@@ -67,7 +67,7 @@ - <message> - <location filename="../src/mainwindow.cpp" line="66"/> - <source>Authentication</source> -- <translation>Аутентификация</translation> -+ <translation type="unfinished"></translation> - </message> - <message> - <source>Fingerprint authentication failed, you still have %1 verification opportunities</source> -@@ -95,12 +95,12 @@ - <location filename="../src/mainwindow.cpp" line="1075"/> - <location filename="../src/mainwindow.cpp" line="1143"/> - <source>Biometric</source> -- <translation>Биометрия</translation> -+ <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/mainwindow.ui" line="480"/> - <source>use password</source> -- <translation>сырсөз колдонуу</translation> -+ <translation type="unfinished"></translation> - </message> - <message> - <source>DeviceType:</source> -@@ -150,19 +150,19 @@ - <location filename="../src/mainwindow.ui" line="441"/> - <location filename="../src/mainwindow.cpp" line="1077"/> - <source>Cancel</source> -- <translation>Жокко чыгаруу</translation> -+ <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/mainwindow.ui" line="460"/> - <location filename="../src/mainwindow.cpp" line="1073"/> - <source>Authenticate</source> -- <translation>Аутентификация</translation> -+ <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/mainwindow.cpp" line="1079"/> - <location filename="../src/mainwindow.cpp" line="1183"/> - <source>Use password</source> -- <translation>Сырсөз колдонуу</translation> -+ <translation type="unfinished"></translation> - </message> - <message> - <source>Auth</source> -@@ -189,14 +189,14 @@ - <location filename="../src/mainwindow.cpp" line="1292"/> - <location filename="../src/mainwindow.cpp" line="1293"/> - <source>Please try again in %1 minutes.</source> -- <translation>%1 мүнөттө кайра аракет кылыңыз.</translation> -+ <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/mainwindow.cpp" line="1230"/> - <location filename="../src/mainwindow.cpp" line="1302"/> - <location filename="../src/mainwindow.cpp" line="1303"/> - <source>Please try again in %1 seconds.</source> -- <translation>%1 секунданын ичинде кайра аракет кылыңыз.</translation> -+ <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/mainwindow.cpp" line="1240"/> -@@ -204,13 +204,13 @@ - <location filename="../src/mainwindow.cpp" line="1311"/> - <location filename="../src/mainwindow.cpp" line="1312"/> - <source>Account locked permanently.</source> -- <translation>Эсеп биротоло кулпуланган.</translation> -+ <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/mainwindow.cpp" line="834"/> - <location filename="../src/mainwindow.cpp" line="835"/> - <source>Password cannot be empty</source> -- <translation>Сырсөз бош болушу мүмкүн эмес</translation> -+ <translation type="unfinished"></translation> - </message> - <message> - <source>Failed to verify %1, please enter password.</source> -@@ -224,7 +224,7 @@ - <location filename="../src/mainwindow.cpp" line="242"/> - <location filename="../src/mainwindow.cpp" line="246"/> - <source>Failed to verify %1, you still have %2 verification opportunities</source> -- <translation>%1 текшерүүгө болбоду, сизде дагы эле %2 текшерүү мүмкүнчүлүктөрү бар</translation> -+ <translation type="unfinished"></translation> - </message> - <message> - <source>An application is attempting to perform an action that requires privileges. Authentication is required to perform this action.</source> -@@ -233,42 +233,42 @@ - <message> - <location filename="../src/mainwindow.cpp" line="731"/> - <source>Password: </source> -- <translation>Сырсөз: </translation> -+ <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/mainwindow.cpp" line="335"/> - <source>Please enter your password or enroll your fingerprint </source> -- <translation>Сырсөзүңөрдү киргизиңиз же манжа изин жазыңыз </translation> -+ <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/mainwindow.cpp" line="259"/> - <source>Abnormal network</source> -- <translation>Аномалдуу тармак</translation> -+ <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/mainwindow.cpp" line="665"/> - <source>This operation requires the administrator's authorization. Please enter your password to allow this operation.</source> -- <translation>Бул операция администратордун уруксатын талап кылат. Бул операцияга уруксат берүү үчүн сырсөздү киргизиңиз.</translation> -+ <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/mainwindow.cpp" line="733"/> - <source>_Password: </source> -- <translation>_Password: </translation> -+ <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/mainwindow.cpp" line="735"/> - <source>_Password:</source> -- <translation>_Password:</translation> -+ <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/mainwindow.cpp" line="850"/> - <source>Authentication failed, please try again.</source> -- <translation>Аутентификация ишке ашпады, кайра аракет кылыңыз.</translation> -+ <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/mainwindow.cpp" line="779"/> - <source>days left</source> -- <translation>калган күндөр</translation> -+ <translation type="unfinished"></translation> - </message> - <message> - <source>Biometric/code scan authentication failed too many times, please enter the password.</source> -@@ -283,14 +283,14 @@ - <location filename="../src/mainwindow.cpp" line="1415"/> - <location filename="../src/mainwindow.cpp" line="1417"/> - <source>Failed to verify %1, please enter password to unlock</source> -- <translation>%1 текшерүүгө болбоду, кулпусун ачуу үчүн сырсөздү киргизиңиз</translation> -+ <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/mainwindow.cpp" line="231"/> - <location filename="../src/mainwindow.cpp" line="233"/> - <location filename="../src/mainwindow.cpp" line="1419"/> - <source>Unable to verify %1, please enter password to unlock</source> -- <translation>%1 текшерүүгө болбоду, кулпусун ачуу үчүн сырсөздү киргизиңиз</translation> -+ <translation type="unfinished"></translation> - </message> - <message> - <source>NET Exception</source> -@@ -299,13 +299,13 @@ - <message> - <location filename="../src/mainwindow.cpp" line="671"/> - <source>A program is attempting to perform an action that requires privileges.It requires authorization to perform the action.</source> -- <translation>Программа артыкчылыктарды талап кылган акцияны аткарууга аракет кылат. Акцияны аткарууга уруксат талап кылынат.</translation> -+ <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/mainwindow.cpp" line="108"/> - <location filename="../src/mainwindow.cpp" line="729"/> - <source>Input Password</source> -- <translation>Сырсөз киргизүү</translation> -+ <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/mainwindow.cpp" line="105"/> -@@ -320,17 +320,17 @@ - <message> - <location filename="../src/mainwindow.cpp" line="783"/> - <source>hours left</source> -- <translation>саат калды</translation> -+ <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/mainwindow.cpp" line="787"/> - <source>minutes left</source> -- <translation>мүнөт калды</translation> -+ <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/mainwindow.cpp" line="791"/> - <source>seconds left</source> -- <translation>секуд калды</translation> -+ <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/mainwindow.cpp" line="880"/> -@@ -341,32 +341,32 @@ - <message> - <location filename="../src/mainwindow.cpp" line="1434"/> - <source>Verify face recognition or enter password to unlock</source> -- <translation>Беттин таанылышын текшерүү же кулпуну ачуу үчүн сырсөз киргизүү</translation> -+ <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/mainwindow.cpp" line="1439"/> - <source>Press fingerprint or enter password to unlock</source> -- <translation>Манжа изин басуу же кулпуну ачуу үчүн сырсөз киргизүү</translation> -+ <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/mainwindow.cpp" line="1444"/> - <source>Verify voiceprint or enter password to unlock</source> -- <translation>Үн изин текшерүү же сырсөз киргизүү</translation> -+ <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/mainwindow.cpp" line="1449"/> - <source>Verify finger vein or enter password to unlock</source> -- <translation>Манжа тамырын текшерүү же кулпуну ачуу үчүн сырсөз киргизүү</translation> -+ <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/mainwindow.cpp" line="1454"/> - <source>Verify iris or enter password to unlock</source> -- <translation>Ирис текшерүү же кулпусун ачуу үчүн сырсөз киргизүү</translation> -+ <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/mainwindow.cpp" line="1459"/> - <source>Use the bound wechat scanning code or enter the password to unlock</source> -- <translation>Чектелген вечат сканерлеу кодын колдонуңуз же сырсөздү ачуу үчүн киргизиңиз</translation> -+ <translation type="unfinished"></translation> - </message> - <message> - <source>Use the bound wechat scanning code or enter the password to log in</source> -@@ -378,7 +378,7 @@ - <location filename="../src/mainwindow.cpp" line="787"/> - <location filename="../src/mainwindow.cpp" line="791"/> - <source>Account locked,</source> -- <translation>Эсеп кулпуланган,</translation> -+ <translation type="unfinished"></translation> - </message> - <message> - <source>Authentication failed, please try again</source> -@@ -390,17 +390,17 @@ - <message> - <location filename="../src/PolkitListener.cpp" line="88"/> - <source>Another client is already authenticating, please try again later.</source> -- <translation>Дагы бир кардар буга чейин аутентификацияланган, кийин кайра аракет кылыңыз.</translation> -+ <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/PolkitListener.cpp" line="265"/> - <source>Authentication failure, please try again.</source> -- <translation>Аутентификациянын жетишсиздиги, сураныч, кайрадан аракет кылыңыз.</translation> -+ <translation type="unfinished"></translation> - </message> - <message> - <location filename="../src/PolkitListener.cpp" line="272"/> - <source>Password input error!</source> -- <translation>Сырсөз киргизүү катасы!</translation> -+ <translation type="unfinished"></translation> - </message> - <message> - <source>Account locked %1 minutes due to %2 fail attempts</source> -diff --git a/polkit-agent/i18n_ts/ug.ts b/polkit-agent/i18n_ts/ug.ts -new file mode 100644 -index 0000000..6e7e835 ---- /dev/null -+++ b/polkit-agent/i18n_ts/ug.ts -@@ -0,0 +1,441 @@ -+<?xml version="1.0" encoding="utf-8"?> -+<!DOCTYPE TS> -+<TS version="2.1" language="ug"> -+<context> -+ <name>BioAuthWidget</name> -+ <message> -+ <source>Retry</source> -+ <translation type="obsolete">重试</translation> -+ </message> -+ <message> -+ <source>%1 too many unsuccessful attempts,please enter password.</source> -+ <translation type="obsolete">%1验证失败达最大次数,请使用密码登录</translation> -+ </message> -+ <message> -+ <source>%1 authentication failure,there are still %2 remaining opportunities</source> -+ <translation type="obsolete">%1认证失败,还剩%2次尝试机会</translation> -+ </message> -+ <message> -+ <source>Please use wechat to scan the code</source> -+ <translation type="vanished">请使用微信扫码</translation> -+ </message> -+</context> -+<context> -+ <name>BioDevices</name> -+ <message> -+ <source>FingerPrint</source> -+ <translation type="obsolete">指纹</translation> -+ </message> -+ <message> -+ <source>FingerVein</source> -+ <translation type="obsolete">指静脉</translation> -+ </message> -+ <message> -+ <source>Iris</source> -+ <translation type="obsolete">虹膜</translation> -+ </message> -+ <message> -+ <source>Face</source> -+ <translation type="obsolete">人脸</translation> -+ </message> -+ <message> -+ <source>VoicePrint</source> -+ <translation type="obsolete">声纹</translation> -+ </message> -+ <message> -+ <source>Wechat</source> -+ <translation type="vanished">微信</translation> -+ </message> -+ <message> -+ <source>QRCode</source> -+ <translation type="vanished">二维码</translation> -+ </message> -+</context> -+<context> -+ <name>LoginOptionsWidget</name> -+ <message> -+ <source>Login Options</source> -+ <translation type="vanished">登录选项</translation> -+ </message> -+ <message> -+ <source>Wechat</source> -+ <translation type="vanished">微信</translation> -+ </message> -+</context> -+<context> -+ <name>MainWindow</name> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="66"/> -+ <source>Authentication</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <source>Fingerprint authentication failed, you still have %1 verification opportunities</source> -+ <translation type="vanished">指纹验证失败,您还有%1次尝试机会</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.ui" line="26"/> -+ <source>Form</source> -+ <translation></translation> -+ </message> -+ <message> -+ <source>More</source> -+ <translation type="obsolete">更多</translation> -+ </message> -+ <message> -+ <source>Restart</source> -+ <translation type="obsolete">重新开始</translation> -+ </message> -+ <message> -+ <source>Password</source> -+ <translation type="vanished">密码</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.ui" line="409"/> -+ <location filename="../src/mainwindow.cpp" line="1075"/> -+ <location filename="../src/mainwindow.cpp" line="1143"/> -+ <source>Biometric</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.ui" line="480"/> -+ <source>use password</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <source>DeviceType:</source> -+ <translation type="obsolete">设备类型:</translation> -+ </message> -+ <message> -+ <source>Back</source> -+ <translation type="obsolete">返回</translation> -+ </message> -+ <message> -+ <source>Details</source> -+ <translation type="vanished">详细</translation> -+ </message> -+ <message> -+ <source>Action Id:</source> -+ <translation type="obsolete">动作:</translation> -+ </message> -+ <message> -+ <source>Description:</source> -+ <translation type="vanished">描述:</translation> -+ </message> -+ <message> -+ <source>Polkit.subject-pid:</source> -+ <translation type="vanished">Polkit.subject-pid:</translation> -+ </message> -+ <message> -+ <source>Retry</source> -+ <translation type="obsolete">重试</translation> -+ </message> -+ <message> -+ <source>Device types:</source> -+ <translation type="obsolete">设备类型:</translation> -+ </message> -+ <message> -+ <source>Vendor:</source> -+ <translation type="vanished">发行商:</translation> -+ </message> -+ <message> -+ <source>Action:</source> -+ <translation type="vanished">动作:</translation> -+ </message> -+ <message> -+ <source>Polkit.caller-pid:</source> -+ <translation type="vanished">Polkit.caller-pid:</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.ui" line="441"/> -+ <location filename="../src/mainwindow.cpp" line="1077"/> -+ <source>Cancel</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.ui" line="460"/> -+ <location filename="../src/mainwindow.cpp" line="1073"/> -+ <source>Authenticate</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="1079"/> -+ <location filename="../src/mainwindow.cpp" line="1183"/> -+ <source>Use password</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <source>Auth</source> -+ <translation type="obsolete">授权</translation> -+ </message> -+ <message> -+ <source>Too many unsuccessful attempts,please enter password.</source> -+ <translation type="vanished">指纹验证失败达最大次数,请使用密码解锁</translation> -+ </message> -+ <message> -+ <source>%1 authentication failure,there are still %2 remaining opportunities</source> -+ <translation type="vanished">%1认证失败,还剩%2次尝试机会</translation> -+ </message> -+ <message> -+ <source>%1 too many unsuccessful attempts,please enter password.</source> -+ <translation type="vanished">%1验证失败达最大次数,请使用密码登录</translation> -+ </message> -+ <message> -+ <source>in authentication, please wait...</source> -+ <translation type="vanished">认证中,请稍等...</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="1219"/> -+ <location filename="../src/mainwindow.cpp" line="1292"/> -+ <location filename="../src/mainwindow.cpp" line="1293"/> -+ <source>Please try again in %1 minutes.</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="1230"/> -+ <location filename="../src/mainwindow.cpp" line="1302"/> -+ <location filename="../src/mainwindow.cpp" line="1303"/> -+ <source>Please try again in %1 seconds.</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="1240"/> -+ <location filename="../src/mainwindow.cpp" line="1241"/> -+ <location filename="../src/mainwindow.cpp" line="1311"/> -+ <location filename="../src/mainwindow.cpp" line="1312"/> -+ <source>Account locked permanently.</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="834"/> -+ <location filename="../src/mainwindow.cpp" line="835"/> -+ <source>Password cannot be empty</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <source>Failed to verify %1, please enter password.</source> -+ <translation type="vanished">验证%1失败,请输入密码.</translation> -+ </message> -+ <message> -+ <source>Unable to verify %1, please enter password.</source> -+ <translation type="vanished">无法验证%1,请输入密码.</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="242"/> -+ <location filename="../src/mainwindow.cpp" line="246"/> -+ <source>Failed to verify %1, you still have %2 verification opportunities</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <source>An application is attempting to perform an action that requires privileges. Authentication is required to perform this action.</source> -+ <translation type="vanished">一个程序正试图执行一个需要特权的动作。要求授权以执行该动作。</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="731"/> -+ <source>Password: </source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="335"/> -+ <source>Please enter your password or enroll your fingerprint </source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="259"/> -+ <source>Abnormal network</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="665"/> -+ <source>This operation requires the administrator's authorization. Please enter your password to allow this operation.</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="733"/> -+ <source>_Password: </source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="735"/> -+ <source>_Password:</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="850"/> -+ <source>Authentication failed, please try again.</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="779"/> -+ <source>days left</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <source>Biometric/code scan authentication failed too many times, please enter the password.</source> -+ <translation type="vanished">生物/扫码验证失败达最大次数,请使用密码解锁.</translation> -+ </message> -+ <message> -+ <source>Bioauth/code scan authentication failed, you still have %1 verification opportunities</source> -+ <translation type="vanished">生物/扫码验证失败,您还有%1次尝试机会</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="226"/> -+ <location filename="../src/mainwindow.cpp" line="1415"/> -+ <location filename="../src/mainwindow.cpp" line="1417"/> -+ <source>Failed to verify %1, please enter password to unlock</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="231"/> -+ <location filename="../src/mainwindow.cpp" line="233"/> -+ <location filename="../src/mainwindow.cpp" line="1419"/> -+ <source>Unable to verify %1, please enter password to unlock</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <source>NET Exception</source> -+ <translation type="vanished">网络异常</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="671"/> -+ <source>A program is attempting to perform an action that requires privileges.It requires authorization to perform the action.</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="108"/> -+ <location filename="../src/mainwindow.cpp" line="729"/> -+ <source>Input Password</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="105"/> -+ <source>Insert the ukey into the USB port</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="107"/> -+ <source>Enter the ukey password</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="783"/> -+ <source>hours left</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="787"/> -+ <source>minutes left</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="791"/> -+ <source>seconds left</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="880"/> -+ <location filename="../src/mainwindow.cpp" line="888"/> -+ <source>Input your password to authentication</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="1434"/> -+ <source>Verify face recognition or enter password to unlock</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="1439"/> -+ <source>Press fingerprint or enter password to unlock</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="1444"/> -+ <source>Verify voiceprint or enter password to unlock</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="1449"/> -+ <source>Verify finger vein or enter password to unlock</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="1454"/> -+ <source>Verify iris or enter password to unlock</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="1459"/> -+ <source>Use the bound wechat scanning code or enter the password to unlock</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <source>Use the bound wechat scanning code or enter the password to log in</source> -+ <translation type="vanished">使用绑定的微信扫码或输入密码登录</translation> -+ </message> -+ <message> -+ <location filename="../src/mainwindow.cpp" line="779"/> -+ <location filename="../src/mainwindow.cpp" line="783"/> -+ <location filename="../src/mainwindow.cpp" line="787"/> -+ <location filename="../src/mainwindow.cpp" line="791"/> -+ <source>Account locked,</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <source>Authentication failed, please try again</source> -+ <translation type="obsolete">认证失败,请重试</translation> -+ </message> -+</context> -+<context> -+ <name>PolkitListener</name> -+ <message> -+ <location filename="../src/PolkitListener.cpp" line="88"/> -+ <source>Another client is already authenticating, please try again later.</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/PolkitListener.cpp" line="265"/> -+ <source>Authentication failure, please try again.</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <location filename="../src/PolkitListener.cpp" line="272"/> -+ <source>Password input error!</source> -+ <translation type="unfinished"></translation> -+ </message> -+ <message> -+ <source>Account locked %1 minutes due to %2 fail attempts</source> -+ <translation type="vanished">账户锁定%1分钟由于%2次错误尝试</translation> -+ </message> -+ <message> -+ <source>Authentication failure,there are still %1 remaining opportunities</source> -+ <translation type="vanished">认证失败,还剩余%1次尝试机会</translation> -+ </message> -+</context> -+<context> -+ <name>QObject</name> -+ <message> -+ <source>FingerPrint</source> -+ <translation type="obsolete">指纹</translation> -+ </message> -+ <message> -+ <source>FingerVein</source> -+ <translation type="obsolete">指静脉</translation> -+ </message> -+ <message> -+ <source>Iris</source> -+ <translation type="obsolete">虹膜</translation> -+ </message> -+ <message> -+ <source>Face</source> -+ <translation type="obsolete">人脸</translation> -+ </message> -+ <message> -+ <source>VoicePrint</source> -+ <translation type="obsolete">声纹</translation> -+ </message> -+ <message> -+ <source>Cancel</source> -+ <translation type="obsolete">取消</translation> -+ </message> -+</context> -+</TS> diff -Nru ukui-biometric-auth-4.10.0.0/debian/patches/0013-Translated-using-Weblate-Uyghur.patch ukui-biometric-auth-4.20.0.0/debian/patches/0013-Translated-using-Weblate-Uyghur.patch --- ukui-biometric-auth-4.10.0.0/debian/patches/0013-Translated-using-Weblate-Uyghur.patch 2024-04-23 10:31:46.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/debian/patches/0013-Translated-using-Weblate-Uyghur.patch 1970-01-01 08:00:00.000000000 +0800 @@ -1,145 +0,0 @@ -From: KevinDuan <duankaiwen@kylinos.com> -Date: Tue, 21 May 2024 05:58:27 +0000 -Subject: Translated using Weblate (Uyghur) - -Currently translated at 94.7% (18 of 19 strings) - -Translation: openkylin-nile-new/ukui-biometric-auth -Translate-URL: http://weblate.openkylin.top/projects/openkylin-nile-new/ukui-biometric-auth/ug/ ---- - bioauth/i18n_ts/ug.ts | 36 ++++++++++++++++++------------------ - 1 file changed, 18 insertions(+), 18 deletions(-) - -diff --git a/bioauth/i18n_ts/ug.ts b/bioauth/i18n_ts/ug.ts -index 8a4c988..a45ce46 100644 ---- a/bioauth/i18n_ts/ug.ts -+++ b/bioauth/i18n_ts/ug.ts -@@ -6,7 +6,7 @@ - <message> - <location filename="../src/bioauthwidget.ui" line="14"/> - <source>Form</source> -- <translation></translation> -+ <translation>جەدۋەل</translation> - </message> - <message> - <source>More</source> -@@ -16,7 +16,7 @@ - <location filename="../src/bioauthwidget.ui" line="146"/> - <location filename="../src/bioauthwidget.cpp" line="41"/> - <source>Retry</source> -- <translation type="unfinished"></translation> -+ <translation>قايتا قايتا تىرشىش</translation> - </message> - <message> - <source>Too many unsuccessful attempts,please enter password.</source> -@@ -38,17 +38,17 @@ - <location filename="../src/bioauthwidget.cpp" line="96"/> - <location filename="../src/bioauthwidget.cpp" line="212"/> - <source>%1 too many unsuccessful attempts,please enter password.</source> -- <translation type="unfinished"></translation> -+ <translation>مەغلۇپ بولۇش قېتىم سانى زىيادە كۆپ بولۇپ كەتتى، مەخپىي نومۇرنى كىرگۈزۈڭ</translation> - </message> - <message> - <location filename="../src/bioauthwidget.cpp" line="102"/> - <source>%1 authentication failure,there are still %2 remaining opportunities</source> -- <translation type="unfinished"></translation> -+ <translation>سالاھىيىتىنى دەلىللەش مەغلۇپ بولدى، يەنە ئىككى قېتىم پۇرسىتىڭىز قالدى</translation> - </message> - <message> - <location filename="../src/bioauthwidget.cpp" line="226"/> - <source>Please use wechat to scan the code</source> -- <translation type="unfinished"></translation> -+ <translation>ئۈندىداردا سىكانىرلاڭ</translation> - </message> - </context> - <context> -@@ -56,47 +56,47 @@ - <message> - <location filename="../src/biodevices.cpp" line="78"/> - <source>Unplugging of %1 device detected</source> -- <translation type="unfinished"></translation> -+ <translation>تەكشۈرۈپ بايقىغان 1 ئۈسكۈنىنى تارتىپ چىقارماق</translation> - </message> - <message> - <location filename="../src/biodevices.cpp" line="88"/> - <source>%1 device insertion detected</source> -- <translation type="unfinished"></translation> -+ <translation>1 ئۈسكۈنىنىڭ كىرگۈزۈلگەنلىكىنى تەكشۈرۈپ چىقماق</translation> - </message> - <message> - <location filename="../src/biodevices.cpp" line="97"/> - <source>Biometric Manager</source> -- <translation type="unfinished"></translation> -+ <translation>بىئولەگىيەلىك ئالاھىدىلىكنى باشقۇرۇش قورالى</translation> - </message> - <message> - <location filename="../src/biodevices.cpp" line="100"/> - <source>biometric</source> -- <translation type="unfinished"></translation> -+ <translation>بىئولوگىيەلىك ئالاھىدىلىك</translation> - </message> - <message> - <location filename="../src/biodevices.cpp" line="700"/> - <source>FingerPrint</source> -- <translation type="unfinished"></translation> -+ <translation>بارماق ئىزى</translation> - </message> - <message> - <location filename="../src/biodevices.cpp" line="702"/> - <source>FingerVein</source> -- <translation type="unfinished"></translation> -+ <translation>بارماقVein</translation> - </message> - <message> - <location filename="../src/biodevices.cpp" line="704"/> - <source>Iris</source> -- <translation type="unfinished"></translation> -+ <translation>ئېرسى</translation> - </message> - <message> - <location filename="../src/biodevices.cpp" line="706"/> - <source>Face</source> -- <translation type="unfinished"></translation> -+ <translation>يۈز</translation> - </message> - <message> - <location filename="../src/biodevices.cpp" line="708"/> - <source>VoicePrint</source> -- <translation type="unfinished"></translation> -+ <translation>بىخەتەرلىك شىڧىرلىق ئاچقۇچى</translation> - </message> - <message> - <location filename="../src/biodevices.cpp" line="710"/> -@@ -106,7 +106,7 @@ - <message> - <location filename="../src/biodevices.cpp" line="712"/> - <source>QRCode</source> -- <translation type="unfinished"></translation> -+ <translation>ئىككىلىك كود</translation> - </message> - <message> - <source>Wechat</source> -@@ -118,7 +118,7 @@ - <message> - <location filename="../src/biodeviceswidget.ui" line="14"/> - <source>Form</source> -- <translation></translation> -+ <translation>جەدۋەل</translation> - </message> - <message> - <source>Device types:</source> -@@ -142,12 +142,12 @@ - <message> - <location filename="../src/loginoptionswidget.cpp" line="79"/> - <source>Login Options</source> -- <translation type="unfinished"></translation> -+ <translation>كىرىش تاللانمىلىرى</translation> - </message> - <message> - <location filename="../src/loginoptionswidget.cpp" line="320"/> - <source>Password</source> -- <translation type="unfinished"></translation> -+ <translation>مەخپىي ئاچقۇچ</translation> - </message> - <message> - <source>Wechat</source> diff -Nru ukui-biometric-auth-4.10.0.0/debian/patches/0014-Translated-using-Weblate-Uyghur.patch ukui-biometric-auth-4.20.0.0/debian/patches/0014-Translated-using-Weblate-Uyghur.patch --- ukui-biometric-auth-4.10.0.0/debian/patches/0014-Translated-using-Weblate-Uyghur.patch 2024-04-23 10:31:46.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/debian/patches/0014-Translated-using-Weblate-Uyghur.patch 1970-01-01 08:00:00.000000000 +0800 @@ -1,43 +0,0 @@ -From: KevinDuan <duankaiwen@kylinos.com> -Date: Tue, 21 May 2024 05:58:56 +0000 -Subject: Translated using Weblate (Uyghur) - -Currently translated at 12.0% (3 of 25 strings) - -Translation: openkylin-nile-new/ukui-biometric-auth-bin -Translate-URL: http://weblate.openkylin.top/projects/openkylin-nile-new/ukui-biometric-auth-bin/ug/ ---- - bioauth-bin/i18n_ts/ug.ts | 6 +++--- - 1 file changed, 3 insertions(+), 3 deletions(-) - -diff --git a/bioauth-bin/i18n_ts/ug.ts b/bioauth-bin/i18n_ts/ug.ts -index b766cfe..30c7d61 100644 ---- a/bioauth-bin/i18n_ts/ug.ts -+++ b/bioauth-bin/i18n_ts/ug.ts -@@ -169,7 +169,7 @@ - <message> - <location filename="../src/main.cpp" line="153"/> - <source>Cancel</source> -- <translation type="unfinished"></translation> -+ <translation>ئەمەلدىن قالدۇرۇش</translation> - </message> - <message> - <location filename="../src/main.cpp" line="162"/> -@@ -221,7 +221,7 @@ - <message> - <location filename="../src/main.cpp" line="262"/> - <source>User</source> -- <translation type="unfinished"></translation> -+ <translation>ئىشلەتكۈچى</translation> - </message> - <message> - <location filename="../src/main.cpp" line="263"/> -@@ -266,7 +266,7 @@ - <message> - <location filename="../src/main.cpp" line="348"/> - <source>Failed to verify %1, you still have %2 verification opportunities</source> -- <translation type="unfinished"></translation> -+ <translation>٪1 نى دەلىللەش مەغلۇپ بولدى، سىزدە يەنىلا ٪2 دەلىللەش پۇرسىتى بار</translation> - </message> - <message> - <location filename="../src/main.cpp" line="350"/> diff -Nru ukui-biometric-auth-4.10.0.0/debian/patches/0015-Translated-using-Weblate-Uyghur.patch ukui-biometric-auth-4.20.0.0/debian/patches/0015-Translated-using-Weblate-Uyghur.patch --- ukui-biometric-auth-4.10.0.0/debian/patches/0015-Translated-using-Weblate-Uyghur.patch 2024-04-23 10:31:46.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/debian/patches/0015-Translated-using-Weblate-Uyghur.patch 1970-01-01 08:00:00.000000000 +0800 @@ -1,288 +0,0 @@ -From: KevinDuan <duankaiwen@kylinos.com> -Date: Tue, 21 May 2024 05:59:48 +0000 -Subject: Translated using Weblate (Uyghur) - -Currently translated at 92.5% (37 of 40 strings) - -Translation: openkylin-nile-new/ukui-biometric-auth-polkit-agent -Translate-URL: http://weblate.openkylin.top/projects/openkylin-nile-new/ukui-biometric-auth-polkit-agent/ug/ ---- - polkit-agent/i18n_ts/ug.ts | 74 +++++++++++++++++++++++----------------------- - 1 file changed, 37 insertions(+), 37 deletions(-) - -diff --git a/polkit-agent/i18n_ts/ug.ts b/polkit-agent/i18n_ts/ug.ts -index 6e7e835..0daf82d 100644 ---- a/polkit-agent/i18n_ts/ug.ts -+++ b/polkit-agent/i18n_ts/ug.ts -@@ -67,7 +67,7 @@ - <message> - <location filename="../src/mainwindow.cpp" line="66"/> - <source>Authentication</source> -- <translation type="unfinished"></translation> -+ <translation>راستىنى دەلىللەش</translation> - </message> - <message> - <source>Fingerprint authentication failed, you still have %1 verification opportunities</source> -@@ -76,7 +76,7 @@ - <message> - <location filename="../src/mainwindow.ui" line="26"/> - <source>Form</source> -- <translation></translation> -+ <translation>جەدۋەل</translation> - </message> - <message> - <source>More</source> -@@ -95,12 +95,12 @@ - <location filename="../src/mainwindow.cpp" line="1075"/> - <location filename="../src/mainwindow.cpp" line="1143"/> - <source>Biometric</source> -- <translation type="unfinished"></translation> -+ <translation>بىئولەگىيەلىك ئالاھىدىلىكنى ئىشلىتىش</translation> - </message> - <message> - <location filename="../src/mainwindow.ui" line="480"/> - <source>use password</source> -- <translation type="unfinished"></translation> -+ <translation>مەخپىي نومۇر ئىشلىتىش</translation> - </message> - <message> - <source>DeviceType:</source> -@@ -150,19 +150,19 @@ - <location filename="../src/mainwindow.ui" line="441"/> - <location filename="../src/mainwindow.cpp" line="1077"/> - <source>Cancel</source> -- <translation type="unfinished"></translation> -+ <translation>ئەمەلدىن قالدۇرۇش</translation> - </message> - <message> - <location filename="../src/mainwindow.ui" line="460"/> - <location filename="../src/mainwindow.cpp" line="1073"/> - <source>Authenticate</source> -- <translation type="unfinished"></translation> -+ <translation>ھوقۇق بېرىش</translation> - </message> - <message> - <location filename="../src/mainwindow.cpp" line="1079"/> - <location filename="../src/mainwindow.cpp" line="1183"/> - <source>Use password</source> -- <translation type="unfinished"></translation> -+ <translation>مەخپىي نومۇر ئىشلىتىش ئارقىلىق دەلىللەش</translation> - </message> - <message> - <source>Auth</source> -@@ -189,14 +189,14 @@ - <location filename="../src/mainwindow.cpp" line="1292"/> - <location filename="../src/mainwindow.cpp" line="1293"/> - <source>Please try again in %1 minutes.</source> -- <translation type="unfinished"></translation> -+ <translation>٪1 مىنۇت ئىچىدە قايتا سىناپ بېقىڭ.</translation> - </message> - <message> - <location filename="../src/mainwindow.cpp" line="1230"/> - <location filename="../src/mainwindow.cpp" line="1302"/> - <location filename="../src/mainwindow.cpp" line="1303"/> - <source>Please try again in %1 seconds.</source> -- <translation type="unfinished"></translation> -+ <translation>٪1 سېكۇنت ئىچىدە قايتا سىناپ بېقىڭ.</translation> - </message> - <message> - <location filename="../src/mainwindow.cpp" line="1240"/> -@@ -204,13 +204,13 @@ - <location filename="../src/mainwindow.cpp" line="1311"/> - <location filename="../src/mainwindow.cpp" line="1312"/> - <source>Account locked permanently.</source> -- <translation type="unfinished"></translation> -+ <translation>ھېسابات مەڭگۈلۈك قۇلۇپلىنىدۇ.</translation> - </message> - <message> - <location filename="../src/mainwindow.cpp" line="834"/> - <location filename="../src/mainwindow.cpp" line="835"/> - <source>Password cannot be empty</source> -- <translation type="unfinished"></translation> -+ <translation>مەخپىي نومۇرنى بوش قويۇشقا بولمايدۇ</translation> - </message> - <message> - <source>Failed to verify %1, please enter password.</source> -@@ -224,7 +224,7 @@ - <location filename="../src/mainwindow.cpp" line="242"/> - <location filename="../src/mainwindow.cpp" line="246"/> - <source>Failed to verify %1, you still have %2 verification opportunities</source> -- <translation type="unfinished"></translation> -+ <translation>٪1 نى دەلىللەش مەغلۇپ بولدى، سىزدە يەنىلا ٪2 دەلىللەش پۇرسىتى بار</translation> - </message> - <message> - <source>An application is attempting to perform an action that requires privileges. Authentication is required to perform this action.</source> -@@ -233,42 +233,42 @@ - <message> - <location filename="../src/mainwindow.cpp" line="731"/> - <source>Password: </source> -- <translation type="unfinished"></translation> -+ <translation>مەخپىي نومۇر </translation> - </message> - <message> - <location filename="../src/mainwindow.cpp" line="335"/> - <source>Please enter your password or enroll your fingerprint </source> -- <translation type="unfinished"></translation> -+ <translation>مەخپىي نومۇرىڭىزنى كىرگۈزۈڭ ياكى بارماق ئىزىڭىزنى تونۇتۇڭ </translation> - </message> - <message> - <location filename="../src/mainwindow.cpp" line="259"/> - <source>Abnormal network</source> -- <translation type="unfinished"></translation> -+ <translation>بىنورمال تور</translation> - </message> - <message> - <location filename="../src/mainwindow.cpp" line="665"/> - <source>This operation requires the administrator's authorization. Please enter your password to allow this operation.</source> -- <translation type="unfinished"></translation> -+ <translation>بۇ مەشغۇلات باشقۇرغۇچىنىڭ ھوقۇق بېرىشىنى تەلەپ قىلىدۇ.مەخپىي نومۇرنى كىرگۈزۈپ بي قېتىمقى مەشغۇلاتنىڭ ئېلىپ بېرىلىشىغا يول قويۇڭ.</translation> - </message> - <message> - <location filename="../src/mainwindow.cpp" line="733"/> - <source>_Password: </source> -- <translation type="unfinished"></translation> -+ <translation>مەخپىي نومۇر </translation> - </message> - <message> - <location filename="../src/mainwindow.cpp" line="735"/> - <source>_Password:</source> -- <translation type="unfinished"></translation> -+ <translation>مەخپىي نومۇر</translation> - </message> - <message> - <location filename="../src/mainwindow.cpp" line="850"/> - <source>Authentication failed, please try again.</source> -- <translation type="unfinished"></translation> -+ <translation>دەلىللەش مەغلۇپ بولدى، قايتا سىناڭ</translation> - </message> - <message> - <location filename="../src/mainwindow.cpp" line="779"/> - <source>days left</source> -- <translation type="unfinished"></translation> -+ <translation>1 كۈندىن كېيىن سىناب بېقىڭ</translation> - </message> - <message> - <source>Biometric/code scan authentication failed too many times, please enter the password.</source> -@@ -283,14 +283,14 @@ - <location filename="../src/mainwindow.cpp" line="1415"/> - <location filename="../src/mainwindow.cpp" line="1417"/> - <source>Failed to verify %1, please enter password to unlock</source> -- <translation type="unfinished"></translation> -+ <translation>٪1 نى دەلىللەش مەغلۇپ بولدى، مەخپى نۇمۇر كىرگۈزۈڭ</translation> - </message> - <message> - <location filename="../src/mainwindow.cpp" line="231"/> - <location filename="../src/mainwindow.cpp" line="233"/> - <location filename="../src/mainwindow.cpp" line="1419"/> - <source>Unable to verify %1, please enter password to unlock</source> -- <translation type="unfinished"></translation> -+ <translation>٪1 نى دەلىللەشكە ئامالسىز، مەخپىي نومۇرنى كىرگۈزۈپ قۇلۇپنى ئېچىڭ</translation> - </message> - <message> - <source>NET Exception</source> -@@ -299,13 +299,13 @@ - <message> - <location filename="../src/mainwindow.cpp" line="671"/> - <source>A program is attempting to perform an action that requires privileges.It requires authorization to perform the action.</source> -- <translation type="unfinished"></translation> -+ <translation>بىر پروگرامما ئىمتىياز تەلەپ قىلىدىغان ھەرىكەتنى قىلىشقا ئۇرۇنماقتا. بۇ ھەرىكەتنى ئىجرا قىلىش ئۈچۈن ھوقۇق تەلەپ قىلىدۇ.</translation> - </message> - <message> - <location filename="../src/mainwindow.cpp" line="108"/> - <location filename="../src/mainwindow.cpp" line="729"/> - <source>Input Password</source> -- <translation type="unfinished"></translation> -+ <translation>ئىم كىرگۈزۈش</translation> - </message> - <message> - <location filename="../src/mainwindow.cpp" line="105"/> -@@ -320,17 +320,17 @@ - <message> - <location filename="../src/mainwindow.cpp" line="783"/> - <source>hours left</source> -- <translation type="unfinished"></translation> -+ <translation>بىر سائەتتىن كېيىن ئېچىلىدۇ</translation> - </message> - <message> - <location filename="../src/mainwindow.cpp" line="787"/> - <source>minutes left</source> -- <translation type="unfinished"></translation> -+ <translation>بىر مىنۇتتىن كېيىن ئېچىلىدۇ</translation> - </message> - <message> - <location filename="../src/mainwindow.cpp" line="791"/> - <source>seconds left</source> -- <translation type="unfinished"></translation> -+ <translation>بىر سېكۇنتتىن كېيىن ئېچىلىدۇ</translation> - </message> - <message> - <location filename="../src/mainwindow.cpp" line="880"/> -@@ -341,32 +341,32 @@ - <message> - <location filename="../src/mainwindow.cpp" line="1434"/> - <source>Verify face recognition or enter password to unlock</source> -- <translation type="unfinished"></translation> -+ <translation>چىراي تونۇشنى دەلىللەش ياكى مەخپىي نومۇر كىرگۈزۈش ئارقىلىق قۇلۇپ ئېچىش</translation> - </message> - <message> - <location filename="../src/mainwindow.cpp" line="1439"/> - <source>Press fingerprint or enter password to unlock</source> -- <translation type="unfinished"></translation> -+ <translation>بارماق ئىزىنى بېسىش ياكى مەخپىي نومۇر كىرگۈزۈش ئارقىلىق قۇلۇپ ئېچىش</translation> - </message> - <message> - <location filename="../src/mainwindow.cpp" line="1444"/> - <source>Verify voiceprint or enter password to unlock</source> -- <translation type="unfinished"></translation> -+ <translation>ئاۋاز ئىزىنى دەلىللەش ياكى مەخپىي نومۇر كىرگۈزۈش ئارقىلىق قۇلۇپ ئېچىش</translation> - </message> - <message> - <location filename="../src/mainwindow.cpp" line="1449"/> - <source>Verify finger vein or enter password to unlock</source> -- <translation type="unfinished"></translation> -+ <translation>بارماق ئىزى ئارقىلىق ئېنىقلاش ياكى مەخپىي نومۇر كىرگۈزۈش ئارقىلىق قۇلۇپ ئېچىش</translation> - </message> - <message> - <location filename="../src/mainwindow.cpp" line="1454"/> - <source>Verify iris or enter password to unlock</source> -- <translation type="unfinished"></translation> -+ <translation>Iris نى ئېنىقلاش ياكى مەخپىي نومۇر كىرگۈزۈش ئارقىلىق قۇلۇپ ئېچىش</translation> - </message> - <message> - <location filename="../src/mainwindow.cpp" line="1459"/> - <source>Use the bound wechat scanning code or enter the password to unlock</source> -- <translation type="unfinished"></translation> -+ <translation>باغلانغان ئۈندىدارنى سىكاننېرلاش كودى ياكى مەخپىي نومۇرىنى كىرگۈزۈپ قۇلۇپ ئېچىش</translation> - </message> - <message> - <source>Use the bound wechat scanning code or enter the password to log in</source> -@@ -378,7 +378,7 @@ - <location filename="../src/mainwindow.cpp" line="787"/> - <location filename="../src/mainwindow.cpp" line="791"/> - <source>Account locked,</source> -- <translation type="unfinished"></translation> -+ <translation>ئىشلىتىش نومۇرىڭىز قۇلۇپلىنىپ قالدى</translation> - </message> - <message> - <source>Authentication failed, please try again</source> -@@ -390,17 +390,17 @@ - <message> - <location filename="../src/PolkitListener.cpp" line="88"/> - <source>Another client is already authenticating, please try again later.</source> -- <translation type="unfinished"></translation> -+ <translation>يەنە بىر خېرىدار دەلىللەۋاتىدۇ، سەل تۇرۇپ قايتا سىناڭ.</translation> - </message> - <message> - <location filename="../src/PolkitListener.cpp" line="265"/> - <source>Authentication failure, please try again.</source> -- <translation type="unfinished"></translation> -+ <translation>دەلىللەش مەغلۇپ بولدى، قايتا سىناڭ.</translation> - </message> - <message> - <location filename="../src/PolkitListener.cpp" line="272"/> - <source>Password input error!</source> -- <translation type="unfinished"></translation> -+ <translation>كىرگۈزگەن مەخپىي نومۇر خاتا بولدى</translation> - </message> - <message> - <source>Account locked %1 minutes due to %2 fail attempts</source> diff -Nru ukui-biometric-auth-4.10.0.0/debian/patches/series ukui-biometric-auth-4.20.0.0/debian/patches/series --- ukui-biometric-auth-4.10.0.0/debian/patches/series 2024-04-23 10:31:46.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/debian/patches/series 2024-11-15 17:01:40.000000000 +0800 @@ -1,15 +1,2 @@ -0001-update-change.patch +0001-update-changelog.patch 0002-update-changelog.patch -0003-update-changelog.patch -0004-udpate-changelog.patch -0005-16-task-190787-UKUI-Kylin-biometric-auth-screensaver.patch -0006-COPYING-LICENSE.patch -0007-17.patch -0008-21.patch -0009-Added-translation-using-Weblate-Uyghur.patch -0010-Deleted-translation-using-Weblate-Kazakh.patch -0011-Deleted-translation-using-Weblate-Uyghur.patch -0012-Added-translation-using-Weblate-Uyghur.patch -0013-Translated-using-Weblate-Uyghur.patch -0014-Translated-using-Weblate-Uyghur.patch -0015-Translated-using-Weblate-Uyghur.patch diff -Nru ukui-biometric-auth-4.10.0.0/images/ukui-loginopt-finger.svg ukui-biometric-auth-4.20.0.0/images/ukui-loginopt-finger.svg --- ukui-biometric-auth-4.10.0.0/images/ukui-loginopt-finger.svg 2023-11-14 16:23:44.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/images/ukui-loginopt-finger.svg 2024-09-23 19:22:29.000000000 +0800 @@ -1 +1 @@ -<svg id="图层_1" data-name="图层 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 16 16"><defs><clipPath id="clip-path"><circle cx="8" cy="8" r="8" fill="none"/></clipPath></defs><g clip-path="url(#clip-path)"><path d="M8.2,4.33H8A2.3,2.3,0,0,0,5.73,5.91a3.59,3.59,0,0,0-.09,1.5,14.1,14.1,0,0,1-1.3,8.89.45.45,0,0,0,.18.61.54.54,0,0,0,.21.05.46.46,0,0,0,.4-.24,15,15,0,0,0,1.4-9.43,2.83,2.83,0,0,1,.06-1.11c.13-.4.41-.87,1.49-.95H8.2a1.26,1.26,0,0,1,1.24.85A11.83,11.83,0,0,1,10,8.35,8.18,8.18,0,0,1,10,9.58v.57a.85.85,0,0,1,0,.16.44.44,0,0,0,.38.5h.06a.45.45,0,0,0,.45-.39,1.51,1.51,0,0,0,0-.3V9.58a10.42,10.42,0,0,0-.07-1.36,13.39,13.39,0,0,0-.56-2.43A2.16,2.16,0,0,0,8.2,4.33Z" fill="#1a1a1a"/><path d="M8.05,1a6.57,6.57,0,0,0-1.23.12,5.81,5.81,0,0,0-4.6,6.76c.08.52.14,1,.21,1.57l.09.74a.44.44,0,0,0,.45.39H3a.44.44,0,0,0,.38-.5l-.09-.74c-.06-.53-.13-1.06-.21-1.6A4.91,4.91,0,0,1,7,2,5.33,5.33,0,0,1,8,1.9a5.33,5.33,0,0,1,3.8,1.69.43.43,0,0,0,.31.13.42.42,0,0,0,.32-.13.45.45,0,0,0,0-.64A6.15,6.15,0,0,0,8.05,1Z" fill="#1a1a1a"/><path d="M5.54,4.88h0M5.3,3.93a.49.49,0,0,0-.2,0,1.64,1.64,0,0,0-.58.56,4.38,4.38,0,0,0-.6,3.38,13.61,13.61,0,0,1-.11,5,9.55,9.55,0,0,1-1,2.68A.45.45,0,0,0,3,16.2a.42.42,0,0,0,.22.05A.45.45,0,0,0,3.64,16,10.4,10.4,0,0,0,4.69,13.1a14.69,14.69,0,0,0,.12-5.31,3.4,3.4,0,0,1,.44-2.72,1,1,0,0,1,.25-.28.46.46,0,0,0,.2-.61.45.45,0,0,0-.4-.25Z" fill="#1a1a1a"/><path d="M8.15,2.72a5.46,5.46,0,0,0-1.51.22.45.45,0,0,0-.31.56.43.43,0,0,0,.43.32h.12a4.42,4.42,0,0,1,1.25-.19,3.07,3.07,0,0,1,3,2.23,13.82,13.82,0,0,1,.57,4.41,19.75,19.75,0,0,1-.91,5.93,3.74,3.74,0,0,1-.18.48.44.44,0,0,0,.21.6.43.43,0,0,0,.19,0,.45.45,0,0,0,.41-.25c.09-.19.16-.39.23-.58a20.8,20.8,0,0,0,.95-6.22A14.66,14.66,0,0,0,12,5.56,3.93,3.93,0,0,0,8.15,2.72Z" fill="#1a1a1a"/><path d="M3,13.15H3m-.5-.69a.45.45,0,0,0-.4.25,2.37,2.37,0,0,0-.18.53,3,3,0,0,1-.1.32c-.07.16-.15.32-.23.49a6.25,6.25,0,0,0-.31.69.45.45,0,0,0,.26.58.44.44,0,0,0,.16,0,.45.45,0,0,0,.42-.29,4.57,4.57,0,0,1,.28-.6c.09-.18.18-.36.25-.54a2.44,2.44,0,0,0,.14-.44,1.89,1.89,0,0,1,.12-.36.46.46,0,0,0-.21-.61.45.45,0,0,0-.2,0Z" fill="#1a1a1a"/><path d="M13.25,4.89h-.1a.46.46,0,0,0-.34.54,22.64,22.64,0,0,1,.58,5.38,18,18,0,0,1-.66,4.74l0,.14v0a.45.45,0,0,0,.05.57.46.46,0,0,0,.33.13.47.47,0,0,0,.31-.12.81.81,0,0,0,.21-.46.15.15,0,0,1,0-.07,18.82,18.82,0,0,0,.69-5,23.9,23.9,0,0,0-.6-5.59.45.45,0,0,0-.44-.34Z" fill="#1a1a1a"/><path d="M10.35,11.43a.44.44,0,0,0-.45.39,17.13,17.13,0,0,1-1.28,5.06.45.45,0,0,0,.22.6.43.43,0,0,0,.19,0,.45.45,0,0,0,.41-.26,18.25,18.25,0,0,0,1.35-5.33.45.45,0,0,0-.39-.5Z" fill="#1a1a1a"/><path d="M8,15.61H8m-.49-.69a.46.46,0,0,0-.41.26l-.64,1.37a.45.45,0,0,0,.21.6.46.46,0,0,0,.19,0,.44.44,0,0,0,.41-.26l.64-1.37A.44.44,0,0,0,7.71,15a.49.49,0,0,0-.19-.05Z" fill="#1a1a1a"/><path d="M8.06,6.56H8a.46.46,0,0,0-.37.52,17.57,17.57,0,0,1-.07,6.52.45.45,0,0,0,.35.53H8a.44.44,0,0,0,.44-.35A18.12,18.12,0,0,0,8.5,6.93a.43.43,0,0,0-.44-.37Z" fill="#1a1a1a"/></g></svg> \ No newline at end of file +<svg id="图层_1" data-name="图层 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><defs><style>.cls-1{fill:#262626;}</style></defs><path class="cls-1" d="M2.79,13.45a2.53,2.53,0,0,1,.12-.36.46.46,0,0,0-.21-.61H2.5v0a.46.46,0,0,0-.4.25,2.19,2.19,0,0,0-.17.49,6.9,6.9,0,0,0,.71.72v0A2.25,2.25,0,0,0,2.79,13.45Z"/><path class="cls-1" d="M10.4,11.39l-.05,0a.44.44,0,0,0-.45.39A16.89,16.89,0,0,1,9,15.93a6.54,6.54,0,0,0,1-.19,18.07,18.07,0,0,0,.81-3.85A.44.44,0,0,0,10.4,11.39Z"/><path class="cls-1" d="M7.71,15A.41.41,0,0,0,7.52,15v0a.46.46,0,0,0-.41.26l-.33.72c.3,0,.61.07.92.08l.22-.46A.43.43,0,0,0,7.71,15Z"/><path class="cls-1" d="M6.53,7.29a3,3,0,0,1,.06-1.11c.13-.4.41-.87,1.49-.95H8.2a1.25,1.25,0,0,1,1.24.85A12,12,0,0,1,10,8.35a8.42,8.42,0,0,1,0,1.23v.57a.43.43,0,0,1,0,.16.44.44,0,0,0,.37.5h.07a.45.45,0,0,0,.45-.39,1.5,1.5,0,0,0,0-.3V9.58a10.33,10.33,0,0,0-.07-1.36,13.39,13.39,0,0,0-.56-2.43A2.15,2.15,0,0,0,8.2,4.33H8A2.31,2.31,0,0,0,5.73,5.91a3.46,3.46,0,0,0-.09,1.5,14.16,14.16,0,0,1-.85,7.91,8.36,8.36,0,0,0,.83.32A15,15,0,0,0,6.53,7.29Z"/><path class="cls-1" d="M12.43,3A6.14,6.14,0,0,0,8.05,1a6.41,6.41,0,0,0-1.23.12,5.81,5.81,0,0,0-4.6,6.76c.08.52.14,1,.21,1.57l.09.74a.44.44,0,0,0,.45.39H3a.44.44,0,0,0,.38-.49h0l-.09-.74c-.06-.53-.13-1.06-.21-1.6A4.92,4.92,0,0,1,7,2H7a5.56,5.56,0,0,1,1-.1,5.38,5.38,0,0,1,3.8,1.69.44.44,0,0,0,.31.13.42.42,0,0,0,.32-.13.45.45,0,0,0,0-.64Z"/><path class="cls-1" d="M4.81,7.79a3.43,3.43,0,0,1,.44-2.72,1,1,0,0,1,.25-.28.46.46,0,0,0,.2-.61.46.46,0,0,0-.4-.25.67.67,0,0,0-.2,0,1.64,1.64,0,0,0-.58.56,4.38,4.38,0,0,0-.6,3.38,13.56,13.56,0,0,1-.11,5,9.89,9.89,0,0,1-.5,1.6A7.11,7.11,0,0,0,4.1,15a10.26,10.26,0,0,0,.59-1.88A14.81,14.81,0,0,0,4.81,7.79Z"/><path class="cls-1" d="M12,5.56A3.93,3.93,0,0,0,8.15,2.72a5.51,5.51,0,0,0-1.51.22.45.45,0,0,0-.31.55h0a.43.43,0,0,0,.43.32h.12a4.46,4.46,0,0,1,1.25-.19,3.07,3.07,0,0,1,3,2.23,13.72,13.72,0,0,1,.57,4.41A19.83,19.83,0,0,1,11,15.41a8.06,8.06,0,0,0,1.06-.53,20.79,20.79,0,0,0,.53-4.65A14.73,14.73,0,0,0,12,5.56Z"/><path class="cls-1" d="M13.72,5.15a.45.45,0,0,0-.44-.34l0,.08h-.1a.46.46,0,0,0-.34.54,22.63,22.63,0,0,1,.58,5.38,18.5,18.5,0,0,1-.35,3.4,7.35,7.35,0,0,0,1.12-1.11,18.59,18.59,0,0,0,.16-2.36A23.88,23.88,0,0,0,13.72,5.15Z"/><path class="cls-1" d="M8.06,6.56H8a.46.46,0,0,0-.37.52,17.65,17.65,0,0,1-.07,6.52.45.45,0,0,0,.35.53H8a.44.44,0,0,0,.44-.35A17.94,17.94,0,0,0,8.5,6.93.43.43,0,0,0,8.06,6.56Z"/></svg> \ No newline at end of file diff -Nru ukui-biometric-auth-4.10.0.0/pam-biometric/biotest.c ukui-biometric-auth-4.20.0.0/pam-biometric/biotest.c --- ukui-biometric-auth-4.10.0.0/pam-biometric/biotest.c 2023-11-14 16:23:44.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/pam-biometric/biotest.c 2024-09-23 19:22:29.000000000 +0800 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018 Tianjin KYLIN Information Technology Co., Ltd. + * Copyright (C) 2023 KylinSoftCo., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff -Nru ukui-biometric-auth-4.10.0.0/pam-biometric/data/org.freedesktop.plicykit.pkexec.bioctl-helper.policy.in ukui-biometric-auth-4.20.0.0/pam-biometric/data/org.freedesktop.plicykit.pkexec.bioctl-helper.policy.in --- ukui-biometric-auth-4.10.0.0/pam-biometric/data/org.freedesktop.plicykit.pkexec.bioctl-helper.policy.in 2023-11-14 16:23:44.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/pam-biometric/data/org.freedesktop.plicykit.pkexec.bioctl-helper.policy.in 2024-09-23 19:22:29.000000000 +0800 @@ -6,11 +6,17 @@ <action id="org.freedesktop.policykit.pkexec.bioctl"> <description>Run the biometric authentication control tool</description> - <description xml:lang="zh">运行生物识别认证控制工具</description> + <description xml:lang="zh_CN">运行生物识别认证控制工具</description> <description xml:lang="bo">འཁོར་སྐྱོད་སྐྱེ་དངོས་ཀྱི་ངོས་འཛིན་ཁས་ལེན་ཚོད་འཛིན་ཡོ་བྱད།།</description> + <description xml:lang="mn">ᠠᠵᠢᠯᠯᠠᠭᠠᠨ ᠤ ᠠᠮᠢᠳᠤ ᠪᠣᠳᠠᠰ ᠢ ᠢᠯᠭᠠᠨ ᠲᠠᠨᠢᠵᠤ ᠭᠡᠷᠡᠴᠢᠯᠡᠬᠦ ᠡᠵᠡᠮᠳᠡᠯ ᠦᠨ ᠪᠠᠭᠠᠵᠢ ᠶᠢ ᠢᠯᠭᠠᠨ ᠲᠠᠨᠢᠬᠤ ᠬᠡᠷᠡᠭᠲᠡᠶ ᠃</description> + <description xml:lang="zh_HK">運行生物識別認證控制工具</description> + <description xml:lang="uy">بىئولوگىيەلىك پەرقلەندۈرۈش ئىسپاتلاش كونترول قىلىش قورالى</description> <message>Authentication is required to enable or disable biometric authentication</message> - <message xml:lang="zh">开启或关闭生物识别认证需要进行身份验证</message> + <message xml:lang="zh_CN">开启或关闭生物识别认证需要进行身份验证</message> <message xml:lang="bo">སྒོ་རྒྱག་པའམ་ཡང་ན་སྒོ་རྒྱག་པའི་སྐྱེ་དངོས་ངོས་འཛིན་བདེན་དཔངར་སྤྲོད་བྱེད་པར་ཐོབ་ཐང་གི་ཚོད་ལྟསར་སྤྲོད་བྱ་དགོས།</message> + <message xml:lang="mn">ᠠᠮᠢᠳᠤ ᠪᠣᠳᠠᠰ ᠢ ᠢᠯᠭᠠᠨ ᠲᠠᠨᠢᠬᠤ ᠭᠡᠷᠡᠴᠢᠯᠡᠭᠡ ᠶᠢ ᠨᠡᠭᠡᠭᠡᠬᠦ ᠪᠤᠶᠤ ᠬᠠᠭᠠᠬᠤ ᠳᠤ ᠪᠡᠶᠡ ᠶᠢᠨ ᠭᠠᠷᠤᠯ ᠤᠨ ᠭᠡᠷᠡᠴᠢᠯᠡᠯ ᠬᠢᠬᠦ ᠴᠢᠬᠤᠯᠠ ᠲᠠᠶ ᠪᠠᠶᠢᠨᠠ᠃</message> + <message xml:lang="zh_HK">開啟或關閉生物識別認證需要進行身份驗證</message> + <message xml:lang="uy">بىئولوگىيەلىك پەرقلەندۈرۈش ئىسپاتىنى ئېچىش ياكى تاقاش ئۈچۈن دەلىللەش كېرەك</message> <icon_name>stock_person</icon_name> <defaults> <allow_any>no</allow_any> diff -Nru ukui-biometric-auth-4.10.0.0/pam-biometric/data/org.freedesktop.plicykit.pkexec.biodrvctl.policy.in ukui-biometric-auth-4.20.0.0/pam-biometric/data/org.freedesktop.plicykit.pkexec.biodrvctl.policy.in --- ukui-biometric-auth-4.10.0.0/pam-biometric/data/org.freedesktop.plicykit.pkexec.biodrvctl.policy.in 2023-11-14 16:23:44.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/pam-biometric/data/org.freedesktop.plicykit.pkexec.biodrvctl.policy.in 2024-09-23 19:22:29.000000000 +0800 @@ -6,11 +6,17 @@ <action id="org.freedesktop.policykit.pkexec.biodrvctl"> <description>Run the biometric device driver control tool</description> - <description xml:lang="zh">运行生物识别设备驱动控制工具</description> + <description xml:lang="zh_CN">运行生物识别设备驱动控制工具</description> <description xml:lang="bo">སྐྱ་དངོས་དབྱེ་འབྱེད་སྒྲག་ཆས་ཀྱི་ཁ་ལོ་བའི་ཚོད་འཛིན་ཡོ་བྱད་</description> + <description xml:lang="mn">ᠠᠮᠢᠳᠤ ᠪᠣᠳᠠᠰ ᠢ ᠢᠯᠭᠠᠨ ᠲᠠᠨᠢᠬᠤ ᠲᠥᠬᠥᠭᠡᠷᠦᠮᠵᠢ ᠪᠡᠷ ᠬᠥᠳᠡᠯᠭᠡᠭᠦᠷ ᠪᠣᠯᠭᠠᠬᠤ ᠡᠵᠡᠮᠳᠡᠯ ᠦᠨ ᠪᠠᠭᠠᠵᠢ ᠶᠢ ᠠᠵᠢᠯᠯᠠᠭᠤᠯᠤᠨᠠ ᠃</description> + <description xml:lang="zh_HK">運行生物識別設備驅動控制工具</description> + <description xml:lang="uy">بىئولوگىيەلىك پەرقلەندۈرۈش ئۈسكۈنىسىنى قوزغىتىش كونترول قىلىش ئەسۋابىنى يۈرگۈزۈش</description> <message>Authentication is required to change the status of biometric device's driver</message> - <message xml:lang="zh">改变生物识别设备驱动状态需要进行身份验证</message> - <message xml:lang="bo">སྐྱ་དངོས་དབྱེ་འབྱེད་སྒྲག་ཆས་ཀྱི་ཁ་ལོ་བའི་གནས་ཚུལ་ལ་འགྱུར་ལྡོག་གཏོང་བར་བདེན་དཔང་ར་སྤྲད་བྱ་དགོས།</message> + <message xml:lang="zh_CN">改变生物识别设备驱动状态需要进行身份验证</message> + <message xml:lang="bo">སྐྱ་དངོས་དབྱེ་འབྱེད་སྒྲག་ཆས་ཀྱི་ཁ་ལོ་བའི་གནས་ཚུལ་ལ་འགྱུར་ལྡོག་གཏོང་བར་བདེན་དཔང་ར་སྤྲད་བྱ་དགོས།</message> + <message xml:lang="mn">ᠠᠮᠢᠳᠤ ᠪᠣᠳᠠᠰ ᠢ ᠢᠯᠭᠠᠨ ᠲᠠᠨᠢᠬᠤ ᠲᠥᠬᠥᠭᠡᠷᠦᠮᠵᠢ ᠶᠢᠨ ᠬᠥᠳᠡᠯᠭᠡᠭᠦᠷ ᠪᠣᠯᠭᠠᠬᠤ ᠪᠠᠶᠢᠳᠠᠯ ᠢ ᠬᠤᠪᠢᠷᠠᠭᠤᠯᠬᠤ ᠳᠤ ᠪᠡᠶᠡ ᠶᠢᠨ ᠭᠠᠷᠤᠯ ᠤᠨ ᠭᠡᠷᠡᠴᠢᠯᠡᠯ ᠬᠢᠬᠦ ᠴᠢᠬᠤᠯᠠ ᠲᠠᠶ ᠪᠠᠶᠢᠬᠤ ᠬᠡᠷᠡᠭᠲᠡᠶ᠃</message> + <message xml:lang="zh_HK">改變生物識別設備驅動狀態需要進行身份驗證</message> + <message xml:lang="uy">بىئولوگىيەلىك پەرقلەندۈرۈش ئۈسكۈنىسىنىڭ قوزغىتىش ھالىتىنى ئۆزگەرتىشتە دەلىللەش كېرەك</message> <icon_name>stock_person</icon_name> <defaults> <allow_any>auth_admin</allow_any> @@ -21,3 +27,4 @@ </action> </policyconfig> + diff -Nru ukui-biometric-auth-4.10.0.0/pam-biometric/data/org.freedesktop.plicykit.pkexec.biorestart.policy.in ukui-biometric-auth-4.20.0.0/pam-biometric/data/org.freedesktop.plicykit.pkexec.biorestart.policy.in --- ukui-biometric-auth-4.10.0.0/pam-biometric/data/org.freedesktop.plicykit.pkexec.biorestart.policy.in 2023-11-14 16:23:44.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/pam-biometric/data/org.freedesktop.plicykit.pkexec.biorestart.policy.in 2024-09-23 19:22:29.000000000 +0800 @@ -6,11 +6,17 @@ <action id="org.freedesktop.policykit.pkexec.biorestart"> <description>Restart Service</description> - <description xml:lang="zh">重启生物特征服务</description> + <description xml:lang="zh_CN">重启生物特征服务</description> <description xml:lang="bo">བསྐྱར་དུ་ཞབས་འདེགས་ཞུ་བ</description> + <description xml:lang="mn">ᠠᠮᠢᠳᠤ ᠪᠣᠳᠠᠰ ᠤᠨ ᠣᠨᠴᠠᠯᠢᠭ ᠤᠨ ᠦᠢᠯᠡᠴᠢᠯᠡᠭᠡ ᠶᠢ ᠳᠠᠬᠢᠨ ᠡᠭᠢᠯᠡᠭᠦᠯᠪᠡ᠃</description> <message>Authentication is required to restart biometric service</message> - <message xml:lang="zh">重启生物特征服务需要身份验证</message> - <message xml:lang="bo">སྐྱ་དངོས་དབྱེ་འབྱེད་ཞབས་ཞུ་སླར་གསོ་བྱེད་པར་བདེན་དཔང་ར་སྤྲད་བྱ་དགོས།</message> + <description xml:lang="zh_HK">重啟生物特徵服務</description> + <description xml:lang="uy">بىئولوگىيەلىك ئالاھىدىلىك مۇلازىمىتىنى قايتىدىن قوزغىتىش</description> + <message xml:lang="zh_CN">重启生物特征服务需要身份验证</message> + <message xml:lang="bo">སྐྱ་དངོས་དབྱེ་འབྱེད་ཞབས་ཞུ་སླར་གསོ་བྱེད་པར་བདེན་དཔང་ར་སྤྲད་བྱ་དགོས།</message> + <message xml:lang="mn">ᠠᠮᠢᠳᠤ ᠪᠣᠳᠠᠰ ᠤᠨ ᠣᠨᠴᠠᠯᠢᠭ ᠰᠢᠨᠵᠢ ᠲᠡᠮᠳᠡᠭ ᠦᠨ ᠦᠢᠯᠡᠴᠢᠯᠡᠭᠡ ᠶᠢ ᠳᠠᠬᠢᠨ ᠰᠡᠩᠬᠡᠷᠡᠭᠦᠯᠬᠦ ᠳᠦ ᠪᠡᠶᠡ ᠶᠢᠨ ᠭᠠᠷᠤᠯ ᠢ ᠰᠢᠯᠭᠠᠨ ᠭᠡᠷᠡᠴᠢᠯᠡᠬᠦ ᠴᠢᠬᠤᠯᠠ ᠲᠠᠶ ᠪᠠᠶᠢᠨᠠ ᠃</message> + <message xml:lang="uy">بىئولوگىيەلىك ئالاھىدىلىك مۇلازىمىتىنى قايتىدىن قوزغىتىش ئۈچۈن دەلىللەش كېرەك </message> + <message xml:lang="zh_HK">重啟生物特徵服務需要身份驗證</message> <icon_name>stock_person</icon_name> <defaults> <allow_any>auth_admin</allow_any> @@ -21,3 +27,4 @@ </action> </policyconfig> + diff -Nru ukui-biometric-auth-4.10.0.0/pam-biometric/data/ukui-biometric.conf ukui-biometric-auth-4.20.0.0/pam-biometric/data/ukui-biometric.conf --- ukui-biometric-auth-4.10.0.0/pam-biometric/data/ukui-biometric.conf 2023-11-14 16:23:44.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/pam-biometric/data/ukui-biometric.conf 2024-09-23 19:22:29.000000000 +0800 @@ -8,6 +8,7 @@ UseFirstDevice=true MaxFailedTimes=5 HiddenSwitchButton=false +FaceTimeoutTimes=1 [Functions] EnableQRCode=true diff -Nru ukui-biometric-auth-4.10.0.0/pam-biometric/logger.c ukui-biometric-auth-4.20.0.0/pam-biometric/logger.c --- ukui-biometric-auth-4.10.0.0/pam-biometric/logger.c 2023-11-14 16:23:44.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/pam-biometric/logger.c 2024-09-23 19:22:29.000000000 +0800 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018 Tianjin KYLIN Information Technology Co., Ltd. + * Copyright (C) 2023 KylinSoftCo., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff -Nru ukui-biometric-auth-4.10.0.0/pam-biometric/pam_biometric.c ukui-biometric-auth-4.20.0.0/pam-biometric/pam_biometric.c --- ukui-biometric-auth-4.10.0.0/pam-biometric/pam_biometric.c 2023-11-14 16:23:44.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/pam-biometric/pam_biometric.c 2024-09-23 19:22:29.000000000 +0800 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018 Tianjin KYLIN Information Technology Co., Ltd. + * Copyright (C) 2023 KylinSoftCo., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -463,6 +463,28 @@ if (stdout_pidof) g_free(stdout_pidof); g_ptr_array_free (args_pidof, TRUE); + + //如果ukui-greeter进程不存在,进而判断ukui-screensaver-backend进程 + args_pidof = g_ptr_array_new (); + g_ptr_array_add(args_pidof, (gpointer)"/usr/bin/pidof"); + g_ptr_array_add(args_pidof, (gpointer)"ukui-screensaver-backend"); + g_ptr_array_add(args_pidof, NULL); + + if (!g_spawn_sync(NULL, (char**)args_pidof->pdata, NULL, G_SPAWN_STDERR_TO_DEV_NULL, NULL, NULL, &stdout_pidof, NULL, NULL, NULL)) { + if (stdout_pidof) + g_free(stdout_pidof); + g_ptr_array_free (args_pidof, TRUE); + } + + if (stdout_pidof) { + if (strlen(stdout_pidof) > 0 && atoi(stdout_pidof) > 0) { + g_strlcpy(buf, "ukui-screensaver-backend", len); + } + g_free(stdout_pidof); + } + + g_ptr_array_free (args_pidof, TRUE); + return ; } if (stdout_pidof) { @@ -668,7 +690,7 @@ get_greeter_session(buf, sizeof(buf)); pam_logger("current greeter: %s\n", buf); - if(strcmp(buf, "ukui-greeter") == 0 || strcmp(buf, "ukui-greeter-wayland") == 0) + if(strcmp(buf, "ukui-greeter") == 0 || strcmp(buf, "ukui-greeter-wayland") == 0 || strcmp(buf, "ukui-session") == 0 || strcmp(buf,"ukui-screensaver-backend")) return biometric_auth_embeded(pamh); // else // return biometric_auth_independent(pamh, "lightdm", 1); diff -Nru ukui-biometric-auth-4.10.0.0/polkit-agent/CMakeLists.txt ukui-biometric-auth-4.20.0.0/polkit-agent/CMakeLists.txt --- ukui-biometric-auth-4.10.0.0/polkit-agent/CMakeLists.txt 2023-11-14 16:23:44.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/polkit-agent/CMakeLists.txt 2024-09-23 19:22:29.000000000 +0800 @@ -3,9 +3,12 @@ pkg_check_modules(QGS REQUIRED gsettings-qt) pkg_check_modules(KDKINFO REQUIRED kysdk-sysinfo) +pkg_check_modules(KYSDKWAYLANDHELPER_PKG REQUIRED kysdk-waylandhelper) find_package(PolkitQt5-1 REQUIRED 0.103.0) find_package(Qt5 COMPONENTS Core Widgets DBus X11Extras Xml Network Svg) +find_package(KF5WindowSystem) +find_package(X11 REQUIRED) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTORCC ON) @@ -58,10 +61,14 @@ ) add_executable(polkit-ukui-authentication-agent-1 ${polkit_SRCS}) +target_include_directories(polkit-ukui-authentication-agent-1 PRIVATE ${KYSDKWAYLANDHELPER_PKG_INCLUDE_DIRS}) +target_link_directories(polkit-ukui-authentication-agent-1 PRIVATE ${KYSDKWAYLANDHELPER_PKG_LIBRARY_DIRS}) target_link_libraries(polkit-ukui-authentication-agent-1 Qt5::Core Qt5::Widgets Qt5::DBus ${EXTRA_LIBS} ${POLKITQT-1_LIBRARIES} + ${KYSDKWAYLANDHELPER_PKG_LIBRARIES} BioAuthWidgets + KF5::WindowSystem -lrt -lukui-log4qt ) diff -Nru ukui-biometric-auth-4.10.0.0/polkit-agent/data/polkit-ukui-authentication-agent-1.desktop.in ukui-biometric-auth-4.20.0.0/polkit-agent/data/polkit-ukui-authentication-agent-1.desktop.in --- ukui-biometric-auth-4.10.0.0/polkit-agent/data/polkit-ukui-authentication-agent-1.desktop.in 2023-11-14 16:23:44.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/polkit-agent/data/polkit-ukui-authentication-agent-1.desktop.in 2024-09-23 19:22:29.000000000 +0800 @@ -36,6 +36,9 @@ Name[x-test]=xxPolicyKit Authentication Agentxx Name[zh_CN]=PolicyKit 认证代理 Name[zh_TW]=PolicyKit 認證代理程式 +Name[ug_CN]=PolicyKit ئىسپات ۋاكالەتچىلىكى +Name[kk_KZ]=PolicyKit دالەل ۆاكىلى +Name[ky_KG]=PolicyKit ىسپات ۋاكالەتچىلىكى Comment=PolicyKit Authentication Agent Comment[ca]=Agent d'autenticació del PolicyKit Comment[ca@valencia]=Agent d'autenticació del PolicyKit diff -Nru ukui-biometric-auth-4.10.0.0/polkit-agent/i18n_ts/bo.ts ukui-biometric-auth-4.20.0.0/polkit-agent/i18n_ts/bo.ts --- ukui-biometric-auth-4.10.0.0/polkit-agent/i18n_ts/bo.ts 2023-11-14 16:23:44.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/polkit-agent/i18n_ts/bo.ts 2024-09-23 19:22:29.000000000 +0800 @@ -9,185 +9,205 @@ <translation type="unfinished"></translation> </message> <message> - <location filename="../src/mainwindow.ui" line="302"/> - <location filename="../src/mainwindow.cpp" line="882"/> - <location filename="../src/mainwindow.cpp" line="948"/> + <location filename="../src/mainwindow.ui" line="409"/> + <location filename="../src/mainwindow.cpp" line="1075"/> + <location filename="../src/mainwindow.cpp" line="1143"/> <source>Biometric</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/mainwindow.ui" line="373"/> + <location filename="../src/mainwindow.ui" line="480"/> <source>use password</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/mainwindow.ui" line="334"/> - <location filename="../src/mainwindow.cpp" line="884"/> + <location filename="../src/mainwindow.ui" line="441"/> + <location filename="../src/mainwindow.cpp" line="1077"/> <source>Cancel</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/mainwindow.ui" line="353"/> - <location filename="../src/mainwindow.cpp" line="880"/> + <location filename="../src/mainwindow.ui" line="460"/> + <location filename="../src/mainwindow.cpp" line="1073"/> <source>Authenticate</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="65"/> + <location filename="../src/mainwindow.cpp" line="66"/> <source>Authentication</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="164"/> - <location filename="../src/mainwindow.cpp" line="1176"/> + <location filename="../src/mainwindow.cpp" line="105"/> + <source>Insert the ukey into the USB port</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="107"/> + <source>Enter the ukey password</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="226"/> + <location filename="../src/mainwindow.cpp" line="1415"/> + <location filename="../src/mainwindow.cpp" line="1417"/> <source>Failed to verify %1, please enter password to unlock</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="168"/> - <location filename="../src/mainwindow.cpp" line="1178"/> + <location filename="../src/mainwindow.cpp" line="231"/> + <location filename="../src/mainwindow.cpp" line="233"/> + <location filename="../src/mainwindow.cpp" line="1419"/> <source>Unable to verify %1, please enter password to unlock</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="175"/> + <location filename="../src/mainwindow.cpp" line="242"/> + <location filename="../src/mainwindow.cpp" line="246"/> <source>Failed to verify %1, you still have %2 verification opportunities</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="261"/> + <location filename="../src/mainwindow.cpp" line="335"/> <source>Please enter your password or enroll your fingerprint </source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="511"/> + <location filename="../src/mainwindow.cpp" line="665"/> <source>This operation requires the administrator's authorization. Please enter your password to allow this operation.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="517"/> + <location filename="../src/mainwindow.cpp" line="671"/> <source>A program is attempting to perform an action that requires privileges.It requires authorization to perform the action.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="578"/> + <location filename="../src/mainwindow.cpp" line="731"/> <source>Password: </source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="580"/> + <location filename="../src/mainwindow.cpp" line="733"/> <source>_Password: </source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="582"/> + <location filename="../src/mainwindow.cpp" line="735"/> <source>_Password:</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="623"/> - <location filename="../src/mainwindow.cpp" line="627"/> - <location filename="../src/mainwindow.cpp" line="631"/> - <location filename="../src/mainwindow.cpp" line="635"/> + <location filename="../src/mainwindow.cpp" line="779"/> + <location filename="../src/mainwindow.cpp" line="783"/> + <location filename="../src/mainwindow.cpp" line="787"/> + <location filename="../src/mainwindow.cpp" line="791"/> <source>Account locked,</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="623"/> + <location filename="../src/mainwindow.cpp" line="779"/> <source>days left</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="627"/> + <location filename="../src/mainwindow.cpp" line="783"/> <source>hours left</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="631"/> + <location filename="../src/mainwindow.cpp" line="787"/> <source>minutes left</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="635"/> + <location filename="../src/mainwindow.cpp" line="791"/> <source>seconds left</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="675"/> - <location filename="../src/mainwindow.cpp" line="676"/> + <location filename="../src/mainwindow.cpp" line="834"/> + <location filename="../src/mainwindow.cpp" line="835"/> <source>Password cannot be empty</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="886"/> - <location filename="../src/mainwindow.cpp" line="991"/> + <location filename="../src/mainwindow.cpp" line="880"/> + <location filename="../src/mainwindow.cpp" line="888"/> + <source>Input your password to authentication</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="1079"/> + <location filename="../src/mainwindow.cpp" line="1183"/> <source>Use password</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="1026"/> - <location filename="../src/mainwindow.cpp" line="1093"/> - <location filename="../src/mainwindow.cpp" line="1094"/> + <location filename="../src/mainwindow.cpp" line="1219"/> + <location filename="../src/mainwindow.cpp" line="1292"/> + <location filename="../src/mainwindow.cpp" line="1293"/> <source>Please try again in %1 minutes.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="1036"/> - <location filename="../src/mainwindow.cpp" line="1103"/> - <location filename="../src/mainwindow.cpp" line="1104"/> + <location filename="../src/mainwindow.cpp" line="1230"/> + <location filename="../src/mainwindow.cpp" line="1302"/> + <location filename="../src/mainwindow.cpp" line="1303"/> <source>Please try again in %1 seconds.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="1045"/> - <location filename="../src/mainwindow.cpp" line="1046"/> - <location filename="../src/mainwindow.cpp" line="1112"/> - <location filename="../src/mainwindow.cpp" line="1113"/> + <location filename="../src/mainwindow.cpp" line="1240"/> + <location filename="../src/mainwindow.cpp" line="1241"/> + <location filename="../src/mainwindow.cpp" line="1311"/> + <location filename="../src/mainwindow.cpp" line="1312"/> <source>Account locked permanently.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="1193"/> + <location filename="../src/mainwindow.cpp" line="1434"/> <source>Verify face recognition or enter password to unlock</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="1198"/> + <location filename="../src/mainwindow.cpp" line="1439"/> <source>Press fingerprint or enter password to unlock</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="1203"/> + <location filename="../src/mainwindow.cpp" line="1444"/> <source>Verify voiceprint or enter password to unlock</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="1208"/> + <location filename="../src/mainwindow.cpp" line="1449"/> <source>Verify finger vein or enter password to unlock</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="1213"/> + <location filename="../src/mainwindow.cpp" line="1454"/> <source>Verify iris or enter password to unlock</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="1218"/> + <location filename="../src/mainwindow.cpp" line="1459"/> <source>Use the bound wechat scanning code or enter the password to unlock</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="576"/> + <location filename="../src/mainwindow.cpp" line="108"/> + <location filename="../src/mainwindow.cpp" line="729"/> <source>Input Password</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="187"/> + <location filename="../src/mainwindow.cpp" line="259"/> <source>Abnormal network</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="691"/> + <location filename="../src/mainwindow.cpp" line="850"/> <source>Authentication failed, please try again.</source> <translation type="unfinished"></translation> </message> @@ -200,12 +220,12 @@ <translation type="unfinished"></translation> </message> <message> - <location filename="../src/PolkitListener.cpp" line="257"/> + <location filename="../src/PolkitListener.cpp" line="265"/> <source>Authentication failure, please try again.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/PolkitListener.cpp" line="264"/> + <location filename="../src/PolkitListener.cpp" line="272"/> <source>Password input error!</source> <translation type="unfinished"></translation> </message> diff -Nru ukui-biometric-auth-4.10.0.0/polkit-agent/i18n_ts/bo_CN.ts ukui-biometric-auth-4.20.0.0/polkit-agent/i18n_ts/bo_CN.ts --- ukui-biometric-auth-4.10.0.0/polkit-agent/i18n_ts/bo_CN.ts 2023-11-14 16:23:44.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/polkit-agent/i18n_ts/bo_CN.ts 2024-09-23 19:22:29.000000000 +0800 @@ -65,9 +65,9 @@ <context> <name>MainWindow</name> <message> - <location filename="../src/mainwindow.cpp" line="65"/> + <location filename="../src/mainwindow.cpp" line="66"/> <source>Authentication</source> - <translation>བདེན་དཔང་ར་སྤྲོད་</translation> + <translation>དབང་བསྐུར།</translation> </message> <message> <source>Fingerprint authentication failed, you still have %1 verification opportunities</source> @@ -91,16 +91,16 @@ <translation type="vanished">密码</translation> </message> <message> - <location filename="../src/mainwindow.ui" line="302"/> - <location filename="../src/mainwindow.cpp" line="882"/> - <location filename="../src/mainwindow.cpp" line="948"/> + <location filename="../src/mainwindow.ui" line="409"/> + <location filename="../src/mainwindow.cpp" line="1075"/> + <location filename="../src/mainwindow.cpp" line="1143"/> <source>Biometric</source> - <translation>སྐྱེ་དངོས་རིག་པ།</translation> + <translation>སྐྱེ་དངོས་དབྱེ་འབྱེད་བཀོལ་བ།</translation> </message> <message> - <location filename="../src/mainwindow.ui" line="373"/> + <location filename="../src/mainwindow.ui" line="480"/> <source>use password</source> - <translation>གསང་གྲངས་བེད་སྤྱོད་བྱ་དགོས</translation> + <translation>གསང་གྲངས་བེད་སྤྱོད་བྱ་དགོས།</translation> </message> <message> <source>DeviceType:</source> @@ -147,22 +147,22 @@ <translation type="vanished">Polkit.caller-pid:</translation> </message> <message> - <location filename="../src/mainwindow.ui" line="334"/> - <location filename="../src/mainwindow.cpp" line="884"/> + <location filename="../src/mainwindow.ui" line="441"/> + <location filename="../src/mainwindow.cpp" line="1077"/> <source>Cancel</source> <translation>ཕྱིར་འཐེན།</translation> </message> <message> - <location filename="../src/mainwindow.ui" line="353"/> - <location filename="../src/mainwindow.cpp" line="880"/> + <location filename="../src/mainwindow.ui" line="460"/> + <location filename="../src/mainwindow.cpp" line="1073"/> <source>Authenticate</source> - <translation>བདེན་དཔང་ར་སྤྲོད་བྱ་དགོས</translation> + <translation>དབང་བསྐུར་བ།</translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="886"/> - <location filename="../src/mainwindow.cpp" line="991"/> + <location filename="../src/mainwindow.cpp" line="1079"/> + <location filename="../src/mainwindow.cpp" line="1183"/> <source>Use password</source> - <translation>གསང་གྲངས་བེད་སྤྱོད་བྱ་དགོས</translation> + <translation>གསང་གྲངས་བེད་སྤྱོད་བྱ་དགོས།</translation> </message> <message> <source>Auth</source> @@ -185,30 +185,30 @@ <translation type="vanished">认证中,请稍等...</translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="1026"/> - <location filename="../src/mainwindow.cpp" line="1093"/> - <location filename="../src/mainwindow.cpp" line="1094"/> + <location filename="../src/mainwindow.cpp" line="1219"/> + <location filename="../src/mainwindow.cpp" line="1292"/> + <location filename="../src/mainwindow.cpp" line="1293"/> <source>Please try again in %1 minutes.</source> - <translation>ཁྱོད་ཀྱིས་ཡང་བསྐྱར་ཐེངས་གཅིག་ལ་ཚོད་ལྟ་ཞིག་བྱེད་རོགས།</translation> + <translation>%1ཡང་བསྐྱར་ཚོད་ལྟ་ཞིག་བྱེད་རོགས།</translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="1036"/> - <location filename="../src/mainwindow.cpp" line="1103"/> - <location filename="../src/mainwindow.cpp" line="1104"/> + <location filename="../src/mainwindow.cpp" line="1230"/> + <location filename="../src/mainwindow.cpp" line="1302"/> + <location filename="../src/mainwindow.cpp" line="1303"/> <source>Please try again in %1 seconds.</source> <translation>ཁྱོད་ཀྱིས་དུས་ཚོད་སྐར་ཆ་གཅིག་གི་ནང་དུ་ཡང་བསྐྱར་ཚོད་ལྟ་ཞིག་བྱེད་རོགས།</translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="1045"/> - <location filename="../src/mainwindow.cpp" line="1046"/> - <location filename="../src/mainwindow.cpp" line="1112"/> - <location filename="../src/mainwindow.cpp" line="1113"/> + <location filename="../src/mainwindow.cpp" line="1240"/> + <location filename="../src/mainwindow.cpp" line="1241"/> + <location filename="../src/mainwindow.cpp" line="1311"/> + <location filename="../src/mainwindow.cpp" line="1312"/> <source>Account locked permanently.</source> <translation>དུས་གཏན་དུ་ཟྭ་བརྒྱབ་པའི་རྩིས་ཐོ།</translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="675"/> - <location filename="../src/mainwindow.cpp" line="676"/> + <location filename="../src/mainwindow.cpp" line="834"/> + <location filename="../src/mainwindow.cpp" line="835"/> <source>Password cannot be empty</source> <translation>གསང་གྲངས་སྟོང་པ་ཡིན་མི་སྲིད།</translation> </message> @@ -221,7 +221,8 @@ <translation type="vanished">无法验证%1,请输入密码.</translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="175"/> + <location filename="../src/mainwindow.cpp" line="242"/> + <location filename="../src/mainwindow.cpp" line="246"/> <source>Failed to verify %1, you still have %2 verification opportunities</source> <translation>%1ལ་ཞིབ་བཤེར་བྱེད་མ་ཐུབ་ན། ཁྱེད་ཚོར་ད་དུང་%2ལ་ཞིབ་བཤེར་བྱེད་པའི་གོ་སྐབས་ཡོད།</translation> </message> @@ -230,44 +231,44 @@ <translation type="vanished">一个程序正试图执行一个需要特权的动作。要求授权以执行该动作。</translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="578"/> + <location filename="../src/mainwindow.cpp" line="731"/> <source>Password: </source> <translation>གསང་གྲངས་ནི། </translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="261"/> + <location filename="../src/mainwindow.cpp" line="335"/> <source>Please enter your password or enroll your fingerprint </source> - <translation>ཁྱེད་ཀྱི་གསང་གྲངས་ནང་འཇུག་བྱེད་པའམ་ཡང་ན་ཁྱེད་ཀྱི་མཛུབ་རིས </translation> + <translation>ཁྱེད་ཀྱི་གསང་གྲངས་ནང་འཇུག་བྱེད་པའམ་ཡང་ན་ཁྱེད་ཀྱི་མཛུབ་རིས་ནང་འཇུག་བྱེད་པ། </translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="187"/> + <location filename="../src/mainwindow.cpp" line="259"/> <source>Abnormal network</source> - <translation>རྒྱུན་ལྡན་མིན་པའི་དྲ་</translation> + <translation>རྒྱུན་ལྡན་མིན་པའི་དྲ་བ།</translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="511"/> + <location filename="../src/mainwindow.cpp" line="665"/> <source>This operation requires the administrator's authorization. Please enter your password to allow this operation.</source> - <translation>བྱ་སྤྱོད་འདི་ལ་དོ་དམ་པས་དབང་ཆ་སྤྲོད་དགོས། ཁྱེད་ཀྱི་གསང་གྲངས་ནང་དུ་བཅུག་ནས་གཤག་བཅོས་འདི་བྱེད་དུ་འཇུག་རོགས།</translation> + <translation>ཐེངས་འདིའི་བཀོལ་སྤྱོད་ལ་དོ་དམ་པའི་དབང་ཆ་ཐོབ་ན་ད་གཟོད་མུ་མཐུད་དུ་ལག་བསྟར་བྱེད་ཐུབ།གསང་གྲངས་ནང་འཇུག་བྱས་ནས་ཐེངས་འདིའི་བཀོལ་སྤྱོད་བྱེད་ཆོག</translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="580"/> + <location filename="../src/mainwindow.cpp" line="733"/> <source>_Password: </source> - <translation>_Password་ནི། </translation> + <translation>གསང་གྲངས། </translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="582"/> + <location filename="../src/mainwindow.cpp" line="735"/> <source>_Password:</source> - <translation>_Password་ནི།</translation> + <translation>གསང་གྲངས།:</translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="691"/> + <location filename="../src/mainwindow.cpp" line="850"/> <source>Authentication failed, please try again.</source> - <translation>བདེན་དཔང་ར་སྤྲོད་བྱེད་མ་ཐུབ་པས་ཁྱེད་ཀྱིས་ཡང་བསྐྱར་ཚོད་ལྟ་ཞིག་བྱེད་</translation> + <translation>བདེན་དཔང་ར་སྤྲོད་ལ་ཕམ་ཁ་བྱུང་བས་ཡང་བསྐྱར་ཚོད་ལྟ་བྱོས།</translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="623"/> + <location filename="../src/mainwindow.cpp" line="779"/> <source>days left</source> - <translation>ཉིན་ཁ་ཤས་ལས་ལྷག་མེད</translation> + <translation>གནམ་རྒྱབ་ཟྭ་འབྱེད།</translation> </message> <message> <source>Biometric/code scan authentication failed too many times, please enter the password.</source> @@ -278,14 +279,16 @@ <translation type="vanished">生物/扫码验证失败,您还有%1次尝试机会</translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="164"/> - <location filename="../src/mainwindow.cpp" line="1176"/> + <location filename="../src/mainwindow.cpp" line="226"/> + <location filename="../src/mainwindow.cpp" line="1415"/> + <location filename="../src/mainwindow.cpp" line="1417"/> <source>Failed to verify %1, please enter password to unlock</source> <translation>%1ལ་ཞིབ་བཤེར་བྱེད་མ་ཐུབ་ན། གསང་གྲངས་ནང་འཇུག་བྱས་ནས་ཟྭ་རྒྱག་རོགས།</translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="168"/> - <location filename="../src/mainwindow.cpp" line="1178"/> + <location filename="../src/mainwindow.cpp" line="231"/> + <location filename="../src/mainwindow.cpp" line="233"/> + <location filename="../src/mainwindow.cpp" line="1419"/> <source>Unable to verify %1, please enter password to unlock</source> <translation>%1ལ་ཞིབ་བཤེར་བྱེད་ཐབས་བྲལ་བ་དང་། གསང་གྲངས་ནང་འཇུག་བྱས་ནས་ཟྭ་རྒྱག་རོགས།</translation> </message> @@ -294,79 +297,86 @@ <translation type="vanished">网络异常</translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="517"/> + <location filename="../src/mainwindow.cpp" line="671"/> <source>A program is attempting to perform an action that requires privileges.It requires authorization to perform the action.</source> - <translation>གོ་རིམ་ཞིག་གིས་དམིགས་བསལ་དབང་ཆ་དགོས་པའི་བྱ་སྤྱོད་ཅིག་སྤེལ་རྩིས་བྱེད་བཞིན་ཡོད། དེས་བྱ་སྤྱོད་སྤེལ་བའི་དབང་ཆ་སྤྲོད་དགོས།</translation> + <translation>གོ་རིམ་ཞིག་གིས་ཁྱད་དབང་དགོས་པའི་འགུལ་སྟངས་ཤིག་ལག་བསྟར་བྱེད་པར་ཚོད་ལྟ་བྱེད་བཞིན་ཡོད་པ་དང་།་འགུལ་སྟངས་འདི་ལག་བསྟར་བྱེད་པའི་དབང་ཆ་སྤྲོད་དགོས་པའི་རེ་བ་བཏོན།</translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="576"/> + <location filename="../src/mainwindow.cpp" line="108"/> + <location filename="../src/mainwindow.cpp" line="729"/> <source>Input Password</source> <translation>ནང་འཇུག་གི་གསང་གྲངས།</translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="104"/> + <location filename="../src/mainwindow.cpp" line="105"/> <source>Insert the ukey into the USB port</source> <translation>བདེ་འཇགས་ཀྱི་གསང་བའི་ལྡེ་མིག་དེ་USBཡི་སྣེ་འདྲེན་དུ་འཇུག་རོགས།</translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="106"/> + <location filename="../src/mainwindow.cpp" line="107"/> <source>Enter the ukey password</source> <translation>གསང་བའི་ཨང་གྲངས་ནང་འཇུག་བྱེད་པ།</translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="764"/> + <location filename="../src/mainwindow.cpp" line="783"/> <source>hours left</source> <translation>དུས་ཚོད་འགའ་ལས་ལྷག་མེད</translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="631"/> + <location filename="../src/mainwindow.cpp" line="787"/> <source>minutes left</source> - <translation>སྐར་མ་འགའ་ལས་ལྷག་མེད</translation> + <translation>སྐར་མ་རྗེས་ནས་ཟྭ་ཕྱེ།</translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="635"/> + <location filename="../src/mainwindow.cpp" line="791"/> <source>seconds left</source> - <translation>གཡོན་ཕྱོགས་ཀྱི་དུས་ཚོད་སྐར་ཆ</translation> + <translation>སྐར་ཆའི་རྗེས་ནས་ཟྭ་ཕྱེ་བ།</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="880"/> + <location filename="../src/mainwindow.cpp" line="888"/> + <source>Input your password to authentication</source> + <translation>གསང་བའི་ཨང་གྲངས་ནང་འཇུག་བྱེད་དབང་ཡོད།</translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="1193"/> + <location filename="../src/mainwindow.cpp" line="1434"/> <source>Verify face recognition or enter password to unlock</source> - <translation>ངོ་གདོང་ངོས་འཛིན་ལ་ཞིབ་བཤེར་བྱེད་པའམ་ཡང་ན་གསང་གྲངས་ནང་</translation> + <translation>དཔང་མིའི་གདོང་ལ་ཞིབ་བཤེར་བྱེད་པའམ་ཡང་ན་གསང་གྲངས་བསྣན་ནས་ཟྭ་འབྱེད་པ།</translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="1198"/> + <location filename="../src/mainwindow.cpp" line="1439"/> <source>Press fingerprint or enter password to unlock</source> - <translation>མཛུབ་རིས་མནན་པའམ་ཡང་ན་གསང་གྲངས་ནང་འཇུག་བྱས་ནས་</translation> + <translation>མཛུབ་རིས་མནན་པའམ་ཡང་ན་གསང་གྲངས་བསྣན་ནས་ཟྭ་འབྱེད་པ།</translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="1203"/> + <location filename="../src/mainwindow.cpp" line="1444"/> <source>Verify voiceprint or enter password to unlock</source> - <translation>སྒྲ་པར་ཞིབ་བཤེར་བྱེད་པའམ་ཡང་ན་གསང་གྲངས་ནང་འཇུག་བྱས་ནས་ཟྭ་རྒྱག</translation> + <translation>སྒྲ་རིས་ར་སྤྲོད་བྱེད་པའམ་ཡང་ན་གསང་གྲངས་བསྣན་ནས་ཟྭ་འབྱེད་པ།</translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="1208"/> + <location filename="../src/mainwindow.cpp" line="1449"/> <source>Verify finger vein or enter password to unlock</source> - <translation>མཛུབ་མོའི་ནང་དུ་ཞིབ་བཤེར་བྱེད་པའམ་ཡང་ན་གསང་གྲངས་ནང་འཇུག་བྱས་</translation> + <translation>ཚོད་ལྟས་ར་སྤྲོད་བྱེད་པ་ནི་སྡོད་རྩ་དང་གསང་གྲངས་བསྣན་ནས་ཟྭ་འབྱེད་པ་དེ་ཡིན།</translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="1213"/> + <location filename="../src/mainwindow.cpp" line="1454"/> <source>Verify iris or enter password to unlock</source> - <translation>iris ཞིབ་བཤེར་བྱེད་པའམ་ཡང་ན་གསང་གྲངས་ནང་འཇུག་བྱས་ནས་ཟྭ་</translation> + <translation>འཇའ་སྐྱི་ར་སྤྲོད་བྱེད་པའམ་ཡང་ན་གསང་གྲངས་བསྣན་ནས་ཟྭ་འབྱེད་པ།</translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="1218"/> + <location filename="../src/mainwindow.cpp" line="1459"/> <source>Use the bound wechat scanning code or enter the password to unlock</source> - <translation>འབྲེལ་མཐུད་ཀྱི་འཕྲིན་ཕྲན་ཞིབ་བཤེར་ཨང་གྲངས་སམ་ཡང་ན་གསང་གྲངས་ནང་འཇུག་བྱས་ནས་ཟྭ་རྒྱག་པ།</translation> + <translation>སྦྲེལ་ཡོད་པའི་སྐད་འཕྲིན་གྱི་ཨང་གྲངས་སམ་གསང་གྲངས་བསྣན་ནས་ཟྭ་འབྱེད་དགོས།</translation> </message> <message> <source>Use the bound wechat scanning code or enter the password to log in</source> <translation type="vanished">使用绑定的微信扫码或输入密码登录</translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="623"/> - <location filename="../src/mainwindow.cpp" line="627"/> - <location filename="../src/mainwindow.cpp" line="631"/> - <location filename="../src/mainwindow.cpp" line="635"/> + <location filename="../src/mainwindow.cpp" line="779"/> + <location filename="../src/mainwindow.cpp" line="783"/> + <location filename="../src/mainwindow.cpp" line="787"/> + <location filename="../src/mainwindow.cpp" line="791"/> <source>Account locked,</source> <translation>རྩིས་ཐོ་ཟྭ་བརྒྱབ་པ།</translation> </message> @@ -380,17 +390,17 @@ <message> <location filename="../src/PolkitListener.cpp" line="88"/> <source>Another client is already authenticating, please try again later.</source> - <translation>མངགས་བཅོལ་བྱེད་མཁན་གཞན་ཞིག་གིས་བདེན་དཔང་ར་སྤྲོད་བྱེད་བཞིན་ཡོད། ཅུང་ཙམ་འགོར་རྗེས་ཡང་བསྐྱར་ཚོད་ལྟ</translation> + <translation>མཁོ་མཁན་གཞན་པ་ཞིག་གིས་བདེན་དཔང་ར་སྤྲོད་བྱེད་བཞིན་ཡོད།ཅུང་ཙམ་འགོར་རྗེས་ཡང་བསྐྱར་ཚོད་ལྟ་བྱོས།</translation> </message> <message> - <location filename="../src/PolkitListener.cpp" line="257"/> + <location filename="../src/PolkitListener.cpp" line="265"/> <source>Authentication failure, please try again.</source> - <translation>བདེན་དཔང་ར་སྤྲོད་བྱེད་མ་ཐུབ་ན་ཁྱེད་ཀྱིས་ཡང་བསྐྱར་ཚོད་ལྟ་</translation> + <translation>བདེན་དཔང་ར་སྤྲོད་བྱེད་མ་ཐུབ་ན་ཁྱེད་ཀྱིས་ཡང་བསྐྱར་ཚོད་ལྟ་བྱེད།</translation> </message> <message> - <location filename="../src/PolkitListener.cpp" line="264"/> + <location filename="../src/PolkitListener.cpp" line="272"/> <source>Password input error!</source> - <translation>གསང་གྲངས་ནང་འཇུག་ནོར་འཁྲུལ་བྱུང་བ་རེད</translation> + <translation>གསང་གྲངས་ནང་འཇུག་ནོར་འཁྲུལ་བྱུང་བ་རེད།</translation> </message> <message> <source>Account locked %1 minutes due to %2 fail attempts</source> diff -Nru ukui-biometric-auth-4.10.0.0/polkit-agent/i18n_ts/de.ts ukui-biometric-auth-4.20.0.0/polkit-agent/i18n_ts/de.ts --- ukui-biometric-auth-4.10.0.0/polkit-agent/i18n_ts/de.ts 1970-01-01 08:00:00.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/polkit-agent/i18n_ts/de.ts 2024-09-23 19:22:29.000000000 +0800 @@ -0,0 +1,441 @@ +<?xml version="1.0" encoding="utf-8"?> +<!DOCTYPE TS> +<TS version="2.1" language="de"> +<context> + <name>BioAuthWidget</name> + <message> + <source>Retry</source> + <translation type="obsolete">重试</translation> + </message> + <message> + <source>%1 too many unsuccessful attempts,please enter password.</source> + <translation type="obsolete">%1验证失败达最大次数,请使用密码登录</translation> + </message> + <message> + <source>%1 authentication failure,there are still %2 remaining opportunities</source> + <translation type="obsolete">%1认证失败,还剩%2次尝试机会</translation> + </message> + <message> + <source>Please use wechat to scan the code</source> + <translation type="vanished">请使用微信扫码</translation> + </message> +</context> +<context> + <name>BioDevices</name> + <message> + <source>FingerPrint</source> + <translation type="obsolete">指纹</translation> + </message> + <message> + <source>FingerVein</source> + <translation type="obsolete">指静脉</translation> + </message> + <message> + <source>Iris</source> + <translation type="obsolete">虹膜</translation> + </message> + <message> + <source>Face</source> + <translation type="obsolete">人脸</translation> + </message> + <message> + <source>VoicePrint</source> + <translation type="obsolete">声纹</translation> + </message> + <message> + <source>Wechat</source> + <translation type="vanished">微信</translation> + </message> + <message> + <source>QRCode</source> + <translation type="vanished">二维码</translation> + </message> +</context> +<context> + <name>LoginOptionsWidget</name> + <message> + <source>Login Options</source> + <translation type="vanished">登录选项</translation> + </message> + <message> + <source>Wechat</source> + <translation type="vanished">微信</translation> + </message> +</context> +<context> + <name>MainWindow</name> + <message> + <location filename="../src/mainwindow.cpp" line="66"/> + <source>Authentication</source> + <translation>Authentifizierung</translation> + </message> + <message> + <source>Fingerprint authentication failed, you still have %1 verification opportunities</source> + <translation type="vanished">指纹验证失败,您还有%1次尝试机会</translation> + </message> + <message> + <location filename="../src/mainwindow.ui" line="26"/> + <source>Form</source> + <translation></translation> + </message> + <message> + <source>More</source> + <translation type="obsolete">更多</translation> + </message> + <message> + <source>Restart</source> + <translation type="obsolete">重新开始</translation> + </message> + <message> + <source>Password</source> + <translation type="vanished">密码</translation> + </message> + <message> + <location filename="../src/mainwindow.ui" line="409"/> + <location filename="../src/mainwindow.cpp" line="1075"/> + <location filename="../src/mainwindow.cpp" line="1143"/> + <source>Biometric</source> + <translation>Biometrisch</translation> + </message> + <message> + <location filename="../src/mainwindow.ui" line="480"/> + <source>use password</source> + <translation>Passwort verwenden</translation> + </message> + <message> + <source>DeviceType:</source> + <translation type="obsolete">设备类型:</translation> + </message> + <message> + <source>Back</source> + <translation type="obsolete">返回</translation> + </message> + <message> + <source>Details</source> + <translation type="vanished">详细</translation> + </message> + <message> + <source>Action Id:</source> + <translation type="obsolete">动作:</translation> + </message> + <message> + <source>Description:</source> + <translation type="vanished">描述:</translation> + </message> + <message> + <source>Polkit.subject-pid:</source> + <translation type="vanished">Polkit.subject-pid:</translation> + </message> + <message> + <source>Retry</source> + <translation type="obsolete">重试</translation> + </message> + <message> + <source>Device types:</source> + <translation type="obsolete">设备类型:</translation> + </message> + <message> + <source>Vendor:</source> + <translation type="vanished">发行商:</translation> + </message> + <message> + <source>Action:</source> + <translation type="vanished">动作:</translation> + </message> + <message> + <source>Polkit.caller-pid:</source> + <translation type="vanished">Polkit.caller-pid:</translation> + </message> + <message> + <location filename="../src/mainwindow.ui" line="441"/> + <location filename="../src/mainwindow.cpp" line="1077"/> + <source>Cancel</source> + <translation>Abbrechen</translation> + </message> + <message> + <location filename="../src/mainwindow.ui" line="460"/> + <location filename="../src/mainwindow.cpp" line="1073"/> + <source>Authenticate</source> + <translation>Beglaubigen</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="1079"/> + <location filename="../src/mainwindow.cpp" line="1183"/> + <source>Use password</source> + <translation>Passwort verwenden</translation> + </message> + <message> + <source>Auth</source> + <translation type="obsolete">授权</translation> + </message> + <message> + <source>Too many unsuccessful attempts,please enter password.</source> + <translation type="vanished">指纹验证失败达最大次数,请使用密码解锁</translation> + </message> + <message> + <source>%1 authentication failure,there are still %2 remaining opportunities</source> + <translation type="vanished">%1认证失败,还剩%2次尝试机会</translation> + </message> + <message> + <source>%1 too many unsuccessful attempts,please enter password.</source> + <translation type="vanished">%1验证失败达最大次数,请使用密码登录</translation> + </message> + <message> + <source>in authentication, please wait...</source> + <translation type="vanished">认证中,请稍等...</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="1219"/> + <location filename="../src/mainwindow.cpp" line="1292"/> + <location filename="../src/mainwindow.cpp" line="1293"/> + <source>Please try again in %1 minutes.</source> + <translation>Versuchen Sie es in %1 Minuten erneut.</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="1230"/> + <location filename="../src/mainwindow.cpp" line="1302"/> + <location filename="../src/mainwindow.cpp" line="1303"/> + <source>Please try again in %1 seconds.</source> + <translation>Bitte versuchen Sie es in %1 Sekunden erneut.</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="1240"/> + <location filename="../src/mainwindow.cpp" line="1241"/> + <location filename="../src/mainwindow.cpp" line="1311"/> + <location filename="../src/mainwindow.cpp" line="1312"/> + <source>Account locked permanently.</source> + <translation>Das Konto wurde dauerhaft gesperrt.</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="834"/> + <location filename="../src/mainwindow.cpp" line="835"/> + <source>Password cannot be empty</source> + <translation>Das Kennwort darf nicht leer sein.</translation> + </message> + <message> + <source>Failed to verify %1, please enter password.</source> + <translation type="vanished">验证%1失败,请输入密码.</translation> + </message> + <message> + <source>Unable to verify %1, please enter password.</source> + <translation type="vanished">无法验证%1,请输入密码.</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="242"/> + <location filename="../src/mainwindow.cpp" line="246"/> + <source>Failed to verify %1, you still have %2 verification opportunities</source> + <translation>%1 konnte nicht verifiziert werden, Sie haben immer noch %2 Überprüfungsmöglichkeiten</translation> + </message> + <message> + <source>An application is attempting to perform an action that requires privileges. Authentication is required to perform this action.</source> + <translation type="vanished">一个程序正试图执行一个需要特权的动作。要求授权以执行该动作。</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="731"/> + <source>Password: </source> + <translation>Passwort: </translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="335"/> + <source>Please enter your password or enroll your fingerprint </source> + <translation>Bitte geben Sie Ihr Passwort ein oder registrieren Sie Ihren Fingerabdruck </translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="259"/> + <source>Abnormal network</source> + <translation>Ungewöhnliches Netzwerk</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="665"/> + <source>This operation requires the administrator's authorization. Please enter your password to allow this operation.</source> + <translation>Für diesen Vorgang ist die Autorisierung des Administrators erforderlich. Bitte geben Sie Ihr Passwort ein, um diesen Vorgang zuzulassen.</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="733"/> + <source>_Password: </source> + <translation>_Passwort: </translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="735"/> + <source>_Password:</source> + <translation>_Passwort:</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="850"/> + <source>Authentication failed, please try again.</source> + <translation>Authentifizierung fehlgeschlagen, bitte versuchen Sie es erneut.</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="779"/> + <source>days left</source> + <translation>Verbleibende Tage</translation> + </message> + <message> + <source>Biometric/code scan authentication failed too many times, please enter the password.</source> + <translation type="vanished">生物/扫码验证失败达最大次数,请使用密码解锁.</translation> + </message> + <message> + <source>Bioauth/code scan authentication failed, you still have %1 verification opportunities</source> + <translation type="vanished">生物/扫码验证失败,您还有%1次尝试机会</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="226"/> + <location filename="../src/mainwindow.cpp" line="1415"/> + <location filename="../src/mainwindow.cpp" line="1417"/> + <source>Failed to verify %1, please enter password to unlock</source> + <translation>%1 konnte nicht verifiziert werden, bitte geben Sie das Kennwort zum Entsperren ein</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="231"/> + <location filename="../src/mainwindow.cpp" line="233"/> + <location filename="../src/mainwindow.cpp" line="1419"/> + <source>Unable to verify %1, please enter password to unlock</source> + <translation>%1 kann nicht verifiziert werden, bitte geben Sie das Kennwort zum Entsperren ein</translation> + </message> + <message> + <source>NET Exception</source> + <translation type="vanished">网络异常</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="671"/> + <source>A program is attempting to perform an action that requires privileges.It requires authorization to perform the action.</source> + <translation>Ein Programm versucht, eine Aktion auszuführen, für die Berechtigungen erforderlich sind. Zum Ausführen der Aktion ist eine Autorisierung erforderlich.</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="108"/> + <location filename="../src/mainwindow.cpp" line="729"/> + <source>Input Password</source> + <translation>Passwort eingeben</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="105"/> + <source>Insert the ukey into the USB port</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="107"/> + <source>Enter the ukey password</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="783"/> + <source>hours left</source> + <translation>Verbleibende Stunden</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="787"/> + <source>minutes left</source> + <translation>Noch Minuten</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="791"/> + <source>seconds left</source> + <translation>Verbleibende Sekunden</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="880"/> + <location filename="../src/mainwindow.cpp" line="888"/> + <source>Input your password to authentication</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="1434"/> + <source>Verify face recognition or enter password to unlock</source> + <translation>Überprüfen Sie die Gesichtserkennung oder geben Sie das Passwort ein, um zu entsperren</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="1439"/> + <source>Press fingerprint or enter password to unlock</source> + <translation>Drücken Sie den Fingerabdruck oder geben Sie das Passwort ein, um zu entsperren</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="1444"/> + <source>Verify voiceprint or enter password to unlock</source> + <translation>Überprüfen Sie den Stimmabdruck oder geben Sie das Passwort ein, um zu entsperren</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="1449"/> + <source>Verify finger vein or enter password to unlock</source> + <translation>Überprüfen Sie die Fingervene oder geben Sie das Passwort ein, um zu entsperren</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="1454"/> + <source>Verify iris or enter password to unlock</source> + <translation>Überprüfen Sie die Iris oder geben Sie das Passwort ein, um zu entsperren</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="1459"/> + <source>Use the bound wechat scanning code or enter the password to unlock</source> + <translation>Verwenden Sie den gebundenen Wechat-Scan-Code oder geben Sie das Passwort zum Entsperren ein</translation> + </message> + <message> + <source>Use the bound wechat scanning code or enter the password to log in</source> + <translation type="vanished">使用绑定的微信扫码或输入密码登录</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="779"/> + <location filename="../src/mainwindow.cpp" line="783"/> + <location filename="../src/mainwindow.cpp" line="787"/> + <location filename="../src/mainwindow.cpp" line="791"/> + <source>Account locked,</source> + <translation>Konto gesperrt,</translation> + </message> + <message> + <source>Authentication failed, please try again</source> + <translation type="obsolete">认证失败,请重试</translation> + </message> +</context> +<context> + <name>PolkitListener</name> + <message> + <location filename="../src/PolkitListener.cpp" line="88"/> + <source>Another client is already authenticating, please try again later.</source> + <translation>Ein anderer Client authentifiziert sich bereits, bitte versuchen Sie es später noch einmal.</translation> + </message> + <message> + <location filename="../src/PolkitListener.cpp" line="265"/> + <source>Authentication failure, please try again.</source> + <translation>Authentifizierungsfehler, bitte versuchen Sie es erneut.</translation> + </message> + <message> + <location filename="../src/PolkitListener.cpp" line="272"/> + <source>Password input error!</source> + <translation>Fehler bei der Passworteingabe!</translation> + </message> + <message> + <source>Account locked %1 minutes due to %2 fail attempts</source> + <translation type="vanished">账户锁定%1分钟由于%2次错误尝试</translation> + </message> + <message> + <source>Authentication failure,there are still %1 remaining opportunities</source> + <translation type="vanished">认证失败,还剩余%1次尝试机会</translation> + </message> +</context> +<context> + <name>QObject</name> + <message> + <source>FingerPrint</source> + <translation type="obsolete">指纹</translation> + </message> + <message> + <source>FingerVein</source> + <translation type="obsolete">指静脉</translation> + </message> + <message> + <source>Iris</source> + <translation type="obsolete">虹膜</translation> + </message> + <message> + <source>Face</source> + <translation type="obsolete">人脸</translation> + </message> + <message> + <source>VoicePrint</source> + <translation type="obsolete">声纹</translation> + </message> + <message> + <source>Cancel</source> + <translation type="obsolete">取消</translation> + </message> +</context> +</TS> diff -Nru ukui-biometric-auth-4.10.0.0/polkit-agent/i18n_ts/es.ts ukui-biometric-auth-4.20.0.0/polkit-agent/i18n_ts/es.ts --- ukui-biometric-auth-4.10.0.0/polkit-agent/i18n_ts/es.ts 2023-11-14 16:23:44.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/polkit-agent/i18n_ts/es.ts 2024-09-23 19:22:29.000000000 +0800 @@ -4,208 +4,438 @@ <context> <name>BioAuthWidget</name> <message> - <source>Form</source> - <translation type="obsolete">Formar</translation> + <source>Retry</source> + <translation type="obsolete">重试</translation> + </message> + <message> + <source>%1 too many unsuccessful attempts,please enter password.</source> + <translation type="obsolete">%1验证失败达最大次数,请使用密码登录</translation> + </message> + <message> + <source>%1 authentication failure,there are still %2 remaining opportunities</source> + <translation type="obsolete">%1认证失败,还剩%2次尝试机会</translation> + </message> + <message> + <source>Please use wechat to scan the code</source> + <translation type="vanished">请使用微信扫码</translation> </message> </context> <context> - <name>BioDevicesWidget</name> + <name>BioDevices</name> <message> - <source>Form</source> - <translation type="obsolete">Formar</translation> + <source>FingerPrint</source> + <translation type="obsolete">指纹</translation> + </message> + <message> + <source>FingerVein</source> + <translation type="obsolete">指静脉</translation> + </message> + <message> + <source>Iris</source> + <translation type="obsolete">虹膜</translation> + </message> + <message> + <source>Face</source> + <translation type="obsolete">人脸</translation> + </message> + <message> + <source>VoicePrint</source> + <translation type="obsolete">声纹</translation> + </message> + <message> + <source>Wechat</source> + <translation type="vanished">微信</translation> + </message> + <message> + <source>QRCode</source> + <translation type="vanished">二维码</translation> + </message> +</context> +<context> + <name>LoginOptionsWidget</name> + <message> + <source>Login Options</source> + <translation type="vanished">登录选项</translation> + </message> + <message> + <source>Wechat</source> + <translation type="vanished">微信</translation> </message> </context> <context> <name>MainWindow</name> <message> + <location filename="../src/mainwindow.cpp" line="66"/> + <source>Authentication</source> + <translation>Autenticación</translation> + </message> + <message> + <source>Fingerprint authentication failed, you still have %1 verification opportunities</source> + <translation type="vanished">指纹验证失败,您还有%1次尝试机会</translation> + </message> + <message> + <location filename="../src/mainwindow.ui" line="26"/> <source>Form</source> - <translation>Formar</translation> + <translation>Forma</translation> + </message> + <message> + <source>More</source> + <translation type="obsolete">更多</translation> </message> <message> + <source>Restart</source> + <translation type="obsolete">重新开始</translation> + </message> + <message> + <source>Password</source> + <translation type="vanished">密码</translation> + </message> + <message> + <location filename="../src/mainwindow.ui" line="409"/> + <location filename="../src/mainwindow.cpp" line="1075"/> + <location filename="../src/mainwindow.cpp" line="1143"/> <source>Biometric</source> - <translation>Biometrico</translation> + <translation>Biométrico</translation> + </message> + <message> + <location filename="../src/mainwindow.ui" line="480"/> + <source>use password</source> + <translation>Usar contraseña</translation> + </message> + <message> + <source>DeviceType:</source> + <translation type="obsolete">设备类型:</translation> + </message> + <message> + <source>Back</source> + <translation type="obsolete">返回</translation> </message> <message> <source>Details</source> - <translation type="vanished">Detalles</translation> + <translation type="vanished">详细</translation> + </message> + <message> + <source>Action Id:</source> + <translation type="obsolete">动作:</translation> + </message> + <message> + <source>Description:</source> + <translation type="vanished">描述:</translation> </message> <message> <source>Polkit.subject-pid:</source> - <translation type="vanished">Polkit.subject-pid:</translation> + <translation type="vanished">Polkit.subject-pid:</translation> </message> <message> - <source>Vendor:</source> - <translation type="vanished">Vendedor:</translation> + <source>Retry</source> + <translation type="obsolete">重试</translation> </message> <message> - <source>Description:</source> - <translation type="vanished">Descripción:</translation> + <source>Device types:</source> + <translation type="obsolete">设备类型:</translation> </message> <message> - <source>Polkit.caller-pid:</source> - <translation type="vanished">Polkit.caller-pid:</translation> + <source>Vendor:</source> + <translation type="vanished">发行商:</translation> </message> <message> <source>Action:</source> - <translation type="vanished">Acción:</translation> + <translation type="vanished">动作:</translation> + </message> + <message> + <source>Polkit.caller-pid:</source> + <translation type="vanished">Polkit.caller-pid:</translation> </message> <message> + <location filename="../src/mainwindow.ui" line="441"/> + <location filename="../src/mainwindow.cpp" line="1077"/> <source>Cancel</source> <translation>Cancelar</translation> </message> <message> + <location filename="../src/mainwindow.ui" line="460"/> + <location filename="../src/mainwindow.cpp" line="1073"/> <source>Authenticate</source> - <translation>Autenticar</translation> + <translation>Autentificar</translation> </message> <message> - <source>Authentication</source> - <translation>Autenticación</translation> + <location filename="../src/mainwindow.cpp" line="1079"/> + <location filename="../src/mainwindow.cpp" line="1183"/> + <source>Use password</source> + <translation>Usar contraseña</translation> + </message> + <message> + <source>Auth</source> + <translation type="obsolete">授权</translation> + </message> + <message> + <source>Too many unsuccessful attempts,please enter password.</source> + <translation type="vanished">指纹验证失败达最大次数,请使用密码解锁</translation> + </message> + <message> + <source>%1 authentication failure,there are still %2 remaining opportunities</source> + <translation type="vanished">%1认证失败,还剩%2次尝试机会</translation> + </message> + <message> + <source>%1 too many unsuccessful attempts,please enter password.</source> + <translation type="vanished">%1验证失败达最大次数,请使用密码登录</translation> </message> <message> <source>in authentication, please wait...</source> - <translation type="vanished">En autenticación, por favor espere ...</translation> + <translation type="vanished">认证中,请稍等...</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="1219"/> + <location filename="../src/mainwindow.cpp" line="1292"/> + <location filename="../src/mainwindow.cpp" line="1293"/> + <source>Please try again in %1 minutes.</source> + <translation>Inténtelo de nuevo en %1 minutos.</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="1230"/> + <location filename="../src/mainwindow.cpp" line="1302"/> + <location filename="../src/mainwindow.cpp" line="1303"/> + <source>Please try again in %1 seconds.</source> + <translation>Inténtelo de nuevo en %1 segundos.</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="1240"/> + <location filename="../src/mainwindow.cpp" line="1241"/> + <location filename="../src/mainwindow.cpp" line="1311"/> + <location filename="../src/mainwindow.cpp" line="1312"/> + <source>Account locked permanently.</source> + <translation>Cuenta bloqueada permanentemente.</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="834"/> + <location filename="../src/mainwindow.cpp" line="835"/> + <source>Password cannot be empty</source> + <translation>La contraseña no puede estar vacía</translation> + </message> + <message> + <source>Failed to verify %1, please enter password.</source> + <translation type="vanished">验证%1失败,请输入密码.</translation> + </message> + <message> + <source>Unable to verify %1, please enter password.</source> + <translation type="vanished">无法验证%1,请输入密码.</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="242"/> + <location filename="../src/mainwindow.cpp" line="246"/> + <source>Failed to verify %1, you still have %2 verification opportunities</source> + <translation>No se pudo verificar %1, todavía tiene %2 oportunidades de verificación</translation> </message> <message> <source>An application is attempting to perform an action that requires privileges. Authentication is required to perform this action.</source> - <translation type="vanished">Una aplicación está intentando realizar una acción que requiere privilegios. Se requiere autenticación para realizar esta acción.</translation> + <translation type="vanished">一个程序正试图执行一个需要特权的动作。要求授权以执行该动作。</translation> </message> <message> + <location filename="../src/mainwindow.cpp" line="731"/> <source>Password: </source> <translation>Contraseña: </translation> </message> <message> - <source>Authentication failed, please try again.</source> - <translation>Autenticación fallida. Por favor intente de nuevo.</translation> + <location filename="../src/mainwindow.cpp" line="335"/> + <source>Please enter your password or enroll your fingerprint </source> + <translation>Ingrese su contraseña o registre su huella dactilar </translation> </message> <message> - <source>Please enter your password or enroll your fingerprint </source> - <translation type="unfinished"></translation> + <location filename="../src/mainwindow.cpp" line="259"/> + <source>Abnormal network</source> + <translation>Red anormal</translation> </message> <message> - <source>use password</source> - <translation type="unfinished"></translation> + <location filename="../src/mainwindow.cpp" line="665"/> + <source>This operation requires the administrator's authorization. Please enter your password to allow this operation.</source> + <translation>Esta operación requiere la autorización del administrador. Introduzca su contraseña para permitir esta operación.</translation> </message> <message> - <source>Account locked,</source> - <translation type="unfinished"></translation> + <location filename="../src/mainwindow.cpp" line="733"/> + <source>_Password: </source> + <translation>_Contraseña: </translation> </message> <message> - <source>days left</source> - <translation type="unfinished"></translation> + <location filename="../src/mainwindow.cpp" line="735"/> + <source>_Password:</source> + <translation>_Contraseña:</translation> </message> <message> - <source>hours left</source> - <translation type="unfinished"></translation> + <location filename="../src/mainwindow.cpp" line="850"/> + <source>Authentication failed, please try again.</source> + <translation>Error de autenticación, inténtelo de nuevo.</translation> </message> <message> - <source>minutes left</source> - <translation type="unfinished"></translation> + <location filename="../src/mainwindow.cpp" line="779"/> + <source>days left</source> + <translation>Días restantes</translation> </message> <message> - <source>seconds left</source> - <translation type="unfinished"></translation> + <source>Biometric/code scan authentication failed too many times, please enter the password.</source> + <translation type="vanished">生物/扫码验证失败达最大次数,请使用密码解锁.</translation> </message> <message> - <source>Password cannot be empty</source> - <translation type="unfinished"></translation> + <source>Bioauth/code scan authentication failed, you still have %1 verification opportunities</source> + <translation type="vanished">生物/扫码验证失败,您还有%1次尝试机会</translation> </message> <message> - <source>Use password</source> - <translation type="unfinished"></translation> + <location filename="../src/mainwindow.cpp" line="226"/> + <location filename="../src/mainwindow.cpp" line="1415"/> + <location filename="../src/mainwindow.cpp" line="1417"/> + <source>Failed to verify %1, please enter password to unlock</source> + <translation>No se pudo verificar %1, ingrese la contraseña para desbloquear</translation> </message> <message> - <source>Please try again in %1 minutes.</source> - <translation type="unfinished"></translation> + <location filename="../src/mainwindow.cpp" line="231"/> + <location filename="../src/mainwindow.cpp" line="233"/> + <location filename="../src/mainwindow.cpp" line="1419"/> + <source>Unable to verify %1, please enter password to unlock</source> + <translation>No se puede verificar %1, ingrese la contraseña para desbloquear</translation> </message> <message> - <source>Please try again in %1 seconds.</source> - <translation type="unfinished"></translation> + <source>NET Exception</source> + <translation type="vanished">网络异常</translation> </message> <message> - <source>Account locked permanently.</source> - <translation type="unfinished"></translation> + <location filename="../src/mainwindow.cpp" line="671"/> + <source>A program is attempting to perform an action that requires privileges.It requires authorization to perform the action.</source> + <translation>Un programa está intentando realizar una acción que requiere privilegios. Requiere autorización para realizar la acción.</translation> </message> <message> - <source>Verify face recognition or enter password to unlock</source> - <translation type="unfinished"></translation> + <location filename="../src/mainwindow.cpp" line="108"/> + <location filename="../src/mainwindow.cpp" line="729"/> + <source>Input Password</source> + <translation>Contraseña de entrada</translation> </message> <message> - <source>Press fingerprint or enter password to unlock</source> + <location filename="../src/mainwindow.cpp" line="105"/> + <source>Insert the ukey into the USB port</source> <translation type="unfinished"></translation> </message> <message> - <source>Verify voiceprint or enter password to unlock</source> + <location filename="../src/mainwindow.cpp" line="107"/> + <source>Enter the ukey password</source> <translation type="unfinished"></translation> </message> <message> - <source>Verify finger vein or enter password to unlock</source> - <translation type="unfinished"></translation> + <location filename="../src/mainwindow.cpp" line="783"/> + <source>hours left</source> + <translation>horas restantes</translation> </message> <message> - <source>Verify iris or enter password to unlock</source> - <translation type="unfinished"></translation> + <location filename="../src/mainwindow.cpp" line="787"/> + <source>minutes left</source> + <translation>Quedan minutos</translation> </message> <message> - <source>Failed to verify %1, you still have %2 verification opportunities</source> - <translation type="unfinished"></translation> + <location filename="../src/mainwindow.cpp" line="791"/> + <source>seconds left</source> + <translation>segundos restantes</translation> </message> <message> - <source>Input Password</source> + <location filename="../src/mainwindow.cpp" line="880"/> + <location filename="../src/mainwindow.cpp" line="888"/> + <source>Input your password to authentication</source> <translation type="unfinished"></translation> </message> <message> - <source>Use the bound wechat scanning code or enter the password to unlock</source> - <translation type="unfinished"></translation> + <location filename="../src/mainwindow.cpp" line="1434"/> + <source>Verify face recognition or enter password to unlock</source> + <translation>Verifique el reconocimiento facial o ingrese la contraseña para desbloquear</translation> </message> <message> - <source>Failed to verify %1, please enter password to unlock</source> - <translation type="unfinished"></translation> + <location filename="../src/mainwindow.cpp" line="1439"/> + <source>Press fingerprint or enter password to unlock</source> + <translation>Presione la huella dactilar o ingrese la contraseña para desbloquear</translation> </message> <message> - <source>Unable to verify %1, please enter password to unlock</source> - <translation type="unfinished"></translation> + <location filename="../src/mainwindow.cpp" line="1444"/> + <source>Verify voiceprint or enter password to unlock</source> + <translation>Verifica la huella de voz o ingresa la contraseña para desbloquear</translation> </message> <message> - <source>A program is attempting to perform an action that requires privileges.It requires authorization to perform the action.</source> - <translation type="unfinished"></translation> + <location filename="../src/mainwindow.cpp" line="1449"/> + <source>Verify finger vein or enter password to unlock</source> + <translation>Verifique la vena del dedo o ingrese la contraseña para desbloquear</translation> </message> <message> - <source>_Password:</source> - <translation type="unfinished"></translation> + <location filename="../src/mainwindow.cpp" line="1454"/> + <source>Verify iris or enter password to unlock</source> + <translation>Verifique el iris o ingrese la contraseña para desbloquear</translation> </message> <message> - <source>_Password: </source> - <translation type="unfinished"></translation> + <location filename="../src/mainwindow.cpp" line="1459"/> + <source>Use the bound wechat scanning code or enter the password to unlock</source> + <translation>Use el código de escaneo de wechat vinculado o ingrese la contraseña para desbloquear</translation> </message> <message> - <source>Abnormal network</source> - <translation type="unfinished"></translation> + <source>Use the bound wechat scanning code or enter the password to log in</source> + <translation type="vanished">使用绑定的微信扫码或输入密码登录</translation> </message> <message> - <source>This operation requires the administrator's authorization. Please enter your password to allow this operation.</source> - <translation type="unfinished"></translation> + <location filename="../src/mainwindow.cpp" line="779"/> + <location filename="../src/mainwindow.cpp" line="783"/> + <location filename="../src/mainwindow.cpp" line="787"/> + <location filename="../src/mainwindow.cpp" line="791"/> + <source>Account locked,</source> + <translation>Cuenta bloqueada,</translation> + </message> + <message> + <source>Authentication failed, please try again</source> + <translation type="obsolete">认证失败,请重试</translation> </message> </context> <context> <name>PolkitListener</name> <message> + <location filename="../src/PolkitListener.cpp" line="88"/> <source>Another client is already authenticating, please try again later.</source> - <translation>Otro cliente ya se está autenticando, inténtalo de nuevo más tarde.</translation> + <translation>Otro cliente ya se está autenticando, inténtelo de nuevo más tarde.</translation> </message> <message> + <location filename="../src/PolkitListener.cpp" line="265"/> <source>Authentication failure, please try again.</source> - <translation>Fallo de autenticación, por favor intente de nuevo.</translation> + <translation>Error de autenticación, inténtelo de nuevo.</translation> </message> <message> + <location filename="../src/PolkitListener.cpp" line="272"/> <source>Password input error!</source> - <translation type="unfinished"></translation> + <translation>¡Error de entrada de contraseña!</translation> + </message> + <message> + <source>Account locked %1 minutes due to %2 fail attempts</source> + <translation type="vanished">账户锁定%1分钟由于%2次错误尝试</translation> + </message> + <message> + <source>Authentication failure,there are still %1 remaining opportunities</source> + <translation type="vanished">认证失败,还剩余%1次尝试机会</translation> </message> </context> <context> <name>QObject</name> <message> + <source>FingerPrint</source> + <translation type="obsolete">指纹</translation> + </message> + <message> + <source>FingerVein</source> + <translation type="obsolete">指静脉</translation> + </message> + <message> + <source>Iris</source> + <translation type="obsolete">虹膜</translation> + </message> + <message> + <source>Face</source> + <translation type="obsolete">人脸</translation> + </message> + <message> + <source>VoicePrint</source> + <translation type="obsolete">声纹</translation> + </message> + <message> <source>Cancel</source> - <translation type="obsolete">Cancelar</translation> + <translation type="obsolete">取消</translation> </message> </context> </TS> diff -Nru ukui-biometric-auth-4.10.0.0/polkit-agent/i18n_ts/fr.ts ukui-biometric-auth-4.20.0.0/polkit-agent/i18n_ts/fr.ts --- ukui-biometric-auth-4.10.0.0/polkit-agent/i18n_ts/fr.ts 2023-11-14 16:23:44.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/polkit-agent/i18n_ts/fr.ts 2024-09-23 19:22:29.000000000 +0800 @@ -4,208 +4,438 @@ <context> <name>BioAuthWidget</name> <message> - <source>Form</source> - <translation type="obsolete">Forme</translation> + <source>Retry</source> + <translation type="obsolete">重试</translation> + </message> + <message> + <source>%1 too many unsuccessful attempts,please enter password.</source> + <translation type="obsolete">%1验证失败达最大次数,请使用密码登录</translation> + </message> + <message> + <source>%1 authentication failure,there are still %2 remaining opportunities</source> + <translation type="obsolete">%1认证失败,还剩%2次尝试机会</translation> + </message> + <message> + <source>Please use wechat to scan the code</source> + <translation type="vanished">请使用微信扫码</translation> </message> </context> <context> - <name>BioDevicesWidget</name> + <name>BioDevices</name> <message> - <source>Form</source> - <translation type="obsolete">Forme</translation> + <source>FingerPrint</source> + <translation type="obsolete">指纹</translation> + </message> + <message> + <source>FingerVein</source> + <translation type="obsolete">指静脉</translation> + </message> + <message> + <source>Iris</source> + <translation type="obsolete">虹膜</translation> + </message> + <message> + <source>Face</source> + <translation type="obsolete">人脸</translation> + </message> + <message> + <source>VoicePrint</source> + <translation type="obsolete">声纹</translation> + </message> + <message> + <source>Wechat</source> + <translation type="vanished">微信</translation> + </message> + <message> + <source>QRCode</source> + <translation type="vanished">二维码</translation> + </message> +</context> +<context> + <name>LoginOptionsWidget</name> + <message> + <source>Login Options</source> + <translation type="vanished">登录选项</translation> + </message> + <message> + <source>Wechat</source> + <translation type="vanished">微信</translation> </message> </context> <context> <name>MainWindow</name> <message> + <location filename="../src/mainwindow.cpp" line="66"/> + <source>Authentication</source> + <translation>Authentification</translation> + </message> + <message> + <source>Fingerprint authentication failed, you still have %1 verification opportunities</source> + <translation type="vanished">指纹验证失败,您还有%1次尝试机会</translation> + </message> + <message> + <location filename="../src/mainwindow.ui" line="26"/> <source>Form</source> - <translation>Forme</translation> + <translation></translation> + </message> + <message> + <source>More</source> + <translation type="obsolete">更多</translation> </message> <message> + <source>Restart</source> + <translation type="obsolete">重新开始</translation> + </message> + <message> + <source>Password</source> + <translation type="vanished">密码</translation> + </message> + <message> + <location filename="../src/mainwindow.ui" line="409"/> + <location filename="../src/mainwindow.cpp" line="1075"/> + <location filename="../src/mainwindow.cpp" line="1143"/> <source>Biometric</source> <translation>Biométrique</translation> </message> <message> + <location filename="../src/mainwindow.ui" line="480"/> + <source>use password</source> + <translation>Utiliser le mot de passe</translation> + </message> + <message> + <source>DeviceType:</source> + <translation type="obsolete">设备类型:</translation> + </message> + <message> + <source>Back</source> + <translation type="obsolete">返回</translation> + </message> + <message> <source>Details</source> - <translation type="vanished">Détails</translation> + <translation type="vanished">详细</translation> + </message> + <message> + <source>Action Id:</source> + <translation type="obsolete">动作:</translation> + </message> + <message> + <source>Description:</source> + <translation type="vanished">描述:</translation> </message> <message> <source>Polkit.subject-pid:</source> - <translation type="vanished">Polkit.subject-pid:</translation> + <translation type="vanished">Polkit.subject-pid:</translation> </message> <message> - <source>Vendor:</source> - <translation type="vanished">Vendeur:</translation> + <source>Retry</source> + <translation type="obsolete">重试</translation> </message> <message> - <source>Description:</source> - <translation type="vanished">La description:</translation> + <source>Device types:</source> + <translation type="obsolete">设备类型:</translation> </message> <message> - <source>Polkit.caller-pid:</source> - <translation type="vanished">Polkit.caller-pid:</translation> + <source>Vendor:</source> + <translation type="vanished">发行商:</translation> </message> <message> <source>Action:</source> - <translation type="vanished">Action:</translation> + <translation type="vanished">动作:</translation> + </message> + <message> + <source>Polkit.caller-pid:</source> + <translation type="vanished">Polkit.caller-pid:</translation> </message> <message> + <location filename="../src/mainwindow.ui" line="441"/> + <location filename="../src/mainwindow.cpp" line="1077"/> <source>Cancel</source> <translation>Annuler</translation> </message> <message> + <location filename="../src/mainwindow.ui" line="460"/> + <location filename="../src/mainwindow.cpp" line="1073"/> <source>Authenticate</source> <translation>Authentifier</translation> </message> <message> - <source>Authentication</source> - <translation>Authentification</translation> + <location filename="../src/mainwindow.cpp" line="1079"/> + <location filename="../src/mainwindow.cpp" line="1183"/> + <source>Use password</source> + <translation>Utiliser le mot de passe</translation> + </message> + <message> + <source>Auth</source> + <translation type="obsolete">授权</translation> + </message> + <message> + <source>Too many unsuccessful attempts,please enter password.</source> + <translation type="vanished">指纹验证失败达最大次数,请使用密码解锁</translation> + </message> + <message> + <source>%1 authentication failure,there are still %2 remaining opportunities</source> + <translation type="vanished">%1认证失败,还剩%2次尝试机会</translation> + </message> + <message> + <source>%1 too many unsuccessful attempts,please enter password.</source> + <translation type="vanished">%1验证失败达最大次数,请使用密码登录</translation> </message> <message> <source>in authentication, please wait...</source> - <translation type="vanished">en cours d'authentification, veuillez patienter ...</translation> + <translation type="vanished">认证中,请稍等...</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="1219"/> + <location filename="../src/mainwindow.cpp" line="1292"/> + <location filename="../src/mainwindow.cpp" line="1293"/> + <source>Please try again in %1 minutes.</source> + <translation>Veuillez réessayer dans %1 minutes.</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="1230"/> + <location filename="../src/mainwindow.cpp" line="1302"/> + <location filename="../src/mainwindow.cpp" line="1303"/> + <source>Please try again in %1 seconds.</source> + <translation>Veuillez réessayer dans %1 secondes.</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="1240"/> + <location filename="../src/mainwindow.cpp" line="1241"/> + <location filename="../src/mainwindow.cpp" line="1311"/> + <location filename="../src/mainwindow.cpp" line="1312"/> + <source>Account locked permanently.</source> + <translation>Compte verrouillé définitivement.</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="834"/> + <location filename="../src/mainwindow.cpp" line="835"/> + <source>Password cannot be empty</source> + <translation>Le mot de passe ne peut pas être vide</translation> + </message> + <message> + <source>Failed to verify %1, please enter password.</source> + <translation type="vanished">验证%1失败,请输入密码.</translation> + </message> + <message> + <source>Unable to verify %1, please enter password.</source> + <translation type="vanished">无法验证%1,请输入密码.</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="242"/> + <location filename="../src/mainwindow.cpp" line="246"/> + <source>Failed to verify %1, you still have %2 verification opportunities</source> + <translation>Échec de la vérification %1, vous avez encore %2 possibilités de vérification</translation> </message> <message> <source>An application is attempting to perform an action that requires privileges. Authentication is required to perform this action.</source> - <translation type="vanished">Une application tente d'exécuter une action nécessitant des privilèges. Une authentification est requise pour effectuer cette action.</translation> + <translation type="vanished">一个程序正试图执行一个需要特权的动作。要求授权以执行该动作。</translation> </message> <message> + <location filename="../src/mainwindow.cpp" line="731"/> <source>Password: </source> <translation>Mot de passe: </translation> </message> <message> - <source>Authentication failed, please try again.</source> - <translation>Authentification échouée. Veuillez réessayer.</translation> + <location filename="../src/mainwindow.cpp" line="335"/> + <source>Please enter your password or enroll your fingerprint </source> + <translation>Veuillez saisir votre mot de passe ou enregistrer votre empreinte digitale </translation> </message> <message> - <source>Please enter your password or enroll your fingerprint </source> - <translation type="unfinished"></translation> + <location filename="../src/mainwindow.cpp" line="259"/> + <source>Abnormal network</source> + <translation>Réseau anormal</translation> </message> <message> - <source>use password</source> - <translation type="unfinished"></translation> + <location filename="../src/mainwindow.cpp" line="665"/> + <source>This operation requires the administrator's authorization. Please enter your password to allow this operation.</source> + <translation>Cette opération nécessite l’autorisation de l’administrateur. Veuillez saisir votre mot de passe pour autoriser cette opération.</translation> </message> <message> - <source>Account locked,</source> - <translation type="unfinished"></translation> + <location filename="../src/mainwindow.cpp" line="733"/> + <source>_Password: </source> + <translation>_Mot de passe: </translation> </message> <message> - <source>days left</source> - <translation type="unfinished"></translation> + <location filename="../src/mainwindow.cpp" line="735"/> + <source>_Password:</source> + <translation>_Mot de passe:</translation> </message> <message> - <source>hours left</source> - <translation type="unfinished"></translation> + <location filename="../src/mainwindow.cpp" line="850"/> + <source>Authentication failed, please try again.</source> + <translation>L’authentification a échoué, veuillez réessayer.</translation> </message> <message> - <source>minutes left</source> - <translation type="unfinished"></translation> + <location filename="../src/mainwindow.cpp" line="779"/> + <source>days left</source> + <translation>jours restants</translation> </message> <message> - <source>seconds left</source> - <translation type="unfinished"></translation> + <source>Biometric/code scan authentication failed too many times, please enter the password.</source> + <translation type="vanished">生物/扫码验证失败达最大次数,请使用密码解锁.</translation> </message> <message> - <source>Password cannot be empty</source> - <translation type="unfinished"></translation> + <source>Bioauth/code scan authentication failed, you still have %1 verification opportunities</source> + <translation type="vanished">生物/扫码验证失败,您还有%1次尝试机会</translation> </message> <message> - <source>Use password</source> - <translation type="unfinished"></translation> + <location filename="../src/mainwindow.cpp" line="226"/> + <location filename="../src/mainwindow.cpp" line="1415"/> + <location filename="../src/mainwindow.cpp" line="1417"/> + <source>Failed to verify %1, please enter password to unlock</source> + <translation>Impossible de vérifier %1, veuillez entrer le mot de passe pour déverrouiller</translation> </message> <message> - <source>Please try again in %1 minutes.</source> - <translation type="unfinished"></translation> + <location filename="../src/mainwindow.cpp" line="231"/> + <location filename="../src/mainwindow.cpp" line="233"/> + <location filename="../src/mainwindow.cpp" line="1419"/> + <source>Unable to verify %1, please enter password to unlock</source> + <translation>Impossible de vérifier %1, veuillez entrer le mot de passe pour déverrouiller</translation> </message> <message> - <source>Please try again in %1 seconds.</source> - <translation type="unfinished"></translation> + <source>NET Exception</source> + <translation type="vanished">网络异常</translation> </message> <message> - <source>Account locked permanently.</source> - <translation type="unfinished"></translation> + <location filename="../src/mainwindow.cpp" line="671"/> + <source>A program is attempting to perform an action that requires privileges.It requires authorization to perform the action.</source> + <translation>Un programme tente d’effectuer une action qui nécessite des privilèges. Il nécessite une autorisation pour effectuer l’action.</translation> </message> <message> - <source>Verify face recognition or enter password to unlock</source> - <translation type="unfinished"></translation> + <location filename="../src/mainwindow.cpp" line="108"/> + <location filename="../src/mainwindow.cpp" line="729"/> + <source>Input Password</source> + <translation>Mot de passe d’entrée</translation> </message> <message> - <source>Press fingerprint or enter password to unlock</source> + <location filename="../src/mainwindow.cpp" line="105"/> + <source>Insert the ukey into the USB port</source> <translation type="unfinished"></translation> </message> <message> - <source>Verify voiceprint or enter password to unlock</source> + <location filename="../src/mainwindow.cpp" line="107"/> + <source>Enter the ukey password</source> <translation type="unfinished"></translation> </message> <message> - <source>Verify finger vein or enter password to unlock</source> - <translation type="unfinished"></translation> + <location filename="../src/mainwindow.cpp" line="783"/> + <source>hours left</source> + <translation>Heures restantes</translation> </message> <message> - <source>Verify iris or enter password to unlock</source> - <translation type="unfinished"></translation> + <location filename="../src/mainwindow.cpp" line="787"/> + <source>minutes left</source> + <translation>minutes restantes</translation> </message> <message> - <source>Failed to verify %1, you still have %2 verification opportunities</source> - <translation type="unfinished"></translation> + <location filename="../src/mainwindow.cpp" line="791"/> + <source>seconds left</source> + <translation>secondes restantes</translation> </message> <message> - <source>Input Password</source> + <location filename="../src/mainwindow.cpp" line="880"/> + <location filename="../src/mainwindow.cpp" line="888"/> + <source>Input your password to authentication</source> <translation type="unfinished"></translation> </message> <message> - <source>Use the bound wechat scanning code or enter the password to unlock</source> - <translation type="unfinished"></translation> + <location filename="../src/mainwindow.cpp" line="1434"/> + <source>Verify face recognition or enter password to unlock</source> + <translation>Vérifier la reconnaissance faciale ou saisir le mot de passe pour déverrouiller</translation> </message> <message> - <source>Failed to verify %1, please enter password to unlock</source> - <translation type="unfinished"></translation> + <location filename="../src/mainwindow.cpp" line="1439"/> + <source>Press fingerprint or enter password to unlock</source> + <translation>Appuyez sur l’empreinte digitale ou entrez le mot de passe pour déverrouiller</translation> </message> <message> - <source>Unable to verify %1, please enter password to unlock</source> - <translation type="unfinished"></translation> + <location filename="../src/mainwindow.cpp" line="1444"/> + <source>Verify voiceprint or enter password to unlock</source> + <translation>Vérifier l’empreinte vocale ou saisir le mot de passe pour déverrouiller</translation> </message> <message> - <source>A program is attempting to perform an action that requires privileges.It requires authorization to perform the action.</source> - <translation type="unfinished"></translation> + <location filename="../src/mainwindow.cpp" line="1449"/> + <source>Verify finger vein or enter password to unlock</source> + <translation>Vérifiez la veine du doigt ou entrez le mot de passe pour déverrouiller</translation> </message> <message> - <source>_Password:</source> - <translation type="unfinished"></translation> + <location filename="../src/mainwindow.cpp" line="1454"/> + <source>Verify iris or enter password to unlock</source> + <translation>Vérifiez l’iris ou entrez le mot de passe pour déverrouiller</translation> </message> <message> - <source>_Password: </source> - <translation type="unfinished"></translation> + <location filename="../src/mainwindow.cpp" line="1459"/> + <source>Use the bound wechat scanning code or enter the password to unlock</source> + <translation>Utilisez le code d’analyse wechat lié ou entrez le mot de passe pour déverrouiller</translation> </message> <message> - <source>Abnormal network</source> - <translation type="unfinished"></translation> + <source>Use the bound wechat scanning code or enter the password to log in</source> + <translation type="vanished">使用绑定的微信扫码或输入密码登录</translation> </message> <message> - <source>This operation requires the administrator's authorization. Please enter your password to allow this operation.</source> - <translation type="unfinished"></translation> + <location filename="../src/mainwindow.cpp" line="779"/> + <location filename="../src/mainwindow.cpp" line="783"/> + <location filename="../src/mainwindow.cpp" line="787"/> + <location filename="../src/mainwindow.cpp" line="791"/> + <source>Account locked,</source> + <translation>Compte verrouillé,</translation> + </message> + <message> + <source>Authentication failed, please try again</source> + <translation type="obsolete">认证失败,请重试</translation> </message> </context> <context> <name>PolkitListener</name> <message> + <location filename="../src/PolkitListener.cpp" line="88"/> <source>Another client is already authenticating, please try again later.</source> - <translation>Un autre client s'authentifie déjà. Veuillez réessayer ultérieurement.</translation> + <translation>Un autre client est déjà en train de s’authentifier, veuillez réessayer plus tard.</translation> </message> <message> + <location filename="../src/PolkitListener.cpp" line="265"/> <source>Authentication failure, please try again.</source> - <translation>Échec de l'authentification, veuillez réessayer.</translation> + <translation>Échec de l’authentification, veuillez réessayer.</translation> </message> <message> + <location filename="../src/PolkitListener.cpp" line="272"/> <source>Password input error!</source> - <translation type="unfinished"></translation> + <translation>Erreur de saisie du mot de passe !</translation> + </message> + <message> + <source>Account locked %1 minutes due to %2 fail attempts</source> + <translation type="vanished">账户锁定%1分钟由于%2次错误尝试</translation> + </message> + <message> + <source>Authentication failure,there are still %1 remaining opportunities</source> + <translation type="vanished">认证失败,还剩余%1次尝试机会</translation> </message> </context> <context> <name>QObject</name> <message> + <source>FingerPrint</source> + <translation type="obsolete">指纹</translation> + </message> + <message> + <source>FingerVein</source> + <translation type="obsolete">指静脉</translation> + </message> + <message> + <source>Iris</source> + <translation type="obsolete">虹膜</translation> + </message> + <message> + <source>Face</source> + <translation type="obsolete">人脸</translation> + </message> + <message> + <source>VoicePrint</source> + <translation type="obsolete">声纹</translation> + </message> + <message> <source>Cancel</source> - <translation type="obsolete">Annuler</translation> + <translation type="obsolete">取消</translation> </message> </context> </TS> diff -Nru ukui-biometric-auth-4.10.0.0/polkit-agent/i18n_ts/kk.ts ukui-biometric-auth-4.20.0.0/polkit-agent/i18n_ts/kk.ts --- ukui-biometric-auth-4.10.0.0/polkit-agent/i18n_ts/kk.ts 1970-01-01 08:00:00.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/polkit-agent/i18n_ts/kk.ts 2024-09-23 19:22:29.000000000 +0800 @@ -0,0 +1,441 @@ +<?xml version="1.0" encoding="utf-8"?> +<!DOCTYPE TS> +<TS version="2.1" language="kk"> +<context> + <name>BioAuthWidget</name> + <message> + <source>Retry</source> + <translation type="obsolete">重试</translation> + </message> + <message> + <source>%1 too many unsuccessful attempts,please enter password.</source> + <translation type="obsolete">%1验证失败达最大次数,请使用密码登录</translation> + </message> + <message> + <source>%1 authentication failure,there are still %2 remaining opportunities</source> + <translation type="obsolete">%1认证失败,还剩%2次尝试机会</translation> + </message> + <message> + <source>Please use wechat to scan the code</source> + <translation type="vanished">请使用微信扫码</translation> + </message> +</context> +<context> + <name>BioDevices</name> + <message> + <source>FingerPrint</source> + <translation type="obsolete">指纹</translation> + </message> + <message> + <source>FingerVein</source> + <translation type="obsolete">指静脉</translation> + </message> + <message> + <source>Iris</source> + <translation type="obsolete">虹膜</translation> + </message> + <message> + <source>Face</source> + <translation type="obsolete">人脸</translation> + </message> + <message> + <source>VoicePrint</source> + <translation type="obsolete">声纹</translation> + </message> + <message> + <source>Wechat</source> + <translation type="vanished">微信</translation> + </message> + <message> + <source>QRCode</source> + <translation type="vanished">二维码</translation> + </message> +</context> +<context> + <name>LoginOptionsWidget</name> + <message> + <source>Login Options</source> + <translation type="vanished">登录选项</translation> + </message> + <message> + <source>Wechat</source> + <translation type="vanished">微信</translation> + </message> +</context> +<context> + <name>MainWindow</name> + <message> + <location filename="../src/mainwindow.cpp" line="66"/> + <source>Authentication</source> + <translation>شىندىقتى دالەلدەۋ</translation> + </message> + <message> + <source>Fingerprint authentication failed, you still have %1 verification opportunities</source> + <translation type="vanished">指纹验证失败,您还有%1次尝试机会</translation> + </message> + <message> + <location filename="../src/mainwindow.ui" line="26"/> + <source>Form</source> + <translation>كەستە</translation> + </message> + <message> + <source>More</source> + <translation type="obsolete">更多</translation> + </message> + <message> + <source>Restart</source> + <translation type="obsolete">重新开始</translation> + </message> + <message> + <source>Password</source> + <translation type="vanished">密码</translation> + </message> + <message> + <location filename="../src/mainwindow.ui" line="409"/> + <location filename="../src/mainwindow.cpp" line="1075"/> + <location filename="../src/mainwindow.cpp" line="1143"/> + <source>Biometric</source> + <translation>بىئولەگىيەلىك ەرەكشەلىكتى ٸستەتۋ</translation> + </message> + <message> + <location filename="../src/mainwindow.ui" line="480"/> + <source>use password</source> + <translation>قۇپيا نومەر ٸستەتۋ</translation> + </message> + <message> + <source>DeviceType:</source> + <translation type="obsolete">设备类型:</translation> + </message> + <message> + <source>Back</source> + <translation type="obsolete">返回</translation> + </message> + <message> + <source>Details</source> + <translation type="vanished">详细</translation> + </message> + <message> + <source>Action Id:</source> + <translation type="obsolete">动作:</translation> + </message> + <message> + <source>Description:</source> + <translation type="vanished">描述:</translation> + </message> + <message> + <source>Polkit.subject-pid:</source> + <translation type="vanished">Polkit.subject-pid:</translation> + </message> + <message> + <source>Retry</source> + <translation type="obsolete">重试</translation> + </message> + <message> + <source>Device types:</source> + <translation type="obsolete">设备类型:</translation> + </message> + <message> + <source>Vendor:</source> + <translation type="vanished">发行商:</translation> + </message> + <message> + <source>Action:</source> + <translation type="vanished">动作:</translation> + </message> + <message> + <source>Polkit.caller-pid:</source> + <translation type="vanished">Polkit.caller-pid:</translation> + </message> + <message> + <location filename="../src/mainwindow.ui" line="441"/> + <location filename="../src/mainwindow.cpp" line="1077"/> + <source>Cancel</source> + <translation>كۇشىنەن قالدىرۋ</translation> + </message> + <message> + <location filename="../src/mainwindow.ui" line="460"/> + <location filename="../src/mainwindow.cpp" line="1073"/> + <source>Authenticate</source> + <translation>ۇقىق بەرۋ</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="1079"/> + <location filename="../src/mainwindow.cpp" line="1183"/> + <source>Use password</source> + <translation>قۇپيا نومەر ٸستەتۋ ارقىلى دالەلدەۋ</translation> + </message> + <message> + <source>Auth</source> + <translation type="obsolete">授权</translation> + </message> + <message> + <source>Too many unsuccessful attempts,please enter password.</source> + <translation type="vanished">指纹验证失败达最大次数,请使用密码解锁</translation> + </message> + <message> + <source>%1 authentication failure,there are still %2 remaining opportunities</source> + <translation type="vanished">%1认证失败,还剩%2次尝试机会</translation> + </message> + <message> + <source>%1 too many unsuccessful attempts,please enter password.</source> + <translation type="vanished">%1验证失败达最大次数,请使用密码登录</translation> + </message> + <message> + <source>in authentication, please wait...</source> + <translation type="vanished">认证中,请稍等...</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="1219"/> + <location filename="../src/mainwindow.cpp" line="1292"/> + <location filename="../src/mainwindow.cpp" line="1293"/> + <source>Please try again in %1 minutes.</source> + <translation>٪1 مينۋت ٸشٸندە قاتە سىناپ كور.</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="1230"/> + <location filename="../src/mainwindow.cpp" line="1302"/> + <location filename="../src/mainwindow.cpp" line="1303"/> + <source>Please try again in %1 seconds.</source> + <translation>٪1 سەكونت ٸشٸندە قاتە سىناپ كور.</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="1240"/> + <location filename="../src/mainwindow.cpp" line="1241"/> + <location filename="../src/mainwindow.cpp" line="1311"/> + <location filename="../src/mainwindow.cpp" line="1312"/> + <source>Account locked permanently.</source> + <translation>ەسەپات ماڭگىلىك قۇلىپتالادى.</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="834"/> + <location filename="../src/mainwindow.cpp" line="835"/> + <source>Password cannot be empty</source> + <translation>قۇپيا نۇمىردى بوس قويۋعا بولمايدى</translation> + </message> + <message> + <source>Failed to verify %1, please enter password.</source> + <translation type="vanished">验证%1失败,请输入密码.</translation> + </message> + <message> + <source>Unable to verify %1, please enter password.</source> + <translation type="vanished">无法验证%1,请输入密码.</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="242"/> + <location filename="../src/mainwindow.cpp" line="246"/> + <source>Failed to verify %1, you still have %2 verification opportunities</source> + <translation>٪1 نى دالەلدەۋ جەڭىلىپ قالدى، سىزدە جانەدە ٪2 دالەلدەۋ ورايى بار</translation> + </message> + <message> + <source>An application is attempting to perform an action that requires privileges. Authentication is required to perform this action.</source> + <translation type="vanished">一个程序正试图执行一个需要特权的动作。要求授权以执行该动作。</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="731"/> + <source>Password: </source> + <translation>قۇپيا نومەر </translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="335"/> + <source>Please enter your password or enroll your fingerprint </source> + <translation>قۇپيا نۇمىرىڭىزدى كىرگىزىڭىز ياكي بارماقشى ئىزىڭىزنى تونۇتۇڭ </translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="259"/> + <source>Abnormal network</source> + <translation>بينورمال تور</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="665"/> + <source>This operation requires the administrator's authorization. Please enter your password to allow this operation.</source> + <translation>نۇ جوبالاۋ باسقارعٸشتٸڭ ۇقىق بىرىستى تالاپ ىستەيدى.قۇپيا نۇمىردى كىرەۈزۈپ بي رەتكى جوبالاۋنىڭ الىپ بېرىلىشىغا جول قويىڭىز.</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="733"/> + <source>_Password: </source> + <translation>قۇپيا نومەر </translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="735"/> + <source>_Password:</source> + <translation>قۇپيا نومەر</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="850"/> + <source>Authentication failed, please try again.</source> + <translation>دالەلدەۋ جەڭىلىپ قالدى، قاتە سىناڭ</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="779"/> + <source>days left</source> + <translation>1 كۇننەن كەيىن سناپ كور</translation> + </message> + <message> + <source>Biometric/code scan authentication failed too many times, please enter the password.</source> + <translation type="vanished">生物/扫码验证失败达最大次数,请使用密码解锁.</translation> + </message> + <message> + <source>Bioauth/code scan authentication failed, you still have %1 verification opportunities</source> + <translation type="vanished">生物/扫码验证失败,您还有%1次尝试机会</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="226"/> + <location filename="../src/mainwindow.cpp" line="1415"/> + <location filename="../src/mainwindow.cpp" line="1417"/> + <source>Failed to verify %1, please enter password to unlock</source> + <translation>٪1 نى دالەلدەۋ جەڭىلىپ قالدى، قۇپيا نومەر كىرگىزىڭىز</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="231"/> + <location filename="../src/mainwindow.cpp" line="233"/> + <location filename="../src/mainwindow.cpp" line="1419"/> + <source>Unable to verify %1, please enter password to unlock</source> + <translation>٪1 نى دالەلدەۋگە امالسٸز، قۇپيا نۇمىردى كىرەۈزۈپ قۇلىبىن ٴٸشڭٸز</translation> + </message> + <message> + <source>NET Exception</source> + <translation type="vanished">网络异常</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="671"/> + <source>A program is attempting to perform an action that requires privileges.It requires authorization to perform the action.</source> + <translation>بٸر پٸروگٸرامما ۇقىق تالاپ ىستەيتىن ارەكەتتى ىستەۋگە ئۇرۇنماقتا. نۇ ارەكەتتى اتقار ەتۋ ٷشٸن ۇقىق تالاپ ىستەيدى.</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="108"/> + <location filename="../src/mainwindow.cpp" line="729"/> + <source>Input Password</source> + <translation>قۇپيا نومەر كىرگىزۋ</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="105"/> + <source>Insert the ukey into the USB port</source> + <translation>ukey نى USB اۋزىنا چېتىپ قويىڭىز</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="107"/> + <source>Enter the ukey password</source> + <translation>ukey قۇپيا نۇمىردى كىرگىزىڭىز</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="783"/> + <source>hours left</source> + <translation>بٸر ساعاتتان كەيىن اشٸلدٸ</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="787"/> + <source>minutes left</source> + <translation>بٸر مينوتتىن كەيىن اشٸلدٸ</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="791"/> + <source>seconds left</source> + <translation>بٸر سەكونتىن كەيىن اشٸلدٸ</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="880"/> + <location filename="../src/mainwindow.cpp" line="888"/> + <source>Input your password to authentication</source> + <translation>قۇپيا نۇمىردى كىرەۈزۈپ ازاماتتىق كۋالىك دالەلدەۋ.</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="1434"/> + <source>Verify face recognition or enter password to unlock</source> + <translation>چىراي تانىسن دالەلدەۋ ياكي قۇپيا نومەر كىرگىزۋ ارقىلى قۇلىپ ٸشٸۋ</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="1439"/> + <source>Press fingerprint or enter password to unlock</source> + <translation>بارماقشى ٴٸزدٸ باسٸۋ ياكي قۇپيا نومەر كىرگىزۋ ارقىلى قۇلىپ ٸشٸۋ</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="1444"/> + <source>Verify voiceprint or enter password to unlock</source> + <translation>اۋا ٴٸزدٸ دالەلدەۋ ياكي قۇپيا نومەر كىرگىزۋ ارقىلى قۇلىپ ٸشٸۋ</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="1449"/> + <source>Verify finger vein or enter password to unlock</source> + <translation>بارماقشى ٴٸزٸ ارقىلى انىقتاۋ ياكي قۇپيا نومەر كىرگىزۋ ارقىلى قۇلىپ ٸشٸۋ</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="1454"/> + <source>Verify iris or enter password to unlock</source> + <translation>Iris نى انىقتاۋ ياكي قۇپيا نومەر كىرگىزۋ ارقىلى قۇلىپ ٸشٸۋ</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="1459"/> + <source>Use the bound wechat scanning code or enter the password to unlock</source> + <translation>بايلانعان ئۈندىدارنى كەسكىندەۋ بەلگىسى ياكي قۇپيا نۇمىردى كىرەۈزۈپ قۇلىپ ٸشٸۋ</translation> + </message> + <message> + <source>Use the bound wechat scanning code or enter the password to log in</source> + <translation type="vanished">使用绑定的微信扫码或输入密码登录</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="779"/> + <location filename="../src/mainwindow.cpp" line="783"/> + <location filename="../src/mainwindow.cpp" line="787"/> + <location filename="../src/mainwindow.cpp" line="791"/> + <source>Account locked,</source> + <translation>ٸستەتۋ نومەرىڭىز قۇلىپتانىپ قالدى</translation> + </message> + <message> + <source>Authentication failed, please try again</source> + <translation type="obsolete">认证失败,请重试</translation> + </message> +</context> +<context> + <name>PolkitListener</name> + <message> + <location filename="../src/PolkitListener.cpp" line="88"/> + <source>Another client is already authenticating, please try again later.</source> + <translation>جانە بٸر قاريدار دالەلدەپ جاتىر، سەل تۇرٸپ قاتە سىناڭ.</translation> + </message> + <message> + <location filename="../src/PolkitListener.cpp" line="265"/> + <source>Authentication failure, please try again.</source> + <translation>دالەلدەۋ جەڭىلىپ قالدى، قاتە سىناڭ.</translation> + </message> + <message> + <location filename="../src/PolkitListener.cpp" line="272"/> + <source>Password input error!</source> + <translation>كىرگىزگەن قۇپيا نومەر قاتە قالدى</translation> + </message> + <message> + <source>Account locked %1 minutes due to %2 fail attempts</source> + <translation type="vanished">账户锁定%1分钟由于%2次错误尝试</translation> + </message> + <message> + <source>Authentication failure,there are still %1 remaining opportunities</source> + <translation type="vanished">认证失败,还剩余%1次尝试机会</translation> + </message> +</context> +<context> + <name>QObject</name> + <message> + <source>FingerPrint</source> + <translation type="obsolete">指纹</translation> + </message> + <message> + <source>FingerVein</source> + <translation type="obsolete">指静脉</translation> + </message> + <message> + <source>Iris</source> + <translation type="obsolete">虹膜</translation> + </message> + <message> + <source>Face</source> + <translation type="obsolete">人脸</translation> + </message> + <message> + <source>VoicePrint</source> + <translation type="obsolete">声纹</translation> + </message> + <message> + <source>Cancel</source> + <translation type="obsolete">取消</translation> + </message> +</context> +</TS> diff -Nru ukui-biometric-auth-4.10.0.0/polkit-agent/i18n_ts/ky.ts ukui-biometric-auth-4.20.0.0/polkit-agent/i18n_ts/ky.ts --- ukui-biometric-auth-4.10.0.0/polkit-agent/i18n_ts/ky.ts 1970-01-01 08:00:00.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/polkit-agent/i18n_ts/ky.ts 2024-09-23 19:22:29.000000000 +0800 @@ -0,0 +1,441 @@ +<?xml version="1.0" encoding="utf-8"?> +<!DOCTYPE TS> +<TS version="2.1" language="ky"> +<context> + <name>BioAuthWidget</name> + <message> + <source>Retry</source> + <translation type="obsolete">重试</translation> + </message> + <message> + <source>%1 too many unsuccessful attempts,please enter password.</source> + <translation type="obsolete">%1验证失败达最大次数,请使用密码登录</translation> + </message> + <message> + <source>%1 authentication failure,there are still %2 remaining opportunities</source> + <translation type="obsolete">%1认证失败,还剩%2次尝试机会</translation> + </message> + <message> + <source>Please use wechat to scan the code</source> + <translation type="vanished">请使用微信扫码</translation> + </message> +</context> +<context> + <name>BioDevices</name> + <message> + <source>FingerPrint</source> + <translation type="obsolete">指纹</translation> + </message> + <message> + <source>FingerVein</source> + <translation type="obsolete">指静脉</translation> + </message> + <message> + <source>Iris</source> + <translation type="obsolete">虹膜</translation> + </message> + <message> + <source>Face</source> + <translation type="obsolete">人脸</translation> + </message> + <message> + <source>VoicePrint</source> + <translation type="obsolete">声纹</translation> + </message> + <message> + <source>Wechat</source> + <translation type="vanished">微信</translation> + </message> + <message> + <source>QRCode</source> + <translation type="vanished">二维码</translation> + </message> +</context> +<context> + <name>LoginOptionsWidget</name> + <message> + <source>Login Options</source> + <translation type="vanished">登录选项</translation> + </message> + <message> + <source>Wechat</source> + <translation type="vanished">微信</translation> + </message> +</context> +<context> + <name>MainWindow</name> + <message> + <location filename="../src/mainwindow.cpp" line="66"/> + <source>Authentication</source> + <translation>راستىنى دالىلدۅ</translation> + </message> + <message> + <source>Fingerprint authentication failed, you still have %1 verification opportunities</source> + <translation type="vanished">指纹验证失败,您还有%1次尝试机会</translation> + </message> + <message> + <location filename="../src/mainwindow.ui" line="26"/> + <source>Form</source> + <translation>جادىبال</translation> + </message> + <message> + <source>More</source> + <translation type="obsolete">更多</translation> + </message> + <message> + <source>Restart</source> + <translation type="obsolete">重新开始</translation> + </message> + <message> + <source>Password</source> + <translation type="vanished">密码</translation> + </message> + <message> + <location filename="../src/mainwindow.ui" line="409"/> + <location filename="../src/mainwindow.cpp" line="1075"/> + <location filename="../src/mainwindow.cpp" line="1143"/> + <source>Biometric</source> + <translation>بىئولەگىيەلىك ۅزگۅچۅلۉگۉ ىشتەتىش</translation> + </message> + <message> + <location filename="../src/mainwindow.ui" line="480"/> + <source>use password</source> + <translation>جاشىرۇۇن نومۇر ىشتەتىش</translation> + </message> + <message> + <source>DeviceType:</source> + <translation type="obsolete">设备类型:</translation> + </message> + <message> + <source>Back</source> + <translation type="obsolete">返回</translation> + </message> + <message> + <source>Details</source> + <translation type="vanished">详细</translation> + </message> + <message> + <source>Action Id:</source> + <translation type="obsolete">动作:</translation> + </message> + <message> + <source>Description:</source> + <translation type="vanished">描述:</translation> + </message> + <message> + <source>Polkit.subject-pid:</source> + <translation type="vanished">Polkit.subject-pid:</translation> + </message> + <message> + <source>Retry</source> + <translation type="obsolete">重试</translation> + </message> + <message> + <source>Device types:</source> + <translation type="obsolete">设备类型:</translation> + </message> + <message> + <source>Vendor:</source> + <translation type="vanished">发行商:</translation> + </message> + <message> + <source>Action:</source> + <translation type="vanished">动作:</translation> + </message> + <message> + <source>Polkit.caller-pid:</source> + <translation type="vanished">Polkit.caller-pid:</translation> + </message> + <message> + <location filename="../src/mainwindow.ui" line="441"/> + <location filename="../src/mainwindow.cpp" line="1077"/> + <source>Cancel</source> + <translation>ارعادان قالتىرىش</translation> + </message> + <message> + <location filename="../src/mainwindow.ui" line="460"/> + <location filename="../src/mainwindow.cpp" line="1073"/> + <source>Authenticate</source> + <translation>ۇقۇق بەرۉۉ</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="1079"/> + <location filename="../src/mainwindow.cpp" line="1183"/> + <source>Use password</source> + <translation>جاشىرۇۇن نومۇر ىشتەتىش ارقىلۇۇ دالىلدۅ</translation> + </message> + <message> + <source>Auth</source> + <translation type="obsolete">授权</translation> + </message> + <message> + <source>Too many unsuccessful attempts,please enter password.</source> + <translation type="vanished">指纹验证失败达最大次数,请使用密码解锁</translation> + </message> + <message> + <source>%1 authentication failure,there are still %2 remaining opportunities</source> + <translation type="vanished">%1认证失败,还剩%2次尝试机会</translation> + </message> + <message> + <source>%1 too many unsuccessful attempts,please enter password.</source> + <translation type="vanished">%1验证失败达最大次数,请使用密码登录</translation> + </message> + <message> + <source>in authentication, please wait...</source> + <translation type="vanished">认证中,请稍等...</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="1219"/> + <location filename="../src/mainwindow.cpp" line="1292"/> + <location filename="../src/mainwindow.cpp" line="1293"/> + <source>Please try again in %1 minutes.</source> + <translation>٪1 مىنۇت ىچىندە قايرا سىناپ باعىڭ.</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="1230"/> + <location filename="../src/mainwindow.cpp" line="1302"/> + <location filename="../src/mainwindow.cpp" line="1303"/> + <source>Please try again in %1 seconds.</source> + <translation>٪1 سىكونت ىچىندە قايرا سىناپ باعىڭ.</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="1240"/> + <location filename="../src/mainwindow.cpp" line="1241"/> + <location filename="../src/mainwindow.cpp" line="1311"/> + <location filename="../src/mainwindow.cpp" line="1312"/> + <source>Account locked permanently.</source> + <translation>ەسابات تۉبۅلۉك قۇلۇپلىنىدۇ.</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="834"/> + <location filename="../src/mainwindow.cpp" line="835"/> + <source>Password cannot be empty</source> + <translation>جاشىرۇۇن نومۇردۇ بوش ،بەكەر قويۇشقا بولبويت</translation> + </message> + <message> + <source>Failed to verify %1, please enter password.</source> + <translation type="vanished">验证%1失败,请输入密码.</translation> + </message> + <message> + <source>Unable to verify %1, please enter password.</source> + <translation type="vanished">无法验证%1,请输入密码.</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="242"/> + <location filename="../src/mainwindow.cpp" line="246"/> + <source>Failed to verify %1, you still have %2 verification opportunities</source> + <translation>٪1 نى دالىلدۅ جەڭىلۉۉ بولدۇ ، سىزدە داعى ەلە ٪2 دالىلدۅ مۅۅرتۉ بار</translation> + </message> + <message> + <source>An application is attempting to perform an action that requires privileges. Authentication is required to perform this action.</source> + <translation type="vanished">一个程序正试图执行一个需要特权的动作。要求授权以执行该动作。</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="731"/> + <source>Password: </source> + <translation>جاشىرۇۇن نومۇر </translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="335"/> + <source>Please enter your password or enroll your fingerprint </source> + <translation>جاشىرۇۇن نومۇرۇڭۇزدۇ كىرگىزىڭ كۅرۉنۉشتۅرۉ بارماق ئىزىڭىزنى تونۇتۇڭ </translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="259"/> + <source>Abnormal network</source> + <translation>بۅتۅنچۅ تور</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="665"/> + <source>This operation requires the administrator's authorization. Please enter your password to allow this operation.</source> + <translation>بۇل ماشقۇلدانۇۇ باشقارۇۇچۇنۇن ۇقۇق بەرۉۉنۉ تالاپ جاسايت .جاشىرۇۇن نومۇردۇ كىيىرىپ بي قاتىمقى ماشقۇلدانۇۇ نىڭ الىپ بېرىلىشىغا جول قويۇڭ.</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="733"/> + <source>_Password: </source> + <translation>جاشىرۇۇن نومۇر </translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="735"/> + <source>_Password:</source> + <translation>جاشىرۇۇن نومۇر</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="850"/> + <source>Authentication failed, please try again.</source> + <translation>دالىلدۅ جەڭىلۉۉ بولدۇ ، قايرا سىناڭ</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="779"/> + <source>days left</source> + <translation>1 كۉندۅن كىيىن سىناپ باعىڭ</translation> + </message> + <message> + <source>Biometric/code scan authentication failed too many times, please enter the password.</source> + <translation type="vanished">生物/扫码验证失败达最大次数,请使用密码解锁.</translation> + </message> + <message> + <source>Bioauth/code scan authentication failed, you still have %1 verification opportunities</source> + <translation type="vanished">生物/扫码验证失败,您还有%1次尝试机会</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="226"/> + <location filename="../src/mainwindow.cpp" line="1415"/> + <location filename="../src/mainwindow.cpp" line="1417"/> + <source>Failed to verify %1, please enter password to unlock</source> + <translation>٪1 نى دالىلدۅ جەڭىلۉۉ بولدۇ ، سىرلۇۇ نومۇر كىرگىزىڭ</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="231"/> + <location filename="../src/mainwindow.cpp" line="233"/> + <location filename="../src/mainwindow.cpp" line="1419"/> + <source>Unable to verify %1, please enter password to unlock</source> + <translation>٪1 نى دالىلدۅۅگۅ ايلاسىز، جاشىرۇۇن نومۇردۇ كىيىرىپ قۇلۇپنى اچىڭ</translation> + </message> + <message> + <source>NET Exception</source> + <translation type="vanished">网络异常</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="671"/> + <source>A program is attempting to perform an action that requires privileges.It requires authorization to perform the action.</source> + <translation>بىر پراگرامما ۇقۇق تالاپ جاسايتۇرعان قىيمىلدى جاسووعو ئۇرۇنماقتا. بۇل قىيمىلدى اتقارماق جاسوو ،اتقارۇۇ ۉچۉن ۇقۇق تالاپ جاسايت .</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="108"/> + <location filename="../src/mainwindow.cpp" line="729"/> + <source>Input Password</source> + <translation>جاشىرۇۇن نومۇر كىرگىزۉۉ</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="105"/> + <source>Insert the ukey into the USB port</source> + <translation>ukey نى USB ووزۇنا چېتىپ قويۇڭ</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="107"/> + <source>Enter the ukey password</source> + <translation>ukey جاشىرۇۇن نومۇرۇن كىرگىزىڭ</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="783"/> + <source>hours left</source> + <translation>بىر سائەتتىن كىيىن اچىلات</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="787"/> + <source>minutes left</source> + <translation>بىر مىنۇتتان كىيىن اچىلات</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="791"/> + <source>seconds left</source> + <translation>بىر سەكۇنتتان كىيىن اچىلات</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="880"/> + <location filename="../src/mainwindow.cpp" line="888"/> + <source>Input your password to authentication</source> + <translation>جاشىرۇۇن نومۇردۇ كىيىرىپ كۉبۅلۉك دالىلدۅ.</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="1434"/> + <source>Verify face recognition or enter password to unlock</source> + <translation>چىراي تاانىشتى دالىلدۅ كۅرۉنۉشتۅرۉ جاشىرۇۇن نومۇر كىرگىزۉۉ ارقىلۇۇ قۇلپ اچۇۇ</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="1439"/> + <source>Press fingerprint or enter password to unlock</source> + <translation>بارماق ىزىن باسۇۇدا كۅرۉنۉشتۅرۉ جاشىرۇۇن نومۇر كىرگىزۉۉ ارقىلۇۇ قۇلپ اچۇۇ</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="1444"/> + <source>Verify voiceprint or enter password to unlock</source> + <translation>دووش ىزىن دالىلدۅ كۅرۉنۉشتۅرۉ جاشىرۇۇن نومۇر كىرگىزۉۉ ارقىلۇۇ قۇلپ اچۇۇ</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="1449"/> + <source>Verify finger vein or enter password to unlock</source> + <translation>بارماق ئزى ارقىلۇۇ انىقتاش كۅرۉنۉشتۅرۉ جاشىرۇۇن نومۇر كىرگىزۉۉ ارقىلۇۇ قۇلپ اچۇۇ</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="1454"/> + <source>Verify iris or enter password to unlock</source> + <translation>Iris نى انىقتاش كۅرۉنۉشتۅرۉ جاشىرۇۇن نومۇر كىرگىزۉۉ ارقىلۇۇ قۇلپ اچۇۇ</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="1459"/> + <source>Use the bound wechat scanning code or enter the password to unlock</source> + <translation>بايلانعان ئۈندىدارنى ىسكاننىردوو قۇپۇيا نومۇرۇ كۅرۉنۉشتۅرۉ جاشىرۇۇن نومۇرۇن كىيىرىپ قۇلپ اچۇۇ</translation> + </message> + <message> + <source>Use the bound wechat scanning code or enter the password to log in</source> + <translation type="vanished">使用绑定的微信扫码或输入密码登录</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="779"/> + <location filename="../src/mainwindow.cpp" line="783"/> + <location filename="../src/mainwindow.cpp" line="787"/> + <location filename="../src/mainwindow.cpp" line="791"/> + <source>Account locked,</source> + <translation>ىشتەتىش نومۇرۇڭۇز قۇلۇپتالىپ قالدى</translation> + </message> + <message> + <source>Authentication failed, please try again</source> + <translation type="obsolete">认证失败,请重试</translation> + </message> +</context> +<context> + <name>PolkitListener</name> + <message> + <location filename="../src/PolkitListener.cpp" line="88"/> + <source>Another client is already authenticating, please try again later.</source> + <translation>داعى بىر سووداگەر ، جولووچۇ دالىلدەپ جاتات، سەل تۇرۇپ قايرا سىناڭ.</translation> + </message> + <message> + <location filename="../src/PolkitListener.cpp" line="265"/> + <source>Authentication failure, please try again.</source> + <translation>دالىلدۅ جەڭىلۉۉ بولدۇ ، قايرا سىناڭ.</translation> + </message> + <message> + <location filename="../src/PolkitListener.cpp" line="272"/> + <source>Password input error!</source> + <translation>كىيىرگەن جاشىرۇۇن نومۇر قاتاا بولدۇ</translation> + </message> + <message> + <source>Account locked %1 minutes due to %2 fail attempts</source> + <translation type="vanished">账户锁定%1分钟由于%2次错误尝试</translation> + </message> + <message> + <source>Authentication failure,there are still %1 remaining opportunities</source> + <translation type="vanished">认证失败,还剩余%1次尝试机会</translation> + </message> +</context> +<context> + <name>QObject</name> + <message> + <source>FingerPrint</source> + <translation type="obsolete">指纹</translation> + </message> + <message> + <source>FingerVein</source> + <translation type="obsolete">指静脉</translation> + </message> + <message> + <source>Iris</source> + <translation type="obsolete">虹膜</translation> + </message> + <message> + <source>Face</source> + <translation type="obsolete">人脸</translation> + </message> + <message> + <source>VoicePrint</source> + <translation type="obsolete">声纹</translation> + </message> + <message> + <source>Cancel</source> + <translation type="obsolete">取消</translation> + </message> +</context> +</TS> diff -Nru ukui-biometric-auth-4.10.0.0/polkit-agent/i18n_ts/mn.ts ukui-biometric-auth-4.20.0.0/polkit-agent/i18n_ts/mn.ts --- ukui-biometric-auth-4.10.0.0/polkit-agent/i18n_ts/mn.ts 1970-01-01 08:00:00.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/polkit-agent/i18n_ts/mn.ts 2024-09-23 19:22:29.000000000 +0800 @@ -0,0 +1,441 @@ +<?xml version="1.0" encoding="utf-8"?> +<!DOCTYPE TS> +<TS version="2.1" language="mn"> +<context> + <name>BioAuthWidget</name> + <message> + <source>Retry</source> + <translation type="obsolete">重试</translation> + </message> + <message> + <source>%1 too many unsuccessful attempts,please enter password.</source> + <translation type="obsolete">%1验证失败达最大次数,请使用密码登录</translation> + </message> + <message> + <source>%1 authentication failure,there are still %2 remaining opportunities</source> + <translation type="obsolete">%1认证失败,还剩%2次尝试机会</translation> + </message> + <message> + <source>Please use wechat to scan the code</source> + <translation type="vanished">请使用微信扫码</translation> + </message> +</context> +<context> + <name>BioDevices</name> + <message> + <source>FingerPrint</source> + <translation type="obsolete">指纹</translation> + </message> + <message> + <source>FingerVein</source> + <translation type="obsolete">指静脉</translation> + </message> + <message> + <source>Iris</source> + <translation type="obsolete">虹膜</translation> + </message> + <message> + <source>Face</source> + <translation type="obsolete">人脸</translation> + </message> + <message> + <source>VoicePrint</source> + <translation type="obsolete">声纹</translation> + </message> + <message> + <source>Wechat</source> + <translation type="vanished">微信</translation> + </message> + <message> + <source>QRCode</source> + <translation type="vanished">二维码</translation> + </message> +</context> +<context> + <name>LoginOptionsWidget</name> + <message> + <source>Login Options</source> + <translation type="vanished">登录选项</translation> + </message> + <message> + <source>Wechat</source> + <translation type="vanished">微信</translation> + </message> +</context> +<context> + <name>MainWindow</name> + <message> + <location filename="../src/mainwindow.cpp" line="66"/> + <source>Authentication</source> + <translation>ᠡᠷᠬᠡ ᠤᠯᠭᠤᠬᠤ</translation> + </message> + <message> + <source>Fingerprint authentication failed, you still have %1 verification opportunities</source> + <translation type="vanished">指纹验证失败,您还有%1次尝试机会</translation> + </message> + <message> + <location filename="../src/mainwindow.ui" line="26"/> + <source>Form</source> + <translation></translation> + </message> + <message> + <source>More</source> + <translation type="obsolete">更多</translation> + </message> + <message> + <source>Restart</source> + <translation type="obsolete">重新开始</translation> + </message> + <message> + <source>Password</source> + <translation type="vanished">密码</translation> + </message> + <message> + <location filename="../src/mainwindow.ui" line="409"/> + <location filename="../src/mainwindow.cpp" line="1075"/> + <location filename="../src/mainwindow.cpp" line="1143"/> + <source>Biometric</source> + <translation>ᠠᠮᠢᠳᠤ ᠪᠤᠳᠠᠰ ᠢ᠋ ᠬᠡᠷᠡᠭᠯᠡᠵᠤ ᠢᠯᠭᠠᠨ ᠳᠠᠨᠢᠬᠤ</translation> + </message> + <message> + <location filename="../src/mainwindow.ui" line="480"/> + <source>use password</source> + <translation>ᠰᠢᠯᠭᠠᠨ ᠪᠠᠳᠤᠯᠠᠭᠰᠠᠨ ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋ ᠢ᠋ ᠬᠡᠷᠡᠭᠯᠡᠬᠦ</translation> + </message> + <message> + <source>DeviceType:</source> + <translation type="obsolete">设备类型:</translation> + </message> + <message> + <source>Back</source> + <translation type="obsolete">返回</translation> + </message> + <message> + <source>Details</source> + <translation type="vanished">详细</translation> + </message> + <message> + <source>Action Id:</source> + <translation type="obsolete">动作:</translation> + </message> + <message> + <source>Description:</source> + <translation type="vanished">描述:</translation> + </message> + <message> + <source>Polkit.subject-pid:</source> + <translation type="vanished">Polkit.subject-pid:</translation> + </message> + <message> + <source>Retry</source> + <translation type="obsolete">重试</translation> + </message> + <message> + <source>Device types:</source> + <translation type="obsolete">设备类型:</translation> + </message> + <message> + <source>Vendor:</source> + <translation type="vanished">发行商:</translation> + </message> + <message> + <source>Action:</source> + <translation type="vanished">动作:</translation> + </message> + <message> + <source>Polkit.caller-pid:</source> + <translation type="vanished">Polkit.caller-pid:</translation> + </message> + <message> + <location filename="../src/mainwindow.ui" line="441"/> + <location filename="../src/mainwindow.cpp" line="1077"/> + <source>Cancel</source> + <translation>ᠦᠬᠡᠢᠰᠭᠡᠬᠦ᠌</translation> + </message> + <message> + <location filename="../src/mainwindow.ui" line="460"/> + <location filename="../src/mainwindow.cpp" line="1073"/> + <source>Authenticate</source> + <translation>ᠡᠷᠬᠡ ᠤᠯᠭᠤᠬᠤ</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="1079"/> + <location filename="../src/mainwindow.cpp" line="1183"/> + <source>Use password</source> + <translation>ᠰᠢᠯᠭᠠᠨ ᠪᠠᠳᠤᠯᠠᠭᠰᠠᠨ ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋ ᠢ᠋ ᠬᠡᠷᠡᠭᠯᠡᠬᠦ</translation> + </message> + <message> + <source>Auth</source> + <translation type="obsolete">授权</translation> + </message> + <message> + <source>Too many unsuccessful attempts,please enter password.</source> + <translation type="vanished">指纹验证失败达最大次数,请使用密码解锁</translation> + </message> + <message> + <source>%1 authentication failure,there are still %2 remaining opportunities</source> + <translation type="vanished">%1认证失败,还剩%2次尝试机会</translation> + </message> + <message> + <source>%1 too many unsuccessful attempts,please enter password.</source> + <translation type="vanished">%1验证失败达最大次数,请使用密码登录</translation> + </message> + <message> + <source>in authentication, please wait...</source> + <translation type="vanished">认证中,请稍等...</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="1219"/> + <location filename="../src/mainwindow.cpp" line="1292"/> + <location filename="../src/mainwindow.cpp" line="1293"/> + <source>Please try again in %1 minutes.</source> + <translation>%1 ᠮᠢᠨᠦ᠋ᠲᠦᠨ ᠳᠠᠷᠠᠭᠠ ᠳᠠᠬᠢᠵᠤ ᠳᠤᠷᠱᠢᠭᠠᠷᠠᠢ.</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="1230"/> + <location filename="../src/mainwindow.cpp" line="1302"/> + <location filename="../src/mainwindow.cpp" line="1303"/> + <source>Please try again in %1 seconds.</source> + <translation>%1 ᠮᠢᠨᠦ᠋ᠲᠦᠨ ᠳᠠᠷᠠᠭᠠ ᠳᠠᠬᠢᠵᠤ ᠳᠤᠷᠱᠢᠭᠠᠷᠠᠢ.</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="1240"/> + <location filename="../src/mainwindow.cpp" line="1241"/> + <location filename="../src/mainwindow.cpp" line="1311"/> + <location filename="../src/mainwindow.cpp" line="1312"/> + <source>Account locked permanently.</source> + <translation>ᠳᠠᠩᠰᠠ ᠨᠢᠭᠡᠨᠳᠡ ᠦᠨᠢᠳᠡ ᠤᠨᠢᠰᠤᠯᠠᠭᠳᠠᠪᠠ.</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="834"/> + <location filename="../src/mainwindow.cpp" line="835"/> + <source>Password cannot be empty</source> + <translation>ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋ ᠬᠤᠭᠤᠰᠤᠨ ᠪᠠᠢᠵᠤ ᠪᠤᠯᠬᠤ ᠦᠬᠡᠢ</translation> + </message> + <message> + <source>Failed to verify %1, please enter password.</source> + <translation type="vanished">验证%1失败,请输入密码.</translation> + </message> + <message> + <source>Unable to verify %1, please enter password.</source> + <translation type="vanished">无法验证%1,请输入密码.</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="242"/> + <location filename="../src/mainwindow.cpp" line="246"/> + <source>Failed to verify %1, you still have %2 verification opportunities</source> + <translation>%1ᠶᠢᠨ/ᠦᠨ ᠰᠢᠯᠭᠠᠨ ᠪᠠᠢᠴᠠᠭᠠᠯᠳᠠ ᠢᠯᠠᠭᠳᠠᠪᠠ ᠂ ᠲᠠ ᠪᠠᠰᠠ%2 ᠤᠳᠠᠭᠠᠨᠤ ᠳᠤᠷᠱᠢᠬᠤ ᠵᠠᠪᠱᠢᠶᠠᠨ ᠲᠠᠢ</translation> + </message> + <message> + <source>An application is attempting to perform an action that requires privileges. Authentication is required to perform this action.</source> + <translation type="vanished">一个程序正试图执行一个需要特权的动作。要求授权以执行该动作。</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="731"/> + <source>Password: </source> + <translation>ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋᠄ </translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="335"/> + <source>Please enter your password or enroll your fingerprint </source> + <translation>ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋ ᠪᠤᠶᠤ ᠬᠤᠷᠤᠭᠤᠨ ᠤ᠋ ᠤᠷᠤᠮ ᠵᠢᠨᠨ ᠤᠷᠤᠭᠤᠯᠤᠭᠠᠷᠠᠢ </translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="259"/> + <source>Abnormal network</source> + <translation>ᠲᠤᠷ ᠰᠦᠯᠵᠢᠶᠡ ᠬᠡᠪ ᠤ᠋ᠨ ᠪᠤᠰᠤ</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="665"/> + <source>This operation requires the administrator's authorization. Please enter your password to allow this operation.</source> + <translation>ᠳᠤᠰ ᠤᠳᠠᠭᠠᠨ ᠤ᠋ ᠠᠵᠢᠯᠯᠠᠬᠤᠢ ᠵᠢᠨ ᠬᠠᠮᠢᠶᠠᠷᠤᠭᠴᠢ ᠵᠢᠨ ᠡᠷᠬᠡ ᠤᠯᠭᠤᠯᠳᠠ ᠪᠡᠷ ᠰᠠᠶᠢ ᠦᠷᠬᠦᠯᠵᠢᠯᠡᠨ ᠬᠡᠷᠡᠭᠵᠢᠬᠦᠯᠦᠨᠡ᠂ ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋ ᠵᠢᠨᠨ ᠤᠷᠤᠭᠤᠯᠵᠤ ᠳᠤᠰ ᠠᠵᠢᠯᠯᠠᠬᠤᠢ ᠵᠢ ᠵᠦᠪᠰᠢᠶᠡᠷᠡᠭᠡᠷᠡᠢ.</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="733"/> + <source>_Password: </source> + <translation>ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋: </translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="735"/> + <source>_Password:</source> + <translation>ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋:</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="850"/> + <source>Authentication failed, please try again.</source> + <translation>ᠰᠢᠯᠭᠠᠨ ᠪᠠᠳᠤᠯᠠᠵᠤ ᠴᠢᠳᠠᠭᠰᠠᠨ ᠦᠬᠡᠢ᠂ ᠳᠠᠬᠢᠵᠤ ᠳᠤᠷᠰᠢᠭᠠᠷᠠᠢ.</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="779"/> + <source>days left</source> + <translation>ᠡᠳᠦᠷ ᠤ᠋ᠨ ᠳᠠᠷᠠᠭᠠ ᠤᠨᠢᠰᠤ ᠳᠠᠢᠯᠤᠨᠠ</translation> + </message> + <message> + <source>Biometric/code scan authentication failed too many times, please enter the password.</source> + <translation type="vanished">生物/扫码验证失败达最大次数,请使用密码解锁.</translation> + </message> + <message> + <source>Bioauth/code scan authentication failed, you still have %1 verification opportunities</source> + <translation type="vanished">生物/扫码验证失败,您还有%1次尝试机会</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="226"/> + <location filename="../src/mainwindow.cpp" line="1415"/> + <location filename="../src/mainwindow.cpp" line="1417"/> + <source>Failed to verify %1, please enter password to unlock</source> + <translation>%1ᠶᠢ/ᠢ ᠪᠠᠳᠤᠯᠭᠠᠵᠢᠭᠤᠯᠬᠤ ᠠᠷᠭᠠ ᠦᠬᠡᠢ ᠂ ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋ ᠤᠷᠤᠭᠤᠯᠵᠤ ᠤᠨᠢᠰᠤᠶᠢ ᠳᠠᠢᠯᠤᠭᠠᠷᠠᠢ</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="231"/> + <location filename="../src/mainwindow.cpp" line="233"/> + <location filename="../src/mainwindow.cpp" line="1419"/> + <source>Unable to verify %1, please enter password to unlock</source> + <translation>%1ᠶᠢ/ᠢ ᠪᠠᠳᠤᠯᠭᠠᠵᠢᠭᠤᠯᠬᠤ ᠠᠷᠭᠠ ᠦᠬᠡᠢ ᠂ ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋ ᠤᠷᠤᠭᠤᠯᠵᠤ ᠤᠨᠢᠰᠤᠶᠢ ᠳᠠᠢᠯᠤᠭᠠᠷᠠᠢ</translation> + </message> + <message> + <source>NET Exception</source> + <translation type="vanished">网络异常</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="671"/> + <source>A program is attempting to perform an action that requires privileges.It requires authorization to perform the action.</source> + <translation>ᠨᠢᠭᠡ ᠫᠡᠷᠦᠭᠷᠡᠮ ᠶᠠᠭ ᠨᠢᠭᠡ ᠤᠨᠠᠴᠠ ᠡᠷᠬᠡ ᠬᠡᠷᠡᠭᠰᠡᠬᠦ ᠬᠦᠳᠡᠯᠬᠡᠬᠡᠨ ᠢ᠋ ᠬᠡᠷᠡᠭᠵᠢᠬᠦᠯᠬᠦ ᠪᠡᠷ ᠳᠤᠷᠰᠢᠵᠤ ᠪᠠᠢᠨᠠ᠂ ᠳᠤᠰ ᠬᠦᠳᠡᠯᠬᠡᠬᠡᠨ ᠢ᠋ ᠬᠦᠢᠴᠡᠳᠬᠡᠬᠦ ᠡᠷᠬᠡ ᠤᠯᠭᠤᠬᠤ ᠵᠢ ᠱᠠᠭᠠᠷᠳᠠᠵᠤ ᠪᠠᠢᠨᠠ.</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="108"/> + <location filename="../src/mainwindow.cpp" line="729"/> + <source>Input Password</source> + <translation>ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋ ᠤᠷᠤᠭᠤᠯᠬᠤ</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="105"/> + <source>Insert the ukey into the USB port</source> + <translation>ᠠᠮᠤᠷ ᠲᠦᠪᠰᠢᠨ ᠦ ᠨᠢᠭᠤᠴᠠ ᠶᠢ USB ᠦᠵᠦᠭᠦᠷ ᠲᠦ ᠬᠠᠳᠬᠤᠵᠤ ᠣᠷᠣᠭᠠᠷᠠᠢ ᠃</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="107"/> + <source>Enter the ukey password</source> + <translation>ᠠᠮᠤᠷ ᠲᠦᠪᠰᠢᠨ ᠨᠢᠭᠤᠴᠠ ᠨᠣᠮᠧᠷ ᠢ ᠣᠷᠣᠭᠤᠯᠤᠨᠠ ᠃</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="783"/> + <source>hours left</source> + <translation>ᠨᠢᠭᠡ ᠴᠠᠭ ᠤ᠋ᠨ ᠳᠠᠷᠠᠭᠠ ᠤᠨᠢᠰᠤ ᠳᠠᠢᠯᠤᠨᠠ</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="787"/> + <source>minutes left</source> + <translation>ᠮᠢᠨᠦ᠋ᠲ ᠤ᠋ᠨ ᠳᠠᠷᠠᠭᠠ ᠤᠨᠢᠰᠤ ᠳᠠᠢᠯᠤᠨᠠ</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="791"/> + <source>seconds left</source> + <translation>ᠰᠸᠺᠦᠨ᠋ᠲ ᠤ᠋ᠨ ᠳᠠᠷᠠᠭᠠ ᠤᠨᠢᠰᠤ ᠳᠠᠢᠯᠤᠨᠠ</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="880"/> + <location filename="../src/mainwindow.cpp" line="888"/> + <source>Input your password to authentication</source> + <translation>ᠨᠢᠭᠤᠴᠠ ᠨᠣᠮᠧᠷ ᠣᠷᠣᠭᠤᠯᠬᠤ ᠳᠤ ᠡᠷᠬᠡ ᠣᠯᠭᠣᠨᠠ ᠃</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="1434"/> + <source>Verify face recognition or enter password to unlock</source> + <translation>ᠨᠢᠭᠤᠷ ᠱᠢᠷᠪᠢᠵᠤ ᠪᠠᠳᠤᠯᠭᠠᠵᠢᠭᠤᠯᠬᠤ ᠪᠤᠶᠤ ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋ ᠤᠷᠤᠭᠤᠯᠵᠤ ᠤᠨᠢᠰᠤᠶᠢ ᠳᠠᠢᠯᠤᠭᠠᠷᠠᠢ</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="1439"/> + <source>Press fingerprint or enter password to unlock</source> + <translation>ᠬᠤᠷᠤᠭᠤᠨᠤ ᠤᠷᠤᠮ ᠳᠠᠷᠤᠬᠤ ᠪᠤᠶᠤ ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋ ᠤᠷᠤᠭᠤᠯᠵᠤ ᠤᠨᠢᠰᠤᠶᠢ ᠳᠠᠢᠯᠤᠭᠠᠷᠠᠢ</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="1444"/> + <source>Verify voiceprint or enter password to unlock</source> + <translation>ᠳᠠᠭᠤᠪᠠᠷ ᠰᠢᠯᠭᠠᠨ ᠪᠠᠳᠤᠯᠠᠬᠤ ᠪᠤᠶᠤ ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋ ᠤᠷᠤᠭᠤᠯᠵᠤ ᠤᠨᠢᠰᠤᠶᠢ ᠳᠠᠢᠯᠤᠭᠠᠷᠠᠢ</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="1449"/> + <source>Verify finger vein or enter password to unlock</source> + <translation>ᠬᠤᠷᠤᠭᠤᠨᠤ ᠨᠠᠮᠵᠢᠭᠤᠨ ᠰᠤᠳᠠᠯᠢᠶᠠᠷ ᠰᠢᠯᠭᠠᠨ ᠪᠠᠳᠤᠯᠠᠬᠤ ᠪᠤᠶᠤ ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋ ᠤᠷᠤᠭᠤᠯᠵᠤ ᠤᠨᠢᠰᠤᠶᠢ ᠳᠠᠢᠯᠤᠭᠠᠷᠠᠢ</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="1454"/> + <source>Verify iris or enter password to unlock</source> + <translation>ᠰᠤᠯᠤᠩᠭᠠ ᠪᠦᠷᠬᠦᠪᠴᠢᠶᠢ ᠰᠢᠯᠭᠠᠨ ᠪᠠᠳᠤᠯᠠᠬᠤ ᠪᠤᠶᠤ ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋ ᠤᠷᠤᠭᠤᠯᠵᠤ ᠤᠨᠢᠰᠤᠶᠢ ᠳᠠᠢᠯᠤᠭᠠᠷᠠᠢ</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="1459"/> + <source>Use the bound wechat scanning code or enter the password to unlock</source> + <translation>ᠤᠶᠠᠭᠰᠠᠨ ᠸᠢᠴᠠᠲᠢᠶᠠᠷ ᠺᠤᠳ᠋ ᠱᠢᠷᠪᠢᠬᠦ᠌ ᠪᠤᠶᠤ ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋ ᠤᠷᠤᠭᠤᠯᠵᠤ ᠤᠨᠢᠰᠤᠶᠢ ᠳᠠᠢᠯᠤᠭᠠᠷᠠᠢ</translation> + </message> + <message> + <source>Use the bound wechat scanning code or enter the password to log in</source> + <translation type="vanished">使用绑定的微信扫码或输入密码登录</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="779"/> + <location filename="../src/mainwindow.cpp" line="783"/> + <location filename="../src/mainwindow.cpp" line="787"/> + <location filename="../src/mainwindow.cpp" line="791"/> + <source>Account locked,</source> + <translation>ᠳᠠᠨᠭᠰᠠ ᠵᠢ ᠨᠢᠬᠡᠨᠳᠡ ᠤᠨᠢᠰᠤᠯᠠᠪᠠ</translation> + </message> + <message> + <source>Authentication failed, please try again</source> + <translation type="obsolete">认证失败,请重试</translation> + </message> +</context> +<context> + <name>PolkitListener</name> + <message> + <location filename="../src/PolkitListener.cpp" line="88"/> + <source>Another client is already authenticating, please try again later.</source> + <translation>ᠦᠬᠡᠷᠡ ᠨᠢᠭᠡ ᠬᠡᠷᠡᠭᠯᠡᠭᠴᠢ ᠵᠢᠨ ᠦᠵᠦᠬᠦᠷᠯᠢᠭ ᠢ᠋ ᠶᠠᠭ ᠨᠤᠳᠠᠯᠠᠵᠤ ᠪᠠᠢᠨᠠ᠂ ᠤᠳᠠᠰᠬᠢᠭᠠᠳ ᠳᠠᠬᠢᠨ ᠳᠤᠷᠰᠢᠭᠠᠷᠠᠢ.</translation> + </message> + <message> + <location filename="../src/PolkitListener.cpp" line="265"/> + <source>Authentication failure, please try again.</source> + <translation>ᠰᠢᠯᠭᠠᠨ ᠪᠠᠳᠤᠯᠠᠵᠤ ᠴᠢᠳᠠᠭᠰᠠᠨ ᠦᠬᠡᠢ᠂ ᠳᠠᠬᠢᠵᠤ ᠳᠤᠷᠰᠢᠭᠠᠷᠠᠢ.</translation> + </message> + <message> + <location filename="../src/PolkitListener.cpp" line="272"/> + <source>Password input error!</source> + <translation>ᠨᠢᠭᠤᠴᠠ ᠺᠤᠳ᠋ ᠢ᠋ ᠪᠤᠷᠤᠭᠤ ᠤᠷᠤᠭᠤᠯᠪᠠ!</translation> + </message> + <message> + <source>Account locked %1 minutes due to %2 fail attempts</source> + <translation type="vanished">账户锁定%1分钟由于%2次错误尝试</translation> + </message> + <message> + <source>Authentication failure,there are still %1 remaining opportunities</source> + <translation type="vanished">认证失败,还剩余%1次尝试机会</translation> + </message> +</context> +<context> + <name>QObject</name> + <message> + <source>FingerPrint</source> + <translation type="obsolete">指纹</translation> + </message> + <message> + <source>FingerVein</source> + <translation type="obsolete">指静脉</translation> + </message> + <message> + <source>Iris</source> + <translation type="obsolete">虹膜</translation> + </message> + <message> + <source>Face</source> + <translation type="obsolete">人脸</translation> + </message> + <message> + <source>VoicePrint</source> + <translation type="obsolete">声纹</translation> + </message> + <message> + <source>Cancel</source> + <translation type="obsolete">取消</translation> + </message> +</context> +</TS> diff -Nru ukui-biometric-auth-4.10.0.0/polkit-agent/i18n_ts/pt.ts ukui-biometric-auth-4.20.0.0/polkit-agent/i18n_ts/pt.ts --- ukui-biometric-auth-4.10.0.0/polkit-agent/i18n_ts/pt.ts 2023-11-14 16:23:44.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/polkit-agent/i18n_ts/pt.ts 2024-09-23 19:22:29.000000000 +0800 @@ -185,6 +185,18 @@ <source>This operation requires the administrator's authorization. Please enter your password to allow this operation.</source> <translation type="unfinished"></translation> </message> + <message> + <source>Insert the ukey into the USB port</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Enter the ukey password</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Input your password to authentication</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>PolkitListener</name> diff -Nru ukui-biometric-auth-4.10.0.0/polkit-agent/i18n_ts/ru.ts ukui-biometric-auth-4.20.0.0/polkit-agent/i18n_ts/ru.ts --- ukui-biometric-auth-4.10.0.0/polkit-agent/i18n_ts/ru.ts 2023-11-14 16:23:44.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/polkit-agent/i18n_ts/ru.ts 2024-09-23 19:22:29.000000000 +0800 @@ -185,6 +185,18 @@ <source>This operation requires the administrator's authorization. Please enter your password to allow this operation.</source> <translation type="unfinished"></translation> </message> + <message> + <source>Insert the ukey into the USB port</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Enter the ukey password</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Input your password to authentication</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>PolkitListener</name> diff -Nru ukui-biometric-auth-4.10.0.0/polkit-agent/i18n_ts/tr.ts ukui-biometric-auth-4.20.0.0/polkit-agent/i18n_ts/tr.ts --- ukui-biometric-auth-4.10.0.0/polkit-agent/i18n_ts/tr.ts 2023-11-14 16:23:44.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/polkit-agent/i18n_ts/tr.ts 2024-09-23 19:22:29.000000000 +0800 @@ -34,136 +34,156 @@ <context> <name>MainWindow</name> <message> - <location filename="../src/mainwindow.cpp" line="65"/> + <location filename="../src/mainwindow.cpp" line="66"/> <source>Authentication</source> <translation>Kimlik Doğrulama</translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="164"/> - <location filename="../src/mainwindow.cpp" line="1176"/> + <location filename="../src/mainwindow.cpp" line="226"/> + <location filename="../src/mainwindow.cpp" line="1415"/> + <location filename="../src/mainwindow.cpp" line="1417"/> <source>Failed to verify %1, please enter password to unlock</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="168"/> - <location filename="../src/mainwindow.cpp" line="1178"/> + <location filename="../src/mainwindow.cpp" line="231"/> + <location filename="../src/mainwindow.cpp" line="233"/> + <location filename="../src/mainwindow.cpp" line="1419"/> <source>Unable to verify %1, please enter password to unlock</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="175"/> + <location filename="../src/mainwindow.cpp" line="242"/> + <location filename="../src/mainwindow.cpp" line="246"/> <source>Failed to verify %1, you still have %2 verification opportunities</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="187"/> + <location filename="../src/mainwindow.cpp" line="259"/> <source>Abnormal network</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="511"/> + <location filename="../src/mainwindow.cpp" line="665"/> <source>This operation requires the administrator's authorization. Please enter your password to allow this operation.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="517"/> + <location filename="../src/mainwindow.cpp" line="671"/> <source>A program is attempting to perform an action that requires privileges.It requires authorization to perform the action.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="576"/> + <location filename="../src/mainwindow.cpp" line="108"/> + <location filename="../src/mainwindow.cpp" line="729"/> <source>Input Password</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="623"/> - <location filename="../src/mainwindow.cpp" line="627"/> - <location filename="../src/mainwindow.cpp" line="631"/> - <location filename="../src/mainwindow.cpp" line="635"/> + <location filename="../src/mainwindow.cpp" line="105"/> + <source>Insert the ukey into the USB port</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="107"/> + <source>Enter the ukey password</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="779"/> + <location filename="../src/mainwindow.cpp" line="783"/> + <location filename="../src/mainwindow.cpp" line="787"/> + <location filename="../src/mainwindow.cpp" line="791"/> <source>Account locked,</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="623"/> + <location filename="../src/mainwindow.cpp" line="779"/> <source>days left</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="627"/> + <location filename="../src/mainwindow.cpp" line="783"/> <source>hours left</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="631"/> + <location filename="../src/mainwindow.cpp" line="787"/> <source>minutes left</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="635"/> + <location filename="../src/mainwindow.cpp" line="791"/> <source>seconds left</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="675"/> - <location filename="../src/mainwindow.cpp" line="676"/> + <location filename="../src/mainwindow.cpp" line="834"/> + <location filename="../src/mainwindow.cpp" line="835"/> <source>Password cannot be empty</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="886"/> - <location filename="../src/mainwindow.cpp" line="991"/> + <location filename="../src/mainwindow.cpp" line="880"/> + <location filename="../src/mainwindow.cpp" line="888"/> + <source>Input your password to authentication</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="1079"/> + <location filename="../src/mainwindow.cpp" line="1183"/> <source>Use password</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="1026"/> - <location filename="../src/mainwindow.cpp" line="1093"/> - <location filename="../src/mainwindow.cpp" line="1094"/> + <location filename="../src/mainwindow.cpp" line="1219"/> + <location filename="../src/mainwindow.cpp" line="1292"/> + <location filename="../src/mainwindow.cpp" line="1293"/> <source>Please try again in %1 minutes.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="1036"/> - <location filename="../src/mainwindow.cpp" line="1103"/> - <location filename="../src/mainwindow.cpp" line="1104"/> + <location filename="../src/mainwindow.cpp" line="1230"/> + <location filename="../src/mainwindow.cpp" line="1302"/> + <location filename="../src/mainwindow.cpp" line="1303"/> <source>Please try again in %1 seconds.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="1045"/> - <location filename="../src/mainwindow.cpp" line="1046"/> - <location filename="../src/mainwindow.cpp" line="1112"/> - <location filename="../src/mainwindow.cpp" line="1113"/> + <location filename="../src/mainwindow.cpp" line="1240"/> + <location filename="../src/mainwindow.cpp" line="1241"/> + <location filename="../src/mainwindow.cpp" line="1311"/> + <location filename="../src/mainwindow.cpp" line="1312"/> <source>Account locked permanently.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="1193"/> + <location filename="../src/mainwindow.cpp" line="1434"/> <source>Verify face recognition or enter password to unlock</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="1198"/> + <location filename="../src/mainwindow.cpp" line="1439"/> <source>Press fingerprint or enter password to unlock</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="1203"/> + <location filename="../src/mainwindow.cpp" line="1444"/> <source>Verify voiceprint or enter password to unlock</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="1208"/> + <location filename="../src/mainwindow.cpp" line="1449"/> <source>Verify finger vein or enter password to unlock</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="1213"/> + <location filename="../src/mainwindow.cpp" line="1454"/> <source>Verify iris or enter password to unlock</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="1218"/> + <location filename="../src/mainwindow.cpp" line="1459"/> <source>Use the bound wechat scanning code or enter the password to unlock</source> <translation type="unfinished"></translation> </message> @@ -185,9 +205,9 @@ <translation type="obsolete">Parola</translation> </message> <message> - <location filename="../src/mainwindow.ui" line="302"/> - <location filename="../src/mainwindow.cpp" line="882"/> - <location filename="../src/mainwindow.cpp" line="948"/> + <location filename="../src/mainwindow.ui" line="409"/> + <location filename="../src/mainwindow.cpp" line="1075"/> + <location filename="../src/mainwindow.cpp" line="1143"/> <source>Biometric</source> <translation>Biyometrik</translation> </message> @@ -236,19 +256,19 @@ <translation type="vanished">Polkit.caller-pid:</translation> </message> <message> - <location filename="../src/mainwindow.ui" line="334"/> - <location filename="../src/mainwindow.cpp" line="884"/> + <location filename="../src/mainwindow.ui" line="441"/> + <location filename="../src/mainwindow.cpp" line="1077"/> <source>Cancel</source> <translation>İptal</translation> </message> <message> - <location filename="../src/mainwindow.ui" line="353"/> - <location filename="../src/mainwindow.cpp" line="880"/> + <location filename="../src/mainwindow.ui" line="460"/> + <location filename="../src/mainwindow.cpp" line="1073"/> <source>Authenticate</source> <translation>Kimlik Doğrulaması</translation> </message> <message> - <location filename="../src/mainwindow.ui" line="373"/> + <location filename="../src/mainwindow.ui" line="480"/> <source>use password</source> <translation type="unfinished"></translation> </message> @@ -257,7 +277,7 @@ <translation type="obsolete">Kimlik Doğrulaması</translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="261"/> + <location filename="../src/mainwindow.cpp" line="335"/> <source>Please enter your password or enroll your fingerprint </source> <translation type="unfinished"></translation> </message> @@ -270,22 +290,22 @@ <translation type="vanished">Bir uygulama, ayrıcalıklar gerektiren bir eylem gerçekleştirmeye çalışıyor. Bu işlemi gerçekleştirmek için kimlik doğrulaması gerekiyor.</translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="578"/> + <location filename="../src/mainwindow.cpp" line="731"/> <source>Password: </source> <translation type="unfinished">Parola: </translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="580"/> + <location filename="../src/mainwindow.cpp" line="733"/> <source>_Password: </source> <translation type="unfinished">_Parola: </translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="582"/> + <location filename="../src/mainwindow.cpp" line="735"/> <source>_Password:</source> <translation type="unfinished">_Parola:</translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="691"/> + <location filename="../src/mainwindow.cpp" line="850"/> <source>Authentication failed, please try again.</source> <translation>Kimlik doğrulama başarısız, lütfen tekrar deneyin.</translation> </message> @@ -302,12 +322,12 @@ <translation>Başka bir hesap zaten kimlik doğrulaması yapıyor, lütfen daha sonra tekrar deneyin.</translation> </message> <message> - <location filename="../src/PolkitListener.cpp" line="257"/> + <location filename="../src/PolkitListener.cpp" line="265"/> <source>Authentication failure, please try again.</source> <translation>Kimlik doğrulama hatalı, lütfen tekrar deneyin.</translation> </message> <message> - <location filename="../src/PolkitListener.cpp" line="264"/> + <location filename="../src/PolkitListener.cpp" line="272"/> <source>Password input error!</source> <translation type="unfinished"></translation> </message> diff -Nru ukui-biometric-auth-4.10.0.0/polkit-agent/i18n_ts/ug.ts ukui-biometric-auth-4.20.0.0/polkit-agent/i18n_ts/ug.ts --- ukui-biometric-auth-4.10.0.0/polkit-agent/i18n_ts/ug.ts 1970-01-01 08:00:00.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/polkit-agent/i18n_ts/ug.ts 2024-09-23 19:22:29.000000000 +0800 @@ -0,0 +1,441 @@ +<?xml version="1.0" encoding="utf-8"?> +<!DOCTYPE TS> +<TS version="2.1" language="ug"> +<context> + <name>BioAuthWidget</name> + <message> + <source>Retry</source> + <translation type="obsolete">重试</translation> + </message> + <message> + <source>%1 too many unsuccessful attempts,please enter password.</source> + <translation type="obsolete">%1验证失败达最大次数,请使用密码登录</translation> + </message> + <message> + <source>%1 authentication failure,there are still %2 remaining opportunities</source> + <translation type="obsolete">%1认证失败,还剩%2次尝试机会</translation> + </message> + <message> + <source>Please use wechat to scan the code</source> + <translation type="vanished">请使用微信扫码</translation> + </message> +</context> +<context> + <name>BioDevices</name> + <message> + <source>FingerPrint</source> + <translation type="obsolete">指纹</translation> + </message> + <message> + <source>FingerVein</source> + <translation type="obsolete">指静脉</translation> + </message> + <message> + <source>Iris</source> + <translation type="obsolete">虹膜</translation> + </message> + <message> + <source>Face</source> + <translation type="obsolete">人脸</translation> + </message> + <message> + <source>VoicePrint</source> + <translation type="obsolete">声纹</translation> + </message> + <message> + <source>Wechat</source> + <translation type="vanished">微信</translation> + </message> + <message> + <source>QRCode</source> + <translation type="vanished">二维码</translation> + </message> +</context> +<context> + <name>LoginOptionsWidget</name> + <message> + <source>Login Options</source> + <translation type="vanished">登录选项</translation> + </message> + <message> + <source>Wechat</source> + <translation type="vanished">微信</translation> + </message> +</context> +<context> + <name>MainWindow</name> + <message> + <location filename="../src/mainwindow.cpp" line="66"/> + <source>Authentication</source> + <translation>راستىنى دەلىللەش</translation> + </message> + <message> + <source>Fingerprint authentication failed, you still have %1 verification opportunities</source> + <translation type="vanished">指纹验证失败,您还有%1次尝试机会</translation> + </message> + <message> + <location filename="../src/mainwindow.ui" line="26"/> + <source>Form</source> + <translation>جەدۋەل</translation> + </message> + <message> + <source>More</source> + <translation type="obsolete">更多</translation> + </message> + <message> + <source>Restart</source> + <translation type="obsolete">重新开始</translation> + </message> + <message> + <source>Password</source> + <translation type="vanished">密码</translation> + </message> + <message> + <location filename="../src/mainwindow.ui" line="409"/> + <location filename="../src/mainwindow.cpp" line="1075"/> + <location filename="../src/mainwindow.cpp" line="1143"/> + <source>Biometric</source> + <translation>بىئولەگىيەلىك ئالاھىدىلىكنى ئىشلىتىش</translation> + </message> + <message> + <location filename="../src/mainwindow.ui" line="480"/> + <source>use password</source> + <translation>مەخپىي نومۇر ئىشلىتىش</translation> + </message> + <message> + <source>DeviceType:</source> + <translation type="obsolete">设备类型:</translation> + </message> + <message> + <source>Back</source> + <translation type="obsolete">返回</translation> + </message> + <message> + <source>Details</source> + <translation type="vanished">详细</translation> + </message> + <message> + <source>Action Id:</source> + <translation type="obsolete">动作:</translation> + </message> + <message> + <source>Description:</source> + <translation type="vanished">描述:</translation> + </message> + <message> + <source>Polkit.subject-pid:</source> + <translation type="vanished">Polkit.subject-pid:</translation> + </message> + <message> + <source>Retry</source> + <translation type="obsolete">重试</translation> + </message> + <message> + <source>Device types:</source> + <translation type="obsolete">设备类型:</translation> + </message> + <message> + <source>Vendor:</source> + <translation type="vanished">发行商:</translation> + </message> + <message> + <source>Action:</source> + <translation type="vanished">动作:</translation> + </message> + <message> + <source>Polkit.caller-pid:</source> + <translation type="vanished">Polkit.caller-pid:</translation> + </message> + <message> + <location filename="../src/mainwindow.ui" line="441"/> + <location filename="../src/mainwindow.cpp" line="1077"/> + <source>Cancel</source> + <translation>ئەمەلدىن قالدۇرۇش</translation> + </message> + <message> + <location filename="../src/mainwindow.ui" line="460"/> + <location filename="../src/mainwindow.cpp" line="1073"/> + <source>Authenticate</source> + <translation>ھوقۇق بېرىش</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="1079"/> + <location filename="../src/mainwindow.cpp" line="1183"/> + <source>Use password</source> + <translation>مەخپىي نومۇر ئىشلىتىش ئارقىلىق دەلىللەش</translation> + </message> + <message> + <source>Auth</source> + <translation type="obsolete">授权</translation> + </message> + <message> + <source>Too many unsuccessful attempts,please enter password.</source> + <translation type="vanished">指纹验证失败达最大次数,请使用密码解锁</translation> + </message> + <message> + <source>%1 authentication failure,there are still %2 remaining opportunities</source> + <translation type="vanished">%1认证失败,还剩%2次尝试机会</translation> + </message> + <message> + <source>%1 too many unsuccessful attempts,please enter password.</source> + <translation type="vanished">%1验证失败达最大次数,请使用密码登录</translation> + </message> + <message> + <source>in authentication, please wait...</source> + <translation type="vanished">认证中,请稍等...</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="1219"/> + <location filename="../src/mainwindow.cpp" line="1292"/> + <location filename="../src/mainwindow.cpp" line="1293"/> + <source>Please try again in %1 minutes.</source> + <translation>٪1 مىنۇت ئىچىدە قايتا سىناپ بېقىڭ.</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="1230"/> + <location filename="../src/mainwindow.cpp" line="1302"/> + <location filename="../src/mainwindow.cpp" line="1303"/> + <source>Please try again in %1 seconds.</source> + <translation>٪1 سېكۇنت ئىچىدە قايتا سىناپ بېقىڭ.</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="1240"/> + <location filename="../src/mainwindow.cpp" line="1241"/> + <location filename="../src/mainwindow.cpp" line="1311"/> + <location filename="../src/mainwindow.cpp" line="1312"/> + <source>Account locked permanently.</source> + <translation>ھېسابات مەڭگۈلۈك قۇلۇپلىنىدۇ.</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="834"/> + <location filename="../src/mainwindow.cpp" line="835"/> + <source>Password cannot be empty</source> + <translation>مەخپىي نومۇرنى بوش قويۇشقا بولمايدۇ</translation> + </message> + <message> + <source>Failed to verify %1, please enter password.</source> + <translation type="vanished">验证%1失败,请输入密码.</translation> + </message> + <message> + <source>Unable to verify %1, please enter password.</source> + <translation type="vanished">无法验证%1,请输入密码.</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="242"/> + <location filename="../src/mainwindow.cpp" line="246"/> + <source>Failed to verify %1, you still have %2 verification opportunities</source> + <translation>٪1 نى دەلىللەش مەغلۇپ بولدى، سىزدە يەنىلا ٪2 دەلىللەش پۇرسىتى بار</translation> + </message> + <message> + <source>An application is attempting to perform an action that requires privileges. Authentication is required to perform this action.</source> + <translation type="vanished">一个程序正试图执行一个需要特权的动作。要求授权以执行该动作。</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="731"/> + <source>Password: </source> + <translation>مەخپىي نومۇر </translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="335"/> + <source>Please enter your password or enroll your fingerprint </source> + <translation>مەخپىي نومۇرىڭىزنى كىرگۈزۈڭ ياكى بارماق ئىزىڭىزنى تونۇتۇڭ </translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="259"/> + <source>Abnormal network</source> + <translation>بىنورمال تور</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="665"/> + <source>This operation requires the administrator's authorization. Please enter your password to allow this operation.</source> + <translation>بۇ مەشغۇلات باشقۇرغۇچىنىڭ ھوقۇق بېرىشىنى تەلەپ قىلىدۇ.مەخپىي نومۇرنى كىرگۈزۈپ بي قېتىمقى مەشغۇلاتنىڭ ئېلىپ بېرىلىشىغا يول قويۇڭ.</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="733"/> + <source>_Password: </source> + <translation>مەخپىي نومۇر </translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="735"/> + <source>_Password:</source> + <translation>مەخپىي نومۇر</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="850"/> + <source>Authentication failed, please try again.</source> + <translation>دەلىللەش مەغلۇپ بولدى، قايتا سىناڭ</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="779"/> + <source>days left</source> + <translation>1 كۈندىن كېيىن سىناب بېقىڭ</translation> + </message> + <message> + <source>Biometric/code scan authentication failed too many times, please enter the password.</source> + <translation type="vanished">生物/扫码验证失败达最大次数,请使用密码解锁.</translation> + </message> + <message> + <source>Bioauth/code scan authentication failed, you still have %1 verification opportunities</source> + <translation type="vanished">生物/扫码验证失败,您还有%1次尝试机会</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="226"/> + <location filename="../src/mainwindow.cpp" line="1415"/> + <location filename="../src/mainwindow.cpp" line="1417"/> + <source>Failed to verify %1, please enter password to unlock</source> + <translation>٪1 نى دەلىللەش مەغلۇپ بولدى، مەخپى نۇمۇر كىرگۈزۈڭ</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="231"/> + <location filename="../src/mainwindow.cpp" line="233"/> + <location filename="../src/mainwindow.cpp" line="1419"/> + <source>Unable to verify %1, please enter password to unlock</source> + <translation>٪1 نى دەلىللەشكە ئامالسىز، مەخپىي نومۇرنى كىرگۈزۈپ قۇلۇپنى ئېچىڭ</translation> + </message> + <message> + <source>NET Exception</source> + <translation type="vanished">网络异常</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="671"/> + <source>A program is attempting to perform an action that requires privileges.It requires authorization to perform the action.</source> + <translation>بىر پروگرامما ئىمتىياز تەلەپ قىلىدىغان ھەرىكەتنى قىلىشقا ئۇرۇنماقتا. بۇ ھەرىكەتنى ئىجرا قىلىش ئۈچۈن ھوقۇق تەلەپ قىلىدۇ.</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="108"/> + <location filename="../src/mainwindow.cpp" line="729"/> + <source>Input Password</source> + <translation>ئىم كىرگۈزۈش</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="105"/> + <source>Insert the ukey into the USB port</source> + <translation>ukey نى USB ئېغىزىغا چېتىپ قويۇڭ</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="107"/> + <source>Enter the ukey password</source> + <translation>ukey مەخپىي نومۇرىنى كىرگۈزۈڭ</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="783"/> + <source>hours left</source> + <translation>بىر سائەتتىن كېيىن ئېچىلىدۇ</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="787"/> + <source>minutes left</source> + <translation>بىر مىنۇتتىن كېيىن ئېچىلىدۇ</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="791"/> + <source>seconds left</source> + <translation>بىر سېكۇنتتىن كېيىن ئېچىلىدۇ</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="880"/> + <location filename="../src/mainwindow.cpp" line="888"/> + <source>Input your password to authentication</source> + <translation>مەخپىي نومۇرنى كىرگۈزۈپ كىملىك دەلىللەش.</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="1434"/> + <source>Verify face recognition or enter password to unlock</source> + <translation>چىراي تونۇشنى دەلىللەش ياكى مەخپىي نومۇر كىرگۈزۈش ئارقىلىق قۇلۇپ ئېچىش</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="1439"/> + <source>Press fingerprint or enter password to unlock</source> + <translation>بارماق ئىزىنى بېسىش ياكى مەخپىي نومۇر كىرگۈزۈش ئارقىلىق قۇلۇپ ئېچىش</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="1444"/> + <source>Verify voiceprint or enter password to unlock</source> + <translation>ئاۋاز ئىزىنى دەلىللەش ياكى مەخپىي نومۇر كىرگۈزۈش ئارقىلىق قۇلۇپ ئېچىش</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="1449"/> + <source>Verify finger vein or enter password to unlock</source> + <translation>بارماق ئىزى ئارقىلىق ئېنىقلاش ياكى مەخپىي نومۇر كىرگۈزۈش ئارقىلىق قۇلۇپ ئېچىش</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="1454"/> + <source>Verify iris or enter password to unlock</source> + <translation>Iris نى ئېنىقلاش ياكى مەخپىي نومۇر كىرگۈزۈش ئارقىلىق قۇلۇپ ئېچىش</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="1459"/> + <source>Use the bound wechat scanning code or enter the password to unlock</source> + <translation>باغلانغان ئۈندىدارنى سىكاننېرلاش كودى ياكى مەخپىي نومۇرىنى كىرگۈزۈپ قۇلۇپ ئېچىش</translation> + </message> + <message> + <source>Use the bound wechat scanning code or enter the password to log in</source> + <translation type="vanished">使用绑定的微信扫码或输入密码登录</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="779"/> + <location filename="../src/mainwindow.cpp" line="783"/> + <location filename="../src/mainwindow.cpp" line="787"/> + <location filename="../src/mainwindow.cpp" line="791"/> + <source>Account locked,</source> + <translation>ئىشلىتىش نومۇرىڭىز قۇلۇپلىنىپ قالدى</translation> + </message> + <message> + <source>Authentication failed, please try again</source> + <translation type="obsolete">认证失败,请重试</translation> + </message> +</context> +<context> + <name>PolkitListener</name> + <message> + <location filename="../src/PolkitListener.cpp" line="88"/> + <source>Another client is already authenticating, please try again later.</source> + <translation>يەنە بىر خېرىدار دەلىللەۋاتىدۇ، سەل تۇرۇپ قايتا سىناڭ.</translation> + </message> + <message> + <location filename="../src/PolkitListener.cpp" line="265"/> + <source>Authentication failure, please try again.</source> + <translation>دەلىللەش مەغلۇپ بولدى، قايتا سىناڭ.</translation> + </message> + <message> + <location filename="../src/PolkitListener.cpp" line="272"/> + <source>Password input error!</source> + <translation>كىرگۈزگەن مەخپىي نومۇر خاتا بولدى</translation> + </message> + <message> + <source>Account locked %1 minutes due to %2 fail attempts</source> + <translation type="vanished">账户锁定%1分钟由于%2次错误尝试</translation> + </message> + <message> + <source>Authentication failure,there are still %1 remaining opportunities</source> + <translation type="vanished">认证失败,还剩余%1次尝试机会</translation> + </message> +</context> +<context> + <name>QObject</name> + <message> + <source>FingerPrint</source> + <translation type="obsolete">指纹</translation> + </message> + <message> + <source>FingerVein</source> + <translation type="obsolete">指静脉</translation> + </message> + <message> + <source>Iris</source> + <translation type="obsolete">虹膜</translation> + </message> + <message> + <source>Face</source> + <translation type="obsolete">人脸</translation> + </message> + <message> + <source>VoicePrint</source> + <translation type="obsolete">声纹</translation> + </message> + <message> + <source>Cancel</source> + <translation type="obsolete">取消</translation> + </message> +</context> +</TS> diff -Nru ukui-biometric-auth-4.10.0.0/polkit-agent/i18n_ts/zh_CN.ts ukui-biometric-auth-4.20.0.0/polkit-agent/i18n_ts/zh_CN.ts --- ukui-biometric-auth-4.10.0.0/polkit-agent/i18n_ts/zh_CN.ts 2023-11-14 16:23:44.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/polkit-agent/i18n_ts/zh_CN.ts 2024-09-23 19:22:29.000000000 +0800 @@ -65,7 +65,7 @@ <context> <name>MainWindow</name> <message> - <location filename="../src/mainwindow.cpp" line="65"/> + <location filename="../src/mainwindow.cpp" line="66"/> <source>Authentication</source> <translation>授权</translation> </message> @@ -88,17 +88,17 @@ </message> <message> <source>Password</source> - <translation>密码</translation> + <translation type="vanished">密码</translation> </message> <message> - <location filename="../src/mainwindow.ui" line="302"/> - <location filename="../src/mainwindow.cpp" line="882"/> - <location filename="../src/mainwindow.cpp" line="948"/> + <location filename="../src/mainwindow.ui" line="409"/> + <location filename="../src/mainwindow.cpp" line="1075"/> + <location filename="../src/mainwindow.cpp" line="1143"/> <source>Biometric</source> <translation>使用生物识别</translation> </message> <message> - <location filename="../src/mainwindow.ui" line="373"/> + <location filename="../src/mainwindow.ui" line="480"/> <source>use password</source> <translation>使用密码验证</translation> </message> @@ -147,20 +147,20 @@ <translation type="vanished">Polkit.caller-pid:</translation> </message> <message> - <location filename="../src/mainwindow.ui" line="334"/> - <location filename="../src/mainwindow.cpp" line="884"/> + <location filename="../src/mainwindow.ui" line="441"/> + <location filename="../src/mainwindow.cpp" line="1077"/> <source>Cancel</source> <translation>取消</translation> </message> <message> - <location filename="../src/mainwindow.ui" line="353"/> - <location filename="../src/mainwindow.cpp" line="880"/> + <location filename="../src/mainwindow.ui" line="460"/> + <location filename="../src/mainwindow.cpp" line="1073"/> <source>Authenticate</source> <translation>授权</translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="886"/> - <location filename="../src/mainwindow.cpp" line="991"/> + <location filename="../src/mainwindow.cpp" line="1079"/> + <location filename="../src/mainwindow.cpp" line="1183"/> <source>Use password</source> <translation>使用密码验证</translation> </message> @@ -185,30 +185,30 @@ <translation type="vanished">认证中,请稍等...</translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="1026"/> - <location filename="../src/mainwindow.cpp" line="1093"/> - <location filename="../src/mainwindow.cpp" line="1094"/> + <location filename="../src/mainwindow.cpp" line="1219"/> + <location filename="../src/mainwindow.cpp" line="1292"/> + <location filename="../src/mainwindow.cpp" line="1293"/> <source>Please try again in %1 minutes.</source> <translation>请%1分钟后再试</translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="1036"/> - <location filename="../src/mainwindow.cpp" line="1103"/> - <location filename="../src/mainwindow.cpp" line="1104"/> + <location filename="../src/mainwindow.cpp" line="1230"/> + <location filename="../src/mainwindow.cpp" line="1302"/> + <location filename="../src/mainwindow.cpp" line="1303"/> <source>Please try again in %1 seconds.</source> <translation>请%1秒后再试</translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="1045"/> - <location filename="../src/mainwindow.cpp" line="1046"/> - <location filename="../src/mainwindow.cpp" line="1112"/> - <location filename="../src/mainwindow.cpp" line="1113"/> + <location filename="../src/mainwindow.cpp" line="1240"/> + <location filename="../src/mainwindow.cpp" line="1241"/> + <location filename="../src/mainwindow.cpp" line="1311"/> + <location filename="../src/mainwindow.cpp" line="1312"/> <source>Account locked permanently.</source> <translation>账号已被永久锁定</translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="675"/> - <location filename="../src/mainwindow.cpp" line="676"/> + <location filename="../src/mainwindow.cpp" line="834"/> + <location filename="../src/mainwindow.cpp" line="835"/> <source>Password cannot be empty</source> <translation>密码不能为空</translation> </message> @@ -221,7 +221,8 @@ <translation type="vanished">无法验证%1,请输入密码.</translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="175"/> + <location filename="../src/mainwindow.cpp" line="242"/> + <location filename="../src/mainwindow.cpp" line="246"/> <source>Failed to verify %1, you still have %2 verification opportunities</source> <translation>验证%1失败,您还有%2次尝试机会</translation> </message> @@ -230,42 +231,42 @@ <translation type="vanished">一个程序正试图执行一个需要特权的动作。要求授权以执行该动作。</translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="578"/> + <location filename="../src/mainwindow.cpp" line="731"/> <source>Password: </source> <translation>密码: </translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="261"/> + <location filename="../src/mainwindow.cpp" line="335"/> <source>Please enter your password or enroll your fingerprint </source> <translation>请输入密码或者录入指纹</translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="187"/> + <location filename="../src/mainwindow.cpp" line="259"/> <source>Abnormal network</source> <translation>网络异常</translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="511"/> + <location filename="../src/mainwindow.cpp" line="665"/> <source>This operation requires the administrator's authorization. Please enter your password to allow this operation.</source> <translation>本次操作需要通过管理员的授权才能继续执行,请输入密码以允许本次操作。</translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="580"/> + <location filename="../src/mainwindow.cpp" line="733"/> <source>_Password: </source> <translation>密码: </translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="582"/> + <location filename="../src/mainwindow.cpp" line="735"/> <source>_Password:</source> <translation>密码:</translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="691"/> + <location filename="../src/mainwindow.cpp" line="850"/> <source>Authentication failed, please try again.</source> <translation>认证失败,请重试。</translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="623"/> + <location filename="../src/mainwindow.cpp" line="779"/> <source>days left</source> <translation>天后解锁</translation> </message> @@ -278,14 +279,16 @@ <translation type="vanished">生物/扫码验证失败,您还有%1次尝试机会</translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="164"/> - <location filename="../src/mainwindow.cpp" line="1176"/> + <location filename="../src/mainwindow.cpp" line="226"/> + <location filename="../src/mainwindow.cpp" line="1415"/> + <location filename="../src/mainwindow.cpp" line="1417"/> <source>Failed to verify %1, please enter password to unlock</source> <translation>验证%1失败,请输入密码解锁</translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="168"/> - <location filename="../src/mainwindow.cpp" line="1178"/> + <location filename="../src/mainwindow.cpp" line="231"/> + <location filename="../src/mainwindow.cpp" line="233"/> + <location filename="../src/mainwindow.cpp" line="1419"/> <source>Unable to verify %1, please enter password to unlock</source> <translation>无法验证%1,请输入密码解锁</translation> </message> @@ -294,67 +297,74 @@ <translation type="vanished">网络异常</translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="517"/> + <location filename="../src/mainwindow.cpp" line="671"/> <source>A program is attempting to perform an action that requires privileges.It requires authorization to perform the action.</source> <translation>一个程序正试图执行一个需要特权的动作,要求授权以执行该动作。</translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="576"/> + <location filename="../src/mainwindow.cpp" line="108"/> + <location filename="../src/mainwindow.cpp" line="729"/> <source>Input Password</source> <translation>输入密码</translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="104"/> + <location filename="../src/mainwindow.cpp" line="105"/> <source>Insert the ukey into the USB port</source> <translation>请将安全密钥插入USB端口</translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="106"/> + <location filename="../src/mainwindow.cpp" line="107"/> <source>Enter the ukey password</source> <translation>输入安全密钥密码</translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="764"/> + <location filename="../src/mainwindow.cpp" line="783"/> <source>hours left</source> <translation>小时后解锁</translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="631"/> + <location filename="../src/mainwindow.cpp" line="787"/> <source>minutes left</source> <translation>分钟后解锁</translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="635"/> + <location filename="../src/mainwindow.cpp" line="791"/> <source>seconds left</source> <translation>秒后解锁</translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="1193"/> + <location filename="../src/mainwindow.cpp" line="880"/> + <location filename="../src/mainwindow.cpp" line="888"/> + <source>Input your password to authentication</source> + <translation>输入密码以授权</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="1434"/> <source>Verify face recognition or enter password to unlock</source> <translation>验证人脸识别或输入密码解锁</translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="1198"/> + <location filename="../src/mainwindow.cpp" line="1439"/> <source>Press fingerprint or enter password to unlock</source> <translation>按压指纹或输入密码解锁</translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="1203"/> + <location filename="../src/mainwindow.cpp" line="1444"/> <source>Verify voiceprint or enter password to unlock</source> <translation>验证声纹或输入密码解锁</translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="1208"/> + <location filename="../src/mainwindow.cpp" line="1449"/> <source>Verify finger vein or enter password to unlock</source> <translation>验证指静脉或输入密码解锁</translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="1213"/> + <location filename="../src/mainwindow.cpp" line="1454"/> <source>Verify iris or enter password to unlock</source> <translation>验证虹膜或输入密码解锁</translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="1218"/> + <location filename="../src/mainwindow.cpp" line="1459"/> <source>Use the bound wechat scanning code or enter the password to unlock</source> <translation>使用绑定的微信扫码或输入密码解锁</translation> </message> @@ -363,10 +373,10 @@ <translation type="vanished">使用绑定的微信扫码或输入密码登录</translation> </message> <message> - <location filename="../src/mainwindow.cpp" line="623"/> - <location filename="../src/mainwindow.cpp" line="627"/> - <location filename="../src/mainwindow.cpp" line="631"/> - <location filename="../src/mainwindow.cpp" line="635"/> + <location filename="../src/mainwindow.cpp" line="779"/> + <location filename="../src/mainwindow.cpp" line="783"/> + <location filename="../src/mainwindow.cpp" line="787"/> + <location filename="../src/mainwindow.cpp" line="791"/> <source>Account locked,</source> <translation>账户已锁定,</translation> </message> @@ -383,12 +393,12 @@ <translation>有另外一个客户端正在认证,请稍后重试。</translation> </message> <message> - <location filename="../src/PolkitListener.cpp" line="257"/> + <location filename="../src/PolkitListener.cpp" line="265"/> <source>Authentication failure, please try again.</source> <translation>认证失败,请重试。</translation> </message> <message> - <location filename="../src/PolkitListener.cpp" line="264"/> + <location filename="../src/PolkitListener.cpp" line="272"/> <source>Password input error!</source> <translation>密码输入错误!</translation> </message> diff -Nru ukui-biometric-auth-4.10.0.0/polkit-agent/i18n_ts/zh_HK.ts ukui-biometric-auth-4.20.0.0/polkit-agent/i18n_ts/zh_HK.ts --- ukui-biometric-auth-4.10.0.0/polkit-agent/i18n_ts/zh_HK.ts 1970-01-01 08:00:00.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/polkit-agent/i18n_ts/zh_HK.ts 2024-09-23 19:22:29.000000000 +0800 @@ -0,0 +1,441 @@ +<?xml version="1.0" encoding="utf-8"?> +<!DOCTYPE TS> +<TS version="2.1" language="zh_Hant"> +<context> + <name>BioAuthWidget</name> + <message> + <source>Retry</source> + <translation type="obsolete">重试</translation> + </message> + <message> + <source>%1 too many unsuccessful attempts,please enter password.</source> + <translation type="obsolete">%1验证失败达最大次数,请使用密码登录</translation> + </message> + <message> + <source>%1 authentication failure,there are still %2 remaining opportunities</source> + <translation type="obsolete">%1认证失败,还剩%2次尝试机会</translation> + </message> + <message> + <source>Please use wechat to scan the code</source> + <translation type="vanished">请使用微信扫码</translation> + </message> +</context> +<context> + <name>BioDevices</name> + <message> + <source>FingerPrint</source> + <translation type="obsolete">指纹</translation> + </message> + <message> + <source>FingerVein</source> + <translation type="obsolete">指静脉</translation> + </message> + <message> + <source>Iris</source> + <translation type="obsolete">虹膜</translation> + </message> + <message> + <source>Face</source> + <translation type="obsolete">人脸</translation> + </message> + <message> + <source>VoicePrint</source> + <translation type="obsolete">声纹</translation> + </message> + <message> + <source>Wechat</source> + <translation type="vanished">微信</translation> + </message> + <message> + <source>QRCode</source> + <translation type="vanished">二维码</translation> + </message> +</context> +<context> + <name>LoginOptionsWidget</name> + <message> + <source>Login Options</source> + <translation type="vanished">登录选项</translation> + </message> + <message> + <source>Wechat</source> + <translation type="vanished">微信</translation> + </message> +</context> +<context> + <name>MainWindow</name> + <message> + <location filename="../src/mainwindow.cpp" line="66"/> + <source>Authentication</source> + <translation>授權</translation> + </message> + <message> + <source>Fingerprint authentication failed, you still have %1 verification opportunities</source> + <translation type="vanished">指纹验证失败,您还有%1次尝试机会</translation> + </message> + <message> + <location filename="../src/mainwindow.ui" line="26"/> + <source>Form</source> + <translation></translation> + </message> + <message> + <source>More</source> + <translation type="obsolete">更多</translation> + </message> + <message> + <source>Restart</source> + <translation type="obsolete">重新开始</translation> + </message> + <message> + <source>Password</source> + <translation type="vanished">密码</translation> + </message> + <message> + <location filename="../src/mainwindow.ui" line="409"/> + <location filename="../src/mainwindow.cpp" line="1075"/> + <location filename="../src/mainwindow.cpp" line="1143"/> + <source>Biometric</source> + <translation>使用生物識別</translation> + </message> + <message> + <location filename="../src/mainwindow.ui" line="480"/> + <source>use password</source> + <translation>使用密碼驗證</translation> + </message> + <message> + <source>DeviceType:</source> + <translation type="obsolete">设备类型:</translation> + </message> + <message> + <source>Back</source> + <translation type="obsolete">返回</translation> + </message> + <message> + <source>Details</source> + <translation type="vanished">详细</translation> + </message> + <message> + <source>Action Id:</source> + <translation type="obsolete">动作:</translation> + </message> + <message> + <source>Description:</source> + <translation type="vanished">描述:</translation> + </message> + <message> + <source>Polkit.subject-pid:</source> + <translation type="vanished">Polkit.subject-pid:</translation> + </message> + <message> + <source>Retry</source> + <translation type="obsolete">重试</translation> + </message> + <message> + <source>Device types:</source> + <translation type="obsolete">设备类型:</translation> + </message> + <message> + <source>Vendor:</source> + <translation type="vanished">发行商:</translation> + </message> + <message> + <source>Action:</source> + <translation type="vanished">动作:</translation> + </message> + <message> + <source>Polkit.caller-pid:</source> + <translation type="vanished">Polkit.caller-pid:</translation> + </message> + <message> + <location filename="../src/mainwindow.ui" line="441"/> + <location filename="../src/mainwindow.cpp" line="1077"/> + <source>Cancel</source> + <translation>取消</translation> + </message> + <message> + <location filename="../src/mainwindow.ui" line="460"/> + <location filename="../src/mainwindow.cpp" line="1073"/> + <source>Authenticate</source> + <translation>授權</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="1079"/> + <location filename="../src/mainwindow.cpp" line="1183"/> + <source>Use password</source> + <translation>使用密碼驗證</translation> + </message> + <message> + <source>Auth</source> + <translation type="obsolete">授权</translation> + </message> + <message> + <source>Too many unsuccessful attempts,please enter password.</source> + <translation type="vanished">指纹验证失败达最大次数,请使用密码解锁</translation> + </message> + <message> + <source>%1 authentication failure,there are still %2 remaining opportunities</source> + <translation type="vanished">%1认证失败,还剩%2次尝试机会</translation> + </message> + <message> + <source>%1 too many unsuccessful attempts,please enter password.</source> + <translation type="vanished">%1验证失败达最大次数,请使用密码登录</translation> + </message> + <message> + <source>in authentication, please wait...</source> + <translation type="vanished">认证中,请稍等...</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="1219"/> + <location filename="../src/mainwindow.cpp" line="1292"/> + <location filename="../src/mainwindow.cpp" line="1293"/> + <source>Please try again in %1 minutes.</source> + <translation>請%1分鐘后再試</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="1230"/> + <location filename="../src/mainwindow.cpp" line="1302"/> + <location filename="../src/mainwindow.cpp" line="1303"/> + <source>Please try again in %1 seconds.</source> + <translation>請%1秒後再試</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="1240"/> + <location filename="../src/mainwindow.cpp" line="1241"/> + <location filename="../src/mainwindow.cpp" line="1311"/> + <location filename="../src/mainwindow.cpp" line="1312"/> + <source>Account locked permanently.</source> + <translation>帳號已被永久鎖定</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="834"/> + <location filename="../src/mainwindow.cpp" line="835"/> + <source>Password cannot be empty</source> + <translation>密碼不能為空</translation> + </message> + <message> + <source>Failed to verify %1, please enter password.</source> + <translation type="vanished">验证%1失败,请输入密码.</translation> + </message> + <message> + <source>Unable to verify %1, please enter password.</source> + <translation type="vanished">无法验证%1,请输入密码.</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="242"/> + <location filename="../src/mainwindow.cpp" line="246"/> + <source>Failed to verify %1, you still have %2 verification opportunities</source> + <translation>驗證%1失敗,您還有%2次嘗試機會</translation> + </message> + <message> + <source>An application is attempting to perform an action that requires privileges. Authentication is required to perform this action.</source> + <translation type="vanished">一个程序正试图执行一个需要特权的动作。要求授权以执行该动作。</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="731"/> + <source>Password: </source> + <translation>密碼: </translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="335"/> + <source>Please enter your password or enroll your fingerprint </source> + <translation>請輸入密碼或者錄入指紋 </translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="259"/> + <source>Abnormal network</source> + <translation>網路異常</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="665"/> + <source>This operation requires the administrator's authorization. Please enter your password to allow this operation.</source> + <translation>本次操作需要通過管理員的授權才能繼續執行,請輸入密碼以允許本次操作。</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="733"/> + <source>_Password: </source> + <translation>密碼: </translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="735"/> + <source>_Password:</source> + <translation>密碼:</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="850"/> + <source>Authentication failed, please try again.</source> + <translation>認證失敗,請重試。</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="779"/> + <source>days left</source> + <translation>天后解鎖</translation> + </message> + <message> + <source>Biometric/code scan authentication failed too many times, please enter the password.</source> + <translation type="vanished">生物/扫码验证失败达最大次数,请使用密码解锁.</translation> + </message> + <message> + <source>Bioauth/code scan authentication failed, you still have %1 verification opportunities</source> + <translation type="vanished">生物/扫码验证失败,您还有%1次尝试机会</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="226"/> + <location filename="../src/mainwindow.cpp" line="1415"/> + <location filename="../src/mainwindow.cpp" line="1417"/> + <source>Failed to verify %1, please enter password to unlock</source> + <translation>驗證%1失敗,請輸入密碼解鎖</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="231"/> + <location filename="../src/mainwindow.cpp" line="233"/> + <location filename="../src/mainwindow.cpp" line="1419"/> + <source>Unable to verify %1, please enter password to unlock</source> + <translation>無法驗證%1,請輸入密碼解鎖</translation> + </message> + <message> + <source>NET Exception</source> + <translation type="vanished">网络异常</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="671"/> + <source>A program is attempting to perform an action that requires privileges.It requires authorization to perform the action.</source> + <translation>一個程式正試圖執行一個需要特權的動作,要求授權以執行該動作。</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="108"/> + <location filename="../src/mainwindow.cpp" line="729"/> + <source>Input Password</source> + <translation>輸入密碼</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="105"/> + <source>Insert the ukey into the USB port</source> + <translation>請將安全金鑰插入USB埠</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="107"/> + <source>Enter the ukey password</source> + <translation>輸入安全金鑰密碼</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="783"/> + <source>hours left</source> + <translation>小時後解鎖</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="787"/> + <source>minutes left</source> + <translation>分鐘後解鎖</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="791"/> + <source>seconds left</source> + <translation>秒後解鎖</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="880"/> + <location filename="../src/mainwindow.cpp" line="888"/> + <source>Input your password to authentication</source> + <translation>輸入密碼以認證</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="1434"/> + <source>Verify face recognition or enter password to unlock</source> + <translation>驗證人臉識別或輸入密碼解鎖</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="1439"/> + <source>Press fingerprint or enter password to unlock</source> + <translation>按壓指紋或輸入密碼解鎖</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="1444"/> + <source>Verify voiceprint or enter password to unlock</source> + <translation>驗證聲紋或輸入密碼解鎖</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="1449"/> + <source>Verify finger vein or enter password to unlock</source> + <translation>驗證指靜脈或輸入密碼解鎖</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="1454"/> + <source>Verify iris or enter password to unlock</source> + <translation>驗證虹膜或輸入密碼解鎖</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="1459"/> + <source>Use the bound wechat scanning code or enter the password to unlock</source> + <translation>使用綁定的微信掃碼或輸入密碼解鎖</translation> + </message> + <message> + <source>Use the bound wechat scanning code or enter the password to log in</source> + <translation type="vanished">使用绑定的微信扫码或输入密码登录</translation> + </message> + <message> + <location filename="../src/mainwindow.cpp" line="779"/> + <location filename="../src/mainwindow.cpp" line="783"/> + <location filename="../src/mainwindow.cpp" line="787"/> + <location filename="../src/mainwindow.cpp" line="791"/> + <source>Account locked,</source> + <translation>帳戶已鎖定,</translation> + </message> + <message> + <source>Authentication failed, please try again</source> + <translation type="obsolete">认证失败,请重试</translation> + </message> +</context> +<context> + <name>PolkitListener</name> + <message> + <location filename="../src/PolkitListener.cpp" line="88"/> + <source>Another client is already authenticating, please try again later.</source> + <translation>有另外一個用戶端正在認證,請稍後重試。</translation> + </message> + <message> + <location filename="../src/PolkitListener.cpp" line="265"/> + <source>Authentication failure, please try again.</source> + <translation>認證失敗,請重試。</translation> + </message> + <message> + <location filename="../src/PolkitListener.cpp" line="272"/> + <source>Password input error!</source> + <translation>密碼輸入錯誤!</translation> + </message> + <message> + <source>Account locked %1 minutes due to %2 fail attempts</source> + <translation type="vanished">账户锁定%1分钟由于%2次错误尝试</translation> + </message> + <message> + <source>Authentication failure,there are still %1 remaining opportunities</source> + <translation type="vanished">认证失败,还剩余%1次尝试机会</translation> + </message> +</context> +<context> + <name>QObject</name> + <message> + <source>FingerPrint</source> + <translation type="obsolete">指纹</translation> + </message> + <message> + <source>FingerVein</source> + <translation type="obsolete">指静脉</translation> + </message> + <message> + <source>Iris</source> + <translation type="obsolete">虹膜</translation> + </message> + <message> + <source>Face</source> + <translation type="obsolete">人脸</translation> + </message> + <message> + <source>VoicePrint</source> + <translation type="obsolete">声纹</translation> + </message> + <message> + <source>Cancel</source> + <translation type="obsolete">取消</translation> + </message> +</context> +</TS> diff -Nru ukui-biometric-auth-4.10.0.0/polkit-agent/src/PolkitAgent.cpp ukui-biometric-auth-4.20.0.0/polkit-agent/src/PolkitAgent.cpp --- ukui-biometric-auth-4.10.0.0/polkit-agent/src/PolkitAgent.cpp 2023-11-14 16:23:44.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/polkit-agent/src/PolkitAgent.cpp 2024-09-23 19:22:29.000000000 +0800 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018 Tianjin KYLIN Information Technology Co., Ltd. + * Copyright (C) 2023 KylinSoftCo., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff -Nru ukui-biometric-auth-4.10.0.0/polkit-agent/src/PolkitListener.cpp ukui-biometric-auth-4.20.0.0/polkit-agent/src/PolkitListener.cpp --- ukui-biometric-auth-4.10.0.0/polkit-agent/src/PolkitListener.cpp 2023-11-14 16:23:44.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/polkit-agent/src/PolkitListener.cpp 2024-09-23 19:22:29.000000000 +0800 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018 Tianjin KYLIN Information Technology Co., Ltd. + * Copyright (C) 2023 KylinSoftCo., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -31,11 +31,13 @@ #include <QApplication> #include <QScreen> #include <fcntl.h> +#include <kysdk/kysdk-system/libkysysinfo.h> #include "PolkitListener.h" #include "mainwindow.h" #include "generic.h" #include <libkysysinfo.h> +#include "windowmanager/windowmanager.h" PolkitListener::PolkitListener(QObject *parent) : Listener(parent), @@ -146,12 +148,12 @@ // hints.functions = MWM_FUNC_ALL; // hints.decorations = MWM_DECOR_BORDER; // XAtomHelper::getInstance()->setWindowMotifHint(mainWindow->winId(), hints); - mainWindow->setWindowFlags(Qt::WindowCloseButtonHint | Qt::WindowStaysOnTopHint); mainWindow->setIcon(iconName); mainWindow->setCurProject(m_isMavis); mainWindow->setHeader(message); mainWindow->setUsers(usersList); mainWindow->setEditInputMethod(m_isSupportTableMode); + mainWindow->setFixedSize(420, 297); /* mainWindow->setDetails(subjectPid, callerPid, actionDesc.actionId(), @@ -161,15 +163,22 @@ */ /* set the position of the mainwindow */ QPoint pos = QCursor::pos(); - for(auto screen : QGuiApplication::screens()) - { - if(screen->geometry().contains(pos)) - { - mainWindow->move(screen->geometry().left() + (screen->geometry().width() - mainWindow->width()) / 2, - screen->geometry().top() + (screen->geometry().height() - mainWindow->height()) / 2); + QRect desScreenGeometry; + for (QScreen *screen : qApp->screens()) { + if (screen->geometry().contains(pos)) { + desScreenGeometry = screen->geometry(); } } + if (desScreenGeometry.isEmpty()) { + desScreenGeometry = qApp->primaryScreen()->geometry(); + } +// mainWindow->move(desScreenGeometry.x() + (desScreenGeometry.width() - mainWindow->width())/2, +// desScreenGeometry.y() + (desScreenGeometry.height() - mainWindow->height())/2); +// qDebug()<<"MoveWindow to center1:"<<desScreenGeometry<<","<<mainWindow->geometry()<<QGuiApplication::platformName();; + + + connect(mainWindow, &MainWindow::accept, this, &PolkitListener::onResponse); connect(mainWindow, &MainWindow::canceled, this, [&]{ wasCancelled = true; @@ -356,6 +365,25 @@ mainWindow->switchAuthMode(MainWindow::PASSWORD); mainWindow->setPrompt(prompt, echo); } + mainWindow->setFixedSize(mainWindow->width(),mainWindow->height()); + + /* set the position of the mainwindow */ + QPoint pos = QCursor::pos(); + QRect desScreenGeometry; + for (QScreen *screen : qApp->screens()) { + if (screen->geometry().contains(pos)) { + desScreenGeometry = screen->geometry(); + } + } + + if (desScreenGeometry.isEmpty()) { + desScreenGeometry = qApp->primaryScreen()->geometry(); + } + + kdk::WindowManager::setGeometry(mainWindow->windowHandle(), + QRect(desScreenGeometry.left() + (desScreenGeometry.width() - mainWindow->width())/2, + desScreenGeometry.top() + (desScreenGeometry.height() - mainWindow->height())/2, + mainWindow->width(), mainWindow->height())); mainWindow->show(); // 重新开始认证不调整窗口位置 diff -Nru ukui-biometric-auth-4.10.0.0/polkit-agent/src/PolkitListener.h ukui-biometric-auth-4.20.0.0/polkit-agent/src/PolkitListener.h --- ukui-biometric-auth-4.10.0.0/polkit-agent/src/PolkitListener.h 2023-11-14 16:23:44.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/polkit-agent/src/PolkitListener.h 2024-09-23 19:22:29.000000000 +0800 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018 Tianjin KYLIN Information Technology Co., Ltd. + * Copyright (C) 2023 KylinSoftCo., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff -Nru ukui-biometric-auth-4.10.0.0/polkit-agent/src/kalabel.cpp ukui-biometric-auth-4.20.0.0/polkit-agent/src/kalabel.cpp --- ukui-biometric-auth-4.10.0.0/polkit-agent/src/kalabel.cpp 2023-11-14 16:23:44.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/polkit-agent/src/kalabel.cpp 2024-09-23 19:22:29.000000000 +0800 @@ -1,3 +1,20 @@ +/* + * Copyright (C) 2023 KylinSoftCo., Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see <http://www.gnu.org/licenses/>. + * +**/ #include "kalabel.h" diff -Nru ukui-biometric-auth-4.10.0.0/polkit-agent/src/kalabel.h ukui-biometric-auth-4.20.0.0/polkit-agent/src/kalabel.h --- ukui-biometric-auth-4.10.0.0/polkit-agent/src/kalabel.h 2023-11-14 16:23:44.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/polkit-agent/src/kalabel.h 2024-09-23 19:22:29.000000000 +0800 @@ -1,3 +1,20 @@ +/* + * Copyright (C) 2023 KylinSoftCo., Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see <http://www.gnu.org/licenses/>. + * +**/ #ifndef KALABEL_H #define KALABEL_H diff -Nru ukui-biometric-auth-4.10.0.0/polkit-agent/src/mainwindow.cpp ukui-biometric-auth-4.20.0.0/polkit-agent/src/mainwindow.cpp --- ukui-biometric-auth-4.10.0.0/polkit-agent/src/mainwindow.cpp 2023-11-14 16:23:44.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/polkit-agent/src/mainwindow.cpp 2024-09-23 19:22:29.000000000 +0800 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018 Tianjin KYLIN Information Technology Co., Ltd. + * Copyright (C) 2023 KylinSoftCo., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -61,9 +61,9 @@ m_nCurLockMin(0), isbioSuccess(false) { + setWindowFlags(Qt::Tool | Qt::WindowCloseButtonHint | Qt::WindowStaysOnTopHint); ui->setupUi(this); setWindowTitle(tr("Authentication")); - setWindowFlags(Qt::WindowCloseButtonHint | Qt::WindowStaysOnTopHint); pam_tally_init(); // @@ -97,6 +97,7 @@ ui->titleTipLayout->addWidget(m_labelTip); ui->loginOptionsLayout->setAlignment(Qt::AlignTop|Qt::AlignCenter); ui->loginOptionsLayout->addWidget(m_loginOptsWidget); + ui->loadingUkeyWidget->adjustSize(); ui->loadingUkeyWidget->hide(); ui->widgetUkeyAuth->hide(); ui->loadingUkeyBtn->setAttribute(Qt::WA_TransparentForMouseEvents, true); @@ -105,14 +106,12 @@ ui->loadingUkeyLbl->setAlignment(Qt::AlignTop|Qt::AlignHCenter); ui->ukeyTipLbl->setText(tr("Enter the ukey password")); ui->ukeyPassword->setPlaceholderText(tr("Input Password")); - ui->loadingUkeyWidget->adjustSize(); maxFailedTimes = bioDevices.getFailedTimes(); isHiddenSwitchButton = bioDevices.GetHiddenSwitchButton(); connect(m_loginOptsWidget, &LoginOptionsWidget::optionSelected, this, [&](unsigned uCurLoginOptType, const DeviceInfoPtr &deviceInfo){ - - isLoadingUkey = false; + isLoadingUkey = false; if(uCurLoginOptType == LOGINOPT_TYPE_GENERAL_UKEY){ stopLoadingUkey(); @@ -142,7 +141,7 @@ if (uCurLoginOptType == LOGINOPT_TYPE_GENERAL_UKEY && !deviceInfo){ isLoadingUkey = true; - startLoadingUkey(); + startLoadingUkey(); m_loginOptsWidget->updateUkeyUIStatus(LOGINOPT_TYPE_GENERAL_UKEY); }else if(uCurLoginOptType == LOGINOPT_TYPE_GENERAL_UKEY && deviceInfo){ stopLoadingUkey(); @@ -157,8 +156,8 @@ return ; } - if(m_bioTimer) - m_bioTimer->stop(); + if(m_bioTimer) + m_bioTimer->stop(); m_deviceInfo = deviceInfo; switchLoginOptType(uCurLoginOptType); @@ -365,24 +364,27 @@ void MainWindow::startLoadingUkey() { + m_loadingPixmap = QIcon::fromTheme("ukui-loading-0-symbolic").pixmap(27,27); + ui->loadingUkeyBtn->setIcon(m_loadingPixmap); + ui->loadingUkeyBtn->setIconSize(QSize(27, 27)); + + ui->loadingUkeyWidget->adjustSize(); + ui->cmbUsers->hide(); + ui->widgetUkeyAuth->hide(); + ui->lePassword->hide(); + + ui->widgetPasswdAuth->hide(); + isLoadingUkey = true; ui->loadingUkeyWidget->show(); + if(!m_loadingTimer) { m_loadingTimer = new QTimer(this); m_loadingTimer->setInterval(150); connect(m_loadingTimer, &QTimer::timeout, this, &MainWindow::updateLoadingPixmap); } - - m_loadingPixmap = QIcon::fromTheme("ukui-loading-0-symbolic").pixmap(27,27); - ui->loadingUkeyBtn->setIcon(m_loadingPixmap); - ui->loadingUkeyBtn->setIconSize(QSize(27, 27)); m_loadingTimer->start(); - ui->loadingUkeyWidget->adjustSize(); - ui->cmbUsers->hide(); - ui->widgetUkeyAuth->hide(); - ui->lePassword->hide(); - ui->widgetPasswdAuth->hide(); } void MainWindow::stopLoadingUkey() @@ -391,9 +393,10 @@ if(m_loadingTimer){ m_loadingTimer->stop(); } + ui->loadingUkeyWidget->hide(); //ui->cmbUsers->show(); - ui->widgetUkeyAuth->show(); + //ui->widgetUkeyAuth->show(); } void MainWindow::updateLoadingPixmap() @@ -874,6 +877,7 @@ int count = m_loginOptsWidget->getLoginOptCount(); enableBioAuth = count > 0; if (count < 1) { + setLoginTypeTip(tr("Input your password to authentication")); m_loginOptsWidget->hide(); } else { m_loginOptsWidget->show(); @@ -881,6 +885,7 @@ } if(m_loginOptsWidget->getHasUkeyOptions()){ + setLoginTypeTip(tr("Input your password to authentication")); m_loginOptsWidget->show(); } @@ -1074,6 +1079,7 @@ ui->returnButton->setText(tr("Use password")); ui->btnLoading->setDisabled(true); ui->returnButton->adjustSize(); + m_labelTip->adjustSize(); if(is_Mavis){ ui->cmbUsers->setFixedHeight(48); ui->lePassword->setFixedHeight(48); @@ -1084,8 +1090,7 @@ switch(mode){ case PASSWORD: { - setMinimumWidth(420); - setMaximumWidth(420); + setFixedWidth(420); if (m_deviceInfo && m_loginOptsWidget->findDeviceById(m_deviceInfo->device_id)) { switchLoginOptType(m_loginOptsWidget->convertDeviceType(m_deviceInfo->biotype)); @@ -1121,18 +1126,16 @@ + ui->cmbUsers->height() + ui->lePassword->height() + ui->lblMessage->height() + ui->btnAuth->height(); } - if (m_loginOptsWidget->isHidden()) { - height -= 20 ; - } +// if (m_loginOptsWidget->isHidden()) { +// height = height - m_labelTip->height() - 10; +// } unsigned uOptsWidgetHeight = m_loginOptsWidget->height(); if (m_loginOptsWidget->isHidden()) { uOptsWidgetHeight = 0; - height -= 20 ; + height = height + m_labelTip->height() - 10; } - setMinimumHeight(height + uOptsWidgetHeight + 10); - setMaximumHeight(height + uOptsWidgetHeight + 10); - + setFixedHeight(height + uOptsWidgetHeight + 10); //m_loginOptsWidget->updateUIStatus(); ui->btnBioAuth->setStyleSheet("QPushButton{font-size:14px;}QPushButton:hover{border:none;color:#3E6CE5;}QPushButton:pressed{border:none;}"); @@ -1163,14 +1166,11 @@ break; case BIOMETRIC: - setMinimumWidth(420); - setMaximumWidth(420); + setFixedWidth(420); if(m_loginOptsWidget->getLoginOptCount() <= 1){ - setMinimumHeight(392+ui->cmbUsers->height()+ui->lblHeader->height()); - setMaximumHeight(392+ui->cmbUsers->height()+ui->lblHeader->height()); + setFixedHeight(392+ui->cmbUsers->height()+ui->lblHeader->height()); } else { - setMinimumHeight(482+ui->cmbUsers->height()+ui->lblHeader->height()); - setMaximumHeight(482+ui->cmbUsers->height()+ui->lblHeader->height()); + setFixedHeight(482+ui->cmbUsers->height()+ui->lblHeader->height()); } ui->btnCancel->hide(); @@ -1484,11 +1484,15 @@ m_labelTip->hide(); } else { QPalette pe; - if(no_changes) + if(no_changes) { pe.setColor(QPalette::WindowText,Qt::red); - else - pe.setColor(QPalette::WindowText,QColor(55, 144, 250, 255)); - m_labelTip->setPalette(pe); + m_labelTip->setPalette(pe); + } else { + QColor color = palette().color(QPalette::WindowText); + QPalette pal(this->palette()); + pal.setColor(QPalette::WindowText,QColor(color)); + m_labelTip->setPalette(pal); + } m_labelTip->setText(m_strLoginTypeTip); m_labelTip->show(); } @@ -1499,7 +1503,7 @@ if (m_deviceInfo) { if(m_deviceInfo->biotype == LOGINOPT_TYPE_GENERAL_UKEY){ - }else{ + }else{ m_loginOptsWidget->startAuth(m_deviceInfo, getUid(userName)); } switchLoginOptType(m_loginOptsWidget->convertDeviceType(m_deviceInfo->biotype)); @@ -1589,17 +1593,14 @@ + ui->btnAuth->height(); } if (m_loginOptsWidget->isHidden()) { - height -= 20 ; + height = height + m_labelTip->height() - 10; } if(uLoginOptType == LOGINOPT_TYPE_GENERAL_UKEY){ - - setMinimumHeight(height + uOptsWidgetHeight + 10); - setMaximumHeight(height + uOptsWidgetHeight + 10); + setLoginTypeTip(""); + setFixedSize(width(), height + uOptsWidgetHeight + 10); }else{ - - setMinimumHeight(height + uOptsWidgetHeight); - setMaximumHeight(height + uOptsWidgetHeight); + setFixedSize(width(), height + uOptsWidgetHeight); } } diff -Nru ukui-biometric-auth-4.10.0.0/polkit-agent/src/mainwindow.h ukui-biometric-auth-4.20.0.0/polkit-agent/src/mainwindow.h --- ukui-biometric-auth-4.10.0.0/polkit-agent/src/mainwindow.h 2023-11-14 16:23:44.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/polkit-agent/src/mainwindow.h 2024-09-23 19:22:29.000000000 +0800 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018 Tianjin KYLIN Information Technology Co., Ltd. + * Copyright (C) 2023 KylinSoftCo., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff -Nru ukui-biometric-auth-4.10.0.0/polkit-agent/src/mainwindow.ui ukui-biometric-auth-4.20.0.0/polkit-agent/src/mainwindow.ui --- ukui-biometric-auth-4.10.0.0/polkit-agent/src/mainwindow.ui 2023-11-14 16:23:44.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/polkit-agent/src/mainwindow.ui 2024-09-23 19:22:29.000000000 +0800 @@ -7,7 +7,7 @@ <x>0</x> <y>0</y> <width>459</width> - <height>547</height> + <height>646</height> </rect> </property> <property name="sizePolicy"> @@ -120,6 +120,9 @@ </item> <item row="4" column="1"> <layout class="QHBoxLayout" name="titleTipLayout"> + <property name="topMargin"> + <number>8</number> + </property> <property name="bottomMargin"> <number>8</number> </property> @@ -381,19 +384,6 @@ </layout> </item> <item> - <spacer name="verticalSpacer"> - <property name="orientation"> - <enum>Qt::Vertical</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>20</width> - <height>40</height> - </size> - </property> - </spacer> - </item> - <item> <layout class="QHBoxLayout" name="horizontalLayout_7"> <property name="spacing"> <number>16</number> @@ -410,7 +400,7 @@ <item> <widget class="QPushButton" name="btnBioAuth"> <property name="cursor"> - <cursorShape>PointingHandCursor</cursorShape> + <cursorShape>ArrowCursor</cursorShape> </property> <property name="styleSheet"> <string notr="true"/> @@ -442,7 +432,7 @@ </sizepolicy> </property> <property name="cursor"> - <cursorShape>PointingHandCursor</cursorShape> + <cursorShape>ArrowCursor</cursorShape> </property> <property name="styleSheet"> <string notr="true"/> @@ -461,7 +451,7 @@ </sizepolicy> </property> <property name="cursor"> - <cursorShape>PointingHandCursor</cursorShape> + <cursorShape>ArrowCursor</cursorShape> </property> <property name="styleSheet"> <string notr="true"/> diff -Nru ukui-biometric-auth-4.10.0.0/polkit-agent/src/modeButton.cpp ukui-biometric-auth-4.20.0.0/polkit-agent/src/modeButton.cpp --- ukui-biometric-auth-4.10.0.0/polkit-agent/src/modeButton.cpp 2023-11-14 16:23:44.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/polkit-agent/src/modeButton.cpp 2024-09-23 19:22:29.000000000 +0800 @@ -1,3 +1,20 @@ +/* + * Copyright (C) 2023 KylinSoftCo., Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see <http://www.gnu.org/licenses/>. + * +**/ #include "modeButton.h" #include <QIcon> @@ -39,7 +56,7 @@ setModeIcon(); setFixedSize(QSize(24, 24)); setModeIcon(); - setCursor(Qt::PointingHandCursor); + setCursor(Qt::ArrowCursor); setStyleSheet("QPushButton::pressed{border:none;background-color:transparent}" "QPushButton::hover::!pressed{border:none;background-color:transparent}"); diff -Nru ukui-biometric-auth-4.10.0.0/polkit-agent/src/modeButton.h ukui-biometric-auth-4.20.0.0/polkit-agent/src/modeButton.h --- ukui-biometric-auth-4.10.0.0/polkit-agent/src/modeButton.h 2023-11-14 16:23:44.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/polkit-agent/src/modeButton.h 2024-09-23 19:22:29.000000000 +0800 @@ -1,3 +1,20 @@ +/* + * Copyright (C) 2023 KylinSoftCo., Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see <http://www.gnu.org/licenses/>. + * +**/ #ifndef MODEBUTTON_H #define MODEBUTTON_H diff -Nru ukui-biometric-auth-4.10.0.0/polkit-agent/src/pam-tally.c ukui-biometric-auth-4.20.0.0/polkit-agent/src/pam-tally.c --- ukui-biometric-auth-4.10.0.0/polkit-agent/src/pam-tally.c 2023-11-14 16:23:44.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/polkit-agent/src/pam-tally.c 2024-09-23 19:22:29.000000000 +0800 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018 Tianjin KYLIN Information Technology Co., Ltd. + * Copyright (C) 2023 KylinSoftCo., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff -Nru ukui-biometric-auth-4.10.0.0/polkit-agent/src/pam-tally.h ukui-biometric-auth-4.20.0.0/polkit-agent/src/pam-tally.h --- ukui-biometric-auth-4.10.0.0/polkit-agent/src/pam-tally.h 2023-11-14 16:23:44.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/polkit-agent/src/pam-tally.h 2024-09-23 19:22:29.000000000 +0800 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018 Tianjin KYLIN Information Technology Co., Ltd. + * Copyright (C) 2023 KylinSoftCo., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff -Nru ukui-biometric-auth-4.10.0.0/polkit-agent/src/sessionmanager.cpp ukui-biometric-auth-4.20.0.0/polkit-agent/src/sessionmanager.cpp --- ukui-biometric-auth-4.10.0.0/polkit-agent/src/sessionmanager.cpp 2023-11-14 16:23:44.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/polkit-agent/src/sessionmanager.cpp 2024-09-23 19:22:29.000000000 +0800 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018 Tianjin KYLIN Information Technology Co., Ltd. + * Copyright (C) 2023 KylinSoftCo., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff -Nru ukui-biometric-auth-4.10.0.0/polkit-agent/src/sessionmanager.h ukui-biometric-auth-4.20.0.0/polkit-agent/src/sessionmanager.h --- ukui-biometric-auth-4.10.0.0/polkit-agent/src/sessionmanager.h 2023-11-14 16:23:44.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/polkit-agent/src/sessionmanager.h 2024-09-23 19:22:29.000000000 +0800 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018 Tianjin KYLIN Information Technology Co., Ltd. + * Copyright (C) 2023 KylinSoftCo., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff -Nru ukui-biometric-auth-4.10.0.0/polkit-agent/src/types.h ukui-biometric-auth-4.20.0.0/polkit-agent/src/types.h --- ukui-biometric-auth-4.10.0.0/polkit-agent/src/types.h 2023-11-14 16:23:44.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/polkit-agent/src/types.h 2024-09-23 19:22:29.000000000 +0800 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018 Tianjin KYLIN Information Technology Co., Ltd. + * Copyright (C) 2023 KylinSoftCo., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff -Nru ukui-biometric-auth-4.10.0.0/polkit-agent/src/users.cpp ukui-biometric-auth-4.20.0.0/polkit-agent/src/users.cpp --- ukui-biometric-auth-4.10.0.0/polkit-agent/src/users.cpp 2023-11-14 16:23:44.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/polkit-agent/src/users.cpp 2024-09-23 19:22:29.000000000 +0800 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018 Tianjin KYLIN Information Technology Co., Ltd. + * Copyright (C) 2023 KylinSoftCo., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff -Nru ukui-biometric-auth-4.10.0.0/polkit-agent/src/users.h ukui-biometric-auth-4.20.0.0/polkit-agent/src/users.h --- ukui-biometric-auth-4.10.0.0/polkit-agent/src/users.h 2023-11-14 16:23:44.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/polkit-agent/src/users.h 2024-09-23 19:22:29.000000000 +0800 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018 Tianjin KYLIN Information Technology Co., Ltd. + * Copyright (C) 2023 KylinSoftCo., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff -Nru ukui-biometric-auth-4.10.0.0/uniauth-backend/CMakeLists.txt ukui-biometric-auth-4.20.0.0/uniauth-backend/CMakeLists.txt --- ukui-biometric-auth-4.10.0.0/uniauth-backend/CMakeLists.txt 2023-11-14 16:23:44.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/uniauth-backend/CMakeLists.txt 2024-09-23 19:22:29.000000000 +0800 @@ -2,9 +2,12 @@ set(CMAKE_AUTOMOC ON) +pkg_check_modules(LIGHTDM-QT5-3 REQUIRED liblightdm-qt5-3) + include_directories( ${Qt5Core_INCLUDE_DIRS} ${Qt5DBus_INCLUDE_DIRS} + ${LIGHTDM-QT5-3_INCLUDE_DIRS} ) set(bin_SRCS @@ -16,10 +19,15 @@ src/serviceinterface.cpp src/servicemanager.h src/servicemanager.cpp + src/personalizeddata.h + src/CSingleton.h + src/personalizeddata.cpp + src/rsac.h + src/rsac.cpp ) add_executable(uniauth-backend ${bin_SRCS}) -target_link_libraries(uniauth-backend Qt5::Core Qt5::DBus -lukui-log4qt) +target_link_libraries(uniauth-backend Qt5::Core Qt5::DBus -lukui-log4qt ${LIGHTDM-QT5-3_LIBRARIES} -lcrypto) install(TARGETS uniauth-backend DESTINATION bin) install(FILES org.ukui.UniauthBackend.conf DESTINATION /etc/dbus-1/system.d/) diff -Nru ukui-biometric-auth-4.10.0.0/uniauth-backend/src/CSingleton.h ukui-biometric-auth-4.20.0.0/uniauth-backend/src/CSingleton.h --- ukui-biometric-auth-4.10.0.0/uniauth-backend/src/CSingleton.h 1970-01-01 08:00:00.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/uniauth-backend/src/CSingleton.h 2024-09-23 19:22:29.000000000 +0800 @@ -0,0 +1,63 @@ +/* + * Copyright (C) 2023 KylinSoftCo., Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see <http://www.gnu.org/licenses/>. + * +**/ +#ifndef CSINGLETON_H +#define CSINGLETON_H + + +template <typename T> +class SingleTon +{ +public: + // 创建单例实例 + template<typename... Args> + static T* instance(Args&&... args) + { + if (m_pInstance == nullptr) + { + m_pInstance = new T(std::forward<Args>(args)...); + } + + return m_pInstance; + } + + // 获取单例 + static T* getInstance() + { + return m_pInstance; + } + + // 删除单例 + static void destroyInstance() + { + delete m_pInstance; + m_pInstance = nullptr; + } + +private: + SingleTon(); + virtual ~SingleTon(); + +private: + static T* m_pInstance; +}; + +template <class T> +T* SingleTon<T>::m_pInstance = nullptr; + + +#endif diff -Nru ukui-biometric-auth-4.10.0.0/uniauth-backend/src/biodeviceinfo.cpp ukui-biometric-auth-4.20.0.0/uniauth-backend/src/biodeviceinfo.cpp --- ukui-biometric-auth-4.10.0.0/uniauth-backend/src/biodeviceinfo.cpp 2023-11-14 16:23:44.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/uniauth-backend/src/biodeviceinfo.cpp 2024-09-23 19:22:29.000000000 +0800 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2022 Tianjin KYLIN Information Technology Co., Ltd. + * Copyright (C) 2023 KylinSoftCo., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff -Nru ukui-biometric-auth-4.10.0.0/uniauth-backend/src/biodeviceinfo.h ukui-biometric-auth-4.20.0.0/uniauth-backend/src/biodeviceinfo.h --- ukui-biometric-auth-4.10.0.0/uniauth-backend/src/biodeviceinfo.h 2023-11-14 16:23:44.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/uniauth-backend/src/biodeviceinfo.h 2024-09-23 19:22:29.000000000 +0800 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2022 Tianjin KYLIN Information Technology Co., Ltd. + * Copyright (C) 2023 KylinSoftCo., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -21,6 +21,7 @@ #include <QDBusInterface> #include <QDBusArgument> #include <QDBusMetaType> +#include <memory> struct DeviceInfo { int device_id; @@ -52,6 +53,10 @@ Q_DECLARE_METATYPE(DeviceInfo) Q_DECLARE_METATYPE(QList<QDBusVariant>) + +typedef std::shared_ptr<DeviceInfo> DeviceInfoPtr; +typedef QList<DeviceInfoPtr> DeviceList; + void registerCustomTypes(); QDBusArgument &operator<<(QDBusArgument &argument, const DeviceInfo &deviceInfo); const QDBusArgument &operator>>(const QDBusArgument &argument, DeviceInfo &deviceInfo); diff -Nru ukui-biometric-auth-4.10.0.0/uniauth-backend/src/main.cpp ukui-biometric-auth-4.20.0.0/uniauth-backend/src/main.cpp --- ukui-biometric-auth-4.10.0.0/uniauth-backend/src/main.cpp 2023-11-14 16:23:44.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/uniauth-backend/src/main.cpp 2024-09-23 19:22:29.000000000 +0800 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2022 Tianjin KYLIN Information Technology Co., Ltd. + * Copyright (C) 2023 KylinSoftCo., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -17,6 +17,7 @@ **/ #include <QCoreApplication> #include "serviceinterface.h" +#include "personalizeddata.h" #include <ukui-log4qt.h> int main(int argc, char *argv[]) @@ -24,6 +25,8 @@ initUkuiLog4qt("ukui-biometric-uniauth"); QCoreApplication a(argc, argv); + KYLINUSERDATAMNG::instance(); + ServiceInterface serviveInterface; Q_UNUSED(serviveInterface); diff -Nru ukui-biometric-auth-4.10.0.0/uniauth-backend/src/personalizeddata.cpp ukui-biometric-auth-4.20.0.0/uniauth-backend/src/personalizeddata.cpp --- ukui-biometric-auth-4.10.0.0/uniauth-backend/src/personalizeddata.cpp 1970-01-01 08:00:00.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/uniauth-backend/src/personalizeddata.cpp 2024-09-23 19:22:29.000000000 +0800 @@ -0,0 +1,362 @@ +/* + * Copyright (C) 2023 KylinSoftCo., Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see <http://www.gnu.org/licenses/>. + * +**/ +#include "personalizeddata.h" + +#include <QJsonDocument> +#include <QJsonObject> +#include <QJsonValue> +#include <QJsonParseError> +#include <QJsonArray> +#include <QFile> +#include <QDate> +#include <QTime> + +enum enum_operation +{ + enum_operation_update = 0, + enum_operation_add, + enum_operation_del, +}; + +PersonalizedData::PersonalizedData(QString user) +{ + KyInfo() << user; + m_user = user; + m_usd_conf_path = QString("/var/lib/lightdm-data/%1/usd/config/ukui-settings-daemon.settings").arg(m_user); + m_greeter_conf_path = QString("/var/lib/lightdm-data/%1/ukui-greeter.conf").arg(m_user); + m_file_watch = new QFileSystemWatcher(); + connect(m_file_watch, &QFileSystemWatcher::fileChanged, this, &PersonalizedData::fileChanged); + this->__load_conf_ukuigreeterconf(); + //无需读取usd配置 + //this->__load_conf_usd_conf(); + +} + +PersonalizedData::~PersonalizedData() +{ + KyInfo() << m_user; + if(0 != m_conf_TimerID) + { + this->killTimer(m_conf_TimerID); + m_conf_TimerID = 0; + } + if(nullptr != m_file_watch) + { + delete m_file_watch; + m_file_watch = nullptr; + } + +} + +void PersonalizedData::getJsonData(QJsonObject & json) +{ + json["user"] = m_user; + { + QJsonObject json_1; + json_1["dateType"] = m_dateType; + json_1["fontSize"] = m_fontSize; + json_1["timeType"] = m_timeType; + json_1["backgroundPath"] = m_backgroundPath; + json_1["color"] = m_color; + json["greeter"] = json_1; + } +} + +QString PersonalizedData::getJsonData() +{ + QJsonObject json; + this->getJsonData(json); + json["operation"] = enum_operation_update; + QJsonDocument document; + document.setObject(json); + return document.toJson(QJsonDocument::Compact); +} + +void PersonalizedData::fileChanged(const QString &path) +{ + KyInfo() << path; + if(m_greeter_conf_path == path) + { + m_greeter_conf_path_changed = true; + } + if(m_usd_conf_path == path) + { + m_usd_conf_path_changed = true; + } + + if(0 != m_conf_TimerID) + { + this->killTimer(m_conf_TimerID); + m_conf_TimerID = 0; + } + m_conf_TimerID = this->startTimer(100); +} + +void PersonalizedData::timerEvent(QTimerEvent *event) +{ + KyInfo() << m_file_watch->files(); + if(event->timerId() == m_conf_TimerID) + { + this->killTimer(m_conf_TimerID); + m_conf_TimerID = 0; + + if(m_greeter_conf_path_changed) + { + m_greeter_conf_path_changed = false; + this->__load_conf_ukuigreeterconf(); + } + if(m_usd_conf_path_changed) + { + m_usd_conf_path_changed = false; + this->__load_conf_usd_conf(); + } + emit KYLINUSERDATAMNG::getInstance()->conf_changed(this->getJsonData()); + } +} + +int PersonalizedData::__load_conf_ukuigreeterconf() +{ + KyInfo(); + QSettings conf(m_greeter_conf_path, QSettings::IniFormat); + if(QSettings::NoError != conf.status()) + { + KyWarning() << m_greeter_conf_path << conf.status(); + return -1; + } + + if(conf.childGroups().contains("Greeter")) + { + conf.beginGroup("Greeter"); + + if(conf.contains("dateType")) + m_dateType = conf.value("dateType", m_dateType).toString(); + + if(conf.contains("fontSize")) + m_fontSize = conf.value("fontSize", m_fontSize).toInt(); + + if(conf.contains("timeType")) + m_timeType = conf.value("timeType", m_timeType).toInt(); + + conf.endGroup(); + } + + if(conf.childGroups().contains("greeter")) + { + conf.beginGroup("greeter"); + + if(conf.contains("backgroundPath")) + { + m_backgroundPath = conf.value("backgroundPath", m_backgroundPath).toString(); + if(!m_backgroundPath.isEmpty()) + { + m_backgroundPath = this->__copy_file(m_backgroundPath); + } + } + + + if(conf.contains("color")) + m_color = conf.value("color", m_color).toString(); + + conf.endGroup(); + } + + if(nullptr != m_file_watch && !m_file_watch->files().contains(m_greeter_conf_path)) + { + m_file_watch->addPath(m_greeter_conf_path); + } + return 0; +} + +int PersonalizedData::__load_conf_usd_conf() +{ + KyInfo(); + QSettings conf(m_usd_conf_path, QSettings::IniFormat); + if(QSettings::NoError != conf.status()) + { + KyWarning() << m_usd_conf_path << conf.status(); + return -1; + } + + if(conf.childGroups().contains("xsettings")) + { + conf.beginGroup("xsettings"); + + if(conf.contains("cursor-size")) + m_cursor_size = conf.value("cursor-size", m_cursor_size).toInt(); + + if(conf.contains("cursor-theme")) + m_cursor_theme = conf.value("cursor-theme", m_cursor_theme).toString(); + + if(conf.contains("scaling-factor")) + m_scaling_factor = conf.value("scaling-factor", m_scaling_factor).toInt(); + + conf.endGroup(); + } + + if(nullptr != m_file_watch && !m_file_watch->files().contains(m_usd_conf_path)) + { + m_file_watch->addPath(m_usd_conf_path); + } + return 0; +} + +QString PersonalizedData::__copy_file(QString oldfile) +{ + if(QFile::exists(oldfile)) + { + QString newfile = "/tmp/loginBackground-" + m_user; + QDate d =QDate::currentDate(); + newfile += d.toString("yyyy-MM-dd"); + if(QFile::exists(newfile)) + { + QFile::remove(newfile); + } + if(QFile::copy(oldfile, newfile)) + { + return newfile; + } + } + return ""; +} + + + +/////////////////////////PersonalizedDataMng////////////////////////////////////// + +PersonalizedDataMng::PersonalizedDataMng(void) +{ + m_usersModel = new QLightDM::UsersModel(this); + connect(m_usersModel, &QAbstractListModel::rowsInserted, this, &PersonalizedDataMng::onUserAdded); + connect(m_usersModel, &QAbstractListModel::rowsRemoved, this, &PersonalizedDataMng::onUserRemoved); + this->__updateUsersInfo(); +} + +PersonalizedDataMng::~PersonalizedDataMng() +{ + if(nullptr != m_usersModel) + { + delete m_usersModel; + m_usersModel = nullptr; + } +} + +QString PersonalizedDataMng::GetConfInformation(QString name) +{ + QJsonObject json; + if(m_userPersonalizedData.contains(name)) + { + QJsonObject json1; + m_userPersonalizedData[name]->getJsonData(json1); + json[name] = json1; + } + else if(name.isEmpty()) + { + for(auto & it : m_userPersonalizedData.toStdMap()) + { + QJsonObject json1; + it.second->getJsonData(json1); + json[it.first] = json1; + } + } + else if("lightdm" == name) + { + QString tmp(m_lightdm_str); + m_lightdm_str = ""; + return tmp; + } + + QJsonDocument document; + document.setObject(json); + QString strJson(document.toJson(QJsonDocument::Compact)); + KyDebug() << strJson; + return strJson; +} + +void PersonalizedDataMng::SetLoginSynInformation(QString val) +{ + m_lightdm_str = val; +} + +void PersonalizedDataMng::onUserAdded(const QModelIndex &, int left, int right) +{ + if(!m_usersModel) + return; + + for(int i = left; i <= right; i++) + { + QString name = m_usersModel->index(i).data(QLightDM::UsersModel::NameRole).toString(); + KyInfo() << left << right << name; + if(!name.isEmpty()) + { + m_userPersonalizedData[name] = KylinUserDatePtr(new PersonalizedData(name)); + + QJsonObject json; + m_userPersonalizedData[name]->getJsonData(json); + json["operation"] = enum_operation_add; + QJsonDocument document; + document.setObject(json); + emit conf_changed(document.toJson()); + } + } +} + +void PersonalizedDataMng::onUserRemoved(const QModelIndex &, int, int) +{ + if(!m_usersModel) + return; + + auto tmp = m_userPersonalizedData; + for(int i = 0; i < m_usersModel->rowCount(QModelIndex()); i++) + { + QString name = m_usersModel->index(i).data(QLightDM::UsersModel::NameRole).toString(); + if(!name.isEmpty()) + tmp.remove(name); + } + + if(tmp.size() > 0) + { + KyInfo() << tmp.begin().key(); + m_userPersonalizedData.remove(tmp.begin().key()); + + QJsonObject json; + json["operation"] = enum_operation_del; + json["user"] = tmp.begin().key(); + QJsonDocument document; + document.setObject(json); + emit conf_changed(document.toJson()); + } +} + +void PersonalizedDataMng::__updateUsersInfo() +{ + if (m_usersModel) + { + for(int i = 0; i < m_usersModel->rowCount(QModelIndex()); i++) + { + QString name = m_usersModel->index(i).data(QLightDM::UsersModel::NameRole).toString(); + if(!name.isEmpty()) + { + m_userPersonalizedData[name] = KylinUserDatePtr(new PersonalizedData(name)); + } + + } + } +} + + + diff -Nru ukui-biometric-auth-4.10.0.0/uniauth-backend/src/personalizeddata.h ukui-biometric-auth-4.20.0.0/uniauth-backend/src/personalizeddata.h --- ukui-biometric-auth-4.10.0.0/uniauth-backend/src/personalizeddata.h 1970-01-01 08:00:00.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/uniauth-backend/src/personalizeddata.h 2024-09-23 19:22:29.000000000 +0800 @@ -0,0 +1,157 @@ +/* + * Copyright (C) 2023 KylinSoftCo., Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see <http://www.gnu.org/licenses/>. + * +**/ +#ifndef PERSONALIZEDDATA_H +#define PERSONALIZEDDATA_H + +#include <QObject> +#include <QSettings> +#include <QMap> +#include <QFile> +#include <QTimer> +#include <QEventLoop> +#include <QTimerEvent> +#include <QFileSystemWatcher> +#include <QSharedPointer> +#include <QLightDM/Greeter> +#include <QLightDM/SessionsModel> +#include <QLightDM/UsersModel> +#include <QModelIndex> + +#include <QJsonDocument> +#include <QJsonObject> +#include <QJsonValue> +#include <QJsonParseError> +#include <QJsonArray> + +#include "ukui-log4qt.h" +#include "CSingleton.h" + + +class PersonalizedData : public QObject +{ + Q_OBJECT +public: + explicit PersonalizedData(QString user); + virtual ~PersonalizedData(); + + ////////////////////ukui-greeter-conf////////////////////////////// + QString dateType(void){ return m_dateType; } + void dateType(QString val){ m_dateType = val; } + + int fontSize(void){ return m_fontSize; } + void fontSize(int val){ m_fontSize = val; } + + int timeType(void){ return m_timeType; } + void timeType(int val){ m_timeType = val; } + + QString backgroundPath(void){ return m_backgroundPath; } + void backgroundPath(QString val){ m_backgroundPath = val; } + + QString color(void){ return m_color; } + void color(QString val){ m_color = val; } + + /////////////////////usd-ukui-settings-daemon//////////////////////////////// + int cursor_size(void){ return m_cursor_size; } + void cursor_size(int val){ m_cursor_size = val; } + + QString cursor_theme(void){ return m_cursor_theme; } + void cursor_theme(QString val){ m_cursor_theme = val; } + + int scaling_factor(void){ return m_scaling_factor; } + void scaling_factor(int val){ m_scaling_factor = val; } + + + void getJsonData(QJsonObject & json); + QString getJsonData(void); + + +protected slots: + void fileChanged(const QString &path); + + virtual void timerEvent( QTimerEvent *event); + +private: + int __load_conf_ukuigreeterconf(void); + int __load_conf_usd_conf(void); + QString __copy_file(QString); +protected: + //ukui-greeter-conf + QString m_dateType = "cn"; + int m_fontSize = 5; + int m_timeType = 24; + QString m_backgroundPath; + QString m_color; + + //usd-ukui-settings-daemon + int m_cursor_size = 48; + QString m_cursor_theme; + int m_scaling_factor = 1; + + //用户名 + QString m_user; + + QFileSystemWatcher * m_file_watch = nullptr; + QString m_greeter_conf_path; + bool m_greeter_conf_path_changed = false; + QString m_usd_conf_path; + bool m_usd_conf_path_changed = false; + int m_conf_TimerID = 0; +}; + + + +typedef QSharedPointer<PersonalizedData> KylinUserDatePtr; + +///////////////////////////////////////////////// +/// \brief The PersonalizedDataMng class +/// + +class PersonalizedDataMng : public QObject +{ + Q_OBJECT +protected: + explicit PersonalizedDataMng(void); + virtual ~PersonalizedDataMng(); + + +public: + QString GetConfInformation(QString); + + void SetLoginSynInformation(QString val); + +signals: + void conf_changed(QString jsonstr); + +protected Q_SLOTS: + void onUserAdded(const QModelIndex&, int, int); + + void onUserRemoved(const QModelIndex&, int, int ); + +protected: + void __updateUsersInfo(); + +protected: + QMap<QString, KylinUserDatePtr > m_userPersonalizedData; + QLightDM::UsersModel * m_usersModel = nullptr; + QString m_lightdm_str; + friend class SingleTon<PersonalizedDataMng>; +}; + +typedef SingleTon<PersonalizedDataMng> KYLINUSERDATAMNG; + +#endif // PERSONALIZEDDATA_H diff -Nru ukui-biometric-auth-4.10.0.0/uniauth-backend/src/rsac.cpp ukui-biometric-auth-4.20.0.0/uniauth-backend/src/rsac.cpp --- ukui-biometric-auth-4.10.0.0/uniauth-backend/src/rsac.cpp 1970-01-01 08:00:00.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/uniauth-backend/src/rsac.cpp 2024-09-23 19:22:29.000000000 +0800 @@ -0,0 +1,216 @@ +/* + * Copyright (C) 2023 KylinSoftCo., Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see <http://www.gnu.org/licenses/>. + * +**/ +#include "rsac.h" +#include <openssl/rsa.h> +#include <openssl/pem.h> + +RSA* publicKeyToRSA(const QByteArray &pubKey) +{ + BIO *pBio = BIO_new_mem_buf(pubKey.data(), pubKey.size()); // 创建内存 + RSA* rsa = PEM_read_bio_RSA_PUBKEY(pBio, nullptr, nullptr, nullptr); + BIO_free_all(pBio); // 释放内存 + return rsa; +} + +RSA* privateKeyToRSA(const QByteArray &priKey) +{ + BIO *pBio = BIO_new_mem_buf(priKey.data(), priKey.size()); // 创建内存 + RSA* rsa = PEM_read_bio_RSAPrivateKey(pBio, nullptr, nullptr, nullptr); + BIO_free_all(pBio); // 释放内存 + return rsa; +} + +/** + * @brief RSAC::generateKeyPair + * 生成密钥对,并分别保存为文件 + * @param priKeyFile 私钥文件名 + * @param pubKeyFile 公钥文件名 + * @param bits 秘钥长度,一般建议1024及以上 + */ +void RSAC::generateKeyPair(const QString &priKeyFile, const QString &pubKeyFile, int bits) +{ + // 生成公钥 + RSA* rsa = RSA_generate_key(bits, RSA_F4, nullptr, nullptr); + BIO *bp = BIO_new(BIO_s_file()); + BIO_write_filename(bp, (void*)pubKeyFile.toStdString().c_str()); + PEM_write_bio_RSAPublicKey(bp, rsa); + BIO_free_all(bp); + + // 生成私钥 + bp = BIO_new(BIO_s_file()); + BIO_write_filename(bp, (void*)priKeyFile.toStdString().c_str()); + PEM_write_bio_RSAPrivateKey(bp, rsa, nullptr, nullptr, 0, nullptr, nullptr); + CRYPTO_cleanup_all_ex_data(); + BIO_free_all(bp); + RSA_free(rsa); +} + +/** + * @brief RSAC::generateKeyPair + * 生成密钥对数据 + * @param privateKey 私钥数据 + * @param publicKey 公钥数据 + * @param bits 秘钥长度,一般建议1024及以上 + */ +void RSAC::generateKeyPair(QByteArray &privateKey, QByteArray &pubKey, int bits) +{ + // 生成密钥对 + RSA *keyPair = RSA_generate_key(bits, RSA_F4, nullptr, nullptr); + + BIO *pri = BIO_new(BIO_s_mem()); + BIO *pub = BIO_new(BIO_s_mem()); + + PEM_write_bio_RSAPrivateKey(pri, keyPair, nullptr, nullptr, 0, nullptr, nullptr); + PEM_write_bio_RSA_PUBKEY(pub, keyPair); + + // 获取长度 + int pri_len = BIO_pending(pri); + int pub_len = BIO_pending(pub); + + privateKey.resize(pri_len); + pubKey.resize(pub_len); + + BIO_read(pri, privateKey.data(), pri_len); + BIO_read(pub, pubKey.data(), pub_len); + + // 内存释放 + RSA_free(keyPair); + BIO_free_all(pub); + BIO_free_all(pri); +} + +/** + * @brief RSAC::encrypt + * RSA加密函数,使用公钥对输入数据,进行加密 + * @param in 输入数据(明文) + * @param out 输出数据(密文) + * @param pubKey 公钥 + * @return 执行结果 + */ +bool RSAC::encrypt(const QByteArray &in, QByteArray &out, const QByteArray& pubKey) +{ + // 公钥数据转RSA + RSA* rsa = publicKeyToRSA(pubKey); + if (rsa == nullptr) + { + return false; + } + + // 对任意长度数据进行加密,超长时,进行分段加密 + int keySize = RSA_size(rsa); + int dataLen = in.size(); + const unsigned char *from = (const unsigned char *)in.data(); + QByteArray to(keySize, 0); + int readLen = 0; + do + { + int select = (keySize - 11) > dataLen ? dataLen : (keySize - 11); + RSA_public_encrypt(select, (from + readLen), (unsigned char *)to.data(), rsa, RSA_PKCS1_PADDING); + dataLen -= select; + readLen += select; + out.append(to); + }while (dataLen > 0); + RSA_free(rsa); + return true; +} + +/** + * @brief RSAC::private_decrypt + * RSA解密函数,使用私钥对输入数据,进行解密 + * @param in 输入数据(密文) + * @param out 输出数据(解密后的内容) + * @param priKey 私钥 + * @return 执行结果 + */ +bool RSAC::decrypt(const QByteArray &in, QByteArray &out, const QByteArray& priKey) +{ + // 私钥数据转RSA + RSA* rsa = privateKeyToRSA(priKey); + if (rsa == nullptr) + { + return false; + } + + // 对任意长度数据进行解密,超长时,进行分段解密 + int keySize = RSA_size(rsa); + int dataLen = in.size(); + const unsigned char *from = (const unsigned char *)in.data(); + QByteArray to(keySize, 0); + int readLen = 0; + do + { + int size = RSA_private_decrypt(keySize, (from + readLen), (unsigned char *)to.data(), rsa, RSA_PKCS1_PADDING); + dataLen -= keySize; + readLen += keySize; + out.append(to.data(), size); + }while (dataLen > 0); + RSA_free(rsa); + return true; +} + +/** + * @brief RSAC::sign + * 使用私钥对摘要数据进行签名 + * @param digest 摘要数据 + * @param sign 签名后的数据 + * @param priKey 私钥 + * @return 执行结果 + */ +bool RSAC::sign(const QByteArray &digest, QByteArray &sign, const QByteArray& priKey) +{ + // 私钥数据转RSA + RSA* rsa = privateKeyToRSA(priKey); + if (rsa == nullptr) + { + return false; + } + + // 对digest进行签名 + unsigned int siglen = 0; + QByteArray temp(RSA_size(rsa), 0); + RSA_sign(NID_sha1, (const unsigned char*)digest.data(), digest.size(), + (unsigned char*)temp.data(), &siglen, rsa); + sign.clear(); + sign.append(temp.data(), siglen); + RSA_free(rsa); + return true; +} + +/** + * @brief RSAC::verify + * 使用公钥对摘要数据进行验签 + * @param digest 摘要数据 + * @param sign 签名后的数据 + * @param pubKey 公钥 + * @return 执行结果 + */ +bool RSAC::verify(const QByteArray &digest, const QByteArray &sign, const QByteArray& pubKey) +{ + // 公钥数据转RSA + RSA* rsa = publicKeyToRSA(pubKey); + if (rsa == nullptr) + { + return false; + } + + // 对digest、sign进行验签 + int ret = RSA_verify(NID_sha1, (const unsigned char*)digest.data(), digest.size(), + (const unsigned char *)sign.data(), sign.size(), rsa); + RSA_free(rsa); + return (ret == 1); +} diff -Nru ukui-biometric-auth-4.10.0.0/uniauth-backend/src/rsac.h ukui-biometric-auth-4.20.0.0/uniauth-backend/src/rsac.h --- ukui-biometric-auth-4.10.0.0/uniauth-backend/src/rsac.h 1970-01-01 08:00:00.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/uniauth-backend/src/rsac.h 2024-09-23 19:22:29.000000000 +0800 @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2023 KylinSoftCo., Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see <http://www.gnu.org/licenses/>. + * +**/ +#ifndef RSAC_H +#define RSAC_H + +#include <QString> + +/** + * @brief The RSAC class + * RSA算法相关实现,包括密钥对生成,加密与解密,签名与验签。 + */ +class RSAC +{ +public: + // 生成秘钥对 + void generateKeyPair(const QString& priKeyFile, const QString &pubKeyFile, int bits = 1024); + void generateKeyPair(QByteArray& priKey, QByteArray& pubKey, int bits = 1024); + + // 对数据进行加解密 + bool encrypt(const QByteArray& in, QByteArray& out, const QByteArray& pubKey); + bool decrypt(const QByteArray& in, QByteArray& out, const QByteArray& priKey); + + // 对摘要进行签名和验签 + bool sign(const QByteArray& digest, QByteArray& sign, const QByteArray &priKey); + bool verify(const QByteArray& digest, const QByteArray &sign, const QByteArray &pubKey); +}; + +#endif // RSAC_H diff -Nru ukui-biometric-auth-4.10.0.0/uniauth-backend/src/serviceinterface.cpp ukui-biometric-auth-4.20.0.0/uniauth-backend/src/serviceinterface.cpp --- ukui-biometric-auth-4.10.0.0/uniauth-backend/src/serviceinterface.cpp 2023-11-14 16:23:44.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/uniauth-backend/src/serviceinterface.cpp 2024-09-23 19:22:29.000000000 +0800 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2022 Tianjin KYLIN Information Technology Co., Ltd. + * Copyright (C) 2023 KylinSoftCo., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -19,6 +19,9 @@ #include <QDBusConnection> #include <QSettings> #include <QDir> +#include <QRegExp> +#include <QFile> +#include <QTimer> #include <pwd.h> #include <unistd.h> #include <sys/types.h> @@ -29,11 +32,25 @@ #include <QDBusMetaType> #include <QDBusConnectionInterface> #include <QDBusContext> +#include <QDBusInterface> #include <QDBusMessage> #include "servicemanager.h" +#include "personalizeddata.h" +#include <unistd.h> +#include <openssl/rsa.h> +#include <openssl/pem.h> + +#define UKUI_GREETER "/usr/sbin/ukui-greeter" +#define UKUI_SCREENSAVER "/usr/bin/ukui-screensaver-backend" +#define GREETER_DBUS_PATH "/" +#define GREETER_DBUS_INTERFACE "org.ukui.greeter" +#define SCREENSAVER_DBUS_PATH "/" +#define SCREENSAVER_DBUS_INTERFACE "org.ukui.screensaver" #define COMM_CONFIG_PATH "/etc/biometric-auth/ukui-biometric.conf" #define USER_CONFIG_PATH "/home/%1/.biometric_auth/ukui_biometric.conf" +#define OLD_990_USER_CONFIG_PATH "/home/%1/.biometric-auth/ukui-biometric.conf" +#define PROC_CPUINFO "/proc/cpuinfo" ServiceInterface::ServiceInterface() { @@ -50,9 +67,10 @@ } registerCustomTypes(); + checkIs990(); m_serviceInterface = new QDBusInterface(DBUS_SERVICE, DBUS_PATH, DBUS_INTERFACE, - QDBusConnection::systemBus()); + QDBusConnection::systemBus(), this); m_serviceInterface->setTimeout(2147483647); connect(m_serviceInterface, SIGNAL(USBDeviceHotPlug(int, int, int)), @@ -63,6 +81,9 @@ ServiceManager *sm = ServiceManager::instance(); connect(sm, &ServiceManager::serviceStatusChanged, this, &ServiceInterface::onBiometricDbusChanged); + + rsac.generateKeyPair(priKey, pubKey, 1024); + connect(KYLINUSERDATAMNG::getInstance(), &PersonalizedDataMng::conf_changed, this, &ServiceInterface::updateUserInformation); } void ServiceInterface::setDefaultDevice(QString userName, int bioDevType, QString deviceName) @@ -475,8 +496,22 @@ default: return false; } + + //同步990旧的配置文件,然后删除 + if(getIs990() && (bioAuthType == ENABLETYPE_BIO)){ + QString oldConfigPath = QString(OLD_990_USER_CONFIG_PATH).arg(userName); + QSettings oldSettings(oldConfigPath, QSettings::IniFormat); + if(oldSettings.contains(strBioAuthType)){ + settings.setValue(strBioAuthType,oldSettings.value(strBioAuthType).toBool()); + oldSettings.remove(strBioAuthType); + oldSettings.sync(); + } + } if (settings.contains(strBioAuthType)) { return settings.value(strBioAuthType).toBool(); + }else if(getIs990() && (bioAuthType == ENABLETYPE_BIO)){ + //990默认为打开 + return true; } else { QSettings settings2(COMM_CONFIG_PATH, QSettings::IniFormat); if (settings2.contains(strBioAuthType)) { @@ -496,6 +531,23 @@ return 3; } +int ServiceInterface::getFTimeoutTimes() +{ + QSettings sysSettings(COMM_CONFIG_PATH, QSettings::IniFormat); + if(sysSettings.contains("FaceTimeoutTimes")) + return sysSettings.value("FaceTimeoutTimes").toInt(); + else + return 1; +} + +void ServiceInterface::setFTimeoutTimes(int times) +{ + if (times < 1) + times = 1; + QSettings settings(COMM_CONFIG_PATH, QSettings::IniFormat); + settings.setValue("FaceTimeoutTimes", times); +} + bool ServiceInterface::getQRCodeEnable() { bool isEnable = false; @@ -576,6 +628,44 @@ } } +//记录当前生物认证信息 +void ServiceInterface::recordAuthDrive(QString appName,int drvid,bool insert) +{ + if(insert){ + m_AuthingDriveList.insert(appName,drvid); + }else{ + m_AuthingDriveList.remove(appName); + } +} + + +//获取当前正在认证的应用 +QStringList ServiceInterface::getAllAuthApp() +{ + return m_AuthingDriveList.keys(); +} + +//根据应用名称获取认证的驱动 +int ServiceInterface::getAppAuthDrive(QString appName) +{ + if(m_AuthingDriveList.contains(appName)){ + return m_AuthingDriveList.value(appName); + } + return -1; +} + +QString ServiceInterface::GetUserInformation(QString username) +{ + KyInfo() << username; + return KYLINUSERDATAMNG::getInstance()->GetConfInformation(username); +} + +void ServiceInterface::SetLoginSynInformation(QString val) +{ + KyInfo() << val; + KYLINUSERDATAMNG::getInstance()->SetLoginSynInformation(val); +} + void ServiceInterface::waitBiometricServiceStatus() { qDebug()<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~` get biometric status"; @@ -628,7 +718,7 @@ QDBusArgument argument; QList<QDBusVariant> qlist; QDBusVariant item; - DeviceInfo *deviceInfo; + DeviceInfoPtr deviceInfo = nullptr; /* 返回值为 i -- int 和 av -- array of variant */ QDBusPendingReply<int, QList<QDBusVariant> > reply = m_serviceInterface->call("GetDrvList"); @@ -652,7 +742,7 @@ variant = item.variant(); /* 转为普通QVariant对象 */ /* 解封装得到 QDBusArgument 对象 */ argument = variant.value<QDBusArgument>(); - deviceInfo = new DeviceInfo(); + deviceInfo = std::make_shared<DeviceInfo>(); argument >> *deviceInfo; /* 提取最终的 DeviceInfo 结构体 */ if (nDriId == deviceInfo->device_id) { if (getCommDefaultDevice(deviceInfo->biotype).isEmpty()) { @@ -662,19 +752,13 @@ } } } else { - for (auto devInfo : m_listDeviceInfos) { - if (devInfo) { - delete devInfo; - devInfo = nullptr; - } - } m_listDeviceInfos.clear(); for (int i = 0; i < deviceCount; i++) { item = qlist[i]; /* 取出一个元素 */ variant = item.variant(); /* 转为普通QVariant对象 */ /* 解封装得到 QDBusArgument 对象 */ argument = variant.value<QDBusArgument>(); - deviceInfo = new DeviceInfo(); + deviceInfo = std::make_shared<DeviceInfo>(); argument >> *deviceInfo; /* 提取最终的 DeviceInfo 结构体 */ m_listDeviceInfos.push_back(deviceInfo); } @@ -797,3 +881,237 @@ initData(); } } + +void ServiceInterface::checkIs990() +{ + QRegExp r1("kirin.*9.0"); + r1.setCaseSensitivity(Qt::CaseInsensitive); + QRegExp r2("pangu.*m900"); + r2.setCaseSensitivity(Qt::CaseInsensitive); + + QFile file(PROC_CPUINFO); + if(!file.exists()){ + is990 = false; + } + file.open(QFile::ReadOnly); + QString str(file.readAll()); + is990 = (str.contains(r1) || str.contains(r2)); + file.close(); +} + +bool ServiceInterface::getIs990() +{ + return is990; +} + +QString ServiceInterface::getPublicEncrypt() +{ + return pubKey; +} + +bool ServiceInterface::sendPassword(QString username,QByteArray password) +{ + QByteArray decryptText; + QByteArray encryptText; + rsac.decrypt(password, decryptText, priKey); // 解密 + //如果处于登录状态 + + qDebug()<<"sendPassword"<<loginAppList.count()<<loginAppList; + if(loginAppList.contains("lightdm")){ + qDebug()<<"login:"; + isFirstLogin = false; + QString publicKey = getLoginPubKey(loginAppList.value("lightdm"),SCREENSAVER_DBUS_PATH,SCREENSAVER_DBUS_INTERFACE); + rsac.encrypt(decryptText, encryptText, publicKey.toLatin1()); + return sendLoginPassword(loginAppList.value("lightdm"),SCREENSAVER_DBUS_PATH,SCREENSAVER_DBUS_INTERFACE,username,encryptText); + } + + //处于锁屏状态 + if(loginAppList.contains(username)){ + qDebug()<<"unlock:"; + isFirstLogin = false; + QString publicKey = getLoginPubKey(loginAppList.value(username),SCREENSAVER_DBUS_PATH,SCREENSAVER_DBUS_INTERFACE); + rsac.encrypt(decryptText, encryptText, publicKey.toLatin1()); + return sendLoginPassword(loginAppList.value(username),SCREENSAVER_DBUS_PATH,SCREENSAVER_DBUS_INTERFACE,username,encryptText); + } + + if(loginAppList.count()>0){ + qDebug()<<"login by screensaver:"; + isFirstLogin = false; + QString publicKey = getLoginPubKey(loginAppList.value(loginAppList.firstKey()),SCREENSAVER_DBUS_PATH,SCREENSAVER_DBUS_INTERFACE); + rsac.encrypt(decryptText, encryptText, publicKey.toLatin1()); + return sendLoginPassword(loginAppList.value(loginAppList.firstKey()),SCREENSAVER_DBUS_PATH,SCREENSAVER_DBUS_INTERFACE,username,encryptText); + } + + //如果是第一次调用,则配置自动登录 + if(isFirstLogin){ + qDebug()<<"isFirstLogin:"; + isFirstLogin = false; + hasSaveLogin = true; + return handleFirstSingleLogn(username,decryptText); + } + + isFirstLogin = false; + return false; +} + +bool ServiceInterface::handleFirstSingleLogn(QString username,QByteArray decryptText) +{ + QEventLoop loopTemp; + bool ret = false; + QByteArray encryptText; + + qDebug()<<"handleFirstSingleLogn wait"; + QMetaObject::Connection connection = QObject::connect(this, &ServiceInterface::onLoginServicdRegisted, [&loopTemp]() { + if (loopTemp.isRunning()) { + loopTemp.quit(); + } + }); + QTimer::singleShot(10000, &loopTemp, SLOT(quit())); + loopTemp.exec(); + qDebug()<<"handleFirstSingleLogn finished"; + disconnect(connection); + qDebug()<<loginAppList.count(); + if(loginAppList.contains("lightdm")){ + isFirstLogin = false; + QString publicKey = getLoginPubKey(loginAppList.value("lightdm"),SCREENSAVER_DBUS_PATH,SCREENSAVER_DBUS_INTERFACE); + if(publicKey.isEmpty()){ + qDebug()<<"get Login PubKey failed!"; + return false; + } + rsac.encrypt(decryptText, encryptText, publicKey.toLatin1()); + return sendLoginPassword(loginAppList.value("lightdm"),SCREENSAVER_DBUS_PATH,SCREENSAVER_DBUS_INTERFACE,username,encryptText); + } + return ret; +} + +QString ServiceInterface::getLoginPubKey(QString service,QString path,QString interface) +{ + QDBusInterface iface(service, + path, + interface, + QDBusConnection::systemBus()); + QDBusReply<QString> stateReply = iface.call("getPublicEncrypt"); + + if(!stateReply.isValid()){ + qWarning()<< "Get state error:" << stateReply.error(); + qDebug()<<"getPublicEncrypt failed"; + return ""; + } + return stateReply.value(); +} + +bool ServiceInterface::sendSignalLoginFinished(QString username,bool res) +{ + qDebug()<<"sendSignalLoginFinished "<<username<<res; + emit onSignalLoginFinished(username,res); + + return true; +} + +bool ServiceInterface::sendLoginPassword(QString service,QString path,QString interface,QString username,QByteArray array) +{ + QEventLoop loopTemp; + bool ret = false; + + qDebug()<<"sendLoginPassword"; + QMetaObject::Connection connection = QObject::connect(this, &ServiceInterface::onSignalLoginFinished, [&loopTemp,&ret](QString username,bool res) { + qDebug()<<"onSignalLoginFinished:"<<username<<res; + ret = res; + if (loopTemp.isRunning()) { + loopTemp.quit(); + } + }); + + QDBusInterface iface(service, + path, + interface, + QDBusConnection::systemBus()); + QDBusReply<bool> stateReply = iface.call("sendPassword",username,array); + if(!stateReply.isValid()){ + disconnect(connection); + return false; + } + + if(!stateReply.value()){ + disconnect(connection); + return stateReply.value(); + } + + QTimer::singleShot(30000, &loopTemp, SLOT(quit())); + + loopTemp.exec(); + disconnect(connection); + + return ret; +} +QString ServiceInterface::getProcessNameFromPid(int pid) +{ + QString filename = "/proc/" + QString::number(pid) + "/cmdline"; + qDebug()<<"filename is "<<filename; + QFile file(filename); + if(!file.open(QIODevice::ReadOnly | QIODevice::Text)) { + qDebug()<<"Can't open the file!"<<endl; + return ""; + } + QByteArray text = file.readAll(); + return QString(text); +} + +QString ServiceInterface::getUserNameFromUid(int uid) +{ + struct passwd *pw = NULL; + pw = getpwuid(uid); + if(pw){ + return QString(pw->pw_name); + } + return ""; +} + +void ServiceInterface::onDbusNameOwnerChanged(QString name,QString oldOwner,QString newOwner) +{ + if(newOwner.isEmpty()){ + for(QString str:loginAppList.keys()){ + if(name == loginAppList.value(str)){ + qDebug()<<"remove name "<<name; + loginAppList.remove(str); + } + } + } +} + +bool ServiceInterface::registerLoginApp() +{ + QDBusConnection conn = connection(); + QDBusMessage msg = message(); + + qDebug() << "Sender Name" << conn.interface()->serviceOwner(msg.service()).value(); + qDebug() << "Sender Pid " << conn.interface()->servicePid(msg.service()).value(); + qDebug() << "Sender uid " << conn.interface()->serviceUid(msg.service()).value(); + + int pid = conn.interface()->servicePid(msg.service()).value(); + QString serviceOwner = conn.interface()->serviceOwner(msg.service()).value(); + int uid = conn.interface()->serviceUid(msg.service()).value(); + + QString appName = getProcessNameFromPid(pid); + qDebug()<<"appName = "<<appName; + + if(appName != UKUI_GREETER && appName != UKUI_SCREENSAVER){ + return false; + } + + QString appUser = getUserNameFromUid(uid); + if(appUser.isEmpty()) + return false; + + qDebug()<<"insert "<<appUser<<serviceOwner; + loginAppList.insert(appUser,serviceOwner); + + if(appUser == "lightdm" && hasSaveLogin){ + QTimer::singleShot(1000, this, [=](){ + emit onLoginServicdRegisted(); + }); + } + + return true; +} + diff -Nru ukui-biometric-auth-4.10.0.0/uniauth-backend/src/serviceinterface.h ukui-biometric-auth-4.20.0.0/uniauth-backend/src/serviceinterface.h --- ukui-biometric-auth-4.10.0.0/uniauth-backend/src/serviceinterface.h 2023-11-14 16:23:44.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/uniauth-backend/src/serviceinterface.h 2024-09-23 19:22:29.000000000 +0800 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2022 Tianjin KYLIN Information Technology Co., Ltd. + * Copyright (C) 2023 KylinSoftCo., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -22,7 +22,10 @@ #include <QCoreApplication> #include <QDBusContext> #include <QObject> +#include <QMap> #include <QFileSystemWatcher> +#include <QDBusInterface> +#include "rsac.h" #define DBUS_SERVICE "org.ukui.Biometric" #define DBUS_PATH "/org/ukui/Biometric" @@ -57,6 +60,10 @@ void setBioAuthStatus(int bioAuthType, bool status); // 获取最大失败次数 int getMaxFailedTimes(); + // 获取人脸识别超时停用次数 + int getFTimeoutTimes(); + // 设置人脸识别超时停用次数 + void setFTimeoutTimes(int times); // 获取是否使能微信扫码登录 bool getQRCodeEnable(); // 获取是否双认证 @@ -69,17 +76,39 @@ bool getUseFirstDevice(); // 获取是否隐藏切换按钮 bool getHiddenSwitchButton(); - + // 记录当前正在进行生物认证的设备 + void recordAuthDrive(QString appName,int drvid,bool insert); + // 获取当前正在进行生物认证的应用 + QStringList getAllAuthApp(); + // 获取当前应用在认证的驱动 + int getAppAuthDrive(QString appName); + //获取用户配置 + QString GetUserInformation(QString username); + //同步登录界面配置 + void SetLoginSynInformation(QString val); + // 获取公钥 + QString getPublicEncrypt(); + //发送用户名和密码 + bool sendPassword(QString username,QByteArray password); + //前端注册到后端接口 + bool registerLoginApp(); + //发送认证结果 + bool sendSignalLoginFinished(QString username,bool res); private slots: void onUSBDeviceHotPlug(int drvid, int action, int deviceNum); void onBiometricDbusChanged(bool bActive); - + void onDbusNameOwnerChanged(QString name,QString oldOwner,QString newOwner); signals: //默认设备改变 void defaultDeviceChanged(QString userName, int bioDevType, QString deviceName); //开关状态改变 void bioAuthStatusChanged(QString userName, int type, bool status); - + //用户配置改变 + void updateUserInformation(QString jsonstring); + //单点登录完成信号 + void onSignalLoginFinished(QString username,bool res); + //登录服务以启动信号 + void onLoginServicdRegisted(); private: //设置默认设备 void setDefaultDevice(QString userName, int bioDevType, QString deviceName); @@ -95,11 +124,34 @@ void updateCommDefaultDevice(int nDriId); // 等待生物识别服务 void waitBiometricServiceStatus(); - + //判断系统是否为990 + void checkIs990(); + //获取系统是否为990 + bool getIs990(); + //根据pid获取进程名称 + QString getProcessNameFromPid(int pid); + //根据uid获取用户名 + QString getUserNameFromUid(int uid); + //获取登录锁屏界面的公钥 + QString getLoginPubKey(QString service,QString path,QString interface); + //发送密码到登录锁屏界面 + bool sendLoginPassword(QString service,QString path,QString interface,QString username,QByteArray array); + //处理首次登录逻辑 + bool handleFirstSingleLogn(QString username,QByteArray decryptText); private: QDBusInterface *m_serviceInterface = nullptr; - QList<DeviceInfo *> m_listDeviceInfos; + DeviceList m_listDeviceInfos; int deviceCount = 0; + bool is990 = false; + QMap<QString,int> m_AuthingDriveList; + + QMap<QString,QString> loginAppList; + RSAC rsac; + QByteArray priKey, pubKey; + bool isFirstLogin = true; + bool hasSaveLogin = false; + QString savedUsername; + QByteArray savedPassword; }; #endif // SERVICEINTERFACE_H diff -Nru ukui-biometric-auth-4.10.0.0/uniauth-backend/src/servicemanager.cpp ukui-biometric-auth-4.20.0.0/uniauth-backend/src/servicemanager.cpp --- ukui-biometric-auth-4.10.0.0/uniauth-backend/src/servicemanager.cpp 2023-11-14 16:23:44.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/uniauth-backend/src/servicemanager.cpp 2024-09-23 19:22:29.000000000 +0800 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018 Tianjin KYLIN Information Technology Co., Ltd. + * Copyright (C) 2023 KylinSoftCo., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -83,6 +83,8 @@ << (newOwner.isEmpty() ? "inactivate" : "activate"); Q_EMIT serviceStatusChanged(!newOwner.isEmpty()); } + + Q_EMIT dbusNameOwnerChanged(name,oldOwner,newOwner); } /*! diff -Nru ukui-biometric-auth-4.10.0.0/uniauth-backend/src/servicemanager.h ukui-biometric-auth-4.20.0.0/uniauth-backend/src/servicemanager.h --- ukui-biometric-auth-4.10.0.0/uniauth-backend/src/servicemanager.h 2023-11-14 16:23:44.000000000 +0800 +++ ukui-biometric-auth-4.20.0.0/uniauth-backend/src/servicemanager.h 2024-09-23 19:22:29.000000000 +0800 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018 Tianjin KYLIN Information Technology Co., Ltd. + * Copyright (C) 2023 KylinSoftCo., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -36,6 +36,7 @@ Q_SIGNALS: void serviceStatusChanged(bool activate); + void dbusNameOwnerChanged(QString name,QString oldOwner,QString newOwner); public Q_SLOTS: void onDBusNameOwnerChanged(const QString &name,