diff options
-rw-r--r-- | NOTICE | 822 | ||||
-rw-r--r-- | flashutils/flashutils.c | 2 | ||||
-rw-r--r-- | gui/gui.cpp | 2 | ||||
-rw-r--r-- | gui/input.cpp | 467 | ||||
-rw-r--r-- | gui/objects.hpp | 14 | ||||
-rw-r--r-- | gui/pages.cpp | 383 | ||||
-rw-r--r-- | gui/pages.hpp | 14 | ||||
-rw-r--r-- | gui/resources.cpp | 19 | ||||
-rw-r--r-- | gui/resources.hpp | 11 | ||||
-rw-r--r-- | gui/text.cpp | 35 | ||||
-rw-r--r-- | gui/theme/common/languages/hu.xml | 35 | ||||
-rw-r--r-- | gui/theme/common/languages/it.xml | 670 | ||||
-rw-r--r-- | gui/theme/common/languages/ru.xml | 104 | ||||
-rw-r--r-- | partition.cpp | 48 | ||||
-rw-r--r-- | partitions.hpp | 3 | ||||
-rw-r--r-- | prebuilt/Android.mk | 2 | ||||
-rw-r--r-- | scripts/README | 14 | ||||
-rw-r--r-- | scripts/language_helper.py | 142 | ||||
-rw-r--r-- | twinstall.cpp | 41 |
19 files changed, 2019 insertions, 809 deletions
@@ -1,190 +1,634 @@ - Copyright (c) 2005-2008, The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - + Copyright (c) 2011-2016, Dees_Troy, bigbiff, Team Win + + 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. + + 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 diff --git a/flashutils/flashutils.c b/flashutils/flashutils.c index fe1181fcd..5a5e0094f 100644 --- a/flashutils/flashutils.c +++ b/flashutils/flashutils.c @@ -54,7 +54,7 @@ static int detect_partition(const char *partitionType, const char *partition) int type = device_flash_type(); if (strstr(partition, "/dev/block/mtd") != NULL) type = MTD; - else if (strstr(partition, "/dev/block/mmc") != NULL) + else if (strstr(partition, "/dev/block/mmc") != NULL || strstr(partition, "/dev/block/sd") != NULL) type = MMC; else if (strstr(partition, "/dev/block/bml") != NULL) type = BML; diff --git a/gui/gui.cpp b/gui/gui.cpp index c2a439acb..4cf80a482 100644 --- a/gui/gui.cpp +++ b/gui/gui.cpp @@ -765,7 +765,7 @@ extern "C" int gui_loadResources(void) check = 1; } - if (check == 0 && PageManager::LoadPackage("TWRP", "/script/ui.xml", "main")) + if (check == 0) { std::string theme_path; diff --git a/gui/input.cpp b/gui/input.cpp index c12ecc2b2..4bf01ada2 100644 --- a/gui/input.cpp +++ b/gui/input.cpp @@ -1,5 +1,5 @@ /* - Copyright 2012 bigbiff/Dees_Troy TeamWin + Copyright 2012 to 2016 bigbiff/Dees_Troy TeamWin This file is part of TWRP/TeamWin Recovery Project. TWRP is free software: you can redistribute it and/or modify @@ -46,6 +46,8 @@ extern "C" { #include "objects.hpp" #include "../data.hpp" +#define TW_INPUT_NO_UPDATE -1000 // Magic value for HandleTextLocation when no change in scrolling has occurred + GUIInput::GUIInput(xml_node<>* node) : GUIObject(node) { @@ -63,12 +65,13 @@ GUIInput::GUIInput(xml_node<>* node) isLocalChange = true; HasAllowed = false; HasDisabled = false; - skipChars = scrollingX = mFontHeight = mFontY = lastX = 0; + cursorX = textWidth = scrollingX = mFontHeight = mFontY = lastX = 0; mBackgroundX = mBackgroundY = mBackgroundW = mBackgroundH = MinLen = MaxLen = 0; mCursorLocation = -1; // -1 is always the end of the string CursorWidth = 3; ConvertStrToColor("black", &mBackgroundColor); ConvertStrToColor("white", &mCursorColor); + displayValue = ""; if (!node) return; @@ -136,11 +139,6 @@ GUIInput::GUIInput(xml_node<>* node) DataManager::SetValue(mVariable, attr->value()); mMask = LoadAttrString(child, "mask"); HasMask = !mMask.empty(); - attr = child->first_attribute("maskvariable"); - if (attr) - mMaskVariable = attr->value(); - else - mMaskVariable = mVariable; } // Load input restrictions @@ -166,10 +164,7 @@ GUIInput::GUIInput(xml_node<>* node) mFontY = mRenderY; if (mInputText) - mInputText->SetMaxWidth(mRenderW); - - isLocalChange = false; - HandleTextLocation(-3); + mInputText->SetMaxWidth(0); } GUIInput::~GUIInput() @@ -178,17 +173,40 @@ GUIInput::~GUIInput() delete mAction; } -int GUIInput::HandleTextLocation(int x) -{ - int textWidth; - string displayValue, originalValue, insertChar; +void GUIInput::HandleTextLocation(int x) { + mRendered = false; + if (textWidth <= mRenderW) { + if (x != TW_INPUT_NO_UPDATE) + lastX = x; + scrollingX = 0; + return; + } + if (scrollingX + textWidth < mRenderW) { + scrollingX = mRenderW - textWidth; + } + + if (x == TW_INPUT_NO_UPDATE) + return; + + scrollingX += x - lastX; + if (scrollingX > 0) + scrollingX = 0; + else if (scrollingX + textWidth < mRenderW) + scrollingX = mRenderW - textWidth; + lastX = x; +} + +void GUIInput::UpdateTextWidth() { void* fontResource = NULL; - if (mFont) + if (mFont) { fontResource = mFont->GetResource(); + } else { + textWidth = 0; + return; + } - DataManager::GetValue(mVariable, originalValue); - displayValue = originalValue; + DataManager::GetValue(mVariable, displayValue); if (HasMask) { int index, string_size = displayValue.size(); string maskedValue; @@ -197,153 +215,80 @@ int GUIInput::HandleTextLocation(int x) displayValue = maskedValue; } textWidth = gr_ttf_measureEx(displayValue.c_str(), fontResource); - if (textWidth <= mRenderW) { - lastX = x; - scrollingX = 0; - skipChars = 0; - mInputText->SkipCharCount(skipChars); - mRendered = false; - return 0; - } - - if (skipChars && skipChars < displayValue.size()) - displayValue.erase(0, skipChars); - - textWidth = gr_ttf_measureEx(displayValue.c_str(), fontResource); - mRendered = false; +} - int deltaX, deltaText, newWidth; +void GUIInput::HandleCursorByTouch(int x) { +// Uses x to find mCursorLocation and cursorX + if (displayValue.size() == 0) { + mCursorLocation = -1; + cursorX = mRenderX; + return; + } - if (x < -1000) { - // No change in scrolling - if (x == -1003) - mCursorLocation = -1; + void* fontResource = NULL; + if (mFont) { + fontResource = mFont->GetResource(); + } else { + return; + } - if (mCursorLocation == -1) { - displayValue = originalValue; - skipChars = 0; - textWidth = gr_ttf_measureEx(displayValue.c_str(), fontResource); - while (textWidth > mRenderW) { - displayValue.erase(0, 1); - skipChars++; - textWidth = gr_ttf_measureEx(displayValue.c_str(), fontResource); + string cursorString; + unsigned index = 0, displaySize = displayValue.size(); + int prevX = mRenderX + scrollingX; + + for(index = 0; index <= displaySize; index++) { + cursorString = displayValue.substr(0, index); + cursorX = gr_ttf_measureEx(cursorString.c_str(), fontResource) + mRenderX + scrollingX; + if (cursorX > x) { + if (index > 0 && x <= cursorX - ((x - prevX) / 2) && prevX >= mRenderX) { + // This helps make sure that we can place the cursor before the very first char if the first char is + // is fully visible while also still letting us place the cursor after the last char if fully visible + mCursorLocation = index - 1; + cursorX = prevX; + return; } - scrollingX = mRenderW - textWidth; - mInputText->SkipCharCount(skipChars); - } else if (x == -1001) { - // Added a new character - int adjust_scrollingX = 0; - string cursorLocate; - - cursorLocate = displayValue; - cursorLocate.resize(mCursorLocation); - textWidth = gr_ttf_measureEx(cursorLocate.c_str(), fontResource); - while (textWidth > mRenderW) { - skipChars++; + mCursorLocation = index; + if (cursorX > mRenderX + mRenderW) { + cursorX = prevX; // This makes sure that the cursor doesn't get placed after the end of the input box mCursorLocation--; - cursorLocate.erase(0, 1); - textWidth = gr_ttf_measureEx(cursorLocate.c_str(), fontResource); - adjust_scrollingX = -1; - } - if (adjust_scrollingX) { - scrollingX = mRenderW - textWidth; - if (scrollingX < 0) - scrollingX = 0; - } - mInputText->SkipCharCount(skipChars); - } else if (x == -1002) { - // Deleted a character - while (-1) { - if (skipChars == 0) { - scrollingX = 0; - mInputText->SkipCharCount(skipChars); - return 0; - } - insertChar = originalValue.substr(skipChars - 1, 1); - displayValue.insert(0, insertChar); - newWidth = gr_ttf_measureEx(displayValue.c_str(), fontResource); - deltaText = newWidth - textWidth; - if (newWidth > mRenderW) { - scrollingX = mRenderW - textWidth; - if (scrollingX < 0) - scrollingX = 0; - mInputText->SkipCharCount(skipChars); - return 0; - } else { - textWidth = newWidth; - skipChars--; - mCursorLocation++; - } + return; } - } else - LOGINFO("GUIInput::HandleTextLocation -> We really shouldn't ever get here...\n"); - } else if (x > lastX) { - // Dragging to right, scrolling left - while (-1) { - deltaX = x - lastX + scrollingX; - if (skipChars == 0 || deltaX == 0) { - scrollingX = 0; - lastX = x; - mInputText->SkipCharCount(skipChars); - return 0; - } - insertChar = originalValue.substr(skipChars - 1, 1); - displayValue.insert(0, insertChar); - newWidth = gr_ttf_measureEx(displayValue.c_str(), fontResource); - deltaText = newWidth - textWidth; - if (deltaText < deltaX) { - lastX += deltaText; - textWidth = newWidth; - skipChars--; - } else { - scrollingX = deltaX; - lastX = x; - mInputText->SkipCharCount(skipChars); - return 0; - } - } - } else if (x < lastX) { - // Dragging to left, scrolling right - if (textWidth <= mRenderW) { - lastX = x; - scrollingX = mRenderW - textWidth; - return 0; - } - if (scrollingX) { - deltaX = lastX - x; - if (scrollingX > deltaX) { - scrollingX -= deltaX; - lastX = x; - return 0; - } else { - lastX -= deltaX; - scrollingX = 0; - } - } - while (-1) { - deltaX = lastX - x; - displayValue.erase(0, 1); - skipChars++; - newWidth = gr_ttf_measureEx(displayValue.c_str(), fontResource); - deltaText = textWidth - newWidth; - if (newWidth <= mRenderW) { - scrollingX = mRenderW - newWidth; - lastX = x; - mInputText->SkipCharCount(skipChars); - return 0; - } - if (deltaText < deltaX) { - lastX -= deltaText; - textWidth = newWidth; - } else { - scrollingX = deltaText - deltaX; - lastX = x; - mInputText->SkipCharCount(skipChars); - return 0; + if (cursorX >= mRenderX) { + return; // This makes sure that the cursor doesn't get placed before the beginning of the input box } } + prevX = cursorX; + } + mCursorLocation = -1; // x is at or past the end of the string +} + +void GUIInput::HandleCursorByText() { +// Uses mCursorLocation to find cursorX + if (!DrawCursor) + return; + + void* fontResource = NULL; + if (mFont) { + fontResource = mFont->GetResource(); + } else { + return; + } + + int cursorWidth = textWidth; + + if (mCursorLocation != -1) { + string cursorDisplay = displayValue; + cursorDisplay.resize(mCursorLocation); + cursorWidth = gr_ttf_measureEx(cursorDisplay.c_str(), fontResource); + } + cursorX = mRenderX + cursorWidth + scrollingX; + if (cursorX >= mRenderX + mRenderW) { + scrollingX = mRenderW - cursorWidth; + cursorX = mRenderX + mRenderW - CursorWidth; + } else if (cursorX < mRenderX) { + scrollingX = cursorWidth * -1; + cursorX = mRenderX; } - return 0; } int GUIInput::Render(void) @@ -372,58 +317,18 @@ int GUIInput::Render(void) int ret = 0; // Render the text - mInputText->SetRenderPos(mRenderX + scrollingX, mFontY); - mInputText->SetMaxWidth(mRenderW - scrollingX); - if (mInputText) ret = mInputText->Render(); - if (ret < 0) return ret; + if (mInputText) { + mInputText->SetRenderPos(mRenderX + scrollingX, mFontY); + mInputText->SetText(displayValue); + gr_clip(mRenderX, mRenderY, mRenderW, mRenderH); + ret = mInputText->Render(); + gr_noclip(); + } + if (ret < 0) + return ret; if (HasInputFocus && DrawCursor) { // Render the cursor - string displayValue; - int cursorX; - DataManager::GetValue(mVariable, displayValue); - if (HasMask) { - int index, string_size = displayValue.size(); - string maskedValue; - for (index=0; index<string_size; index++) - maskedValue += mMask; - displayValue = maskedValue; - } - if (displayValue.size() == 0) { - skipChars = 0; - mCursorLocation = -1; - cursorX = mRenderX; - } else { - if (skipChars && skipChars < displayValue.size()) { - displayValue.erase(0, skipChars); - } - if (mCursorLocation == 0) { - // Cursor is at the beginning - cursorX = mRenderX; - } else if (mCursorLocation > 0) { - // Cursor is in the middle - if (displayValue.size() > (unsigned)mCursorLocation) { - string cursorDisplay; - - cursorDisplay = displayValue; - cursorDisplay.resize(mCursorLocation); - cursorX = gr_ttf_measureEx(cursorDisplay.c_str(), fontResource) + mRenderX; - } else { - // Cursor location is after the end of the text - reset to -1 - mCursorLocation = -1; - cursorX = gr_ttf_measureEx(displayValue.c_str(), fontResource) + mRenderX; - } - } else { - // Cursor is at the end (-1) - cursorX = gr_ttf_measureEx(displayValue.c_str(), fontResource) + mRenderX; - } - } - cursorX += scrollingX; - // Make sure that the cursor doesn't go past the boundaries of the box - if (cursorX + (int)CursorWidth > mRenderX + mRenderW) - cursorX = mRenderX + mRenderW - CursorWidth; - - // Set the color for the cursor gr_color(mCursorColor.red, mCursorColor.green, mCursorColor.blue, 255); gr_fill(cursorX, mFontY, CursorWidth, mFontHeight); } @@ -454,8 +359,6 @@ int GUIInput::GetSelection(int x, int y) int GUIInput::NotifyTouch(TOUCH_STATE state, int x, int y) { static int startSelection = -1; - int textWidth; - string displayValue, originalValue; void* fontResource = NULL; if (mFont) fontResource = mFont->GetResource(); @@ -507,43 +410,9 @@ int GUIInput::NotifyTouch(TOUCH_STATE state, int x, int y) case TOUCH_RELEASE: // We've moved the cursor location - int relativeX = x - mRenderX; - mRendered = false; DrawCursor = true; - DataManager::GetValue(mVariable, displayValue); - if (HasMask) { - int index, string_size = displayValue.size(); - string maskedValue; - for (index=0; index<string_size; index++) - maskedValue += mMask; - displayValue = maskedValue; - } - if (displayValue.size() == 0) { - skipChars = 0; - mCursorLocation = -1; - return 0; - } else if (skipChars && skipChars < displayValue.size()) { - displayValue.erase(0, skipChars); - } - - string cursorString; - int cursorX = 0; - unsigned index = 0; - - for(index=0; index<displayValue.size(); index++) - { - cursorString = displayValue.substr(0, index); - cursorX = gr_ttf_measureEx(cursorString.c_str(), fontResource) + mRenderX; - if (cursorX > x) { - if (index > 0) - mCursorLocation = index - 1; - else - mCursorLocation = index; - return 0; - } - } - mCursorLocation = -1; + HandleCursorByTouch(x); break; } } @@ -554,10 +423,19 @@ int GUIInput::NotifyVarChange(const std::string& varName, const std::string& val { GUIObject::NotifyVarChange(varName, value); - if (varName == mVariable && !isLocalChange) { - HandleTextLocation(-1003); + if (varName == mVariable) { + if (!isLocalChange) { + UpdateTextWidth(); + HandleTextLocation(TW_INPUT_NO_UPDATE); + } else + isLocalChange = false; return 0; } + if (varName.empty()) { + UpdateTextWidth(); + HandleTextLocation(TW_INPUT_NO_UPDATE); + HandleCursorByText(); + } return 0; } @@ -566,54 +444,48 @@ int GUIInput::NotifyKey(int key, bool down) if (!HasInputFocus || !down) return 1; - string variableValue; switch (key) { case KEY_LEFT: - if (mCursorLocation == 0 && skipChars == 0) + if (mCursorLocation == 0) return 0; // we're already at the beginning if (mCursorLocation == -1) { - DataManager::GetValue(mVariable, variableValue); - if (variableValue.size() == 0) + if (displayValue.size() == 0) { + cursorX = mRenderX; return 0; - mCursorLocation = variableValue.size() - skipChars - 1; - } else if (mCursorLocation == 0) { - skipChars--; - HandleTextLocation(-1002); + } + mCursorLocation = displayValue.size() - 1; } else { mCursorLocation--; - HandleTextLocation(-1002); } mRendered = false; + HandleCursorByText(); return 0; case KEY_RIGHT: if (mCursorLocation == -1) return 0; // we're already at the end mCursorLocation++; - DataManager::GetValue(mVariable, variableValue); - if (variableValue.size() <= mCursorLocation + skipChars) + if ((int)displayValue.size() <= mCursorLocation) mCursorLocation = -1; - HandleTextLocation(-1001); + HandleCursorByText(); mRendered = false; return 0; case KEY_HOME: case KEY_UP: - DataManager::GetValue(mVariable, variableValue); - if (variableValue.size() == 0) + if (displayValue.size() == 0) return 0; mCursorLocation = 0; - skipChars = 0; mRendered = false; - HandleTextLocation(-1002); + cursorX = mRenderX; return 0; case KEY_END: case KEY_DOWN: mCursorLocation = -1; mRendered = false; - HandleTextLocation(-1003); + HandleCursorByText(); return 0; } @@ -622,58 +494,38 @@ int GUIInput::NotifyKey(int key, bool down) int GUIInput::NotifyCharInput(int key) { - string variableValue; - if (HasInputFocus) { if (key == KEYBOARD_BACKSPACE) { //Backspace - DataManager::GetValue(mVariable, variableValue); - if (variableValue.size() > 0 && (mCursorLocation + skipChars != 0 || mCursorLocation == -1)) { + if (displayValue.size() > 0 && mCursorLocation != 0) { if (mCursorLocation == -1) { - variableValue.resize(variableValue.size() - 1); + displayValue.resize(displayValue.size() - 1); } else { - variableValue.erase(mCursorLocation + skipChars - 1, 1); - if (mCursorLocation > 0) - mCursorLocation--; - else if (skipChars > 0) - skipChars--; + displayValue.erase(mCursorLocation - 1, 1); + mCursorLocation--; } isLocalChange = true; - DataManager::SetValue(mVariable, variableValue); - isLocalChange = false; - - if (HasMask) { - int index, string_size = variableValue.size(); - string maskedValue; - for (index=0; index<string_size; index++) - maskedValue += mMask; - DataManager::SetValue(mMaskVariable, maskedValue); - } - HandleTextLocation(-1002); + DataManager::SetValue(mVariable, displayValue); + UpdateTextWidth(); + HandleTextLocation(TW_INPUT_NO_UPDATE); + HandleCursorByText(); } } else if (key == KEYBOARD_SWIPE_LEFT) { // Delete all isLocalChange = true; if (mCursorLocation == -1) { DataManager::SetValue (mVariable, ""); - if (HasMask) - DataManager::SetValue(mMaskVariable, ""); + displayValue = ""; + textWidth = 0; mCursorLocation = -1; } else { - DataManager::GetValue(mVariable, variableValue); - variableValue.erase(0, mCursorLocation + skipChars); - DataManager::SetValue(mVariable, variableValue); - if (HasMask) { - DataManager::GetValue(mMaskVariable, variableValue); - variableValue.erase(0, mCursorLocation + skipChars); - DataManager::SetValue(mMaskVariable, variableValue); - } + displayValue.erase(0, mCursorLocation); + DataManager::SetValue(mVariable, displayValue); + UpdateTextWidth(); mCursorLocation = 0; } - skipChars = 0; + cursorX = mRenderX; scrollingX = 0; - mInputText->SkipCharCount(skipChars); - isLocalChange = false; mRendered = false; return 0; } else if (key >= 32) { @@ -684,33 +536,24 @@ int GUIInput::NotifyCharInput(int key) if (HasDisabled && DisabledList.find((char)key) != string::npos) { return 0; } - DataManager::GetValue(mVariable, variableValue); - if (MaxLen != 0 && variableValue.size() >= MaxLen) { + if (MaxLen != 0 && displayValue.size() >= MaxLen) { return 0; } if (mCursorLocation == -1) { - variableValue += key; + displayValue += key; } else { - variableValue.insert(mCursorLocation + skipChars, 1, key); + displayValue.insert(mCursorLocation, 1, key); mCursorLocation++; } isLocalChange = true; - DataManager::SetValue(mVariable, variableValue); - HandleTextLocation(-1001); - isLocalChange = false; - - if (HasMask) { - int index, string_size = variableValue.size(); - string maskedValue; - for (index=0; index<string_size; index++) - maskedValue += mMask; - DataManager::SetValue(mMaskVariable, maskedValue); - } + DataManager::SetValue(mVariable, displayValue); + UpdateTextWidth(); + HandleTextLocation(TW_INPUT_NO_UPDATE); + HandleCursorByText(); } else if (key == KEYBOARD_ACTION) { // Action - DataManager::GetValue(mVariable, variableValue); if (mAction) { - unsigned inputLen = variableValue.length(); + unsigned inputLen = displayValue.length(); if (inputLen < MinLen) return 0; else if (MaxLen != 0 && inputLen > MaxLen) diff --git a/gui/objects.hpp b/gui/objects.hpp index 6c6fa5eb0..7913b36cb 100644 --- a/gui/objects.hpp +++ b/gui/objects.hpp @@ -192,8 +192,7 @@ public: // Set maximum width in pixels virtual int SetMaxWidth(unsigned width); - // Set number of characters to skip (for scrolling) - virtual int SkipCharCount(unsigned skip); + void SetText(string newtext); public: bool isHighlighted; @@ -209,7 +208,6 @@ protected: int mIsStatic; int mVarChanged; int mFontHeight; - unsigned charSkip; }; // GUIImage - Used for static image @@ -1001,7 +999,10 @@ protected: virtual int GetSelection(int x, int y); // Handles displaying the text properly when chars are added, deleted, or for scrolling - virtual int HandleTextLocation(int x); + void HandleTextLocation(int x); + void UpdateTextWidth(); + void HandleCursorByTouch(int x); + void HandleCursorByText(); protected: GUIText* mInputText; @@ -1013,15 +1014,16 @@ protected: std::string mLastValue; std::string mVariable; std::string mMask; - std::string mMaskVariable; + std::string displayValue; COLOR mBackgroundColor; COLOR mCursorColor; int scrollingX; + int cursorX; int lastX; int mCursorLocation; int mBackgroundX, mBackgroundY, mBackgroundW, mBackgroundH; int mFontY; - unsigned skipChars; + int textWidth; unsigned mFontHeight; unsigned CursorWidth; bool mRendered; diff --git a/gui/pages.cpp b/gui/pages.cpp index cfe306773..115d6b35d 100644 --- a/gui/pages.cpp +++ b/gui/pages.cpp @@ -55,9 +55,6 @@ extern "C" { extern int gGuiRunning; -// From ../twrp.cpp -extern bool datamedia; - // From console.cpp extern size_t last_message_count; extern std::vector<std::string> gConsole; @@ -621,7 +618,7 @@ int Page::NotifyCharInput(int ch) if (ret == 0) return 0; else if (ret < 0) - LOGERR("A char input handler has returned an error"); + LOGERR("A char input handler has returned an error\n"); } return 1; } @@ -637,7 +634,7 @@ int Page::SetKeyBoardFocus(int inFocus) if (ret == 0) return 0; else if (ret < 0) - LOGERR("An input focus handler has returned an error"); + LOGERR("An input focus handler has returned an error\n"); } return 1; } @@ -663,13 +660,42 @@ int Page::NotifyVarChange(std::string varName, std::string value) return 0; } -PageSet::PageSet(const char* xmlFile) + +// transient data for loading themes +struct LoadingContext +{ + ZipArchive* zip; // zip to load theme from, or NULL for the stock theme + std::set<std::string> filenames; // to detect cyclic includes + std::string basepath; // if zip is NULL, base path to load includes from with trailing slash, otherwise empty + std::vector<xml_document<>*> xmldocs; // all loaded xml docs + std::vector<char*> xmlbuffers; // text buffers with xml content + std::vector<xml_node<>*> styles; // refer to <styles> nodes inside xmldocs + std::vector<xml_node<>*> templates; // refer to <templates> nodes inside xmldocs + + LoadingContext() + { + zip = NULL; + } + + ~LoadingContext() + { + // free all xml buffers + for (std::vector<char*>::iterator it = xmlbuffers.begin(); it != xmlbuffers.end(); ++it) + free(*it); + } + +}; + +// for FindStyle +LoadingContext* PageManager::currentLoadingContext = NULL; + + +PageSet::PageSet() { mResources = new ResourceManager; mCurrentPage = NULL; - if (!xmlFile) - mCurrentPage = new Page(NULL, NULL); + set_scale_values(1, 1); // Reset any previous scaling values } PageSet::~PageSet() @@ -681,6 +707,105 @@ PageSet::~PageSet() delete mResources; } +int PageSet::Load(LoadingContext& ctx, const std::string& filename) +{ + bool isMain = ctx.xmlbuffers.empty(); // if we have no files yet, remember that this is the main XML file + + if (!ctx.filenames.insert(filename).second) + // ignore already loaded files to prevent crash with cyclic includes + return 0; + + // load XML into buffer + char* xmlbuffer = PageManager::LoadFileToBuffer(filename, ctx.zip); + if (!xmlbuffer) + return -1; // error already displayed by LoadFileToBuffer + ctx.xmlbuffers.push_back(xmlbuffer); + + // parse XML + xml_document<>* doc = new xml_document<>(); + doc->parse<0>(xmlbuffer); + ctx.xmldocs.push_back(doc); + + xml_node<>* root = doc->first_node("recovery"); + if (!root) + root = doc->first_node("install"); + if (!root) { + LOGERR("Unknown root element in %s\n", filename.c_str()); + return -1; + } + + if (isMain) { + int rc = LoadDetails(ctx, root); + if (rc != 0) + return rc; + } + + LOGINFO("Loading resources...\n"); + xml_node<>* child = root->first_node("resources"); + if (child) + mResources->LoadResources(child, ctx.zip, "theme"); + + LOGINFO("Loading variables...\n"); + child = root->first_node("variables"); + if (child) + LoadVariables(child); + + LOGINFO("Loading mouse cursor...\n"); + child = root->first_node("mousecursor"); + if (child) + PageManager::LoadCursorData(child); + + LOGINFO("Loading pages...\n"); + child = root->first_node("templates"); + if (child) + ctx.templates.push_back(child); + + child = root->first_node("styles"); + if (child) + ctx.styles.push_back(child); + + // Load pages + child = root->first_node("pages"); + if (child) { + if (LoadPages(ctx, child)) { + LOGERR("PageSet::Load returning -1\n"); + return -1; + } + } + + // process includes recursively + child = root->first_node("include"); + if (child) { + xml_node<>* include = child->first_node("xmlfile"); + while (include != NULL) { + xml_attribute<>* attr = include->first_attribute("name"); + if (!attr) { + LOGERR("Skipping include/xmlfile with no name\n"); + continue; + } + + string filename = ctx.basepath + attr->value(); + LOGINFO("Including file: %s...\n", filename.c_str()); + int rc = Load(ctx, filename); + if (rc != 0) + return rc; + + include = include->next_sibling("xmlfile"); + } + } + + return 0; +} + +void PageSet::MakeEmergencyConsoleIfNeeded() +{ + if (mPages.empty()) { + mCurrentPage = new Page(NULL, NULL); // fallback console page + // TODO: since removal of non-TTF fonts, the emergency console doesn't work without a font, which might be missing too + mPages.push_back(mCurrentPage); + } +} + int PageSet::LoadLanguage(char* languageFile, ZipArchive* package) { xml_document<> lang; @@ -724,26 +849,9 @@ int PageSet::LoadLanguage(char* languageFile, ZipArchive* package) return ret; } -int PageSet::Load(ZipArchive* package, char* xmlFile, char* languageFile, char* baseLanguageFile) +int PageSet::LoadDetails(LoadingContext& ctx, xml_node<>* root) { - xml_document<> mDoc; - xml_node<>* parent; - xml_node<>* child; - xml_node<>* xmltemplate; - xml_node<>* xmlstyle; - - mDoc.parse<0>(xmlFile); - parent = mDoc.first_node("recovery"); - if (!parent) - parent = mDoc.first_node("install"); - - set_scale_values(1, 1); // Reset any previous scaling values - - if (baseLanguageFile) - LoadLanguage(baseLanguageFile, NULL); - - // Now, let's parse the XML - child = parent->first_node("details"); + xml_node<>* child = root->first_node("details"); if (child) { int theme_ver = 0; xml_node<>* themeversion = child->first_node("themeversion"); @@ -754,9 +862,8 @@ int PageSet::Load(ZipArchive* package, char* xmlFile, char* languageFile, char* } if (theme_ver != TW_THEME_VERSION) { LOGINFO("theme version from xml: %i, expected %i\n", theme_ver, TW_THEME_VERSION); - if (package) { + if (ctx.zip) { gui_err("theme_ver_err=Custom theme version does not match TWRP version. Using stock theme."); - mDoc.clear(); return TW_THEME_VER_ERR; } else { gui_print_color("warning", "Stock theme version does not match TWRP version.\n"); @@ -810,151 +917,6 @@ int PageSet::Load(ZipArchive* package, char* xmlFile, char* languageFile, char* LOGINFO("XML contains no details tag, no scaling will be applied.\n"); } - if (languageFile) - LoadLanguage(languageFile, package); - - LOGINFO("Loading resources...\n"); - child = parent->first_node("resources"); - if (child) - mResources->LoadResources(child, package, "theme"); - - LOGINFO("Loading variables...\n"); - child = parent->first_node("variables"); - if (child) - LoadVariables(child); - - LOGINFO("Loading mouse cursor...\n"); - child = parent->first_node("mousecursor"); - if(child) - PageManager::LoadCursorData(child); - - LOGINFO("Loading pages...\n"); - // This may be NULL if no templates are present - xmltemplate = parent->first_node("templates"); - if (xmltemplate) - templates.push_back(xmltemplate); - - // Load styles if present - xmlstyle = parent->first_node("styles"); - if (xmlstyle) - styles.push_back(xmlstyle); - - child = parent->first_node("pages"); - if (child) { - if (LoadPages(child)) { - LOGERR("PageSet::Load returning -1\n"); - mDoc.clear(); - return -1; - } - } - - int ret = CheckInclude(package, &mDoc); - mDoc.clear(); - templates.clear(); - return ret; -} - -int PageSet::CheckInclude(ZipArchive* package, xml_document<> *parentDoc) -{ - xml_node<>* par; - xml_node<>* par2; - xml_node<>* chld; - xml_node<>* parent; - xml_node<>* child; - xml_node<>* xmltemplate; - xml_node<>* xmlstyle; - long len; - char* xmlFile = NULL; - string filename; - xml_document<> *doc = NULL; - - par = parentDoc->first_node("recovery"); - if (!par) { - par = parentDoc->first_node("install"); - } - if (!par) { - return 0; - } - - par2 = par->first_node("include"); - if (!par2) - return 0; - chld = par2->first_node("xmlfile"); - while (chld != NULL) { - xml_attribute<>* attr = chld->first_attribute("name"); - if (!attr) - break; - - if (!package) { - // We can try to load the XML directly... - filename = TWRES; - filename += attr->value(); - } else { - filename += attr->value(); - } - xmlFile = PageManager::LoadFileToBuffer(filename, package); - if (xmlFile == NULL) { - LOGERR("PageSet::CheckInclude unable to load '%s'\n", filename.c_str()); - return -1; - } - - doc = new xml_document<>(); - doc->parse<0>(xmlFile); - - parent = doc->first_node("recovery"); - if (!parent) - parent = doc->first_node("install"); - - // Now, let's parse the XML - LOGINFO("Loading included resources...\n"); - child = parent->first_node("resources"); - if (child) - mResources->LoadResources(child, package, "theme"); - - LOGINFO("Loading included variables...\n"); - child = parent->first_node("variables"); - if (child) - LoadVariables(child); - - LOGINFO("Loading mouse cursor...\n"); - child = parent->first_node("mousecursor"); - if(child) - PageManager::LoadCursorData(child); - - LOGINFO("Loading included pages...\n"); - // This may be NULL if no templates are present - xmltemplate = parent->first_node("templates"); - if (xmltemplate) - templates.push_back(xmltemplate); - - // Load styles if present - xmlstyle = parent->first_node("styles"); - if (xmlstyle) - styles.push_back(xmlstyle); - - child = parent->first_node("pages"); - if (child && LoadPages(child)) - { - templates.pop_back(); - doc->clear(); - delete doc; - free(xmlFile); - return -1; - } - - if (CheckInclude(package, doc)) { - doc->clear(); - delete doc; - free(xmlFile); - return -1; - } - doc->clear(); - delete doc; - free(xmlFile); - - chld = chld->next_sibling("xmlfile"); - } - return 0; } @@ -1089,7 +1051,7 @@ int PageSet::LoadVariables(xml_node<>* vars) return 0; } -int PageSet::LoadPages(xml_node<>* pages) +int PageSet::LoadPages(LoadingContext& ctx, xml_node<>* pages) { xml_node<>* child; @@ -1099,7 +1061,7 @@ int PageSet::LoadPages(xml_node<>* pages) child = pages->first_node("page"); while (child != NULL) { - Page* page = new Page(child, &templates); + Page* page = new Page(child, &ctx.templates); if (page->GetName().empty()) { LOGERR("Unable to process load page\n"); @@ -1356,10 +1318,8 @@ void PageManager::LoadLanguage(string filename) { int PageManager::LoadPackage(std::string name, std::string package, std::string startpage) { - int fd; - ZipArchive zip, *pZip = NULL; - long len; - char* xmlFile = NULL; + std::string mainxmlfilename = package; + ZipArchive zip; char* languageFile = NULL; char* baseLanguageFile = NULL; PageSet* pageSet = NULL; @@ -1369,6 +1329,9 @@ int PageManager::LoadPackage(std::string name, std::string package, std::string mReloadTheme = false; mStartPage = startpage; + // init the loading context + LoadingContext ctx; + // Open the XML file LOGINFO("Loading package: %s (%s)\n", name.c_str(), package.c_str()); if (package.size() > 4 && package.substr(package.size() - 4) != ".zip") @@ -1376,8 +1339,11 @@ int PageManager::LoadPackage(std::string name, std::string package, std::string LOGINFO("Load XML directly\n"); tw_x_offset = TW_X_OFFSET; tw_y_offset = TW_Y_OFFSET; - LoadLanguageList(NULL); - languageFile = LoadFileToBuffer(TWRES "languages/en.xml", NULL); + if (name != "splash") { + LoadLanguageList(NULL); + languageFile = LoadFileToBuffer(TWRES "languages/en.xml", NULL); + } + ctx.basepath = TWRES; } else { @@ -1395,26 +1361,32 @@ int PageManager::LoadPackage(std::string name, std::string package, std::string sysReleaseMap(&map); goto error; } - pZip = &zip; - package = "ui.xml"; - LoadLanguageList(pZip); - languageFile = LoadFileToBuffer("languages/en.xml", pZip); + ctx.zip = &zip; + mainxmlfilename = "ui.xml"; + LoadLanguageList(ctx.zip); + languageFile = LoadFileToBuffer("languages/en.xml", ctx.zip); baseLanguageFile = LoadFileToBuffer(TWRES "languages/en.xml", NULL); } - xmlFile = LoadFileToBuffer(package, pZip); - if (xmlFile == NULL) { - goto error; - } - // Before loading, mCurrentSet must be the loading package so we can find resources pageSet = mCurrentSet; - mCurrentSet = new PageSet(xmlFile); - ret = mCurrentSet->Load(pZip, xmlFile, languageFile, baseLanguageFile); + mCurrentSet = new PageSet(); + + if (baseLanguageFile) { + mCurrentSet->LoadLanguage(baseLanguageFile, NULL); + free(baseLanguageFile); + } + if (languageFile) { + mCurrentSet->LoadLanguage(languageFile, ctx.zip); free(languageFile); - languageFile = NULL; } + + // Load and parse the XML and all includes + currentLoadingContext = &ctx; // required to find styles + ret = mCurrentSet->Load(ctx, mainxmlfilename); + currentLoadingContext = NULL; + if (ret == 0) { mCurrentSet->SetPage(startpage); mPageSets.insert(std::pair<std::string, PageSet*>(name, mCurrentSet)); @@ -1423,25 +1395,21 @@ int PageManager::LoadPackage(std::string name, std::string package, std::string LOGERR("Package %s failed to load.\n", name.c_str()); } + // reset to previous pageset mCurrentSet = pageSet; - if (pZip) { - mzCloseZipArchive(pZip); + if (ctx.zip) { + mzCloseZipArchive(ctx.zip); sysReleaseMap(&map); } - free(xmlFile); - if (languageFile) - free(languageFile); return ret; error: // Sometimes we get here without a real error - if (pZip) { - mzCloseZipArchive(pZip); + if (ctx.zip) { + mzCloseZipArchive(ctx.zip); sysReleaseMap(&map); } - if (xmlFile) - free(xmlFile); return -1; } @@ -1466,6 +1434,7 @@ PageSet* PageManager::SelectPackage(std::string name) if (tmp) { mCurrentSet = tmp; + mCurrentSet->MakeEmergencyConsoleIfNeeded(); mCurrentSet->NotifyVarChange("", ""); } else @@ -1620,7 +1589,13 @@ HardwareKeyboard *PageManager::GetHardwareKeyboard() xml_node<>* PageManager::FindStyle(std::string name) { - for (std::vector<xml_node<>*>::iterator itr = mCurrentSet->styles.begin(); itr != mCurrentSet->styles.end(); itr++) { + if (!currentLoadingContext) + { + LOGERR("FindStyle works only while loading a theme.\n"); + return NULL; + } + + for (std::vector<xml_node<>*>::iterator itr = currentLoadingContext->styles.begin(); itr != currentLoadingContext->styles.end(); itr++) { xml_node<>* node = (*itr)->first_node("style"); while (node) { diff --git a/gui/pages.hpp b/gui/pages.hpp index 927f3fc01..4bfd5b0e5 100644 --- a/gui/pages.hpp +++ b/gui/pages.hpp @@ -88,16 +88,18 @@ protected: bool ProcessNode(xml_node<>* page, std::vector<xml_node<>*> *templates, int depth); }; +struct LoadingContext; + class PageSet { public: - PageSet(const char* xmlFile); + PageSet(); virtual ~PageSet(); public: + int Load(LoadingContext& ctx, const std::string& filename); int LoadLanguage(char* languageFile, ZipArchive* package); - int Load(ZipArchive* package, char* xmlFile, char* languageFile, char* baseLanguageFile); - int CheckInclude(ZipArchive* package, xml_document<> *parentDoc); + void MakeEmergencyConsoleIfNeeded(); Page* FindPage(std::string name); int SetPage(std::string page); @@ -117,17 +119,16 @@ public: int SetKeyBoardFocus(int inFocus); int NotifyVarChange(std::string varName, std::string value); - std::vector<xml_node<>*> styles; void AddStringResource(std::string resource_source, std::string resource_name, std::string value); protected: - int LoadPages(xml_node<>* pages); + int LoadDetails(LoadingContext& ctx, xml_node<>* root); + int LoadPages(LoadingContext& ctx, xml_node<>* pages); int LoadVariables(xml_node<>* vars); protected: ResourceManager* mResources; std::vector<Page*> mPages; - std::vector<xml_node<>*> templates; Page* mCurrentPage; std::vector<Page*> mOverlays; // Special case for popup dialogs and the lock screen }; @@ -187,6 +188,7 @@ protected: static HardwareKeyboard *mHardwareKeyboard; static bool mReloadTheme; static std::string mStartPage; + static LoadingContext* currentLoadingContext; }; #endif // _PAGES_HEADER_HPP diff --git a/gui/resources.cpp b/gui/resources.cpp index e7611dd9f..9c97dad18 100644 --- a/gui/resources.cpp +++ b/gui/resources.cpp @@ -54,24 +54,27 @@ int Resource::ExtractResource(ZipArchive* pZip, std::string folderName, std::str return ret; } -void Resource::LoadImage(ZipArchive* pZip, std::string file, gr_surface* source) +void Resource::LoadImage(ZipArchive* pZip, std::string file, gr_surface* surface) { + int rc = 0; if (ExtractResource(pZip, "images", file, ".png", TMP_RESOURCE_NAME) == 0) { - res_create_surface(TMP_RESOURCE_NAME, source); + rc = res_create_surface(TMP_RESOURCE_NAME, surface); unlink(TMP_RESOURCE_NAME); } else if (ExtractResource(pZip, "images", file, "", TMP_RESOURCE_NAME) == 0) { // JPG includes the .jpg extension in the filename so extension should be blank - res_create_surface(TMP_RESOURCE_NAME, source); + rc = res_create_surface(TMP_RESOURCE_NAME, surface); unlink(TMP_RESOURCE_NAME); } else if (!pZip) { // File name in xml may have included .png so try without adding .png - res_create_surface(file.c_str(), source); + rc = res_create_surface(file.c_str(), surface); } + if (rc != 0) + LOGINFO("Failed to load image from %s%s, error %d\n", file.c_str(), pZip ? " (zip)" : "", rc); } void Resource::CheckAndScaleImage(gr_surface source, gr_surface* destination, int retain_aspect) @@ -122,7 +125,6 @@ void FontResource::LoadFont(xml_node<>* node, ZipArchive* pZip) if(file.size() >= 4 && file.compare(file.size()-4, 4, ".ttf") == 0) { - m_type = TYPE_TTF; int font_size = 0; if (origFontSize != 0) { @@ -144,10 +146,11 @@ void FontResource::LoadFont(xml_node<>* node, ZipArchive* pZip) if(attr) dpi = atoi(attr->value()); - if (ExtractResource(pZip, "fonts", file, "", TMP_RESOURCE_NAME) == 0) + // we can't use TMP_RESOURCE_NAME here because the ttf subsystem is caching the name and scaling needs to reload the font + std::string tmpname = "/tmp/" + file; + if (ExtractResource(pZip, "fonts", file, "", tmpname) == 0) { - mFont = gr_ttf_loadFont(TMP_RESOURCE_NAME, font_size, dpi); - unlink(TMP_RESOURCE_NAME); + mFont = gr_ttf_loadFont(tmpname.c_str(), font_size, dpi); } else { diff --git a/gui/resources.hpp b/gui/resources.hpp index 4548c10b4..528fecc14 100644 --- a/gui/resources.hpp +++ b/gui/resources.hpp @@ -29,21 +29,13 @@ private: protected: static int ExtractResource(ZipArchive* pZip, std::string folderName, std::string fileName, std::string fileExtn, std::string destFile); - static void LoadImage(ZipArchive* pZip, std::string file, gr_surface* source); + static void LoadImage(ZipArchive* pZip, std::string file, gr_surface* surface); static void CheckAndScaleImage(gr_surface source, gr_surface* destination, int retain_aspect); }; class FontResource : public Resource { public: - enum Type - { - TYPE_TWRP, -#ifndef TW_DISABLE_TTF - TYPE_TTF, -#endif - }; - FontResource(xml_node<>* node, ZipArchive* pZip); virtual ~FontResource(); @@ -54,7 +46,6 @@ public: protected: void* mFont; - Type m_type; private: void LoadFont(xml_node<>* node, ZipArchive* pZip); diff --git a/gui/text.cpp b/gui/text.cpp index 6498af62c..49e27a104 100644 --- a/gui/text.cpp +++ b/gui/text.cpp @@ -1,3 +1,21 @@ +/* + Copyright 2012 to 2016 bigbiff/Dees_Troy TeamWin + This file is part of TWRP/TeamWin Recovery Project. + + TWRP 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. + + TWRP 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 TWRP. If not, see <http://www.gnu.org/licenses/>. +*/ + // text.cpp - GUIText object #include <stdarg.h> @@ -33,7 +51,6 @@ GUIText::GUIText(xml_node<>* node) mVarChanged = 0; mFontHeight = 0; maxWidth = 0; - charSkip = 0; scaleWidth = true; isHighlighted = false; mText = ""; @@ -94,22 +111,18 @@ int GUIText::Render(void) return -1; mLastValue = gui_parse_text(mText); - string displayValue = mLastValue; - - if (charSkip) - displayValue.erase(0, charSkip); mVarChanged = 0; int x = mRenderX, y = mRenderY; - int width = gr_ttf_measureEx(displayValue.c_str(), fontResource); + int width = gr_ttf_measureEx(mLastValue.c_str(), fontResource); if (isHighlighted) gr_color(mHighlightColor.red, mHighlightColor.green, mHighlightColor.blue, mHighlightColor.alpha); else gr_color(mColor.red, mColor.green, mColor.blue, mColor.alpha); - gr_textEx_scaleW(mRenderX, mRenderY, displayValue.c_str(), fontResource, maxWidth, mPlacement, scaleWidth); + gr_textEx_scaleW(mRenderX, mRenderY, mLastValue.c_str(), fontResource, maxWidth, mPlacement, scaleWidth); return 0; } @@ -164,13 +177,13 @@ int GUIText::NotifyVarChange(const std::string& varName, const std::string& valu int GUIText::SetMaxWidth(unsigned width) { maxWidth = width; + if (!maxWidth) + scaleWidth = false; mVarChanged = 1; return 0; } -int GUIText::SkipCharCount(unsigned skip) +void GUIText::SetText(string newtext) { - charSkip = skip; - mVarChanged = 1; - return 0; + mText = newtext; } diff --git a/gui/theme/common/languages/hu.xml b/gui/theme/common/languages/hu.xml index 718dd172e..8f88751d6 100644 --- a/gui/theme/common/languages/hu.xml +++ b/gui/theme/common/languages/hu.xml @@ -2,6 +2,7 @@ <!--Generated by crowdin.com--> <language> <display>Hungarian</display> + <resources> <!-- Font overrides - only change these if your language requires special characters --> <resource name="font_l" type="fontoverride" filename="RobotoCondensed-Regular.ttf" scale="100" /> @@ -9,6 +10,7 @@ <resource name="font_s" type="fontoverride" filename="RobotoCondensed-Regular.ttf" scale="100" /> <resource name="fixed" type="fontoverride" filename="DroidSansMono.ttf" scale="100" /> + <!-- Partition display names --> <string name="system">Rendszer</string> <string name="system_image">Rendszerkép</string> <string name="vendor">Gyártó</string> @@ -23,9 +25,12 @@ <string name="usbotg">USB OTG</string> <string name="android_secure">Android Secure</string> <string name="dalvik">Dalvik / ART-gyorsítótár</string> + <!-- This is a rarely used partition on a Micro SD card for a very old app2sd system --> <string name="sdext">SD-EXT</string> <string name="adopted_data">Adoptált adatok</string> <string name="adopted_storage">Adoptált tároló</string> + + <!-- GUI XML strings --> <string name="twrp_header">Team Win Recovery Project</string> <string name="twrp_watch_header">TWRP %tw_version%</string> <string name="cpu_temp">CPU: %tw_cpu_temp% °C</string> @@ -43,6 +48,7 @@ <string name="tab_screen">KÉPERNYŐ</string> <string name="tab_vibration">REZGÉS</string> <string name="tab_language">NYELV</string> + <string name="install_btn">Telepítés</string> <string name="wipe_btn">Törlés</string> <string name="backup_btn">Biztonsági mentés</string> @@ -144,7 +150,8 @@ <string name="format_data_wtc2">mentését és médiáját. Nem lehet visszavonni.</string> <string name="format_data_undo">Ezt nem lehet visszavonni.</string> <string name="format_data_complete">Adatok formázása kész</string> - <string name="yes_continue">Folytatáshoz gépelje be: igen. Nyomja meg a vissza gombot a megszakításhoz.</string> + <!-- Translator note: the word "yes" must remain English! --> + <string name="yes_continue">Folytatáshoz gépelje be: yes. Nyomja meg a vissza gombot a megszakításhoz.</string> <string name="part_opt_hdr">Partíció lehetőségei: %tw_partition_name%</string> <string name="sel_act_hdr">Válasszon műveletet</string> <string name="file_sys_opt">Fájlrendszer beállítások</string> @@ -234,7 +241,7 @@ <string name="restore_sel_part">Válassza ki a visszaállítandó partíciókat:</string> <string name="restore_enable_md5_chk">A biztonsági mentési fájlok MD5 ellenőrzésének engedélyezése</string> <string name="restore_complete">Mentés helyreállítása kész</string> - <string name="swipe_restore">Csúsztasson a visszaállítshoz</string> + <string name="swipe_restore">Csúsztasson a visszaállításhoz</string> <string name="swipe_restore_s"> Visszaállítás</string> <string name="rename_backup_hdr">Biztonsági mentés átnevezése</string> <string name="rename_backup_confirm">Biztonsági mentés átnevezése?</string> @@ -300,6 +307,8 @@ <string name="settings_language_btn">Nyelv</string> <string name="time_zone_hdr">Időzóna</string> <string name="sel_tz_list">Időzóna választása:</string> + <!-- Translator note: if it does not make sense to translate the locations or if it makes more sense, + feel free to change the location listed or drop the location entirely and just call it UTC -6 --> <string name="utcm11">(UTC-11) Szamoa, Midway-szigetek</string> <string name="utcm10">(UTC-10) Hawaii</string> <string name="utcm9">(UTC-9) Alaszka</string> @@ -356,6 +365,7 @@ <string name="copy_log_confirm">Napló másolása SD-kártyára?</string> <string name="copying_log">Napló másolása az SD-kártyára...</string> <string name="copy_log_complete">Napló másolása kész</string> + <string name="fix_context_btn">Kontextus javítása</string> <string name="part_sd_btn">SD-kártya particionálása</string> <string name="part_sd_s_btn">SD-kártya</string> <string name="file_manager_btn">Fájlkezelő</string> @@ -427,6 +437,8 @@ <string name="decrypt_data_hdr">Adat dekódolása</string> <string name="decrypt_data_enter_pass">Adja meg a jelszót.</string> <string name="decrypt_data_enter_pattern">Adja meg a mintát.</string> + <string name="decrypt_data_failed">Helytelen jelszó, próbálja újra!</string> + <string name="decrypt_data_failed_pattern">Helytelen minta, próbálja újra!</string> <string name="decrypt_data_trying">Dekódolás megpróbálása</string> <string name="term_hdr">Terminál parancs</string> <string name="term_s_hdr">Terminál</string> @@ -440,6 +452,14 @@ <string name="sideload_confirm">ADB Sideload</string> <string name="sideload_usage">Használat: adb sideload fájlnév.zip</string> <string name="sideload_complete">ADB Sideload kész</string> + <string name="fix_contexts_hdr">Kontextus javítása</string> + <string name="fix_contexts_note1">Megjegyzés: kontextus javítására ritkán van szükség.</string> + <string name="fix_contexts_note2">SELinux kontextus javítása a készülék</string> + <string name="fix_contexts_note3">nem megfelelő elindulását okozhatja.</string> + <string name="swipe_to_fix_contexts">Csúsztasson a kontextus javításához</string> + <string name="swipe_fix_contexts"> Kontextus javítása</string> + <string name="fixing_contexts">Kontextus javítása...</string> + <string name="fix_contexts_complete">Kontextus javítása kész</string> <string name="reboot_hdr">Újraindítás</string> <string name="su_hdr">SuperSU ellenőrzés</string> <string name="su_note1">A készüléke nem tűnik rootoltnak.</string> @@ -451,6 +471,8 @@ <string name="su_installing">SuperSU telepítése</string> <string name="sel_storage_list">Válasszon tárolót</string> <string name="ok_btn">OK</string> + + <!-- Various console messages - these consist of user displayed messages, oftentimes errors --> <string name="no_kernel_selinux">Kernel nem támogatja a SELinux összefüggések olvasását.</string> <string name="full_selinux">Teljes SELinux támogatás jelen van.</string> <string name="no_selinux">Nincs SELinux támogatás (nincs libselinux).</string> @@ -459,6 +481,7 @@ <string name="decrypt_success">Sikeresen visszafejtve az alapértelmezett jelszóval.</string> <string name="unable_to_decrypt">Visszafejtés sikertelen az alapértelmezett jelszóval. Szükség lehet az adatok formázására.</string> <string name="generating_md51">MD5 generálása</string> + <!-- Message displayed during a backup if we are generating an MD5, ideally, leave the leading " * " to help align and separate this text from other console text --> <string name="generating_md52"> * MD5 generálása...</string> <string name="md5_created"> * MD5 létrehozva.</string> <string name="md5_error"> * MD5 hiba!</string> @@ -481,6 +504,8 @@ <string name="backup_completed">[BIZTONSÁGI MENTÉS KÉSZ {1} MÁSODPERC ALATT]</string> <string name="restore_started">[VISSZAÁLLÍTÁS ELINDÍTVA]</string> <string name="restore_folder">Mappa visszaállítása: \'{1}\'</string> + <!-- {1} is the partition display name and {2} is the number of seconds --> + <string name="restore_part_done">[{1} kész ({2} másodperc)]</string> <string name="verifying_md5">MD5 ellenőrzése</string> <string name="skip_md5">MD5 ellenőrzés átugrása felhasználói beállítás alapján.</string> <string name="calc_restore">Visszaállítási részletek számítása...</string> @@ -491,6 +516,7 @@ <string name="total_restore_size">Teljes visszaállítás mérete: {1}MB</string> <string name="updating_system_details">Rendszer részleteinek frissítése</string> <string name="restore_completed">[VISSZAÁLLÍTÁS BEFEJEZŐDÖTT {1} MÁSODPERC ALATT]</string> + <!-- {1} is the path we could not open, {2} is strerror output --> <string name="error_opening_strerr">Megnyitási hiba: \'{1}\' ({2})</string> <string name="unable_locate_part_backup_name">Nem található partíció a biztonsági mentés neve alapján: \'{1}\'</string> <string name="unable_find_part_path">Nem található partíció a(z) \'{1}\' elérési útnak</string> @@ -534,8 +560,11 @@ <string name="repairing_using">{1} javítása {2} segítségével...</string> <string name="unable_repair">{1} nem javítható.</string> <string name="mount_data_footer">Nem sikerült csatolni az /adat partíciót és a titkosítási lábléc sem található.</string> + <!-- {1} is the folder name that we could not create, {2} is strerror output --> <string name="create_folder_strerr">\'{1}\' mappa létrehozása sikertelen ({2}).</string> + <!-- {1} is the folder name that we could not mount, {2} is strerror output --> <string name="fail_mount">\'{1}\' csatolása sikertlelen ({2})</string> + <!-- {1} is the folder name that we could not unmount, {2} is strerror output --> <string name="fail_unmount">\'{1}\' leválasztása sikertlelen ({2})</string> <string name="cannot_resize">{1} átméretezése sikertelen.</string> <string name="repair_resize">{1} javítása az átméretezés előtt.</string> @@ -611,6 +640,7 @@ <string name="backup_error">Hiba a biztonsági mentés létrehozásakor.</string> <string name="restore_error">Hiba a visszaállítási folyamat közben.</string> <string name="split_thread">{1} szálazonosító tördelése {2} archívumba</string> + <!-- These 2 items are saved in the data manager instead of resource manager, so %llu, etc is correct instead of {1} --> <string name="file_progress">%llu / %llu fájl, %i%%</string> <string name="size_progress">%lluMB / %lluMB, %i%%</string> <string name="decrypt_cmd">Adatpartíció visszafejtésének megpróbálása parancssor segítségével.</string> @@ -635,5 +665,6 @@ <string name="cancel_sideload">ADB sideload megszakítva...</string> <string name="change_fs_err">Fájlrendszer módosítási hiba.</string> <string name="theme_ver_err">Egyéni téma verziója nem egyezik a TWRP verziójával. Gyári téma használata.</string> + <string name="up_a_level">(Egy szinttel feljebb)</string> </resources> </language> diff --git a/gui/theme/common/languages/it.xml b/gui/theme/common/languages/it.xml new file mode 100644 index 000000000..04187ef94 --- /dev/null +++ b/gui/theme/common/languages/it.xml @@ -0,0 +1,670 @@ +<?xml version="1.0"?> + +<language> + <display>Italiano</display> + + <resources> + <!-- Font overrides - only change these if your language requires special characters --> + <resource name="font_l" type="fontoverride" filename="RobotoCondensed-Regular.ttf" scale="100" /> + <resource name="font_m" type="fontoverride" filename="RobotoCondensed-Regular.ttf" scale="100" /> + <resource name="font_s" type="fontoverride" filename="RobotoCondensed-Regular.ttf" scale="100" /> + <resource name="fixed" type="fontoverride" filename="DroidSansMono.ttf" scale="100" /> + + <!-- Partition display names --> + <string name="system">System</string> + <string name="system_image">Immagine System</string> + <string name="vendor">Vendor</string> + <string name="vendor_image">Immagine Vendor</string> + <string name="boot">Boot</string> + <string name="recovery">Recovery</string> + <string name="cache">Cache</string> + <string name="data">Data</string> + <string name="sdcard">SDCard</string> + <string name="internal">Archivio interno</string> + <string name="microsd">Micro SD</string> + <string name="usbotg">USB OTG</string> + <string name="android_secure">Android Secure</string> + <string name="dalvik">Dalvik / ART Cache</string> + <!-- This is a rarely used partition on a Micro SD card for a very old app2sd system --> + <string name="sdext">SD-EXT</string> + <string name="adopted_data">Data annessa</string> + <string name="adopted_storage">Archivio annesso</string> + + <!-- GUI XML strings --> + <string name="twrp_header">Team Win Recovery Project</string> + <string name="twrp_watch_header">TWRP %tw_version%</string> + <string name="cpu_temp">CPU: %tw_cpu_temp% °C</string> + <string name="battery_pct">Batteria: %tw_battery%</string> + <string name="sort_by_name">Ordina per Nome</string> + <string name="sort_by_date">Ordina per Data</string> + <string name="sort_by_size">Ordina per Dimensione</string> + <string name="sort_by_name_only">Nome</string> + <string name="sort_by_date_only">Data</string> + <string name="sort_by_size_only">Dimensione</string> + <string name="tab_general">GENERALE</string> + <string name="tab_options">OPZIONI</string> + <string name="tab_backup">BACKUP</string> + <string name="tab_time_zone">FUSO ORARIO</string> + <string name="tab_screen">SCHERMO</string> + <string name="tab_vibration">VIBRAZIONE</string> + <string name="tab_language">LINGUA</string> + + <string name="install_btn">Installa</string> + <string name="wipe_btn">Pulisci</string> + <string name="backup_btn">Backup</string> + <string name="restore_btn">Ripristina</string> + <string name="mount_btn">Monta</string> + <string name="settings_btn">Impostazioni</string> + <string name="advanced_btn">Avanzate</string> + <string name="reboot_btn">Riavvia</string> + <string name="files_btn">File</string> + <string name="copy_log_btn">Copia Log</string> + <string name="select_type_hdr">Scegli tipologia</string> + <string name="install_zip_hdr">Installa Zip</string> + <string name="install_zip_btn">Installa Zip</string> + <string name="install_image_hdr">Installa Immagine</string> + <string name="install_image_btn">Installa Immagine</string> + <string name="install_select_file_hdr">Seleziona il file</string> + <string name="file_selector_folders_hdr">Cartelle</string> + <string name="select_file_from_storage">Seleziona il file da %tw_storage_display_name% (%tw_storage_free_size% MB)</string> + <string name="adb_sideload_btn">ADB Sideload</string> + <string name="install_hdr">Installa</string> + <string name="select_storage_hdr">Scegli archivio</string> + <string name="select_storage_btn">Scegli archivio</string> + <string name="queue_hdr">Coda</string> + <string name="zip_queue_count">%tw_zip_queue_count% file accodati su un max di 10</string> + <string name="zip_queue_count_s">File %tw_zip_queue_count% di 10:</string> + <string name="zip_warn1">Questa operazione potrebbe installare software</string> + <string name="zip_warn2">incompatibile e rendere il tuo dispositivo inutilizzabile.</string> + <string name="zip_back_cancel">Premi indietro per annullare la selezione di questo file.</string> + <string name="zip_back_clear">Premi indietro per eliminare la coda di Zip.</string> + <string name="folder">Cartella:</string> + <string name="file">File:</string> + <string name="zip_sig_chk">Verifica della firma del file Zip</string> + <string name="inject_twrp_chk">Esegui TWRP Inject dopo l'installazione</string> + <string name="options_hdr">Opzioni</string> + <string name="confirm_flash_hdr">Conferma installazione</string> + <string name="zip_queue">Coda:</string> + <string name="options">Opzioni:</string> + <string name="swipe_confirm"> Conferma</string> + <string name="zip_add_btn">Aggiungi altri Zip</string> + <string name="zip_clear_btn">Elimina la coda di Zip</string> + <string name="install_zip_count_hdr">Installazione Zip %tw_zip_index% di %tw_zip_queue_count%</string> + <string name="installing_zip_xml">Installazione Zip %tw_file% in corso...</string> + <string name="failed">Operazione fallita</string> + <string name="successful">Operazione riuscita</string> + <string name="install_failed">Installazione fallita</string> + <string name="install_successful">Installazione riuscita</string> + <string name="wipe_cache_dalvik_btn">Pulisci Cache/Dalvik</string> + <string name="reboot_system_btn">Riavvia sistema</string> + <string name="install_sel_target">Scegli partizione</string> + <string name="flash_image_select">Scegli la partizione su cui installare:</string> + <string name="target_partition">Partizione scelta:</string> + <string name="flashing_image">Installazione Immagine...</string> + <string name="image_flashed">Immagine installata</string> + <string name="wipe_cache_dalvik_confirm">Pulire Cache & Dalvik?</string> + <string name="wiping_cache_dalvik">Pulizia Cache & Dalvik...</string> + <string name="wipe_cache_dalvik_complete">Pulizia Cache & Dalvik completata</string> + <string name="swipe_wipe">Scorri per pulire</string> + <string name="swipe_wipe_s"> Pulisci</string> + <string name="no_os1">Nessun SO installato. Sei</string> + <string name="no_osrb">certo di voler riavviare?</string> + <string name="no_ospo">certo di voler spegnere?</string> + <string name="rebooting">Riavvio...</string> + <string name="swipe_reboot">Scorri per riavviare</string> + <string name="swipe_reboot_s"> Riavvia</string> + <string name="swipe_flash">Scorri per installare</string> + <string name="confirm_action">Conferma l'azione</string> + <string name="back_cancel">Premi indietro per annullare.</string> + <string name="cancel_btn">Annulla</string> + <string name="wipe_hdr">Pulizia</string> + <string name="factory_reset_hdr">Reset di fabbrica</string> + <string name="factory_reset_btn">Reset di fabbrica</string> + <string name="factory_reset1">Data, Cache e Dalvik saranno puliti</string> + <string name="factory_reset2">(l'archivio interno sarà escluso)</string> + <string name="factory_reset3">La maggior parte delle volte, questo</string> + <string name="factory_reset4">sarà l'unico tipo di pulizia necessario.</string> + <string name="factory_resetting">Reset in corso...</string> + <string name="advanced_wipe_hdr">Pulizia avanzata</string> + <string name="advanced_wipe_btn">Pulizia avanzata</string> + <string name="wipe_enc_confirm">Eliminare la crittografia da Data?</string> + <string name="formatting_data">Formattazione di Data in corso...</string> + <string name="swipe_format_data">Scorri per formattare Data...</string> + <string name="swipe_format_data_s"> Formattazione Data</string> + <string name="factory_reset_complete">Reset di fabbrica completato</string> + <string name="sel_part_hdr">Selezione partizioni</string> + <string name="wipe_sel_confirm">Pulire questa(e) partizione(i)?</string> + <string name="wiping_part">Pulizia partizione(i) in corso...</string> + <string name="wipe_complete">Pulizia completata</string> + <string name="sel_part_wipe">Scegli le partizioni da pulire:</string> + <string name="invalid_part_sel">Scelta non valida</string> + <string name="format_data_hdr">Formattazione Data</string> + <string name="format_data_btn">Formatta Data</string> + <string name="format_data_ptr1">Formattare Data eliminerà tutte le tue app,</string> + <string name="format_data_ptr2">backup, immagini, video e file. Inoltre, la</string> + <string name="format_data_ptr3">crittografia dell'archivio interno sarà rimossa.</string> + <string name="format_data_adopted">Includi Archivio annesso</string> + <string name="format_data_lcp1">Formattare Data eliminerà tutte le app, backup, immagini, video e file.</string> + <string name="format_data_lcp2">Inoltre, la crittografia dell'archivio interno sarà rimossa.</string> + <string name="format_data_wtc1">Formattare Data eliminerà tutte le tue app,</string> + <string name="format_data_wtc2">backup e file. L'operazione è irreversibile.</string> + <string name="format_data_undo">L'operazione è irreversibile.</string> + <string name="format_data_complete">Formattazione di Data completata</string> + <!-- Translator note: the word "yes" must remain English! --> + <string name="yes_continue">Scrivi yes per continuare. Premi indietro per annullare.</string> + <string name="part_opt_hdr">Opzioni partizione per: %tw_partition_name%</string> + <string name="sel_act_hdr">Scegli azione</string> + <string name="file_sys_opt">Opzioni filesystem</string> + <string name="partition">Partizione: %tw_partition_name%</string> + <string name="part_mount_point">Punto di montaggio: %tw_partition_mount_point%</string> + <string name="part_curr_fs">Filesystem: %tw_partition_file_system%</string> + <string name="part_present_yes">Presente: Sì</string> + <string name="part_present_no">Presente: No</string> + <string name="part_removable_yes">Rimovibile: Sì</string> + <string name="part_removable_no">Rimovibile: No</string> + <string name="part_size">Dimensione: %tw_partition_size%MB</string> + <string name="part_used">Utilizzati: %tw_partition_used%MB</string> + <string name="part_free">Liberi: %tw_partition_free%MB</string> + <string name="part_backup_size">Dimensione backup: %tw_partition_backup_size%MB</string> + <string name="resize_btn">Ridimensiona filesystem</string> + <string name="resize_btn_s">Ridimensiona</string> + <string name="resize_confirm">Ridimensionare %tw_partition_name%?</string> + <string name="resizing">Ridimensionamento in corso...</string> + <string name="resize_complete">Ridimensionamento completato</string> + <string name="swipe_resize">Scorri per ridimensionare</string> + <string name="swipe_resize_s"> Ridimensiona</string> + <string name="repair_btn">Ripara filesystem</string> + <string name="repair_btn_s">Ripara</string> + <string name="repair_confirm">Riparare %tw_partition_name%?</string> + <string name="repairing">Riparazione in corso...</string> + <string name="repair_complete">Riparazione completata</string> + <string name="swipe_repair">Scorri per riparare</string> + <string name="swipe_repair_s"> Ripara</string> + <string name="change_fs_btn">Cambia filesystem</string> + <string name="change_fs_btn_s">Cambia</string> + <string name="change_fs_for_hdr">Cambia il filesystem di: %tw_partition_name%</string> + <string name="change_fs_for_hdr_s">Partizione: %tw_partition_name% > Scegli filesystem</string> + <string name="change_fs_warn1">Alcune ROM o kernel non supportano determinati</string> + <string name="change_fs_warn2">filesystem. Procedi con cautela!</string> + <string name="change_fs_confirm">Modificare %tw_partition_name%?</string> + <string name="formatting">Formattazione in corso...</string> + <string name="format_complete">Formattazione completata</string> + <string name="swipe_change_fs">Scorri per modificare</string> + <string name="swipe_change_s"> Modifica</string> + <string name="back_btn">Indietro</string> + <string name="wipe_enc_btn">Elimina crittografia</string> + <string name="swipe_factory_reset">Scorri per eseguire reset di fabbrica</string> + <string name="repair_change_btn">Ripara o Modifica filesystem</string> + <string name="storage_hdr">Archivio: %tw_storage_display_name% (%tw_storage_free_size% MB)</string> + <string name="backup_hdr">Backup</string> + <string name="backup_confirm_hdr">Conferma Backup</string> + <string name="encryption_tab">CRITTOGRAFIA</string> + <string name="encryption">Crittografia:</string> + <string name="name">Nome:</string> + <string name="sel_part_backup">Seleziona le partizioni di cui eseguire un Backup:</string> + <string name="storage">Archivio:</string> + <string name="enc_disabled">disabilitata - imposta una password per abilitarla</string> + <string name="enc_enabled">abilitata</string> + <string name="enable_backup_comp_chk">Abilita compressione</string> + <string name="skip_md5_backup_chk">Salta la generazione di MD5 durante il backup</string> + <string name="disable_backup_space_chk">Disabilita controllo dello spazio libero</string> + <string name="refresh_sizes_btn">Aggiorna dimensioni</string> + <string name="swipe_backup">Scorri per eseguire il backup</string> + <string name="append_date_btn">Includi la data</string> + <string name="backup_name_exists">Esiste già un backup con lo stesso nome!</string> + <string name="encrypt_backup">Crittografare il backup?</string> + <string name="enter_pass">Inserisci una password:</string> + <string name="enter_pass2">Inserisci nuovamente la password:</string> + <string name="pass_not_match">Le password non corrispondono!</string> + <string name="partitions">Partizioni:</string> + <string name="disabled">Disabilitato</string> + <string name="enabled">Abilitato</string> + <string name="backup_name_hdr">Imposta nome backup</string> + <string name="progress">Avanzamento:</string> + <string name="backup_complete">Backup completato</string> + <string name="restore_hdr">Ripristina backup</string> + <string name="sel_backup_hdr">Scegli backup</string> + <string name="restore_sel_store_hdr">Seleziona un backup da %tw_storage_display_name% (%tw_storage_free_size% MB)</string> + <string name="restore_sel_pack_fs">Scegli i contenuti da ripristinare:</string> + <string name="restore_enc_backup_hdr">Backup crittografato</string> + <string name="restore_dec_fail">Password errata! Riprova.</string> + <string name="del_backup_btn">Elimina backup</string> + <string name="del_backup_confirm">Eliminare il backup?</string> + <string name="del_backup_confirm2">L'operazione è irreversibile!</string> + <string name="deleting_backup">Eliminazione backup in corso...</string> + <string name="backup_deleted">Eliminazione backup completata</string> + <string name="swipe_delete">Scorri per eliminare</string> + <string name="swipe_delete_s"> Elimina</string> + <string name="restore_try_decrypt">Backup crittografato - tentativo di decriptazione</string> + <string name="restore_try_decrypt_s">Tentativo di decriptazione</string> + <string name="restore_backup_date">Backup creato il %tw_restore_file_date%</string> + <string name="restore_sel_part">Seleziona le partizioni da ripristinare:</string> + <string name="restore_enable_md5_chk">Abilita verifica MD5</string> + <string name="restore_complete">Ripristino completato</string> + <string name="swipe_restore">Scorri per ripristinare</string> + <string name="swipe_restore_s"> Ripristina</string> + <string name="rename_backup_hdr">Rinomina backup</string> + <string name="rename_backup_confirm">Rinominare il backup?</string> + <string name="rename_backup_confirm2">L'operazione è irreversibile!</string> + <string name="renaming_backup">Rinominazione del backup in corso...</string> + <string name="rename_backup_complete">Rinominazione del backup completata</string> + <string name="swipe_to_rename">Scorri per rinominare</string> + <string name="swipe_rename"> Rinomina</string> + <string name="confirm_hdr">Conferma</string> + <string name="mount_hdr">Monta</string> + <string name="mount_sel_part">Seleziona le partizioni da montare:</string> + <string name="mount_sys_ro_chk">Monta la partizione System in sola lettura</string> + <string name="mount_sys_ro_s_chk">Monta System in sola lettura</string> + <string name="decrypt_data_btn">Decripta Data</string> + <string name="disable_mtp_btn">Disabilita MTP</string> + <string name="enable_mtp_btn">Abilita MTP</string> + <string name="mount_usb_storage_btn">Monta archivio USB</string> + <string name="usb_storage_hdr">Archivio USB</string> + <string name="usb_stor_mnt1">Archivio USB montato</string> + <string name="usb_stor_mnt2">Accertati di aver eseguito la rimozione sicura</string> + <string name="usb_stor_mnt3">dal tuo computer prima di smontare l'archivio!</string> + <string name="unmount_btn">Smonta</string> + <string name="rb_system_btn">Sistema</string> + <string name="rb_poweroff_btn">Spegni</string> + <string name="rb_recovery_btn">Recovery</string> + <string name="rb_bootloader_btn">Bootloader</string> + <string name="rb_download_btn">Download</string> + <string name="turning_off">Spegnimento in corso...</string> + <string name="swipe_power_off">Scorri per spegnere</string> + <string name="swipe_power_off_s">Spegni</string> + <string name="sys_ro_hdr">Partizione System non modificata</string> + <string name="sys_ro_keep">Mantenere System in sola lettura?</string> + <string name="sys_rop1">TWRP può preservare la partizione System dalle modifiche</string> + <string name="sys_rop2">per facilitarti l'installazione di aggiornamenti ufficiali.</string> + <string name="sys_rop3">TWRP non potrà prevenire la sostituzione della Recovery da parte</string> + <string name="sys_rop4">della ROM, e non ti chiederà se desideri ottenere accesso root.</string> + <string name="sys_rop5">Installare Zip o eseguire operazioni mediante adb</string> + <string name="sys_rop6">potrà ugualmente operare modifiche su System.</string> + <string name="sys_rol1">TWRP può preservare la partizione System dalle modifiche per facilitarti l'installazione di aggiornamenti ufficiali.</string> + <string name="sys_rol2">TWRP non potrà prevenire la sostituzione della Recovery da parte della ROM, e non ti chiederà se desideri ottenere accesso root.</string> + <string name="sys_rol3">Installare Zip o eseguire operazioni mediante adb potrà ugualmente operare modifiche su System.</string> + <string name="sys_ro_never_show_chk">Non mostrare più questa schermata all'avvio</string> + <string name="sys_ro_keep_ro_btn">Mantieni sola lettura</string> + <string name="swipe_allow_mod">Scorri per permettere le modifiche</string> + <string name="swipe_allow_mod_s">Permetti modifiche</string> + <string name="settings_hdr">Impostazioni</string> + <string name="settings_gen_hdr">Generale</string> + <string name="settings_gen_s_hdr">Generale</string> + <string name="settings_gen_btn">Generale</string> + <string name="use_rmrf_chk">Usa rm -rf invece di formattare</string> + <string name="use24clock_chk">Usa orologio a 24 ore</string> + <string name="rev_navbar_chk">Rovescia la navbar</string> + <string name="simact_chk">Simula le azioni per il testing dei temi</string> + <string name="simfail_chk">Simula fallimenti per le azioni</string> + <string name="ctr_navbar_rdo">Centra pulsanti della navbar</string> + <string name="lft_navbar_rdo">Allinea pulsanti della navbar a SX</string> + <string name="rht_navbar_rdo">Allinea pulsanti della navbar a DX</string> + <string name="restore_defaults_btn">Ripristina predefinite</string> + <string name="settings_tz_btn">Fuso orario</string> + <string name="settings_screen_btn">Schermo</string> + <string name="settings_screen_bright_btn">Luminosità</string> + <string name="settings_vibration_btn">Vibrazione</string> + <string name="settings_language_btn">Lingua</string> + <string name="time_zone_hdr">Fuso orario</string> + <string name="sel_tz_list">Scegli fuso orario:</string> + <!-- Translator note: if it does not make sense to translate the locations or if it makes more sense, + feel free to change the location listed or drop the location entirely and just call it UTC -6 --> + <string name="utcm11">(UTC -11) Samoa, Midway Island</string> + <string name="utcm10">(UTC -10) Hawaii</string> + <string name="utcm9">(UTC -9) Alaska</string> + <string name="utcm8">(UTC -8) Pacific Time</string> + <string name="utcm7">(UTC -7) Mountain Time</string> + <string name="utcm6">(UTC -6) Central Time</string> + <string name="utcm5">(UTC -5) Eastern Time</string> + <string name="utcm4">(UTC -4) Atlantic Time</string> + <string name="utcm3">(UTC -3) Brazil, Buenos Aires</string> + <string name="utcm2">(UTC -2) Mid-Atlantic</string> + <string name="utcm1">(UTC -1) Azores, Cape Verde</string> + <string name="utc0">(UTC 0) London, Dublin, Lisbon</string> + <string name="utcp1">(UTC +1) Berlin, Brussels, Paris</string> + <string name="utcp2">(UTC +2) Athens, Istanbul, South Africa</string> + <string name="utcp3">(UTC +3) Moscow, Baghdad</string> + <string name="utcp4">(UTC +4) Abu Dhabi, Tbilisi, Muscat</string> + <string name="utcp5">(UTC +5) Yekaterinburg, Islamabad</string> + <string name="utcp6">(UTC +6) Almaty, Dhaka, Colombo</string> + <string name="utcp7">(UTC +7) Bangkok, Hanoi, Jakarta</string> + <string name="utcp8">(UTC +8) Beijing, Singapore, Hong Kong</string> + <string name="utcp9">(UTC +9) Tokyo, Seoul, Yakutsk</string> + <string name="utcp10">(UTC +10) Eastern Australia, Guam</string> + <string name="utcp11">(UTC +11) Vladivostok, Solomon Islands</string> + <string name="utcp12">(UTC +12) Auckland, Wellington, Fiji</string> + <string name="sel_tz_offset">Scegli offset (solitamente 0): %tw_time_zone_guioffset%</string> + <string name="tz_offset_none">Nessuno</string> + <string name="tz_offset_0">0</string> + <string name="tz_offset_15">15</string> + <string name="tz_offset_30">30</string> + <string name="tz_offset_45">45</string> + <string name="use_dst_chk">Usa ora legale</string> + <string name="curr_tz">Fuso orario attuale: %tw_time_zone%</string> + <string name="curr_tz_s">Fuso orario attuale:</string> + <string name="set_tz_btn">Imposta fuso orario</string> + <string name="settings_screen_hdr">Schermo</string> + <string name="settings_screen_timeout_hdr">Timeout schermo</string> + <string name="enable_timeout_chk">Abilita timeout schermo</string> + <string name="screen_to_slider">Timeout in secondi:</string> + <string name="screen_to_slider_s">Timeout in secondi (0=disabilitato): %tw_screen_timeout_secs%</string> + <string name="screen_to_na">Impostazione del timeout non disponibile</string> + <string name="screen_bright_slider">Luminosità: %tw_brightness_pct%%</string> + <string name="screen_bright_na">Impostazione luminosità non disponibile</string> + <string name="vibration_hdr">Vibrazione</string> + <string name="button_vibration_hdr">Vibrazione pulsanti</string> + <string name="kb_vibration_hdr">Vibrazione tastiera</string> + <string name="act_vibration_hdr">Vibrazione azioni</string> + <string name="button_vibration">Vibrazione pulsanti:</string> + <string name="kb_vibration">Vibrazione tastiera:</string> + <string name="act_vibration">Vibrazione azioni:</string> + <string name="select_language">Scegli lingua:</string> + <string name="sel_lang_btn">Scegli lingua</string> + <string name="set_language_btn">Imposta lingua</string> + <string name="advanced_hdr">Avanzate</string> + <string name="copy_log_confirm">Copiare il log su scheda SD?</string> + <string name="copying_log">Copia del log in corso...</string> + <string name="copy_log_complete">Copia del log completata</string> + <string name="fix_context_btn">Ripara contesti</string> + <string name="part_sd_btn">Partiziona SD</string> + <string name="part_sd_s_btn">Scheda SD</string> + <string name="file_manager_btn">File manager</string> + <string name="language_hdr">Lingua</string> + <string name="terminal_btn">Terminale</string> + <string name="reload_theme_btn">Ricarica tema</string> + <string name="dumlock_btn">HTC Dumlock</string> + <string name="inject_twrp_btn">TWRP Inject</string> + <string name="inject_twrp_confirm">Eseguire nuovamente TWRP Inject?</string> + <string name="injecting_twrp">Esecuzione di TWRP Inject in corso...</string> + <string name="inject_twrp_complete">TWRP Inject completato</string> + <string name="swipe_to_confirm">Scorri per confermare</string> + <string name="part_sd_hdr">Partiziona scheda SD</string> + <string name="invalid_partsd_sel">Devi selezionare un dispositivo rimovibile</string> + <string name="part_sd_lose">Tutti i file sulla scheda SD andranno perduti!</string> + <string name="part_sd_undo">L'operazione è irreversibile!</string> + <string name="part_sd_ext_sz">Dimensione EXT:</string> + <string name="part_sd_swap_sz">Dimensione Swap:</string> + <string name="part_sd_m">-</string> + <string name="part_sd_p">+</string> + <string name="file_system">Filesystem:</string> + <string name="swipe_part_sd">Scorri per partizionare</string> + <string name="swipe_part_sd_s">Partiziona</string> + <string name="partitioning_sd">Partizionamento scheda SD in corso...</string> + <string name="partitioning_sd2">Ci vorranno un paio di minuti.</string> + <string name="part_sd_complete">Partizionamento completato</string> + <string name="dumlock_hdr">HTC Dumlock</string> + <string name="dumlock_restore_btn">Ripristina Boot originale</string> + <string name="dumlock_restore_confirm">Ripristinare l'immagine di Boot originale?</string> + <string name="dumlock_restoring">Ripristino del Boot originale in corso...</string> + <string name="dumlock_restore_complete">Ripristino del Boot originale completato</string> + <string name="dumlock_reflash_btn">Reinstalla Recovery</string> + <string name="dumlock_reflash_confirm">Reinstallare la Recovery in Boot?</string> + <string name="dumlock_reflashing">Installazione Recovery in Boot in corso...</string> + <string name="dumlock_reflash_complete">Installazione della Recovery in Boot completata</string> + <string name="dumlock_install_btn">Installa HTC Dumlock</string> + <string name="dumlock_install_confirm">Installare i file di HTC Dumlock nella ROM?</string> + <string name="dumlock_installing">Installazione di HTC Dumlock in corso...</string> + <string name="dumlock_install_complete">Installazione di HTC Dumlock Install completata</string> + <string name="swipe_to_unlock">Scorri per sbloccare</string> + <string name="swipe_unlock"> Sblocca</string> + <string name="fm_hdr">File manager</string> + <string name="fm_sel_file">Seleziona un file o una cartella</string> + <string name="fm_type_folder">Cartella</string> + <string name="fm_type_file">File</string> + <string name="fm_choose_act">Scegli azione</string> + <string name="fm_selected">%tw_fm_type% selezionato(a):</string> + <string name="fm_copy_btn">Copia</string> + <string name="fm_copy_file_btn">Copia</string> + <string name="fm_copy_folder_btn">Copia</string> + <string name="fm_copying">Copia di</string> + <string name="fm_move_btn">Sposta</string> + <string name="fm_moving">Spostamento di</string> + <string name="fm_chmod755_btn">chmod 755</string> + <string name="fm_chmod755ing">chmod 755 di</string> + <string name="fm_chmod_btn">chmod</string> + <string name="fm_delete_btn">Elimina</string> + <string name="fm_deleting">Eliminazione di</string> + <string name="fm_rename_btn">Rinomina</string> + <string name="fm_rename_file_btn">Rinomina</string> + <string name="fm_rename_folder_btn">Rinomina</string> + <string name="fm_renaming">Rinominazione di</string> + <string name="fm_sel_dest">Scegli cartella di destinazione</string> + <string name="fm_sel_curr_folder">Scegli cartella attuale</string> + <string name="fm_rename_hdr">Rinomina</string> + <string name="fm_set_perms_hdr">Imposta permessi</string> + <string name="fm_perms">Permessi:</string> + <string name="fm_complete">Operazione completata</string> + <string name="decrypt_data_hdr">Decripta Data</string> + <string name="decrypt_data_enter_pass">Inserisci la password.</string> + <string name="decrypt_data_failed">Password errata! Riprova.</string> + <string name="decrypt_data_failed_pattern">Sequenza errata! Riprova.</string> + <string name="decrypt_data_enter_pattern">Inserisci sequenza di sblocco.</string> + <string name="decrypt_data_trying">Tentativo di decriptazione in corso...</string> + <string name="term_hdr">Terminale</string> + <string name="term_s_hdr">Terminale</string> + <string name="term_kill_btn">TERMINA</string> + <string name="term_sel_folder_hdr">Scegli la cartella d'inizio</string> + <string name="adb_sideload_hdr">ADB Sideload</string> + <string name="sideload_wipe_dalvik_chk">Pulisci la cache Dalvik</string> + <string name="sideload_wipe_cache_chk">Pulisci Cache</string> + <string name="swipe_to_sideload">Scorri per avviare Sideload</string> + <string name="swipe_sideload"> Avvia</string> + <string name="sideload_confirm">ADB Sideload</string> + <string name="sideload_usage">Utilizzo: adb sideload nomefile.zip</string> + <string name="sideload_complete">ADB Sideload completato</string> + <string name="fix_contexts_hdr">Ripristina contesti</string> + <string name="fix_contexts_note1">Nota: il ripristino dei contesti è raramente necessario.</string> + <string name="fix_contexts_note2">Il ripristino dei contesti SELinux può impedire</string> + <string name="fix_contexts_note3">il corretto avvio del tuo dispositivo.</string> + <string name="swipe_to_fix_contexts">Scorri per ripristinare i contesti</string> + <string name="swipe_fix_contexts"> Ripristina contesti</string> + <string name="fixing_contexts">Ripristino dei contesti in corso...</string> + <string name="fix_contexts_complete">Ripristino dei contesti completato</string> + <string name="reboot_hdr">Riavvio</string> + <string name="su_hdr">Verifica SuperSU</string> + <string name="su_note1">Il tuo dispositivo non sembra disporre di accesso root.</string> + <string name="su_note2">Installare SuperSU ora?</string> + <string name="su_note3">Ciò ti garantirà privilegi di root.</string> + <string name="su_cancel">Non installare</string> + <string name="swipe_su_to_install">Scorri per installare</string> + <string name="swipe_su_install"> Installa</string> + <string name="su_installing">Installazione di SuperSU in corso...</string> + <string name="sel_storage_list">Scegli archivio</string> + <string name="ok_btn">OK</string> + + <!-- Various console messages - these consist of user displayed messages, oftentimes errors --> + <string name="no_kernel_selinux">Il kernel non supporta la lettura dei contesti SELinux.</string> + <string name="full_selinux">Supporto per SELinux completo non presente.</string> + <string name="no_selinux">Nessun supporto per SELinux (libselinux assente).</string> + <string name="mtp_enabled">MTP abilitato</string> + <string name="mtp_crash">MTP si è arrestato. Non sarà più inizializzato all'avvio.</string> + <string name="decrypt_success">Decriptazione con password predefinita avvenuta con successo.</string> + <string name="unable_to_decrypt">Impossibile decriptare con password predefinita. Potresti dover formattare Data.</string> + <string name="generating_md51">Generazione MD5 in corso...</string> + <!-- Message displayed during a backup if we are generating an MD5, ideally, leave the leading " * " to help align and separate this text from other console text --> + <string name="generating_md52"> * Generazione MD5 in corso...</string> + <string name="md5_created"> * MD5 creato.</string> + <string name="md5_error"> * Errore nell'MD5!</string> + <string name="md5_compute_error"> * Errore nel calcolo dell'MD5.</string> + <string name="current_date">(Data attuale)</string> + <string name="auto_generate">(Genera automaticamente)</string> + <string name="unable_to_locate_partition">Impossibile localizzare la partizione '{1}' per il calcolo delle dimensioni del backup.</string> + <string name="no_partition_selected">Nessuna partizione selezionata.</string> + <string name="total_partitions_backup"> * Numero di partizioni di cui eseguire il backup: {1}</string> + <string name="total_backup_size"> * Dimensione complessiva: {1}MB</string> + <string name="available_space"> * Spazio disponibile: {1}MB</string> + <string name="unable_locate_storage">Impossibile localizzare l'archivio.</string> + <string name="no_space">Lo spazio libero dell'archivio scelto è insufficiente.</string> + <string name="backup_started">[INIZIO DEL BACKUP]</string> + <string name="backup_folder"> * Cartella dei backup: {1}</string> + <string name="fail_backup_folder">Creazione della cartella dei backup fallita.</string> + <string name="avg_backup_fs">Velocità media di backup del filesystem: {1} MB/sec</string> + <string name="avg_backup_img">Velocità media di backup del drive: {1} MB/sec</string> + <string name="total_backed_size">[DIMENSIONE TOTALE SALVATA: {1} MB]</string> + <string name="backup_completed">[BACKUP COMPLETATO IN {1} SECONDI]</string> + <string name="restore_started">[INIZIO DEL RIPRISTINO]</string> + <string name="restore_folder">Cartella da cui ripristinare: '{1}'</string> + <!-- {1} is the partition display name and {2} is the number of seconds --> + <string name="restore_part_done">[Partizione {1} ripristinata ({2} secondi)]</string> + <string name="verifying_md5">Verifica MD5 in corso...</string> + <string name="skip_md5">Saltando la verifica del MD5 in base alle impostazioni stabilite.</string> + <string name="calc_restore">Calcolo dei dettagli del ripristino in corso...</string> + <string name="restore_read_only">Impossibile ripristinare {1} -- partizione montata in sola lettura.</string> + <string name="restore_unable_locate">Impossibile localizzare la partizione '{1}' per il ripristino.</string> + <string name="no_part_restore">Nessuna partizione selezionata per il ripristino.</string> + <string name="restore_part_count">Ripristino di {1} partizioni in corso...</string> + <string name="total_restore_size">Dimensione complessiva da ripristinare: {1}MB</string> + <string name="updating_system_details">Aggiornamento dei dettagli di System...</string> + <string name="restore_completed">[RIPRISTINO COMPLETATO IN {1} SECONDI]</string> + <!-- {1} is the path we could not open, {2} is strerror output --> + <string name="error_opening_strerr">Errore durante l'apertura di: '{1}' ({2})</string> + <string name="unable_locate_part_backup_name">Impossibile localizzare la partizione dal nome di backup: '{1}'</string> + <string name="unable_find_part_path">Impossibile localizzare la partizione associata al percorso '{1}'</string> + <string name="update_part_details">Aggiornamento dei dettagli della partizione...</string> + <string name="update_part_details_done">...fatto</string> + <string name="wiping_dalvik">Pulizia delle cartelle della cache Dalvik...</string> + <string name="cleaned">Cartella pulita: {1}...</string> + <string name="dalvik_done">-- pulizia delle cartelle della cache Dalvik completata!</string> + <string name="no_andsec">Nessuna partizione Android protetta trovata.</string> + <string name="unable_to_locate">Impossibile localizzare {1}.</string> + <string name="wiping_datamedia">Pulizia dell'archivio interno -- /data/media...</string> + <string name="unable_to_mount">Impossibile montare {1}</string> + <string name="unable_to_mount_internal">Impossibile montare l'archivio interno</string> + <string name="unable_to_mount_storage">Impossibile montare l'archivio</string> + <string name="fail_decrypt">Decriptazione dei dati fallita.</string> + <string name="no_crypto_support">In questa build non è stato integrato alcun supporto per la crittografia.</string> + <string name="decrypt_success_dev">Dati decriptati con successo. Nuovo dispositivo di memoria: '{1}'</string> + <string name="done">Fatto.</string> + <string name="start_partition_sd">Partizionamento scheda SD in corso...</string> + <string name="partition_sd_locate">Impossibile localizzare il dispositivo da partizionare.</string> + <string name="ext_swap_size">La dimensione complessiva di EXT e Swap eccede la capacità della scheda SD.</string> + <string name="remove_part_table">Rimozione della tabella delle partizioni in corso...</string> + <string name="unable_rm_part">Impossibile rimuovere la tabella delle partizioni.</string> + <string name="create_part">Creazione della partizione {1} in corso...</string> + <string name="unable_to_create_part">Impossibile creare la partizione {1}.</string> + <string name="format_sdext_as">Formattazione di sd-ext come {1}...</string> + <string name="part_complete">Partizionamento completato.</string> + <string name="unable_to_open">Impossibile aprire '{1}'.</string> + <string name="mtp_already_enabled">MTP è stato già abilitato</string> + <string name="mtp_fail">Impossibile abilitare MTP</string> + <string name="no_mtp">Supporto per MTP non incluso</string> + <string name="image_flash_start">[INIZIO INSTALLAZIONE DELL'IMMAGINE]</string> + <string name="img_to_flash">Immagine da installare: '{1}'</string> + <string name="flash_unable_locate">Impossibile localizzare la partizione '{1}' per l'installazione.</string> + <string name="no_part_flash">Nessuna partizione scelta per l'installazione.</string> + <string name="too_many_flash">Troppe partizioni scelte per l'installazione.</string> + <string name="invalid_flash">La partizione specificata non è valida.</string> + <string name="flash_done">[INSTALLAZIONE COMPLETATA]</string> + <string name="wiping">Pulizia di {1} in corso...</string> + <string name="repair_not_exist">{1} non esiste! Impossibile riparare!</string> + <string name="repairing_using">Riparazione di {1} utilizzando {2}...</string> + <string name="unable_repair">Impossibile riparare {1}.</string> + <string name="mount_data_footer">Impossibile montare la partizione Data. Footer criptato non trovato.</string> + <!-- {1} is the folder name that we could not create, {2} is strerror output --> + <string name="create_folder_strerr">Impossibile creare la cartella '{1}' ({2}).</string> + <!-- {1} is the folder name that we could not mount, {2} is strerror output --> + <string name="fail_mount">Impossibile montare '{1}' ({2}).</string> + <!-- {1} is the folder name that we could not unmount, {2} is strerror output --> + <string name="fail_unmount">Impossibile smontare '{1}' ({2}).</string> + <string name="cannot_resize">Impossibile ridimensionare {1}.</string> + <string name="repair_resize">Riparazione di {1} prima del ridimensionamento.</string> + <string name="unable_resize">Impossibile ridimensionare {1}.</string> + <string name="no_md5_found">Nessun MD5 trovato per '{1}'. Deseleziona "Abilita verifica MD5" per procedere con il ripristino.</string> + <string name="md5_fail_match">Il valore MD5 non corrisponde per '{1}'.</string> + <string name="fail_decrypt_tar">Decriptazione fallita per il file Tar '{1}'</string> + <string name="format_data_msg">Potresti dover riavviare la Recovery per accedere nuovamente a Data.</string> + <string name="format_data_err">Impossibile formattare al fine di rimuovere la crittografia.</string> + <string name="formatting_using">Formattazione di {1} tramite {2}...</string> + <string name="unable_to_wipe">Impossibile pulire {1}.</string> + <string name="cannot_wipe">La partizione {1} non può essere pulita.</string> + <string name="remove_all">Eliminazione di tutti i file in '{1}'...</string> + <string name="wiping_data">Pulizia di Data tralasciando /data/media...</string> + <string name="backing_up">Backup di {1} in corso...</string> + <string name="backing">Backup in corso...</string> + <string name="backup_size">La dimensione del backup di '{1}' è 0 byte.</string> + <string name="datamedia_fs_restore">ATTENZIONE: Il backup di Data è stato fatto mentre il filesystem era {1}! Il dispositivo potrebbe non avviarsi finché non reimposti il filesystem {1}.</string> + <string name="restoring">Ripristino di {1} in corso...</string> + <string name="restoring_hdr">Ripristino in corso...</string> + <string name="recreate_folder_err">Impossibile ripristinare la cartella {1}.</string> + <string name="img_size_err">La dimensione dell'immagine eccede la capacità del dispositivo</string> + <string name="flashing">Installazione di {1}...</string> + <string name="backup_folder_set">Cartella dei backup impostata in '{1}'</string> + <string name="locate_backup_err">Impossibile localizzare il backup '{1}'</string> + <string name="set_restore_opt">Impostazione opzioni di ripristino: '{1}':</string> + <string name="md5_check_skip">Tralascia controllo MD5: attivo</string> + <string name="ors_encrypt_restore_err">Impossibile utilizzare OpenRecoveryScript per ripristinare un backup criptato.</string> + <string name="mounting">Montaggio</string> + <string name="unmounting">Smontaggio</string> + <string name="mounted">'{1}' montata</string> + <string name="unmounted">'{1}' smontata</string> + <string name="setting">Impostazione di '{1}' a '{2}'</string> + <string name="setting_empty">Impostazione di '{1}' a vuoto</string> + <string name="making_dir1">Creazione cartella</string> + <string name="making_dir2">Creazione cartella: '{1}'</string> + <string name="running_command">Esecuzione comando</string> + <string name="sideload">ADB Sideload</string> + <string name="start_sideload">Avvio di ADB Sideload...</string> + <string name="need_new_adb">Necessiti di adb 1.0.32 o più recente, per inviare dati tramite Sideload.</string> + <string name="no_pwd">Nessuna password fornita.</string> + <string name="done_ors">Elaborazione script terminata</string> + <string name="injecttwrp">Installazione di TWRP in Boot tramite TWRP Inject...</string> + <string name="zip_err">Errore durante l'installazione dello Zip '{1}'</string> + <string name="installing_zip">Installazione dello Zip '{1}' in corso...</string> + <string name="select_backup_opt">Impostazione opzioni di backup:</string> + <string name="compression_on">La compressione è attiva</string> + <string name="md5_off">La generazione di MD5 è disattiva</string> + <string name="backup_fail">Backup non riuscito</string> + <string name="backup_clean">Backup non riuscito. Pulizia della cartella dei backup in corso...</string> + <string name="running_recovery_commands">Esecuzione dei comandi di ripristino...</string> + <string name="recovery_commands_complete">Esecuzione dei comandi completata</string> + <string name="running_ors">Esecuzione di OpenRecoveryScript...</string> + <string name="ors_complete">Esecuzione di OpenRecoveryScript completata</string> + <string name="no_updater_binary">Impossibile trovare '{1}' nel file Zip.</string> + <string name="check_for_md5">Controllo sull'MD5 in corso...</string> + <string name="fail_sysmap">Impossibile mappare '{1}'</string> + <string name="verify_zip_sig">Verifica della firma dello Zip in corso...</string> + <string name="verify_zip_fail">Verifica della firma non riuscita!</string> + <string name="verify_zip_done">Verifica della firma completata con successo.</string> + <string name="zip_corrupt">Il file Zip è corrotto!</string> + <string name="no_md5">Nessun MD5 trovato: la verifica non sarà eseguita</string> + <string name="md5_fail">L'MD5 non corrisponde</string> + <string name="md5_match">L'MD5 corrisponde</string> + <string name="pid_signal">Il processo {1} è terminato con segnale: {2}</string> + <string name="pid_error">Il processo {1} è terminato con ERRORE: {2}</string> + <string name="install_dumlock">Installazione di HTC Dumlock in System...</string> + <string name="dumlock_restore">Ripristino del Boot originale...</string> + <string name="dumlock_reflash">Reinstallazione della Recovery in Boot...</string> + <string name="run_script">Esecuzione dello script {1}...</string> + <string name="rename_stock">Il file della Recovery stock, in System, è stato rinominato per prevenire la sostituzione di TWRP da paete della ROM.</string> + <string name="split_backup">Divisione del backup in archivi multipli...</string> + <string name="backup_error">Errore nella creazione del backup.</string> + <string name="restore_error">Errore durante il ripristino.</string> + <string name="split_thread">Divisione del thread {1} nell'archivio {2}</string> + <!-- These 2 items are saved in the data manager instead of resource manager, so %llu, etc is correct instead of {1} --> + <string name="file_progress">File %llu di %llu, %i%%</string> + <string name="size_progress">%lluMB di %lluMB, %i%%</string> + <string name="decrypt_cmd">Tentativo di decriptare Data da riga di comando.</string> + <string name="base_pkg_err">Errore nel caricamento dei pacchetti base.</string> + <string name="simulating">Simulazione azioni in corso...</string> + <string name="backup_cancel">Backup annullato</string> + <string name="config_twrp">Configurazione di TWRP in corso...</string> + <string name="config_twrp_err">Impossibile configurare TWRP con questo kernel.</string> + <string name="copy_log">Log della Recovery copiato in {1}.</string> + <string name="max_queue">È stata raggiunta la dimensione massima della coda di Zip!</string> + <string name="min_queue">È stata raggiunta la dimensione minima della coda di Zip!</string> + <string name="screenshot_saved">Lo screenshot è stato salvato in {1}</string> + <string name="screenshot_err">Cattura dello screenshot non riuscita!</string> + <string name="zip_wipe_cache">Uno o più Zip ha richiesto la pulizia della Cache -- La Cache sarà pulita immediatamente.</string> + <string name="and_sec_wipe_err">Impossibile pulire android_secure</string> + <string name="dalvik_wipe_err">Pulizia della cache Dalvik fallita</string> + <string name="auto_gen">(Genera automaticamente)</string> + <string name="curr_date">(Data attuale)</string> + <string name="backup_name_len">Il nome del backup eccede la lunghezza massima.</string> + <string name="backup_name_invalid">Il nome del backup '{1}' contiene uno o più caratteri non validi: '{1}'</string> + <string name="no_real_sdcard">Questo dispositivo non possiede una scheda SD reale! Interruzione immediata!</string> + <string name="cancel_sideload">Annullamento di ADB sideload...</string> + <string name="change_fs_err">Errore nella modifica del filesystem.</string> + <string name="theme_ver_err">La versione del tema personalizzato non corrisponde alla versione di TWRP. Sarà utilizzato il tema predefinito.</string> + <string name="up_a_level">(Livello superiore)</string> + </resources> +</language> diff --git a/gui/theme/common/languages/ru.xml b/gui/theme/common/languages/ru.xml index 57a99656d..ee3b0691f 100644 --- a/gui/theme/common/languages/ru.xml +++ b/gui/theme/common/languages/ru.xml @@ -2,7 +2,7 @@ <language> <display>Русский</display> - <!-- Translated by Jemmini, 2016 --> + <!-- Translated by Jemmini; modified by agur4ik, SevenMaxs, S-trace 2016 --> <resources> <!-- Font overrides - only change these if your language requires special characters --> @@ -21,11 +21,11 @@ <string name="cache">Cache</string> <string name="data">Data</string> <string name="sdcard">SDcard</string> - <string name="internal">Внутр.память</string> + <string name="internal">Память устройства</string> <string name="microsd">Micro SDCard</string> <string name="usbotg">USB OTG</string> <string name="android_secure">Android Secure</string> - <string name="dalvik">Dalvik / ART Cache</string> + <string name="dalvik">Dalvik/ART Cache</string> <!-- This is a rarely used partition on a Micro SD card for a very old app2sd system --> <string name="sdext">SD-EXT</string> <string name="adopted_data">Adopted Data</string> @@ -50,7 +50,7 @@ <string name="tab_vibration">ВИБРАЦИЯ</string> <string name="tab_language">ЯЗЫК</string> - <string name="install_btn">Установить</string> + <string name="install_btn">Установка</string> <string name="wipe_btn">Очистка</string> <string name="backup_btn">Резервное коп-ние</string> <string name="restore_btn">Восстановление</string> @@ -63,14 +63,14 @@ <string name="select_type_hdr">Выбор типа</string> <string name="install_zip_hdr">Установка Zip</string> <string name="install_zip_btn">Установка Zip</string> - <string name="install_image_hdr">Установка образа</string> - <string name="install_image_btn">Установка образа</string> + <string name="install_image_hdr">Установка Img-образа</string> + <string name="install_image_btn">Установка Img</string> <string name="install_select_file_hdr">Выбор файла</string> <string name="file_selector_folders_hdr">Папки</string> - <string name="select_file_from_storage">Выбор файла из %tw_storage_display_name% (%tw_storage_free_size% MB)</string> + <string name="select_file_from_storage">Текущий накопитель: %tw_storage_display_name% (%tw_storage_free_size% МБ)</string> <string name="adb_sideload_btn">ADB sideload</string> <string name="install_hdr">Установка</string> - <string name="select_storage_hdr">Выбор накопителя</string> + <string name="select_storage_hdr">Выберите накопитель</string> <string name="select_storage_btn">Выбор накопителя</string> <string name="queue_hdr">Очередь</string> <string name="zip_queue_count">Файлов в очереди: %tw_zip_queue_count% из 10 возможных</string> @@ -81,10 +81,10 @@ <string name="zip_back_clear">Нажмите назад для очистки очереди.</string> <string name="folder">Папка:</string> <string name="file">Файл:</string> - <string name="zip_sig_chk">Проверка Zip сигнатуры</string> + <string name="zip_sig_chk">Проверка подписи Zip</string> <string name="inject_twrp_chk">Интегрировать TWRP после установки</string> <string name="options_hdr">Опции</string> - <string name="confirm_flash_hdr">Confirm Flash</string> + <string name="confirm_flash_hdr">Подтвердите установку</string> <string name="zip_queue">Очередь:</string> <string name="options">Опции:</string> <string name="swipe_confirm"> Подтвердить</string> @@ -97,7 +97,7 @@ <string name="install_failed">Установка не удалась</string> <string name="install_successful">Установка выполнена успешно</string> <string name="wipe_cache_dalvik_btn">Очистка cache/dalvik</string> - <string name="reboot_system_btn">Перезагрузка в сист.</string> + <string name="reboot_system_btn">Перезагрузка в ОС</string> <string name="install_sel_target">Выбор раздела</string> <string name="flash_image_select">Выберите раздел для прошивки образа:</string> <string name="target_partition">Целевой раздел:</string> @@ -163,17 +163,17 @@ <string name="part_present_no">Присутствует: нет</string> <string name="part_removable_yes">Съемное: да</string> <string name="part_removable_no">Съемное: нет</string> - <string name="part_size">Размер: %tw_partition_size%MB</string> - <string name="part_used">Использовано: %tw_partition_used%MB</string> - <string name="part_free">Свободно: %tw_partition_free%MB</string> - <string name="part_backup_size">Размер резервных копий: %tw_partition_backup_size%MB</string> - <string name="resize_btn">Исправ. размер</string> - <string name="resize_btn_s">Испр. размер</string> - <string name="resize_confirm">Исправить размер %tw_partition_name%?</string> - <string name="resizing">Исправление размера...</string> - <string name="resize_complete">Размер партиции исправлен</string> - <string name="swipe_resize">Свайп для испр-ния размера</string> - <string name="swipe_resize_s"> Испр. размер</string> + <string name="part_size">Размер: %tw_partition_size% МБ</string> + <string name="part_used">Использовано: %tw_partition_used% МБ</string> + <string name="part_free">Свободно: %tw_partition_free% МБ</string> + <string name="part_backup_size">Размер резервных копий: %tw_partition_backup_size% МБ</string> + <string name="resize_btn">Измен. размер</string> + <string name="resize_btn_s">Изм. размер</string> + <string name="resize_confirm">Изменить размер %tw_partition_name%?</string> + <string name="resizing">Изменение размера...</string> + <string name="resize_complete">Размер раздела изменён</string> + <string name="swipe_resize">Свайп для изменения размера</string> + <string name="swipe_resize_s"> Измен. размер</string> <string name="repair_btn">Восст-ть файл. систему</string> <string name="repair_btn_s">Восстановление</string> <string name="repair_confirm">Восстановить %tw_partition_name%?</string> @@ -196,7 +196,7 @@ <string name="wipe_enc_btn">Стереть шифрование</string> <string name="swipe_factory_reset">Свайп для подтверждения</string> <string name="repair_change_btn">Восстановить или изменить файловую систему</string> - <string name="storage_hdr">Хранилище: %tw_storage_display_name% (%tw_storage_free_size% MB)</string> + <string name="storage_hdr">Текущий накопитель: %tw_storage_display_name% (%tw_storage_free_size% МБ)</string> <string name="backup_hdr">Резервное копирование</string> <string name="backup_confirm_hdr">Подтверждение резервного копирования</string> <string name="encryption_tab">ШИФРОВАНИЕ</string> @@ -225,7 +225,7 @@ <string name="backup_complete">Резервное копирование завершено</string> <string name="restore_hdr">Восстановление</string> <string name="sel_backup_hdr">Выбор резервной копии</string> - <string name="restore_sel_store_hdr">Выбор резервной копии из %tw_storage_display_name% (%tw_storage_free_size% MB)</string> + <string name="restore_sel_store_hdr">Текущий накопитель: %tw_storage_display_name% (%tw_storage_free_size% МБ)</string> <string name="restore_sel_pack_fs">Выбор резервной копии для восстановления:</string> <string name="restore_enc_backup_hdr">Зашифрованная резервная копия</string> <string name="restore_dec_fail">Пароль неверный, попробуйте снова!</string> @@ -238,7 +238,7 @@ <string name="swipe_delete_s"> Удаление</string> <string name="restore_try_decrypt">Зашифрованная резервная копия - попытка расшифровки</string> <string name="restore_try_decrypt_s">Попытка расшифровки</string> - <string name="restore_backup_date">Резервная копия создана %tw_restore_file_date%</string> + <string name="restore_backup_date">Резервная копия создана: %tw_restore_file_date%</string> <string name="restore_sel_part">Выбор раздела для восстановления:</string> <string name="restore_enable_md5_chk">Включить проверку MD5 файлов резервной копии</string> <string name="restore_complete">Восстановление завершено</string> @@ -259,12 +259,12 @@ <string name="decrypt_data_btn">Расшифровать данные</string> <string name="disable_mtp_btn">Выключить MTP</string> <string name="enable_mtp_btn">Включить MTP</string> - <string name="mount_usb_storage_btn">Смонтировать как USB-накопит.</string> + <string name="mount_usb_storage_btn">Включить UMS</string> <string name="usb_storage_hdr">USB накопитель</string> - <string name="usb_stor_mnt1">USB накопитель смонтирован</string> - <string name="usb_stor_mnt2">Для безопасного отключения вашего устройства</string> - <string name="usb_stor_mnt3">от компьютера, выполните размонтирование!</string> - <string name="unmount_btn">Размонтировать</string> + <string name="usb_stor_mnt1">Режим USB накопителя включен</string> + <string name="usb_stor_mnt2">Перед отключением вашего устройства от компьютера,</string> + <string name="usb_stor_mnt3">выполните размонтирование (выключите UMS)!</string> + <string name="unmount_btn">Выключить UMS</string> <string name="rb_system_btn">Система</string> <string name="rb_poweroff_btn">Выключение</string> <string name="rb_recovery_btn">Рекавери</string> @@ -300,7 +300,7 @@ <string name="ctr_navbar_rdo">Кнопки нав.панели по центру</string> <string name="lft_navbar_rdo">Выровнять кнопки нав.панели слева</string> <string name="rht_navbar_rdo">Выровнять кнопки нав.панели справа</string> - <string name="restore_defaults_btn">Восстановить настр-ки</string> + <string name="restore_defaults_btn">Сброс настроек</string> <string name="settings_tz_btn">Часовой пояс</string> <string name="settings_screen_btn">Экран</string> <string name="settings_screen_bright_btn">Яркость</string> @@ -329,9 +329,9 @@ <string name="utcp5">(UTC +5) Ташкент, Исламабад, Карачи</string> <string name="utcp6">(UTC +6) Алматы, Астана, Дхака, Екатеринбург</string> <string name="utcp7">(UTC +7) Омск, Новосибирск, Бангкок, Джакарта, Ханой</string> - <string name="utcp8">(UTC +8) Красноярск, Гонконг, Пекин, Улан-Батор</string> - <string name="utcp9">(UTC +9) Иркутск, Осака, Саппоро, Токио, Сеул</string> - <string name="utcp10">(UTC +10) Якутск, Гуам, Канберра, Мельбурн, Сидней</string> + <string name="utcp8">(UTC +8) Красноярск, Пекин, Улан-Батор, Иркутск</string> + <string name="utcp9">(UTC +9) Осака, Саппоро, Токио, Сеул, Якутск</string> + <string name="utcp10">(UTC +10) Гуам, Канберра, Мельбурн, Сидней</string> <string name="utcp11">(UTC +11) Владивосток, Сахалин, Соломоновы о-ва</string> <string name="utcp12">(UTC +12) Магадан, Камчатка, Фиджи, Маршаловы о-ва</string> <string name="sel_tz_offset">Выбор смещения (как правило 0): %tw_time_zone_guioffset%</string> @@ -437,8 +437,8 @@ <string name="fm_complete">Операция завершена</string> <string name="decrypt_data_hdr">Расшифровать данные</string> <string name="decrypt_data_enter_pass">Введите пароль.</string> - <string name="decryt_data_failed">Пароль неверный, попробуйте снова!</string> - <string name="decryt_data_failed_pattern">Шаблон неверный, попробуйте снова!</string> + <string name="decrypt_data_failed">Пароль неверный, попробуйте снова!</string> + <string name="decrypt_data_failed_pattern">Шаблон неверный, попробуйте снова!</string> <string name="decrypt_data_enter_pattern">Введите шаблон.</string> <string name="decrypt_data_trying">Попытка расшифровки</string> <string name="term_hdr">Команда терминала</string> @@ -470,7 +470,7 @@ <string name="swipe_su_to_install">Свайп для установки</string> <string name="swipe_su_install"> Установка</string> <string name="su_installing">Установка SuperSU</string> - <string name="sel_storage_list">Выбор хранилища</string> + <string name="sel_storage_list">Выберите накопитель</string> <string name="ok_btn">OK</string> <!-- Various console messages - these consist of user displayed messages, oftentimes errors --> @@ -492,17 +492,17 @@ <string name="unable_to_locate_partition">Не удается найти '{1}' раздел для расчета копирования.</string> <string name="no_partition_selected">Не выбраны разделы для резервного копирования.</string> <string name="total_partitions_backup"> * Общее количество разделов для резервного копирования: {1}</string> - <string name="total_backup_size"> * Общий объем данных: {1}MB</string> - <string name="available_space"> * Доступный объем: {1}MB</string> + <string name="total_backup_size"> * Общий объем данных: {1} МБ</string> + <string name="available_space"> * Доступный объем: {1} МБ</string> <string name="unable_locate_storage">Не удается найти накопитель для хранения.</string> <string name="no_space">В накопителе для хранения недостаточно свободного места.</string> <string name="backup_started">[РЕЗЕРВНОЕ КОПИРОВАНИЕ НАЧАТО]</string> <string name="backup_folder"> * Папка для резервной копии: {1}</string> <string name="fail_backup_folder">Не удается создать папку для резервной копии.</string> - <string name="avg_backup_fs">Средняя скорость копирования для файлов: {1} MB/sec</string> - <string name="avg_backup_img">Средняя скорость копирования для образов: {1} MB/sec</string> - <string name="total_backed_size">[{1} MB ВСЕГО СКОПИРОВАНО]</string> - <string name="backup_completed">[КОПИРОВАНИЕ ЗАВЕРШЕНО ЗА {1} СЕКУНД]</string> + <string name="avg_backup_fs">Средняя скорость копирования для файлов: {1} МБ/сек</string> + <string name="avg_backup_img">Средняя скорость копирования для образов: {1} МБ/сек</string> + <string name="total_backed_size">[ВСЕГО СКОПИРОВАНО {1} МБ]</string> + <string name="backup_completed">[КОПИРОВАНИЕ ЗАВЕРШЕНО ЗА {1} СЕКУНД(Ы)]</string> <string name="restore_started">[ВОССТАНОВЛЕНИЕ НАЧАТО]</string> <string name="restore_folder">Папка для восстановления: '{1}'</string> <!-- {1} is the partition display name and {2} is the number of seconds --> @@ -514,9 +514,9 @@ <string name="restore_unable_locate">Не удается найти '{1}' раздел для восстановления.</string> <string name="no_part_restore">Не выбраны разделы для восстановления.</string> <string name="restore_part_count">Восстановление {1} разделов...</string> - <string name="total_restore_size">Общий размер для восстановления: {1}MB</string> + <string name="total_restore_size">Общий размер для восстановления: {1} МБ</string> <string name="updating_system_details">Обновление информации о системе</string> - <string name="restore_completed">[ВОССТАНОВЛЕНИЕ ЗАВЕРШЕНО ЗА {1} СЕКУНД]</string> + <string name="restore_completed">[ВОССТАНОВЛЕНИЕ ЗАВЕРШЕНО ЗА {1} СЕКУНД(Ы)]</string> <!-- {1} is the path we could not open, {2} is strerror output --> <string name="error_opening_strerr">Ошибка открытия: '{1}' ({2})</string> <string name="unable_locate_part_backup_name">Не удается найти раздел для копирования: '{1}'</string> @@ -533,9 +533,9 @@ <string name="unable_to_mount_internal">Не удается смонтировать internal_storage</string> <string name="unable_to_mount_storage">Не удается смонтировать накопитель</string> <string name="fail_decrypt">Не удается расшифровать data.</string> - <string name="no_crypto_support">Шифрование не добавлено в эту сборки, пинайте разработчика.</string> + <string name="no_crypto_support">Шифрование не добавлено в эту сборку, пинайте разработчика.</string> <string name="decrypt_success_dev">Data успешно расшифрован, новое блочное устройство: '{1}'</string> - <string name="done">Done.</string> + <string name="done">Готово.</string> <string name="start_partition_sd">Разметка SD-карты...</string> <string name="partition_sd_locate">Не удалось найти устройство для разметки.</string> <string name="ext_swap_size">Размер EXT + Swap превышает размер sdcard.</string> @@ -622,10 +622,10 @@ <string name="ors_complete">OpenRecoveryScript выполнен</string> <string name="no_updater_binary">'{1}' не найден в zip файле.</string> <string name="check_for_md5">Проверка MD5-файлов...</string> - <string name="fail_sysmap">Failed to map file '{1}'</string> - <string name="verify_zip_sig">Проверка zip сигнатуры...</string> - <string name="verify_zip_fail">Zip сигнатура не прошла проверку!</string> - <string name="verify_zip_done">Zip сигнатура проверена успешно.</string> + <string name="fail_sysmap">Не удалось отобразить в память файл '{1}'</string> + <string name="verify_zip_sig">Проверка подписи zip...</string> + <string name="verify_zip_fail">Подпись Zip не прошла проверку!</string> + <string name="verify_zip_done">Подпись Zip проверена успешно.</string> <string name="zip_corrupt">Zip-файл поврежден!</string> <string name="no_md5">Пропуск проверки MD5: не найден MD5-файл</string> <string name="md5_fail">MD5 не соответствует</string> @@ -643,7 +643,7 @@ <string name="split_thread">Разделение идентификатора потока {1} в архив {2}</string> <!-- These 2 items are saved in the data manager instead of resource manager, so %llu, etc is correct instead of {1} --> <string name="file_progress">%llu из %llu файлов, %i%%</string> - <string name="size_progress">%lluMB из %lluMB, %i%%</string> + <string name="size_progress">%llu МБ из %llu МБ, %i%%</string> <string name="decrypt_cmd">Попытка расшифровать раздел данных с помощью командной строки.</string> <string name="base_pkg_err">Неудача при загрузке базовых пакетов.</string> <string name="simulating">Имитация действий...</string> diff --git a/partition.cpp b/partition.cpp index 354563466..fe2843cae 100644 --- a/partition.cpp +++ b/partition.cpp @@ -984,6 +984,14 @@ bool TWPartition::Is_Mounted(void) { return ret; } +bool TWPartition::Is_File_System_Writable(void) { + if (!Is_File_System(Current_File_System) || !Is_Mounted()) + return false; + + string test_path = Mount_Point + "/."; + return (access(test_path.c_str(), W_OK) == 0); +} + bool TWPartition::Mount(bool Display_Error) { int exfat_mounted = 0; unsigned long flags = Mount_Flags; @@ -1152,6 +1160,31 @@ bool TWPartition::UnMount(bool Display_Error) { } } +bool TWPartition::ReMount(bool Display_Error) { + if (UnMount(Display_Error)) + return Mount(Display_Error); + return false; +} + +bool TWPartition::ReMount_RW(bool Display_Error) { + // No need to remount if already mounted rw + if (Is_File_System_Writable()) + return true; + + bool ro = Mount_Read_Only; + int flags = Mount_Flags; + + Mount_Read_Only = false; + Mount_Flags &= ~MS_RDONLY; + + bool ret = ReMount(Display_Error); + + Mount_Read_Only = ro; + Mount_Flags = flags; + + return ret; +} + bool TWPartition::Wipe(string New_File_System) { bool wiped = false, update_crypt = false, recreate_media = true; int check; @@ -1611,8 +1644,12 @@ bool TWPartition::Wipe_Encryption() { close(fd); } } else { - string Command = "flash_image " + Crypto_Key_Location + " /dev/zero"; - TWFunc::Exec_Cmd(Command); + if (TWFunc::IOCTL_Get_Block_Size(Crypto_Key_Location.c_str()) >= 16384LLU) { + string Command = "dd of='" + Crypto_Key_Location + "' if=/dev/zero bs=16384 count=1"; + TWFunc::Exec_Cmd(Command); + } else { + LOGINFO("Crypto key location reports size < 16K so not wiping crypto footer.\n"); + } } if (Wipe(Fstab_File_System)) { Has_Data_Media = Save_Data_Media; @@ -2137,7 +2174,8 @@ bool TWPartition::Restore_Tar(string restore_folder, string Restore_File_System, TWFunc::GUI_Operation_Text(TW_RESTORE_TEXT, Backup_Display_Name, gui_parse_text("{@restoring_hdr}")); gui_msg(Msg("restoring=Restoring {1}...")(Backup_Display_Name)); - if (!Mount(true)) + // Remount as read/write as needed so we can restore the backup + if (!ReMount_RW(true)) return false; Full_FileName = restore_folder + "/" + Backup_FileName; @@ -2174,6 +2212,10 @@ bool TWPartition::Restore_Tar(string restore_folder, string Restore_File_System, } } #endif + if (Mount_Read_Only || Mount_Flags & MS_RDONLY) + // Remount as read only when restoration is complete + ReMount(true); + return ret; } diff --git a/partitions.hpp b/partitions.hpp index 90f772cb4..1d43e0478 100644 --- a/partitions.hpp +++ b/partitions.hpp @@ -51,8 +51,11 @@ public: public: bool Is_Mounted(); // Checks mount to see if the partition is currently mounted + bool Is_File_System_Writable(); // Checks if the root directory of the file system can be written to bool Mount(bool Display_Error); // Mounts the partition if it is not mounted bool UnMount(bool Display_Error); // Unmounts the partition if it is mounted + bool ReMount(bool Display_Error); // Remounts the partition + bool ReMount_RW(bool Display_Error); // Remounts the partition with read/write access bool Wipe(string New_File_System); // Wipes the partition bool Wipe(); // Wipes the partition bool Wipe_AndSec(); // Wipes android secure diff --git a/prebuilt/Android.mk b/prebuilt/Android.mk index 44767014f..cba396af2 100644 --- a/prebuilt/Android.mk +++ b/prebuilt/Android.mk @@ -19,7 +19,7 @@ else RELINK_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/sh RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libcrypto.so ifneq (,$(filter $(PLATFORM_SDK_VERSION), 23)) - RELINK_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/toybox + RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/sbin/toybox ifneq ($(wildcard external/zip/Android.mk),) RELINK_SOURCE_FILES += $(TARGET_OUT_OPTIONAL_EXECUTABLES)/zip endif diff --git a/scripts/README b/scripts/README index ff8b36621..0191d8ffa 100644 --- a/scripts/README +++ b/scripts/README @@ -25,3 +25,17 @@ Usage: python compare_xml.py -o target.xml + + +language_helper.py + +This script reads the English and supplied other language files and +compares the 2 and reorders and rewrites the other language to a new +XML file such that all the strings are placed in the same order as +the English file. It will place commented out string lines for items +that are not present in the new file and will not include any strings +in the new file that are no longer present in the English source. +There is also a version tag that may be compared if present between +the English and other language in case a translation string changes. + +python language_helper.py -o ../gui/theme/common/languages/es.xml diff --git a/scripts/language_helper.py b/scripts/language_helper.py new file mode 100644 index 000000000..2e3df7132 --- /dev/null +++ b/scripts/language_helper.py @@ -0,0 +1,142 @@ +from xml.dom import minidom +import sys +import getopt + +# language helper +# +# by Ethan Yonker (Dees_Troy) +# +# This script reads the English and supplied other language files and +# compares the 2 and reorders and rewrites the other language to a new +# XML file such that all the strings are placed in the same order as +# the English file. It will place commented out string lines for items +# that are not present in the new file and will not include any strings +# in the new file that are no longer present in the English source. +# There is also a version tag that may be compared if present between +# the English and other language in case a translation string changes. + + + +# this helps us avoid ascii unicode errors when writing the final XML +def toprettyxml(xdoc, encoding): + #"""Return a pretty-printed XML document in a given encoding.""" + unistr = xdoc.toprettyxml().replace(u'<?xml version="1.0" ?>', + u'<?xml version="1.0" encoding="%s"?>' % encoding) + return unistr.encode(encoding, 'xmlcharrefreplace') + +HELP = """ + language_helper.py -o file.xml other language to compre to English + [ -f file.xml ] output file (defaults to new.xml) + -h help info +""" + +enfile = "../gui/theme/common/languages/en.xml" +otherfile = "" +outfile = "new.xml" + +try: + opts, args = getopt.getopt(sys.argv[1:], "hfo:koz", ["device="]) +except getopt.GetoptEror: + print HELP + sys.stdout.flush() + sys.exit(2) + +for opt, arg in opts: + if opt == "-h": + print HELP + sys.stdout.flush() + sys.exit() + elif opt == "-o": + otherfile = arg + elif opt == "-f": + outfile = arg + +if otherfile == "": + print HELP + exit() + +print "Comparing %s and %s" % (enfile, otherfile) +print "" + +# Open English +endoc = minidom.parse(enfile) + +# Open other language +otherdoc = minidom.parse(otherfile) +otherstrings = otherdoc.getElementsByTagName('string') + +# create minidom-document +doc = minidom.Document() + +# language tag +language = doc.createElement('language') +doc.appendChild(language) + +# display tag (name of the language that shows in the GUI) +otherlang = "" +otherdisplay = otherdoc.getElementsByTagName('display') +for disnode in otherdisplay: + if disnode.nodeType == disnode.ELEMENT_NODE: + language.appendChild(disnode) + otherlang = disnode.firstChild.data + print otherlang + +# resources +resources = doc.createElement('resources') +language.appendChild(resources) + +enres = endoc.getElementsByTagName('resources') +for resnode in enres: + resc = resnode.childNodes + for child in resc: + if child.nodeType == child.ELEMENT_NODE: + if child.tagName != "string": + otherres = otherdoc.getElementsByTagName('resources') + found = False + for othernode in otherres: + otherresc = othernode.childNodes + for otherchild in otherresc: + if otherchild.nodeType == otherchild.ELEMENT_NODE: + if otherchild.tagName == child.tagName: + if otherchild.attributes['name'].value == child.attributes['name'].value: + found = True + resources.appendChild(otherchild) + break + if found == True: + break + if found == False: + print "Failed to find %s in %s, using what we got from English" % (child.toxml(), otherlang) + resources.appendChild(child) + else: + found = False + for others in otherstrings: + if child.attributes['name'].value == others.attributes['name'].value: + found = True + enver = "1" + if child.hasAttribute('version'): + enver = child.attributes['version'].value + otherver = "1" + if others.hasAttribute('version'): + otherver = others.attributes['version'].value + if enver != otherver: + ver_err = "English has version " + enver + " but " + otherlang + " has version " + otherver + " for '" + child.attributes['name'].value + "'" + print ver_err + version_comment = doc.createComment(ver_err) + resources.appendChild(version_comment) + resources.appendChild(others) + else: + resources.appendChild(others) + break + if found == False: + print "'%s' present in English and not in %s" % (child.attributes['name'].value, otherlang) + notfound_err = "NOT FOUND " + child.toxml() + notfound_comment = doc.createComment(notfound_err) + resources.appendChild(notfound_comment) + elif child.nodeType == child.COMMENT_NODE: + resources.appendChild(child) + +# Done, output the xml to a file +file_handle = open(outfile,"wb") +itspretty = toprettyxml(doc, "utf-8") +file_handle.write(itspretty) +file_handle.close() diff --git a/twinstall.cpp b/twinstall.cpp index a2eb72530..f512e278c 100644 --- a/twinstall.cpp +++ b/twinstall.cpp @@ -1,5 +1,5 @@ /* - Copyright 2012 bigbiff/Dees_Troy TeamWin + Copyright 2012 to 2016 bigbiff/Dees_Troy TeamWin This file is part of TWRP/TeamWin Recovery Project. TWRP is free software: you can redistribute it and/or modify @@ -41,6 +41,7 @@ #include "twrpDigest.hpp" #include "twrp-functions.hpp" #include "gui/gui.hpp" +#include "gui/pages.hpp" extern "C" { #include "gui/gui.h" #include "legacy_property_service.h" @@ -93,6 +94,36 @@ static int switch_to_new_properties() return 0; } +static int Install_Theme(const char* path, ZipArchive *Zip) { +#ifdef TW_OEM_BUILD // We don't do custom themes in OEM builds + mzCloseZipArchive(Zip); + return INSTALL_CORRUPT; +#else + const ZipEntry* xml_location = mzFindZipEntry(Zip, "ui.xml"); + + mzCloseZipArchive(Zip); + if (xml_location == NULL) { + return INSTALL_CORRUPT; + } + if (!PartitionManager.Mount_Settings_Storage(true)) + return INSTALL_ERROR; + string theme_path = DataManager::GetSettingsStoragePath(); + theme_path += "/TWRP/theme"; + if (!TWFunc::Path_Exists(theme_path)) { + if (!TWFunc::Recursive_Mkdir(theme_path)) { + return INSTALL_ERROR; + } + } + theme_path += "/ui.zip"; + if (TWFunc::copy_file(path, theme_path, 0644) != 0) { + return INSTALL_ERROR; + } + LOGINFO("Installing custom theme '%s' to '%s'\n", path, theme_path.c_str()); + PageManager::RequestReload(); + return INSTALL_SUCCESS; +#endif +} + static int Run_Update_Binary(const char *path, ZipArchive *Zip, int* wipe_cache) { const ZipEntry* binary_location = mzFindZipEntry(Zip, ASSUMED_UPDATE_BINARY_NAME); string Temp_Binary = "/tmp/updater"; // Note: AOSP names it /tmp/update_binary (yes, with "_") @@ -102,8 +133,6 @@ static int Run_Update_Binary(const char *path, ZipArchive *Zip, int* wipe_cache) FILE* child_data; if (binary_location == NULL) { - mzCloseZipArchive(Zip); - gui_msg(Msg(msg::kError, "no_updater_binary=Could not find '{1}' in the zip file.")(ASSUMED_UPDATE_BINARY_NAME)); return INSTALL_CORRUPT; } @@ -300,6 +329,12 @@ extern "C" int TWinstall_zip(const char* path, int* wipe_cache) { return INSTALL_CORRUPT; } ret_val = Run_Update_Binary(path, &Zip, wipe_cache); + if (ret_val == INSTALL_CORRUPT) { + // If no updater binary is found, check for ui.xml + ret_val = Install_Theme(path, &Zip); + if (ret_val == INSTALL_CORRUPT) + gui_msg(Msg(msg::kError, "no_updater_binary=Could not find '{1}' in the zip file.")(ASSUMED_UPDATE_BINARY_NAME)); + } sysReleaseMap(&map); return ret_val; } |