From d5e5b3626347f2560f605a62a7a4acde4c803993 Mon Sep 17 00:00:00 2001 From: mcguirepr89 Date: Tue, 25 Jan 2022 22:26:51 -0500 Subject: [PATCH] adding new filemanager still need to be sure the installation sets the proper file permissions and need to replace menu.html --- scripts/edit_pages.php | 46 - scripts/edit_scripts.php | 46 - scripts/filemanager/LICENSE | 674 +++++ scripts/filemanager/SECURITY.md | 27 + scripts/filemanager/filemanager.php | 4090 ++++++++++++++++++++++++++ scripts/filemanager/translation.json | 2231 ++++++++++++++ scripts/index.html | 13 +- scripts/list_pages.php | 119 - scripts/list_scripts.php | 115 - templates/gotty | 2 +- 10 files changed, 7033 insertions(+), 330 deletions(-) delete mode 100644 scripts/edit_pages.php delete mode 100644 scripts/edit_scripts.php create mode 100644 scripts/filemanager/LICENSE create mode 100644 scripts/filemanager/SECURITY.md create mode 100644 scripts/filemanager/filemanager.php create mode 100644 scripts/filemanager/translation.json delete mode 100644 scripts/list_pages.php delete mode 100644 scripts/list_scripts.php diff --git a/scripts/edit_pages.php b/scripts/edit_pages.php deleted file mode 100644 index 4597b03..0000000 --- a/scripts/edit_pages.php +++ /dev/null @@ -1,46 +0,0 @@ -Moved.', htmlspecialchars($url)); - exit(); -} - -// read the textfile -$text = file_get_contents($file); - -?> - - - - -
- - -
- -
- diff --git a/scripts/edit_scripts.php b/scripts/edit_scripts.php deleted file mode 100644 index 9ce3c0a..0000000 --- a/scripts/edit_scripts.php +++ /dev/null @@ -1,46 +0,0 @@ -Moved.', htmlspecialchars($url)); - exit(); -} - -// read the textfile -$text = file_get_contents($file); - -?> - - - - -
- - -
- -
- diff --git a/scripts/filemanager/LICENSE b/scripts/filemanager/LICENSE new file mode 100644 index 0000000..94a9ed0 --- /dev/null +++ b/scripts/filemanager/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/scripts/filemanager/SECURITY.md b/scripts/filemanager/SECURITY.md new file mode 100644 index 0000000..6f69486 --- /dev/null +++ b/scripts/filemanager/SECURITY.md @@ -0,0 +1,27 @@ +# Security Policy + +## Reporting a Vulnerability + +The team takes security bugs seriously. We appreciate your efforts to responsibly disclose your findings, and will make every effort to acknowledge your contributions. + +To report a security issue, email ccpprogrammers[at]gmail.com and include the word "SECURITY" in the subject line. + +The team will send a response indicating the next steps in handling your report. After the initial reply to your report you will be kept informed of the progress towards a fix and full announcement. + +Report security bugs in third-party modules to the person or team maintaining the module. + +## Disclosure Policy + +When the security team receives a security bug report, they will assign it to a +primary handler. This person will coordinate the fix and release process, +involving the following steps: + + * Confirm the problem and determine the affected versions. + * Audit code to find any potential similar problems. + * Prepare fixes for all releases still under maintenance. These fixes will be + released as fast as possible to npm. + +## Comments on this Policy + +If you have suggestions on how this process could be improved please submit a +pull request. diff --git a/scripts/filemanager/filemanager.php b/scripts/filemanager/filemanager.php new file mode 100644 index 0000000..2a6ada0 --- /dev/null +++ b/scripts/filemanager/filemanager.php @@ -0,0 +1,4090 @@ + 'Password', 'Username2' => 'Password2', ...) +// Generate secure password hash - https://tinyfilemanager.github.io/docs/pwd.html +$auth_users = array( + 'admin' => '$2y$10$/K.hjNr84lLNDt8fTXjoI.DBp6PpeyoJ.mGwrrLuCZfAwfSAGqhOW', //admin@123 + 'user' => '$2y$10$Fg6Dz8oH9fPoZ2jJan5tZuv6Z4Kp7avtQ9bDfrdRntXtPeiMAZyGO' //12345 +); + +// Readonly users +// e.g. array('users', 'guest', ...) +$readonly_users = array( + 'user' +); + +// Enable highlight.js (https://highlightjs.org/) on view's page +$use_highlightjs = true; + +// highlight.js style +// for dark theme use 'ir-black' +$highlightjs_style = 'vs'; + +// Enable ace.js (https://ace.c9.io/) on view's page +$edit_files = true; + +// Default timezone for date() and time() +// Doc - http://php.net/manual/en/timezones.php +$default_timezone = 'Etc/UTC'; // UTC + +// Root path for file manager +// use absolute path of directory i.e: '/var/www/folder' or $_SERVER['DOCUMENT_ROOT'].'/folder' +$root_path = $_SERVER['DOCUMENT_ROOT']; + +// Root url for links in file manager.Relative to $http_host. Variants: '', 'path/to/subfolder' +// Will not working if $root_path will be outside of server document root +$root_url = ''; + +// Server hostname. Can set manually if wrong +$http_host = $_SERVER['HTTP_HOST']; + +// user specific directories +// array('Username' => 'Directory path', 'Username2' => 'Directory path', ...) +$directories_users = array(); + +// input encoding for iconv +$iconv_input_encoding = 'UTF-8'; + +// date() format for file modification date +// Doc - https://www.php.net/manual/en/function.date.php +$datetime_format = 'd.m.y H:i'; + +// Allowed file extensions for create and rename files +// e.g. 'txt,html,css,js' +$allowed_file_extensions = ''; + +// Allowed file extensions for upload files +// e.g. 'gif,png,jpg,html,txt' +$allowed_upload_extensions = ''; + +// Favicon path. This can be either a full url to an .PNG image, or a path based on the document root. +// full path, e.g http://example.com/favicon.png +// local path, e.g images/icons/favicon.png +$favicon_path = ''; + +// Files and folders to excluded from listing +// e.g. array('myfile.html', 'personal-folder', '*.php', ...) +$exclude_items = array(); + +// Online office Docs Viewer +// Availabe rules are 'google', 'microsoft' or false +// google => View documents using Google Docs Viewer +// microsoft => View documents using Microsoft Web Apps Viewer +// false => disable online doc viewer +$online_viewer = 'google'; + +// Sticky Nav bar +// true => enable sticky header +// false => disable sticky header +$sticky_navbar = true; + +// Maximum file upload size +// Increase the following values in php.ini to work properly +// memory_limit, upload_max_filesize, post_max_size +$max_upload_size_bytes = 5000; + +// Possible rules are 'OFF', 'AND' or 'OR' +// OFF => Don't check connection IP, defaults to OFF +// AND => Connection must be on the whitelist, and not on the blacklist +// OR => Connection must be on the whitelist, or not on the blacklist +$ip_ruleset = 'OFF'; + +// Should users be notified of their block? +$ip_silent = true; + +// IP-addresses, both ipv4 and ipv6 +$ip_whitelist = array( + '127.0.0.1', // local ipv4 + '::1' // local ipv6 +); + +// IP-addresses, both ipv4 and ipv6 +$ip_blacklist = array( + '0.0.0.0', // non-routable meta ipv4 + '::' // non-routable meta ipv6 +); + +// if User has the customized config file, try to use it to override the default config above +$config_file = __DIR__.'/config.php'; +if (is_readable($config_file)) { + @include($config_file); +} + +// --- EDIT BELOW CAREFULLY OR DO NOT EDIT AT ALL --- + +// max upload file size +define('MAX_UPLOAD_SIZE', $max_upload_size_bytes); + +// private key and session name to store to the session +if ( !defined( 'FM_SESSION_ID')) { + define('FM_SESSION_ID', 'filemanager'); +} + +// Configuration +$cfg = new FM_Config(); + +// Default language +$lang = isset($cfg->data['lang']) ? $cfg->data['lang'] : 'en'; + +// Show or hide files and folders that starts with a dot +$show_hidden_files = isset($cfg->data['show_hidden']) ? $cfg->data['show_hidden'] : true; + +// PHP error reporting - false = Turns off Errors, true = Turns on Errors +$report_errors = isset($cfg->data['error_reporting']) ? $cfg->data['error_reporting'] : true; + +// Hide Permissions and Owner cols in file-listing +$hide_Cols = isset($cfg->data['hide_Cols']) ? $cfg->data['hide_Cols'] : true; + +// Show directory size: true or speedup output: false +$calc_folder = isset($cfg->data['calc_folder']) ? $cfg->data['calc_folder'] : true; + +// Theme +$theme = isset($cfg->data['theme']) ? $cfg->data['theme'] : 'light'; + +define('FM_THEME', $theme); + +//available languages +$lang_list = array( + 'en' => 'English' +); + +if ($report_errors == true) { + @ini_set('error_reporting', E_ALL); + @ini_set('display_errors', 1); +} else { + @ini_set('error_reporting', E_ALL); + @ini_set('display_errors', 0); +} + +// if fm included +if (defined('FM_EMBED')) { + $use_auth = false; + $sticky_navbar = false; +} else { + @set_time_limit(600); + + date_default_timezone_set($default_timezone); + + ini_set('default_charset', 'UTF-8'); + if (version_compare(PHP_VERSION, '5.6.0', '<') && function_exists('mb_internal_encoding')) { + mb_internal_encoding('UTF-8'); + } + if (function_exists('mb_regex_encoding')) { + mb_regex_encoding('UTF-8'); + } + + session_cache_limiter(''); + session_name(FM_SESSION_ID ); + function session_error_handling_function($code, $msg, $file, $line) { + // Permission denied for default session, try to create a new one + if ($code == 2) { + session_abort(); + session_id(session_create_id()); + @session_start(); + } + } + set_error_handler('session_error_handling_function'); + session_start(); + restore_error_handler(); +} + +if (empty($auth_users)) { + $use_auth = false; +} + +$is_https = isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == 'on' || $_SERVER['HTTPS'] == 1) + || isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https'; + +// update $root_url based on user specific directories +if (isset($_SESSION[FM_SESSION_ID]['logged']) && !empty($directories_users[$_SESSION[FM_SESSION_ID]['logged']])) { + $wd = fm_clean_path(dirname($_SERVER['PHP_SELF'])); + $root_url = $root_url.$wd.DIRECTORY_SEPARATOR.$directories_users[$_SESSION[FM_SESSION_ID]['logged']]; +} +// clean $root_url +$root_url = fm_clean_path($root_url); + +// abs path for site +defined('FM_ROOT_URL') || define('FM_ROOT_URL', ($is_https ? 'https' : 'http') . '://' . $http_host . (!empty($root_url) ? '/' . $root_url : '')); +defined('FM_SELF_URL') || define('FM_SELF_URL', ($is_https ? 'https' : 'http') . '://' . $http_host . $_SERVER['PHP_SELF']); + +// logout +if (isset($_GET['logout'])) { + unset($_SESSION[FM_SESSION_ID]['logged']); + fm_redirect(FM_SELF_URL); +} + +// Validate connection IP +if($ip_ruleset != 'OFF'){ + $clientIp = $_SERVER['REMOTE_ADDR']; + + $proceed = false; + + $whitelisted = in_array($clientIp, $ip_whitelist); + $blacklisted = in_array($clientIp, $ip_blacklist); + + if($ip_ruleset == 'AND'){ + if($whitelisted == true && $blacklisted == false){ + $proceed = true; + } + } else + if($ip_ruleset == 'OR'){ + if($whitelisted == true || $blacklisted == false){ + $proceed = true; + } + } + + if($proceed == false){ + trigger_error('User connection denied from: ' . $clientIp, E_USER_WARNING); + + if($ip_silent == false){ + fm_set_msg(lng('Access denied. IP restriction applicable'), 'error'); + fm_show_header_login(); + fm_show_message(); + } + + exit(); + } +} + +// Auth +if ($use_auth) { + if (isset($_SESSION[FM_SESSION_ID]['logged'], $auth_users[$_SESSION[FM_SESSION_ID]['logged']])) { + // Logged + } elseif (isset($_POST['fm_usr'], $_POST['fm_pwd'])) { + // Logging In + sleep(1); + if(function_exists('password_verify')) { + if (isset($auth_users[$_POST['fm_usr']]) && isset($_POST['fm_pwd']) && password_verify($_POST['fm_pwd'], $auth_users[$_POST['fm_usr']])) { + $_SESSION[FM_SESSION_ID]['logged'] = $_POST['fm_usr']; + fm_set_msg(lng('You are logged in')); + fm_redirect(FM_SELF_URL . '?p='); + } else { + unset($_SESSION[FM_SESSION_ID]['logged']); + fm_set_msg(lng('Login failed. Invalid username or password'), 'error'); + fm_redirect(FM_SELF_URL); + } + } else { + fm_set_msg(lng('password_hash not supported, Upgrade PHP version'), 'error');; + } + } else { + // Form + unset($_SESSION[FM_SESSION_ID]['logged']); + fm_show_header_login(); + ?> +
+
+
+
+
+
+ +
+
+ +
+
+
+
+ + ".lng('Root path')." \"{$root_path}\" ".lng('not found!')." "; + exit; +} + +defined('FM_SHOW_HIDDEN') || define('FM_SHOW_HIDDEN', $show_hidden_files); +defined('FM_ROOT_PATH') || define('FM_ROOT_PATH', $root_path); +defined('FM_LANG') || define('FM_LANG', $lang); +defined('FM_FILE_EXTENSION') || define('FM_FILE_EXTENSION', $allowed_file_extensions); +defined('FM_UPLOAD_EXTENSION') || define('FM_UPLOAD_EXTENSION', $allowed_upload_extensions); +defined('FM_EXCLUDE_ITEMS') || define('FM_EXCLUDE_ITEMS', (version_compare(PHP_VERSION, '7.0.0', '<') ? serialize($exclude_items) : $exclude_items)); +defined('FM_DOC_VIEWER') || define('FM_DOC_VIEWER', $online_viewer); +define('FM_READONLY', $use_auth && !empty($readonly_users) && isset($_SESSION[FM_SESSION_ID]['logged']) && in_array($_SESSION[FM_SESSION_ID]['logged'], $readonly_users)); +define('FM_IS_WIN', DIRECTORY_SEPARATOR == '\\'); + +// always use ?p= +if (!isset($_GET['p']) && empty($_FILES)) { + fm_redirect(FM_SELF_URL . '?p='); +} + +// get path +$p = isset($_GET['p']) ? $_GET['p'] : (isset($_POST['p']) ? $_POST['p'] : ''); + +// clean path +$p = fm_clean_path($p); + +// for ajax request - save +$input = file_get_contents('php://input'); +$_POST = (strpos($input, 'ajax') != FALSE && strpos($input, 'save') != FALSE) ? json_decode($input, true) : $_POST; + +// instead globals vars +define('FM_PATH', $p); +define('FM_USE_AUTH', $use_auth); +define('FM_EDIT_FILE', $edit_files); +defined('FM_ICONV_INPUT_ENC') || define('FM_ICONV_INPUT_ENC', $iconv_input_encoding); +defined('FM_USE_HIGHLIGHTJS') || define('FM_USE_HIGHLIGHTJS', $use_highlightjs); +defined('FM_HIGHLIGHTJS_STYLE') || define('FM_HIGHLIGHTJS_STYLE', $highlightjs_style); +defined('FM_DATETIME_FORMAT') || define('FM_DATETIME_FORMAT', $datetime_format); + +unset($p, $use_auth, $iconv_input_encoding, $use_highlightjs, $highlightjs_style); + +/*************************** ACTIONS ***************************/ + +// AJAX Request +if (isset($_POST['ajax']) && !FM_READONLY) { + + // save + if (isset($_POST['type']) && $_POST['type'] == "save") { + // get current path + $path = FM_ROOT_PATH; + if (FM_PATH != '') { + $path .= '/' . FM_PATH; + } + // check path + if (!is_dir($path)) { + fm_redirect(FM_SELF_URL . '?p='); + } + $file = $_GET['edit']; + $file = fm_clean_path($file); + $file = str_replace('/', '', $file); + if ($file == '' || !is_file($path . '/' . $file)) { + fm_set_msg(lng('File not found'), 'error'); + fm_redirect(FM_SELF_URL . '?p=' . urlencode(FM_PATH)); + } + header('X-XSS-Protection:0'); + $file_path = $path . '/' . $file; + + $writedata = $_POST['content']; + $fd = fopen($file_path, "w"); + $write_results = @fwrite($fd, $writedata); + fclose($fd); + if ($write_results === false){ + header("HTTP/1.1 500 Internal Server Error"); + die("Could Not Write File! - Check Permissions / Ownership"); + } + die(true); + } + + //search : get list of files from the current folder + if(isset($_POST['type']) && $_POST['type']=="search") { + $dir = FM_ROOT_PATH; + $response = scan(fm_clean_path($_POST['path']), $_POST['content']); + echo json_encode($response); + exit(); + } + + // backup files + if (isset($_POST['type']) && $_POST['type'] == "backup" && !empty($_POST['file'])) { + $fileName = $_POST['file']; + $fullPath = FM_ROOT_PATH . '/'; + if (!empty($_POST['path'])) { + $relativeDirPath = fm_clean_path($_POST['path']); + $fullPath .= "{$relativeDirPath}/"; + } + $date = date("dMy-His"); + $newFileName = "{$fileName}-{$date}.bak"; + $fullyQualifiedFileName = $fullPath . $fileName; + try { + if (!file_exists($fullyQualifiedFileName)) { + throw new Exception("File {$fileName} not found"); + } + if (copy($fullyQualifiedFileName, $fullPath . $newFileName)) { + echo "Backup {$newFileName} created"; + } else { + throw new Exception("Could not copy file {$fileName}"); + } + } catch (Exception $e) { + echo $e->getMessage(); + } + } + + // Save Config + if (isset($_POST['type']) && $_POST['type'] == "settings") { + global $cfg, $lang, $report_errors, $show_hidden_files, $lang_list, $hide_Cols, $calc_folder, $theme; + $newLng = $_POST['js-language']; + fm_get_translations([]); + if (!array_key_exists($newLng, $lang_list)) { + $newLng = 'en'; + } + + $erp = isset($_POST['js-error-report']) && $_POST['js-error-report'] == "true" ? true : false; + $shf = isset($_POST['js-show-hidden']) && $_POST['js-show-hidden'] == "true" ? true : false; + $hco = isset($_POST['js-hide-cols']) && $_POST['js-hide-cols'] == "true" ? true : false; + $caf = isset($_POST['js-calc-folder']) && $_POST['js-calc-folder'] == "true" ? true : false; + $te3 = $_POST['js-theme-3']; + + if ($cfg->data['lang'] != $newLng) { + $cfg->data['lang'] = $newLng; + $lang = $newLng; + } + if ($cfg->data['error_reporting'] != $erp) { + $cfg->data['error_reporting'] = $erp; + $report_errors = $erp; + } + if ($cfg->data['show_hidden'] != $shf) { + $cfg->data['show_hidden'] = $shf; + $show_hidden_files = $shf; + } + if ($cfg->data['show_hidden'] != $shf) { + $cfg->data['show_hidden'] = $shf; + $show_hidden_files = $shf; + } + if ($cfg->data['hide_Cols'] != $hco) { + $cfg->data['hide_Cols'] = $hco; + $hide_Cols = $hco; + } + if ($cfg->data['calc_folder'] != $caf) { + $cfg->data['calc_folder'] = $caf; + $calc_folder = $caf; + } + if ($cfg->data['theme'] != $te3) { + $cfg->data['theme'] = $te3; + $theme = $te3; + } + $cfg->save(); + echo true; + } + + // new password hash + if (isset($_POST['type']) && $_POST['type'] == "pwdhash") { + $res = isset($_POST['inputPassword2']) && !empty($_POST['inputPassword2']) ? password_hash($_POST['inputPassword2'], PASSWORD_DEFAULT) : ''; + echo $res; + } + + //upload using url + if(isset($_POST['type']) && $_POST['type'] == "upload" && !empty($_REQUEST["uploadurl"])) { + $path = FM_ROOT_PATH; + if (FM_PATH != '') { + $path .= '/' . FM_PATH; + } + + function event_callback ($message) { + global $callback; + echo json_encode($message); + } + + function get_file_path () { + global $path, $fileinfo, $temp_file; + return $path."/".basename($fileinfo->name); + } + + $url = !empty($_REQUEST["uploadurl"]) && preg_match("|^http(s)?://.+$|", stripslashes($_REQUEST["uploadurl"])) ? stripslashes($_REQUEST["uploadurl"]) : null; + + //prevent 127.* domain and known ports + $domain = parse_url($url, PHP_URL_HOST); + $port = parse_url($url, PHP_URL_PORT); + $knownPorts = [22, 23, 25, 3306]; + + if (preg_match("/^localhost$|^127(?:\.[0-9]+){0,2}\.[0-9]+$|^(?:0*\:)*?:?0*1$/i", $domain) || in_array($port, $knownPorts)) { + $err = array("message" => "URL is not allowed"); + event_callback(array("fail" => $err)); + exit(); + } + + $use_curl = false; + $temp_file = tempnam(sys_get_temp_dir(), "upload-"); + $fileinfo = new stdClass(); + $fileinfo->name = trim(basename($url), ".\x00..\x20"); + + $allowed = (FM_UPLOAD_EXTENSION) ? explode(',', FM_UPLOAD_EXTENSION) : false; + $ext = strtolower(pathinfo($fileinfo->name, PATHINFO_EXTENSION)); + $isFileAllowed = ($allowed) ? in_array($ext, $allowed) : true; + + $err = false; + + if(!$isFileAllowed) { + $err = array("message" => "File extension is not allowed"); + event_callback(array("fail" => $err)); + exit(); + } + + if (!$url) { + $success = false; + } else if ($use_curl) { + @$fp = fopen($temp_file, "w"); + @$ch = curl_init($url); + curl_setopt($ch, CURLOPT_NOPROGRESS, false ); + curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); + curl_setopt($ch, CURLOPT_FILE, $fp); + @$success = curl_exec($ch); + $curl_info = curl_getinfo($ch); + if (!$success) { + $err = array("message" => curl_error($ch)); + } + @curl_close($ch); + fclose($fp); + $fileinfo->size = $curl_info["size_download"]; + $fileinfo->type = $curl_info["content_type"]; + } else { + $ctx = stream_context_create(); + @$success = copy($url, $temp_file, $ctx); + if (!$success) { + $err = error_get_last(); + } + } + + if ($success) { + $success = rename($temp_file, get_file_path()); + } + + if ($success) { + event_callback(array("done" => $fileinfo)); + } else { + unlink($temp_file); + if (!$err) { + $err = array("message" => "Invalid url parameter"); + } + event_callback(array("fail" => $err)); + } + } + + exit(); +} + +// Delete file / folder +if (isset($_GET['del']) && !FM_READONLY) { + $del = str_replace( '/', '', fm_clean_path( $_GET['del'] ) ); + if ($del != '' && $del != '..' && $del != '.') { + $path = FM_ROOT_PATH; + if (FM_PATH != '') { + $path .= '/' . FM_PATH; + } + $is_dir = is_dir($path . '/' . $del); + if (fm_rdelete($path . '/' . $del)) { + $msg = $is_dir ? lng('Folder').' %s '.lng('Deleted') : lng('File').' %s '.lng('Deleted'); + fm_set_msg(sprintf($msg, fm_enc($del))); + } else { + $msg = $is_dir ? lng('Folder').' %s '.lng('not deleted') : lng('File').' %s '.lng('not deleted'); + fm_set_msg(sprintf($msg, fm_enc($del)), 'error'); + } + } else { + fm_set_msg(lng('Invalid file or folder name'), 'error'); + } + fm_redirect(FM_SELF_URL . '?p=' . urlencode(FM_PATH)); +} + +// Create folder +if (isset($_GET['new']) && isset($_GET['type']) && !FM_READONLY) { + $type = $_GET['type']; + $new = str_replace( '/', '', fm_clean_path( strip_tags( $_GET['new'] ) ) ); + if (fm_isvalid_filename($new) && $new != '' && $new != '..' && $new != '.') { + $path = FM_ROOT_PATH; + if (FM_PATH != '') { + $path .= '/' . FM_PATH; + } + if ($_GET['type'] == "file") { + if (!file_exists($path . '/' . $new)) { + if(fm_is_valid_ext($new)) { + @fopen($path . '/' . $new, 'w') or die('Cannot open file: ' . $new); + fm_set_msg(sprintf(lng('File').' %s '.lng('Created'), fm_enc($new))); + } else { + fm_set_msg(lng('File extension is not allowed'), 'error'); + } + } else { + fm_set_msg(sprintf(lng('File').' %s '.lng('already exists'), fm_enc($new)), 'alert'); + } + } else { + if (fm_mkdir($path . '/' . $new, false) === true) { + fm_set_msg(sprintf(lng('Folder').' %s '.lng('Created'), $new)); + } elseif (fm_mkdir($path . '/' . $new, false) === $path . '/' . $new) { + fm_set_msg(sprintf(lng('Folder').' %s '.lng('already exists'), fm_enc($new)), 'alert'); + } else { + fm_set_msg(sprintf(lng('Folder').' %s '.lng('not created'), fm_enc($new)), 'error'); + } + } + } else { + fm_set_msg(lng('Invalid characters in file or folder name'), 'error'); + } + fm_redirect(FM_SELF_URL . '?p=' . urlencode(FM_PATH)); +} + +// Copy folder / file +if (isset($_GET['copy'], $_GET['finish']) && !FM_READONLY) { + // from + $copy = $_GET['copy']; + $copy = fm_clean_path($copy); + // empty path + if ($copy == '') { + fm_set_msg(lng('Source path not defined'), 'error'); + fm_redirect(FM_SELF_URL . '?p=' . urlencode(FM_PATH)); + } + // abs path from + $from = FM_ROOT_PATH . '/' . $copy; + // abs path to + $dest = FM_ROOT_PATH; + if (FM_PATH != '') { + $dest .= '/' . FM_PATH; + } + $dest .= '/' . basename($from); + // move? + $move = isset($_GET['move']); + // copy/move/duplicate + if ($from != $dest) { + $msg_from = trim(FM_PATH . '/' . basename($from), '/'); + if ($move) { // Move and to != from so just perform move + $rename = fm_rename($from, $dest); + if ($rename) { + fm_set_msg(sprintf(lng('Moved from').' %s '.lng('to').' %s', fm_enc($copy), fm_enc($msg_from))); + } elseif ($rename === null) { + fm_set_msg(lng('File or folder with this path already exists'), 'alert'); + } else { + fm_set_msg(sprintf(lng('Error while moving from').' %s '.lng('to').' %s', fm_enc($copy), fm_enc($msg_from)), 'error'); + } + } else { // Not move and to != from so copy with original name + if (fm_rcopy($from, $dest)) { + fm_set_msg(sprintf(lng('Copied from').' %s '.lng('to').' %s', fm_enc($copy), fm_enc($msg_from))); + } else { + fm_set_msg(sprintf(lng('Error while copying from').' %s '.lng('to').' %s', fm_enc($copy), fm_enc($msg_from)), 'error'); + } + } + } else { + if (!$move){ //Not move and to = from so duplicate + $msg_from = trim(FM_PATH . '/' . basename($from), '/'); + $fn_parts = pathinfo($from); + $extension_suffix = ''; + if(!is_dir($from)){ + $extension_suffix = '.'.$fn_parts['extension']; + } + //Create new name for duplicate + $fn_duplicate = $fn_parts['dirname'].'/'.$fn_parts['filename'].'-'.date('YmdHis').$extension_suffix; + $loop_count = 0; + $max_loop = 1000; + // Check if a file with the duplicate name already exists, if so, make new name (edge case...) + while(file_exists($fn_duplicate) & $loop_count < $max_loop){ + $fn_parts = pathinfo($fn_duplicate); + $fn_duplicate = $fn_parts['dirname'].'/'.$fn_parts['filename'].'-copy'.$extension_suffix; + $loop_count++; + } + if (fm_rcopy($from, $fn_duplicate, False)) { + fm_set_msg(sprintf('Copyied from %s to %s', fm_enc($copy), fm_enc($fn_duplicate))); + } else { + fm_set_msg(sprintf('Error while copying from %s to %s', fm_enc($copy), fm_enc($fn_duplicate)), 'error'); + } + } + else{ + fm_set_msg(lng('Paths must be not equal'), 'alert'); + } + } + fm_redirect(FM_SELF_URL . '?p=' . urlencode(FM_PATH)); +} + +// Mass copy files/ folders +if (isset($_POST['file'], $_POST['copy_to'], $_POST['finish']) && !FM_READONLY) { + // from + $path = FM_ROOT_PATH; + if (FM_PATH != '') { + $path .= '/' . FM_PATH; + } + // to + $copy_to_path = FM_ROOT_PATH; + $copy_to = fm_clean_path($_POST['copy_to']); + if ($copy_to != '') { + $copy_to_path .= '/' . $copy_to; + } + if ($path == $copy_to_path) { + fm_set_msg(lng('Paths must be not equal'), 'alert'); + fm_redirect(FM_SELF_URL . '?p=' . urlencode(FM_PATH)); + } + if (!is_dir($copy_to_path)) { + if (!fm_mkdir($copy_to_path, true)) { + fm_set_msg('Unable to create destination folder', 'error'); + fm_redirect(FM_SELF_URL . '?p=' . urlencode(FM_PATH)); + } + } + // move? + $move = isset($_POST['move']); + // copy/move + $errors = 0; + $files = $_POST['file']; + if (is_array($files) && count($files)) { + foreach ($files as $f) { + if ($f != '') { + // abs path from + $from = $path . '/' . $f; + // abs path to + $dest = $copy_to_path . '/' . $f; + // do + if ($move) { + $rename = fm_rename($from, $dest); + if ($rename === false) { + $errors++; + } + } else { + if (!fm_rcopy($from, $dest)) { + $errors++; + } + } + } + } + if ($errors == 0) { + $msg = $move ? 'Selected files and folders moved' : 'Selected files and folders copied'; + fm_set_msg($msg); + } else { + $msg = $move ? 'Error while moving items' : 'Error while copying items'; + fm_set_msg($msg, 'error'); + } + } else { + fm_set_msg(lng('Nothing selected'), 'alert'); + } + fm_redirect(FM_SELF_URL . '?p=' . urlencode(FM_PATH)); +} + +// Rename +if (isset($_GET['ren'], $_GET['to']) && !FM_READONLY) { + // old name + $old = $_GET['ren']; + $old = fm_clean_path($old); + $old = str_replace('/', '', $old); + // new name + $new = $_GET['to']; + $new = fm_clean_path(strip_tags($new)); + $new = str_replace('/', '', $new); + // path + $path = FM_ROOT_PATH; + if (FM_PATH != '') { + $path .= '/' . FM_PATH; + } + // rename + if (fm_isvalid_filename($new) && $old != '' && $new != '') { + if (fm_rename($path . '/' . $old, $path . '/' . $new)) { + fm_set_msg(sprintf(lng('Renamed from').' %s '. lng('to').' %s', fm_enc($old), fm_enc($new))); + } else { + fm_set_msg(sprintf(lng('Error while renaming from').' %s '. lng('to').' %s', fm_enc($old), fm_enc($new)), 'error'); + } + } else { + fm_set_msg(lng('Invalid characters in file name'), 'error'); + } + fm_redirect(FM_SELF_URL . '?p=' . urlencode(FM_PATH)); +} + +// Download +if (isset($_GET['dl'])) { + $dl = $_GET['dl']; + $dl = fm_clean_path($dl); + $dl = str_replace('/', '', $dl); + $path = FM_ROOT_PATH; + if (FM_PATH != '') { + $path .= '/' . FM_PATH; + } + if ($dl != '' && is_file($path . '/' . $dl)) { + fm_download_file($path . '/' . $dl, $dl, 1024); + exit; + } else { + fm_set_msg(lng('File not found'), 'error'); + fm_redirect(FM_SELF_URL . '?p=' . urlencode(FM_PATH)); + } +} + +// Upload +if (!empty($_FILES) && !FM_READONLY) { + $override_file_name = false; + $f = $_FILES; + $path = FM_ROOT_PATH; + $ds = DIRECTORY_SEPARATOR; + if (FM_PATH != '') { + $path .= '/' . FM_PATH; + } + + $errors = 0; + $uploads = 0; + $allowed = (FM_UPLOAD_EXTENSION) ? explode(',', FM_UPLOAD_EXTENSION) : false; + $response = array ( + 'status' => 'error', + 'info' => 'Oops! Try again' + ); + + $filename = $f['file']['name']; + $tmp_name = $f['file']['tmp_name']; + $ext = strtolower(pathinfo($filename, PATHINFO_EXTENSION)); + $isFileAllowed = ($allowed) ? in_array($ext, $allowed) : true; + + if(!fm_isvalid_filename($filename) && !fm_isvalid_filename($_REQUEST['fullpath'])) { + $response = array ( + 'status' => 'error', + 'info' => "Invalid File name!", + ); + echo json_encode($response); exit(); + } + + $targetPath = $path . $ds; + if ( is_writable($targetPath) ) { + $fullPath = $path . '/' . str_replace("./","_",$_REQUEST['fullpath']); + $folder = substr($fullPath, 0, strrpos($fullPath, "/")); + + if(file_exists ($fullPath) && !$override_file_name) { + $ext_1 = $ext ? '.'.$ext : ''; + $fullPath = str_replace($ext_1, '', $fullPath) .'_'. date('ymdHis'). $ext_1; + } + + if (!is_dir($folder)) { + $old = umask(0); + mkdir($folder, 0777, true); + umask($old); + } + + if (empty($f['file']['error']) && !empty($tmp_name) && $tmp_name != 'none' && $isFileAllowed) { + if (move_uploaded_file($tmp_name, $fullPath)) { + // Be sure that the file has been uploaded + if ( file_exists($fullPath) ) { + $response = array ( + 'status' => 'success', + 'info' => "file upload successful" + ); + } else { + $response = array ( + 'status' => 'error', + 'info' => 'Couldn\'t upload the requested file.' + ); + } + } else { + $response = array ( + 'status' => 'error', + 'info' => "Error while uploading files. Uploaded files $uploads", + ); + } + } + } else { + $response = array ( + 'status' => 'error', + 'info' => 'The specified folder for upload isn\'t writeable.' + ); + } + // Return the response + echo json_encode($response); + exit(); +} + +// Mass deleting +if (isset($_POST['group'], $_POST['delete']) && !FM_READONLY) { + $path = FM_ROOT_PATH; + if (FM_PATH != '') { + $path .= '/' . FM_PATH; + } + + $errors = 0; + $files = $_POST['file']; + if (is_array($files) && count($files)) { + foreach ($files as $f) { + if ($f != '') { + $new_path = $path . '/' . $f; + if (!fm_rdelete($new_path)) { + $errors++; + } + } + } + if ($errors == 0) { + fm_set_msg(lng('Selected files and folder deleted')); + } else { + fm_set_msg(lng('Error while deleting items'), 'error'); + } + } else { + fm_set_msg(lng('Nothing selected'), 'alert'); + } + + fm_redirect(FM_SELF_URL . '?p=' . urlencode(FM_PATH)); +} + +// Pack files +if (isset($_POST['group']) && (isset($_POST['zip']) || isset($_POST['tar'])) && !FM_READONLY) { + $path = FM_ROOT_PATH; + $ext = 'zip'; + if (FM_PATH != '') { + $path .= '/' . FM_PATH; + } + + //set pack type + $ext = isset($_POST['tar']) ? 'tar' : 'zip'; + + + if (($ext == "zip" && !class_exists('ZipArchive')) || ($ext == "tar" && !class_exists('PharData'))) { + fm_set_msg(lng('Operations with archives are not available'), 'error'); + fm_redirect(FM_SELF_URL . '?p=' . urlencode(FM_PATH)); + } + + $files = $_POST['file']; + if (!empty($files)) { + chdir($path); + + if (count($files) == 1) { + $one_file = reset($files); + $one_file = basename($one_file); + $zipname = $one_file . '_' . date('ymd_His') . '.'.$ext; + } else { + $zipname = 'archive_' . date('ymd_His') . '.'.$ext; + } + + if($ext == 'zip') { + $zipper = new FM_Zipper(); + $res = $zipper->create($zipname, $files); + } elseif ($ext == 'tar') { + $tar = new FM_Zipper_Tar(); + $res = $tar->create($zipname, $files); + } + + if ($res) { + fm_set_msg(sprintf(lng('Archive').' %s '.lng('Created'), fm_enc($zipname))); + } else { + fm_set_msg(lng('Archive not created'), 'error'); + } + } else { + fm_set_msg(lng('Nothing selected'), 'alert'); + } + + fm_redirect(FM_SELF_URL . '?p=' . urlencode(FM_PATH)); +} + +// Unpack +if (isset($_GET['unzip']) && !FM_READONLY) { + $unzip = $_GET['unzip']; + $unzip = fm_clean_path($unzip); + $unzip = str_replace('/', '', $unzip); + $isValid = false; + + $path = FM_ROOT_PATH; + if (FM_PATH != '') { + $path .= '/' . FM_PATH; + } + + if ($unzip != '' && is_file($path . '/' . $unzip)) { + $zip_path = $path . '/' . $unzip; + $ext = pathinfo($zip_path, PATHINFO_EXTENSION); + $isValid = true; + } else { + fm_set_msg(lng('File not found'), 'error'); + } + + + if (($ext == "zip" && !class_exists('ZipArchive')) || ($ext == "tar" && !class_exists('PharData'))) { + fm_set_msg(lng('Operations with archives are not available'), 'error'); + fm_redirect(FM_SELF_URL . '?p=' . urlencode(FM_PATH)); + } + + if ($isValid) { + //to folder + $tofolder = ''; + if (isset($_GET['tofolder'])) { + $tofolder = pathinfo($zip_path, PATHINFO_FILENAME); + if (fm_mkdir($path . '/' . $tofolder, true)) { + $path .= '/' . $tofolder; + } + } + + if($ext == "zip") { + $zipper = new FM_Zipper(); + $res = $zipper->unzip($zip_path, $path); + } elseif ($ext == "tar") { + try { + $gzipper = new PharData($zip_path); + if (@$gzipper->extractTo($path,null, true)) { + $res = true; + } else { + $res = false; + } + } catch (Exception $e) { + //TODO:: need to handle the error + $res = true; + } + } + + if ($res) { + fm_set_msg(lng('Archive unpacked')); + } else { + fm_set_msg(lng('Archive not unpacked'), 'error'); + } + + } else { + fm_set_msg(lng('File not found'), 'error'); + } + fm_redirect(FM_SELF_URL . '?p=' . urlencode(FM_PATH)); +} + +// Change Perms (not for Windows) +if (isset($_POST['chmod']) && !FM_READONLY && !FM_IS_WIN) { + $path = FM_ROOT_PATH; + if (FM_PATH != '') { + $path .= '/' . FM_PATH; + } + + $file = $_POST['chmod']; + $file = fm_clean_path($file); + $file = str_replace('/', '', $file); + if ($file == '' || (!is_file($path . '/' . $file) && !is_dir($path . '/' . $file))) { + fm_set_msg(lng('File not found'), 'error'); + fm_redirect(FM_SELF_URL . '?p=' . urlencode(FM_PATH)); + } + + $mode = 0; + if (!empty($_POST['ur'])) { + $mode |= 0400; + } + if (!empty($_POST['uw'])) { + $mode |= 0200; + } + if (!empty($_POST['ux'])) { + $mode |= 0100; + } + if (!empty($_POST['gr'])) { + $mode |= 0040; + } + if (!empty($_POST['gw'])) { + $mode |= 0020; + } + if (!empty($_POST['gx'])) { + $mode |= 0010; + } + if (!empty($_POST['or'])) { + $mode |= 0004; + } + if (!empty($_POST['ow'])) { + $mode |= 0002; + } + if (!empty($_POST['ox'])) { + $mode |= 0001; + } + + if (@chmod($path . '/' . $file, $mode)) { + fm_set_msg(lng('Permissions changed')); + } else { + fm_set_msg(lng('Permissions not changed'), 'error'); + } + + fm_redirect(FM_SELF_URL . '?p=' . urlencode(FM_PATH)); +} + +/*************************** /ACTIONS ***************************/ + +// get current path +$path = FM_ROOT_PATH; +if (FM_PATH != '') { + $path .= '/' . FM_PATH; +} + +// check path +if (!is_dir($path)) { + fm_redirect(FM_SELF_URL . '?p='); +} + +// get parent folder +$parent = fm_get_parent_path(FM_PATH); + +$objects = is_readable($path) ? scandir($path) : array(); +$folders = array(); +$files = array(); +$current_path = array_slice(explode("/",$path), -1)[0]; +if (is_array($objects) && fm_is_exclude_items($current_path)) { + foreach ($objects as $file) { + if ($file == '.' || $file == '..') { + continue; + } + if (!FM_SHOW_HIDDEN && substr($file, 0, 1) === '.') { + continue; + } + $new_path = $path . '/' . $file; + if (@is_file($new_path) && fm_is_exclude_items($file)) { + $files[] = $file; + } elseif (@is_dir($new_path) && $file != '.' && $file != '..' && fm_is_exclude_items($file)) { + $folders[] = $file; + } + } +} + +if (!empty($files)) { + natcasesort($files); +} +if (!empty($folders)) { + natcasesort($folders); +} + +// upload form +if (isset($_GET['upload']) && !FM_READONLY) { + fm_show_header(); // HEADER + fm_show_nav_path(FM_PATH); // current path + //get the allowed file extensions + function getUploadExt() { + $extArr = explode(',', FM_UPLOAD_EXTENSION); + if(FM_UPLOAD_EXTENSION && $extArr) { + array_walk($extArr, function(&$x) {$x = ".$x";}); + return implode(',', $extArr); + } + return ''; + } + ?> + + +
+ +
+
+ +
+
+

+ + : +

+ +
+ + +
+ +
+
+ + +
+
+
+ + + +
+
+
+
+
+
+
+ + + ' . PHP_EOL; + } + ?> +

: , ', $copy_files) ?>

+

:
+ + / +

+

+

+   + +

+ +
+
+
+ +
+

Copying

+

+ Source path:
+ Destination folder: +

+

+ Copy   + Move   + Cancel +

+

+ +
+ + +
+
+
+ + +
+
+
+ +
+ +
+ +
+
+ +
+ +
+
+ + +
+
+
+ +
+ +
+
+ + +
+
+
+ +
+ +
+
+ + +
+
+
+ +
+ +
+
+ + +
+
+
+ +
+ +
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+ + +
+
+
+ + +
+
+
+
+

Tiny File Manager

+

Author: Prasath Mani

+

Mail Us: ccpprogrammers[at]gmail.com

+
+
+
+ +
+
+
+ +
+
+
+ +
+
+ +

""

+

+ Full path:
+ File size:
+ MIME-type:
+ + Files in archive:
+ Total size:
+ Size in archive:
+ Compression: %
+ '; + } + // Text info + if ($is_text) { + $is_utf8 = fm_is_utf8($content); + if (function_exists('iconv')) { + if (!$is_utf8) { + $content = iconv(FM_ICONV_INPUT_ENC, 'UTF-8//IGNORE', $content); + } + } + echo 'Charset: ' . ($is_utf8 ? 'utf-8' : '8 bit') . '
'; + } + ?> +

+

+   + +   + +   + +   + + +   + +   + + +

+ '; + } else if($online_viewer == 'microsoft') { + echo ''; + } + } elseif ($is_zip) { + // ZIP content + if ($filenames !== false) { + echo ''; + foreach ($filenames as $fn) { + if ($fn['folder']) { + echo '' . fm_enc($fn['name']) . '
'; + } else { + echo $fn['name'] . ' (' . fm_get_filesize($fn['filesize']) . ')
'; + } + } + echo '
'; + } else { + echo '

'.lng('Error while fetching archive info').'

'; + } + } elseif ($is_image) { + // Image content + if (in_array($ext, array('gif', 'jpg', 'jpeg', 'png', 'bmp', 'ico', 'svg', 'webp', 'avif'))) { + echo '

'; + } + } elseif ($is_audio) { + // Audio content + echo '

'; + } elseif ($is_video) { + // Video content + echo '
'; + } elseif ($is_text) { + if (FM_USE_HIGHLIGHTJS) { + // highlight + $hljs_classes = array( + 'shtml' => 'xml', + 'htaccess' => 'apache', + 'phtml' => 'php', + 'lock' => 'json', + 'svg' => 'xml', + ); + $hljs_class = isset($hljs_classes[$ext]) ? 'lang-' . $hljs_classes[$ext] : 'lang-' . $ext; + if (empty($ext) || in_array(strtolower($file), fm_get_text_names()) || preg_match('#\.min\.(css|js)$#i', $file)) { + $hljs_class = 'nohighlight'; + } + $content = '
' . fm_enc($content) . '
'; + } elseif (in_array($ext, array('php', 'php4', 'php5', 'phtml', 'phps'))) { + // php highlight + $content = highlight_string($content, true); + } else { + $content = '
' . fm_enc($content) . '
'; + } + echo $content; + } + ?> +
+
+ +
+
+
+ +
+
+ + + + + + + + + + + +
+
+ ' . htmlspecialchars($content) . ''; + } elseif ($is_text) { + echo '
' . htmlspecialchars($content) . '
'; + } else { + fm_set_msg(lng('FILE EXTENSION HAS NOT SUPPORTED'), 'error'); + } + ?> +
+ +
+
+
+ +
+
+

+ Full path:
+

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +

+   + +

+
+
+
+
+ +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + '?'); + $group = array('name' => '?'); + } + ?> + + + + + + + + + + + + + '?'); + $group = array('name' => '?'); + } + ?> + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + +
+
..
+
+ + +
+
+
+ ' . readlink($path . '/' . $f) . '' : '') ?>
+
"> + + + + + + + + +
+
+ + +
+
+
+ + + + + + + + + ' . readlink($path . '/' . $f) . '' : '') ?> +
+
"> + + + + + + + + + + + +
+ '.fm_get_filesize($all_files_size).'' ?> + '.$num_files.'' ?> + '.$num_folders.'' ?> + '.fm_get_filesize(@disk_free_space($path)) .' '.lng('FreeOf').' '.fm_get_filesize(@disk_total_space($path)).''; ?> +
+
+ +
+ +
+ +
+ + + + +
+ +
+ += $time1 && $upd) { + return false; + } + } + $ok = copy($f1, $f2); + if ($ok) { + touch($f2, $time1); + } + return $ok; +} + +/** + * Get mime type + * @param string $file_path + * @return mixed|string + */ +function fm_get_mime_type($file_path) +{ + if (function_exists('finfo_open')) { + $finfo = finfo_open(FILEINFO_MIME_TYPE); + $mime = finfo_file($finfo, $file_path); + finfo_close($finfo); + return $mime; + } elseif (function_exists('mime_content_type')) { + return mime_content_type($file_path); + } elseif (!stristr(ini_get('disable_functions'), 'shell_exec')) { + $file = escapeshellarg($file_path); + $mime = shell_exec('file -bi ' . $file); + return $mime; + } else { + return '--'; + } +} + +/** + * HTTP Redirect + * @param string $url + * @param int $code + */ +function fm_redirect($url, $code = 302) +{ + header('Location: ' . $url, true, $code); + exit; +} + +/** + * Path traversal prevention and clean the url + * It replaces (consecutive) occurrences of / and \\ with whatever is in DIRECTORY_SEPARATOR, and processes /. and /.. fine. + * @param $path + * @return string + */ +function get_absolute_path($path) { + $path = str_replace(array('/', '\\'), DIRECTORY_SEPARATOR, $path); + $parts = array_filter(explode(DIRECTORY_SEPARATOR, $path), 'strlen'); + $absolutes = array(); + foreach ($parts as $part) { + if ('.' == $part) continue; + if ('..' == $part) { + array_pop($absolutes); + } else { + $absolutes[] = $part; + } + } + return implode(DIRECTORY_SEPARATOR, $absolutes); +} + +/** + * Clean path + * @param string $path + * @return string + */ +function fm_clean_path($path, $trim = true) +{ + $path = $trim ? trim($path) : $path; + $path = trim($path, '\\/'); + $path = str_replace(array('../', '..\\'), '', $path); + $path = get_absolute_path($path); + if ($path == '..') { + $path = ''; + } + return str_replace('\\', '/', $path); +} + +/** + * Get parent path + * @param string $path + * @return bool|string + */ +function fm_get_parent_path($path) +{ + $path = fm_clean_path($path); + if ($path != '') { + $array = explode('/', $path); + if (count($array) > 1) { + $array = array_slice($array, 0, -1); + return implode('/', $array); + } + return ''; + } + return false; +} + +/** + * Check file is in exclude list + * @param string $file + * @return bool + */ +function fm_is_exclude_items($file) { + $ext = strtolower(pathinfo($file, PATHINFO_EXTENSION)); + if (isset($exclude_items) and sizeof($exclude_items)) { + unset($exclude_items); + } + + $exclude_items = FM_EXCLUDE_ITEMS; + if (version_compare(PHP_VERSION, '7.0.0', '<')) { + $exclude_items = unserialize($exclude_items); + } + if (!in_array($file, $exclude_items) && !in_array("*.$ext", $exclude_items)) { + return true; + } + return false; +} + +/** + * get language translations from json file + * @param int $tr + * @return array + */ +function fm_get_translations($tr) { + try { + $content = @file_get_contents('translation.json'); + if($content !== FALSE) { + $lng = json_decode($content, TRUE); + global $lang_list; + foreach ($lng["language"] as $key => $value) + { + $code = $value["code"]; + $lang_list[$code] = $value["name"]; + if ($tr) + $tr[$code] = $value["translation"]; + } + return $tr; + } + + } + catch (Exception $e) { + echo $e; + } +} + +/** + * @param $file + * Recover all file sizes larger than > 2GB. + * Works on php 32bits and 64bits and supports linux + * @return int|string + */ +function fm_get_size($file) +{ + static $iswin; + static $isdarwin; + if (!isset($iswin)) { + $iswin = (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN'); + } + if (!isset($isdarwin)) { + $isdarwin = (strtoupper(substr(PHP_OS, 0)) == "DARWIN"); + } + + static $exec_works; + if (!isset($exec_works)) { + $exec_works = (function_exists('exec') && !ini_get('safe_mode') && @exec('echo EXEC') == 'EXEC'); + } + + // try a shell command + if ($exec_works) { + $arg = escapeshellarg($file); + $cmd = ($iswin) ? "for %F in (\"$file\") do @echo %~zF" : ($isdarwin ? "stat -f%z $arg" : "stat -c%s $arg"); + @exec($cmd, $output); + if (is_array($output) && ctype_digit($size = trim(implode("\n", $output)))) { + return $size; + } + } + + // try the Windows COM interface + if ($iswin && class_exists("COM")) { + try { + $fsobj = new COM('Scripting.FileSystemObject'); + $f = $fsobj->GetFile( realpath($file) ); + $size = $f->Size; + } catch (Exception $e) { + $size = null; + } + if (ctype_digit($size)) { + return $size; + } + } + + // if all else fails + return filesize($file); +} + +/** + * Get nice filesize + * @param int $size + * @return string + */ +function fm_get_filesize($size) +{ + $size = (float) $size; + $units = array('B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'); + $power = ($size > 0) ? floor(log($size, 1024)) : 0; + $power = ($power > (count($units) - 1)) ? (count($units) - 1) : $power; + return sprintf('%s %s', round($size / pow(1024, $power), 2), $units[$power]); +} + +/** + * Get director total size + * @param string $directory + * @return int + */ +function fm_get_directorysize($directory) { + global $calc_folder; + if ($calc_folder==true) { // Slower output + $size = 0; $count= 0; $dirCount= 0; + foreach(new RecursiveIteratorIterator(new RecursiveDirectoryIterator($directory)) as $file) + if ($file->isFile()) + { $size+=$file->getSize(); + $count++; + } + else if ($file->isDir()) { $dirCount++; } + // return [$size, $count, $dirCount]; + return $size; + } + else return 'Folder'; // Quick output +} + +/** + * Get info about zip archive + * @param string $path + * @return array|bool + */ +function fm_get_zif_info($path, $ext) { + if ($ext == 'zip' && function_exists('zip_open')) { + $arch = zip_open($path); + if ($arch) { + $filenames = array(); + while ($zip_entry = zip_read($arch)) { + $zip_name = zip_entry_name($zip_entry); + $zip_folder = substr($zip_name, -1) == '/'; + $filenames[] = array( + 'name' => $zip_name, + 'filesize' => zip_entry_filesize($zip_entry), + 'compressed_size' => zip_entry_compressedsize($zip_entry), + 'folder' => $zip_folder + //'compression_method' => zip_entry_compressionmethod($zip_entry), + ); + } + zip_close($arch); + return $filenames; + } + } elseif($ext == 'tar' && class_exists('PharData')) { + $archive = new PharData($path); + $filenames = array(); + foreach(new RecursiveIteratorIterator($archive) as $file) { + $parent_info = $file->getPathInfo(); + $zip_name = str_replace("phar://".$path, '', $file->getPathName()); + $zip_name = substr($zip_name, ($pos = strpos($zip_name, '/')) !== false ? $pos + 1 : 0); + $zip_folder = $parent_info->getFileName(); + $zip_info = new SplFileInfo($file); + $filenames[] = array( + 'name' => $zip_name, + 'filesize' => $zip_info->getSize(), + 'compressed_size' => $file->getCompressedSize(), + 'folder' => $zip_folder + ); + } + return $filenames; + } + return false; +} + +/** + * Encode html entities + * @param string $text + * @return string + */ +function fm_enc($text) +{ + return htmlspecialchars($text, ENT_QUOTES, 'UTF-8'); +} + +/** + * Prevent XSS attacks + * @param string $text + * @return string + */ +function fm_isvalid_filename($text) { + return (strpbrk($text, '/?%*:|"<>') === FALSE) ? true : false; +} + +/** + * Save message in session + * @param string $msg + * @param string $status + */ +function fm_set_msg($msg, $status = 'ok') +{ + $_SESSION[FM_SESSION_ID]['message'] = $msg; + $_SESSION[FM_SESSION_ID]['status'] = $status; +} + +/** + * Check if string is in UTF-8 + * @param string $string + * @return int + */ +function fm_is_utf8($string) +{ + return preg_match('//u', $string); +} + +/** + * Convert file name to UTF-8 in Windows + * @param string $filename + * @return string + */ +function fm_convert_win($filename) +{ + if (FM_IS_WIN && function_exists('iconv')) { + $filename = iconv(FM_ICONV_INPUT_ENC, 'UTF-8//IGNORE', $filename); + } + return $filename; +} + +/** + * @param $obj + * @return array + */ +function fm_object_to_array($obj) +{ + if (!is_object($obj) && !is_array($obj)) { + return $obj; + } + if (is_object($obj)) { + $obj = get_object_vars($obj); + } + return array_map('fm_object_to_array', $obj); +} + +/** + * Get CSS classname for file + * @param string $path + * @return string + */ +function fm_get_file_icon_class($path) +{ + // get extension + $ext = strtolower(pathinfo($path, PATHINFO_EXTENSION)); + + switch ($ext) { + case 'ico': + case 'gif': + case 'jpg': + case 'jpeg': + case 'jpc': + case 'jp2': + case 'jpx': + case 'xbm': + case 'wbmp': + case 'png': + case 'bmp': + case 'tif': + case 'tiff': + case 'webp': + case 'avif': + case 'svg': + $img = 'fa fa-picture-o'; + break; + case 'passwd': + case 'ftpquota': + case 'sql': + case 'js': + case 'json': + case 'sh': + case 'config': + case 'twig': + case 'tpl': + case 'md': + case 'gitignore': + case 'c': + case 'cpp': + case 'cs': + case 'py': + case 'rs': + case 'map': + case 'lock': + case 'dtd': + $img = 'fa fa-file-code-o'; + break; + case 'txt': + case 'ini': + case 'conf': + case 'log': + case 'htaccess': + $img = 'fa fa-file-text-o'; + break; + case 'css': + case 'less': + case 'sass': + case 'scss': + $img = 'fa fa-css3'; + break; + case 'bz2': + case 'zip': + case 'rar': + case 'gz': + case 'tar': + case '7z': + case 'xz': + $img = 'fa fa-file-archive-o'; + break; + case 'php': + case 'php4': + case 'php5': + case 'phps': + case 'phtml': + $img = 'fa fa-code'; + break; + case 'htm': + case 'html': + case 'shtml': + case 'xhtml': + $img = 'fa fa-html5'; + break; + case 'xml': + case 'xsl': + $img = 'fa fa-file-excel-o'; + break; + case 'wav': + case 'mp3': + case 'mp2': + case 'm4a': + case 'aac': + case 'ogg': + case 'oga': + case 'wma': + case 'mka': + case 'flac': + case 'ac3': + case 'tds': + $img = 'fa fa-music'; + break; + case 'm3u': + case 'm3u8': + case 'pls': + case 'cue': + case 'xspf': + $img = 'fa fa-headphones'; + break; + case 'avi': + case 'mpg': + case 'mpeg': + case 'mp4': + case 'm4v': + case 'flv': + case 'f4v': + case 'ogm': + case 'ogv': + case 'mov': + case 'mkv': + case '3gp': + case 'asf': + case 'wmv': + $img = 'fa fa-file-video-o'; + break; + case 'eml': + case 'msg': + $img = 'fa fa-envelope-o'; + break; + case 'xls': + case 'xlsx': + case 'ods': + $img = 'fa fa-file-excel-o'; + break; + case 'csv': + $img = 'fa fa-file-text-o'; + break; + case 'bak': + case 'swp': + $img = 'fa fa-clipboard'; + break; + case 'doc': + case 'docx': + case 'odt': + $img = 'fa fa-file-word-o'; + break; + case 'ppt': + case 'pptx': + $img = 'fa fa-file-powerpoint-o'; + break; + case 'ttf': + case 'ttc': + case 'otf': + case 'woff': + case 'woff2': + case 'eot': + case 'fon': + $img = 'fa fa-font'; + break; + case 'pdf': + $img = 'fa fa-file-pdf-o'; + break; + case 'psd': + case 'ai': + case 'eps': + case 'fla': + case 'swf': + $img = 'fa fa-file-image-o'; + break; + case 'exe': + case 'msi': + $img = 'fa fa-file-o'; + break; + case 'bat': + $img = 'fa fa-terminal'; + break; + default: + $img = 'fa fa-info-circle'; + } + + return $img; +} + +/** + * Get image files extensions + * @return array + */ +function fm_get_image_exts() +{ + return array('ico', 'gif', 'jpg', 'jpeg', 'jpc', 'jp2', 'jpx', 'xbm', 'wbmp', 'png', 'bmp', 'tif', 'tiff', 'psd', 'svg', 'webp', 'avif'); +} + +/** + * Get video files extensions + * @return array + */ +function fm_get_video_exts() +{ + return array('avi', 'webm', 'wmv', 'mp4', 'm4v', 'ogm', 'ogv', 'mov', 'mkv'); +} + +/** + * Get audio files extensions + * @return array + */ +function fm_get_audio_exts() +{ + return array('wav', 'mp3', 'ogg', 'm4a'); +} + +/** + * Get text file extensions + * @return array + */ +function fm_get_text_exts() +{ + return array( + 'txt', 'css', 'ini', 'conf', 'log', 'htaccess', 'passwd', 'ftpquota', 'sql', 'js', 'json', 'sh', 'config', + 'php', 'php4', 'php5', 'phps', 'phtml', 'htm', 'html', 'shtml', 'xhtml', 'xml', 'xsl', 'm3u', 'm3u8', 'pls', 'cue', + 'eml', 'msg', 'csv', 'bat', 'twig', 'tpl', 'md', 'gitignore', 'less', 'sass', 'scss', 'c', 'cpp', 'cs', 'py', + 'map', 'lock', 'dtd', 'svg', 'scss', 'asp', 'aspx', 'asx', 'asmx', 'ashx', 'jsx', 'jsp', 'jspx', 'cfm', 'cgi' + ); +} + +/** + * Get mime types of text files + * @return array + */ +function fm_get_text_mimes() +{ + return array( + 'application/xml', + 'application/javascript', + 'application/x-javascript', + 'image/svg+xml', + 'message/rfc822', + ); +} + +/** + * Get file names of text files w/o extensions + * @return array + */ +function fm_get_text_names() +{ + return array( + 'license', + 'readme', + 'authors', + 'contributors', + 'changelog', + ); +} + +/** + * Get online docs viewer supported files extensions + * @return array + */ +function fm_get_onlineViewer_exts() +{ + return array('doc', 'docx', 'xls', 'xlsx', 'pdf', 'ppt', 'pptx', 'ai', 'psd', 'dxf', 'xps', 'rar', 'odt', 'ods'); +} + +function fm_get_file_mimes($extension) +{ + $fileTypes['swf'] = 'application/x-shockwave-flash'; + $fileTypes['pdf'] = 'application/pdf'; + $fileTypes['exe'] = 'application/octet-stream'; + $fileTypes['zip'] = 'application/zip'; + $fileTypes['doc'] = 'application/msword'; + $fileTypes['xls'] = 'application/vnd.ms-excel'; + $fileTypes['ppt'] = 'application/vnd.ms-powerpoint'; + $fileTypes['gif'] = 'image/gif'; + $fileTypes['png'] = 'image/png'; + $fileTypes['jpeg'] = 'image/jpg'; + $fileTypes['jpg'] = 'image/jpg'; + $fileTypes['webp'] = 'image/webp'; + $fileTypes['avif'] = 'image/avif'; + $fileTypes['rar'] = 'application/rar'; + + $fileTypes['ra'] = 'audio/x-pn-realaudio'; + $fileTypes['ram'] = 'audio/x-pn-realaudio'; + $fileTypes['ogg'] = 'audio/x-pn-realaudio'; + + $fileTypes['wav'] = 'video/x-msvideo'; + $fileTypes['wmv'] = 'video/x-msvideo'; + $fileTypes['avi'] = 'video/x-msvideo'; + $fileTypes['asf'] = 'video/x-msvideo'; + $fileTypes['divx'] = 'video/x-msvideo'; + + $fileTypes['mp3'] = 'audio/mpeg'; + $fileTypes['mp4'] = 'audio/mpeg'; + $fileTypes['mpeg'] = 'video/mpeg'; + $fileTypes['mpg'] = 'video/mpeg'; + $fileTypes['mpe'] = 'video/mpeg'; + $fileTypes['mov'] = 'video/quicktime'; + $fileTypes['swf'] = 'video/quicktime'; + $fileTypes['3gp'] = 'video/quicktime'; + $fileTypes['m4a'] = 'video/quicktime'; + $fileTypes['aac'] = 'video/quicktime'; + $fileTypes['m3u'] = 'video/quicktime'; + + $fileTypes['php'] = ['application/x-php']; + $fileTypes['html'] = ['text/html']; + $fileTypes['txt'] = ['text/plain']; + //Unknown mime-types should be 'application/octet-stream' + if(empty($fileTypes[$extension])) { + $fileTypes[$extension] = ['application/octet-stream']; + } + return $fileTypes[$extension]; +} + +/** + * This function scans the files and folder recursively, and return matching files + * @param string $dir + * @param string $filter + * @return json + */ + function scan($dir, $filter = '') { + $path = FM_ROOT_PATH.'/'.$dir; + if($dir) { + $ite = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path)); + $rii = new RegexIterator($ite, "/(" . $filter . ")/i"); + + $files = array(); + foreach ($rii as $file) { + if (!$file->isDir()) { + $fileName = $file->getFilename(); + $location = str_replace(FM_ROOT_PATH, '', $file->getPath()); + $files[] = array( + "name" => $fileName, + "type" => "file", + "path" => $location, + ); + } + } + return $files; + } +} + +/* +Parameters: downloadFile(File Location, File Name, +max speed, is streaming +If streaming - videos will show as videos, images as images +instead of download prompt +https://stackoverflow.com/a/13821992/1164642 +*/ + +function fm_download_file($fileLocation, $fileName, $chunkSize = 1024) +{ + if (connection_status() != 0) + return (false); + $extension = pathinfo($fileName, PATHINFO_EXTENSION); + + $contentType = fm_get_file_mimes($extension); + header("Cache-Control: public"); + header("Content-Transfer-Encoding: binary\n"); + header('Content-Type: $contentType'); + + $contentDisposition = 'attachment'; + + + if (strstr($_SERVER['HTTP_USER_AGENT'], "MSIE")) { + $fileName = preg_replace('/\./', '%2e', $fileName, substr_count($fileName, '.') - 1); + header("Content-Disposition: $contentDisposition;filename=\"$fileName\""); + } else { + header("Content-Disposition: $contentDisposition;filename=\"$fileName\""); + } + + header("Accept-Ranges: bytes"); + $range = 0; + $size = filesize($fileLocation); + + if (isset($_SERVER['HTTP_RANGE'])) { + list($a, $range) = explode("=", $_SERVER['HTTP_RANGE']); + str_replace($range, "-", $range); + $size2 = $size - 1; + $new_length = $size - $range; + header("HTTP/1.1 206 Partial Content"); + header("Content-Length: $new_length"); + header("Content-Range: bytes $range$size2/$size"); + } else { + $size2 = $size - 1; + header("Content-Range: bytes 0-$size2/$size"); + header("Content-Length: " . $size); + } + + if ($size == 0) { + die('Zero byte file! Aborting download'); + } + @ini_set('magic_quotes_runtime', 0); + $fp = fopen("$fileLocation", "rb"); + + fseek($fp, $range); + + while (!feof($fp) and (connection_status() == 0)) { + set_time_limit(0); + print(@fread($fp, 1024*$chunkSize)); + flush(); + ob_flush(); + // sleep(1); + } + fclose($fp); + + return ((connection_status() == 0) and !connection_aborted()); +} + +function fm_get_theme() { + $result = ''; + if(FM_THEME == "dark") { + $result = "text-white bg-dark"; + } + return $result; +} + +/** + * Class to work with zip files (using ZipArchive) + */ +class FM_Zipper +{ + private $zip; + + public function __construct() + { + $this->zip = new ZipArchive(); + } + + /** + * Create archive with name $filename and files $files (RELATIVE PATHS!) + * @param string $filename + * @param array|string $files + * @return bool + */ + public function create($filename, $files) + { + $res = $this->zip->open($filename, ZipArchive::CREATE); + if ($res !== true) { + return false; + } + if (is_array($files)) { + foreach ($files as $f) { + if (!$this->addFileOrDir($f)) { + $this->zip->close(); + return false; + } + } + $this->zip->close(); + return true; + } else { + if ($this->addFileOrDir($files)) { + $this->zip->close(); + return true; + } + return false; + } + } + + /** + * Extract archive $filename to folder $path (RELATIVE OR ABSOLUTE PATHS) + * @param string $filename + * @param string $path + * @return bool + */ + public function unzip($filename, $path) + { + $res = $this->zip->open($filename); + if ($res !== true) { + return false; + } + if ($this->zip->extractTo($path)) { + $this->zip->close(); + return true; + } + return false; + } + + /** + * Add file/folder to archive + * @param string $filename + * @return bool + */ + private function addFileOrDir($filename) + { + if (is_file($filename)) { + return $this->zip->addFile($filename); + } elseif (is_dir($filename)) { + return $this->addDir($filename); + } + return false; + } + + /** + * Add folder recursively + * @param string $path + * @return bool + */ + private function addDir($path) + { + if (!$this->zip->addEmptyDir($path)) { + return false; + } + $objects = scandir($path); + if (is_array($objects)) { + foreach ($objects as $file) { + if ($file != '.' && $file != '..') { + if (is_dir($path . '/' . $file)) { + if (!$this->addDir($path . '/' . $file)) { + return false; + } + } elseif (is_file($path . '/' . $file)) { + if (!$this->zip->addFile($path . '/' . $file)) { + return false; + } + } + } + } + return true; + } + return false; + } +} + +/** + * Class to work with Tar files (using PharData) + */ +class FM_Zipper_Tar +{ + private $tar; + + public function __construct() + { + $this->tar = null; + } + + /** + * Create archive with name $filename and files $files (RELATIVE PATHS!) + * @param string $filename + * @param array|string $files + * @return bool + */ + public function create($filename, $files) + { + $this->tar = new PharData($filename); + if (is_array($files)) { + foreach ($files as $f) { + if (!$this->addFileOrDir($f)) { + return false; + } + } + return true; + } else { + if ($this->addFileOrDir($files)) { + return true; + } + return false; + } + } + + /** + * Extract archive $filename to folder $path (RELATIVE OR ABSOLUTE PATHS) + * @param string $filename + * @param string $path + * @return bool + */ + public function unzip($filename, $path) + { + $res = $this->tar->open($filename); + if ($res !== true) { + return false; + } + if ($this->tar->extractTo($path)) { + return true; + } + return false; + } + + /** + * Add file/folder to archive + * @param string $filename + * @return bool + */ + private function addFileOrDir($filename) + { + if (is_file($filename)) { + try { + $this->tar->addFile($filename); + return true; + } catch (Exception $e) { + return false; + } + } elseif (is_dir($filename)) { + return $this->addDir($filename); + } + return false; + } + + /** + * Add folder recursively + * @param string $path + * @return bool + */ + private function addDir($path) + { + $objects = scandir($path); + if (is_array($objects)) { + foreach ($objects as $file) { + if ($file != '.' && $file != '..') { + if (is_dir($path . '/' . $file)) { + if (!$this->addDir($path . '/' . $file)) { + return false; + } + } elseif (is_file($path . '/' . $file)) { + try { + $this->tar->addFile($path . '/' . $file); + } catch (Exception $e) { + return false; + } + } + } + } + return true; + } + return false; + } +} + + + +/** + * Save Configuration + */ + class FM_Config +{ + var $data; + + function __construct() + { + global $root_path, $root_url, $CONFIG; + $fm_url = $root_url.$_SERVER["PHP_SELF"]; + $this->data = array( + 'lang' => 'en', + 'error_reporting' => true, + 'show_hidden' => true + ); + $data = false; + if (strlen($CONFIG)) { + $data = fm_object_to_array(json_decode($CONFIG)); + } else { + $msg = 'Tiny File Manager
Error: Cannot load configuration'; + if (substr($fm_url, -1) == '/') { + $fm_url = rtrim($fm_url, '/'); + $msg .= '
'; + $msg .= '
Seems like you have a trailing slash on the URL.'; + $msg .= '
Try this link: ' . $fm_url . ''; + } + die($msg); + } + if (is_array($data) && count($data)) $this->data = $data; + else $this->save(); + } + + function save() + { + $fm_file = __FILE__; + $var_name = '$CONFIG'; + $var_value = var_export(json_encode($this->data), true); + $config_string = " + + ' . $_SESSION[FM_SESSION_ID]['message'] . '

'; + unset($_SESSION[FM_SESSION_ID]['message']); + unset($_SESSION[FM_SESSION_ID]['status']); + } +} + +/** + * Show page header in Login Form + */ +function fm_show_header_login() +{ +$sprites_ver = '20160315'; +header("Content-Type: text/html; charset=utf-8"); +header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); +header("Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0"); +header("Pragma: no-cache"); + +global $lang, $root_url, $favicon_path; +?> + + + + + + + + + + '; } ?> + <?php echo fm_enc(APP_TITLE) ?> + + + +"> +
+ + +
+ + + + + + + + + + + + + + + '; } ?> + <?php echo fm_enc(APP_TITLE) ?> + + + + + + + + + + + + "> +
+ + + + + + + + + +
+ + + + + + + + + + + + + +
+ + + diff --git a/scripts/filemanager/translation.json b/scripts/filemanager/translation.json new file mode 100644 index 0000000..2867e63 --- /dev/null +++ b/scripts/filemanager/translation.json @@ -0,0 +1,2231 @@ +{ + "appName": "Tiny File Manager", + "version": "2.4.6", + "language": [ + { + "name": "Romanian", + "code": "ro", + "translation": { + "AppName": "Tiny File Manager", + "AppTitle": "Titlu aplicatie", + "Login": "Logare", + "Username": "Nume utilizator", + "Password": "Parola", + "Logout": "Delogare", + "Move": "Muta", + "Copy": "Copiaza", + "Save": "Salveaza", + "SelectAll": "Selecteaza Tot", + "UnSelectAll": "Deselecteaza Tot", + "File": "Fisier", + "Back": "Inapoi", + "Size": "Marime", + "Perms": "Permisiuni", + "Modified": "Modificat", + "Owner": "Titular", + "Search": "Cauta", + "NewItem": "Nou", + "Folder": "Dosar", + "Delete": "Sterge", + "Rename": "Redenumeste", + "CopyTo": "Copiaza In", + "DirectLink": "Link Direct", + "UploadingFiles": "Incarca Fisiere", + "ChangePermissions": "Schimba Permisiuni", + "Copying": "Copiaza", + "CreateNewItem": "Creeaza Obiect Nou", + "Name": "Nume", + "AdvancedEditor": "Editor Avansat", + "RememberMe": "Tine-ma Minte", + "Actions": "Actiuni", + "Upload": "Incarca", + "Cancel": "Anuleaza", + "InvertSelection": "Selectare Inversa", + "DestinationFolder": "Dosar Destinatie", + "ItemType": "Tip Obiect", + "ItemName": "Nume obiect", + "CreateNow": "Creeaza Acum", + "Download": "Descarca", + "Open": "Deschide", + "UnZip": "Decomprima", + "UnZipToFolder": "Decomprima in Dosar", + "Edit": "Editeaza", + "NormalEditor": "Editor Standard", + "BackUp": "Copie de Siguranta", + "SourceFolder": "Dosar Sursa", + "Files": "Fisiere", + "Change": "Schimba", + "Settings": "Setari", + "Language": "Limba", + "MemoryUsed": "Memorie Utilizata", + "PartitionSize": "Dimensiune Partitie", + "ErrorReporting": "Raportare de Erori", + "ShowHiddenFiles": "Arata Fisiere Ascunse", + "Full size": "Dimensiune Totala", + "Help": "Ajutor", + "Free of": "Liber din", + "Preview": "Previzualizeaza", + "Help Documents": "Documentatie", + "Report Issue": "Raporteaza o Problema", + "Generate": "Genereaza", + "FullSize": "Marime Maxima", + "FreeOf": "Liber din", + "CalculateFolderSize": "Calculeaza spatiul acupat de dosar", + "ProcessID": "Id instanta", + "Created": "Creat", + "HideColumns": "Ascunde Coloanele", + "Folder is empty": "Dosarul este gol", + "Check Latest Version": "Verifica ultima versiune", + "Generate new password hash": "Genereaza hash nou parola", + "You are logged in": "Sunteti logat/a", + "Login failed. Invalid username or password": "Autentificare esuata. Credentialele nu sunt valide (utilizator/parola)", + "password_hash not supported, Upgrade PHP version": "Generare hash parola nesuportata, actualizati interpretorul PHP de pe server" + } + }, + { + "name": "Hungarian", + "code": "hu", + "translation": { + "AppName": "Tiny File Manager", + "AppTitle": "Fájl kezelő", + "Login": "Bejelentkezés", + "Username": "Felhasználói név", + "Password": "Jelszó", + "Logout": "Kijelentkezés", + "Move": "Mozgatás", + "Copy": "Másolás", + "Save": "Mentés", + "SelectAll": "Mindet kijelöl", + "UnSelectAll": "Kijelölést megszüntet", + "File": "Fájl", + "Back": "Vissza", + "Size": "Méret", + "Perms": "Jogok", + "Modified": "Módosítás", + "Owner": "Tulajdonos", + "Search": "Keresés", + "NewItem": "Új", + "Folder": "Könyvtár", + "Delete": "Törlés", + "Rename": "Átnevezés", + "CopyTo": "Másolás ide", + "DirectLink": "Közvetlen link", + "UploadingFiles": "Fájlok feltöltése", + "ChangePermissions": "Jogosultságok módosítása", + "Copying": "Másolás", + "CreateNewItem": "Új létrehozása", + "Name": "Név", + "AdvancedEditor": "Haladó szerkesztő", + "RememberMe": "Emlékezzen rám", + "Actions": "Műveletek", + "Upload": "Feltöltés", + "Cancel": "Mégsem", + "InvertSelection": "Kijelöltés megfordítása", + "DestinationFolder": "Célmappa", + "ItemType": "Elem típus", + "ItemName": "Elem név", + "CreateNow": "Elkészít", + "Download": "Letöltés", + "Open": "Megnyitás", + "UnZip": "Kitömörítés", + "UnZipToFolder": "Kitömörítás adott mappába", + "Edit": "Szerkesztés", + "NormalEditor": "Alap szerkesztő", + "BackUp": "Biztonsági mentés", + "SourceFolder": "Forrás könyvtár", + "Files": "Szűrő", + "Change": "Módosítás", + "Settings": "Beállítások", + "Language": "Nyelv", + "MemoryUsed": "Használt memória", + "PartitionSize": "Partició mérete", + "ErrorReporting": "Hibabejelntés", + "ShowHiddenFiles": "Rejtett fájlok megjelenítése", + "Full size": "Teljes méret", + "Help": "Segítség", + "Free of": "ebből szabaf", + "Preview": "Előnézet", + "Help Documents": "Súgó dokumentum", + "Report Issue": "Probléma jelentése", + "Generate": "Generálás", + "FullSize": "Teljes méret", + "FreeOf": "ebből szabad", + "CalculateFolderSize": "Becsült mappa méret", + "ProcessID": "Folyamat azonosító", + "Created": "Készítés", + "HideColumns": "Oszlopok elrejtése", + "Folder is empty": "A mappa üres", + "Check Latest Version": "Új verzió ellenőrzése", + "Generate new password hash": "Új jelszó hash létrehozása", + "You are logged in": "Ön sikeresen bejelentkezett", + "Login failed. Invalid username or password": "Sikertelen bejelentkezés. Hibás felhasználói név vagy jelszó.", + "password_hash not supported, Upgrade PHP version": "password_hash ebben a PHP verzióban nem támogatott" + } + }, + { + "name": "Norsk", + "code": "no", + "translation": { + "AppName": "Tiny File Manager", + "AppTitle": "Fil behandler", + "Login": "Logg inn", + "Username": "Brukernavn", + "Password": "Passord", + "Logout": "Logg ut", + "Move": "Flytt", + "Copy": "Kopier", + "Save": "Lagre", + "SelectAll": "Velg alt", + "UnSelectAll": "Av velg alt", + "File": "Fil", + "Back": "Tilbake", + "Size": "Størelse", + "Perms": "Uprawnienia", + "Modified": "Endret", + "Owner": "Eier", + "Search": "Søk", + "NewItem": "Ny", + "Folder": "Mappe", + "Delete": "Slett", + "Rename": "Gi nytt navn", + "CopyTo": "Kopier til", + "DirectLink": "Direktelink", + "UploadingFiles": "Laster opp filer", + "ChangePermissions": "Endre rettigheter", + "Copying": "Kopierer", + "CreateNewItem": "Lag ny", + "Name": "Navn", + "AdvancedEditor": "Avansert Tekstbehandler", + "RememberMe": "Husk meg", + "Actions": "Handlinger", + "Upload": "Last opp", + "Cancel": "Avbryt", + "InvertSelection": "Inverter valgte", + "DestinationFolder": "Målmappe", + "ItemType": "Filtype", + "ItemName": "Filnavn", + "CreateNow": "Lag nå", + "Download": "Last ned", + "Open": "Åpne", + "UnZip": "Pakk ut", + "UnZipToFolder": "Pakk ut til mappe", + "Edit": "Endre", + "NormalEditor": "Normal Tekstbehandler", + "BackUp": "Sikkerhetskopier", + "SourceFolder": "Kildemappe", + "Files": "Filer", + "Change": "Endre", + "Settings": "Instillinger", + "Language": "Språk", + "MemoryUsed": "Minne brukt", + "PartitionSize": "Partitions størrelse", + "ErrorReporting": "Error raportering", + "ShowHiddenFiles": "Vis skjulte filer", + "Full size": "Mappe størelse", + "Help": "Hjelp", + "Free of": "Ledig av", + "Preview": "Forhåndsvisning", + "Help Documents": "Help dokumenter", + "Report Issue": "Raporter problem", + "Generate": "Generer", + "FullSize": "Mappe størelse", + "FreeOf": "ledig av", + "CalculateFolderSize": "Kalkuler mappestørelse", + "ProcessID": "Prosess ID", + "Created": "Opprettet", + "HideColumns": "Skjul tilganger/eier kolonner", + "Folder is empty": "Mappen er tom", + "Check Latest Version": "Se etter oppdateringer", + "Generate new password hash": "Generer en ny passord hash", + "You are logged in": "Du er innlogget", + "Login failed. Invalid username or password": "Innlogging feilet. Feil brukernavn eller passord", + "password_hash not supported, Upgrade PHP version": "password_hash er ikke støttet, venligst oppdater PHP versjonen" + } + }, + { + "name": "فارسی", + "code": "Fa", + "translation": { + "Tiny File Manager": "مدیریت فایل کوچک", + "File Manager": "مدیریت فایل", + "Sign in": "ورود", + "Username": "نام کاربری", + "Password": "گذرواژه", + "Sign Out": "خروج", + "Move": "جابجایی", + "Copy": "کپی", + "Save": "ذخیره", + "Select all": "انتخاب همه", + "Unselect all": "انتخاب نکردن همه", + "File": "فایل", + "Back": "برگشت", + "Size": "حجم", + "Perms": "دسترسی", + "Modified": "ویرایش شده", + "Owner": "مالک", + "Search": "جستجو", + "New Item": "افزودن", + "Folder": "پوشه", + "Delete": "حذف", + "Rename": "تغییر نام", + "Copy to": "کپی در", + "Direct link": "لینک مستقیم", + "Upload Files": "اپلود فایل ها", + "Change Permissions": "تغییر دسترسی", + "Copying": "کپی کردن", + "Create New Item": "افزودن", + "Name": "نام", + "Advanced Editor": "ویرایشگر پیشرفته", + "Remember Me": "مرا به خاطر داشته باشe", + "Actions": "اکشن", + "Upload": "آپلود", + "Cancel": "انصراف", + "Invert Selection": "معکوس کردن انتخاب ها", + "Destination Folder": "پوشه مقصد", + "Item Type": "نوع مورد", + "Item Name": "نام مورد", + "Create Now": "ایجاد در الان", + "Download": "دانلود", + "Open": "باز کردن", + "UnZip": "UnZip", + "UnZip to folder": "خارج کردن از حالت فشرده", + "Edit": "ویرایش", + "Normal Editor": "ویرایش معمولی", + "Back Up": "برگشت بالا", + "Source Folder": "منبه پوشه", + "Files": "فایل ها", + "Change": "تغییر", + "Settings": "تنظیمات", + "Language": "زبان", + "Memory used": "حافظه استفاده شده", + "Partition size": "حجم پارتیشن", + "Error Reporting": "گزارش خطا", + "Show Hidden Files": "نمایش فایل های مخفی", + "Full size": "فضا پر است", + "Help": "راهنما", + "Free of": "خالیی از", + "Preview": "پیشنمایش", + "Help Documents": "مستندات کمکی", + "Report Issue": "گزارش مشکل", + "Generate": "ایجاد", + "Full Size": "تمام حجم", + "free of": "خالی از", + "Calculate folder size": "محاسبه حجم پوشه", + "Check Latest Version": "بررسی آخرین نسخه", + "Generate new password hash": "ایجاد گذرواژه جدید", + "Hide Perms/Owner columns": "مخفی کردن ستون های دسترسی و مالک" + } + }, + { + "name": "Русский", + "code": "ru", + "translation": { + "Actions": "Действия", + "AdvancedEditor": "Улучшенный редактор", + "AppName": "Файловый менеджер", + "AppTitle": "Файловый менеджер", + "Back": "Вернуться", + "BackUp": "Резервная копия", + "Cancel": "Отмена", + "Change": "Изменения", + "ChangePermissions": "Изменить права", + "Check Latest Version": "Проверить последнюю версию", + "Copy": "Копировать", + "Copying": "Копировать", + "CopyTo": "Скопировать в", + "CreateNewItem": "Создать новый", + "CreateNow": "Создать сейчас", + "Delete": "Удалить", + "DestinationFolder": "Папка назначения", + "DirectLink": "Ссылка", + "Download": "Загрузка", + "Edit": "Редактировать", + "File": "Файл", + "Files": "Файлы", + "Folder": "Папка", + "FreeOf": "свободно из", + "FullSize": "Размер файлов в папке", + "Generate": "Сгенерировать", + "Generate new password hash": "Сгенерировать хеш нового пароля", + "Help": "Помощь", + "Help Documents": "Справочная документация", + "InvertSelection": "Обратная выборка", + "ItemName": "Имя элемента", + "ItemType": "Тип элемента", + "Language": "Язык", + "Login": "Войти", + "Logout": "Выйти", + "MemoryUsed": "Используемая память", + "Modified": "Обновление", + "Move": "Переместить", + "Name": "Имя", + "NewItem": "Создать", + "NormalEditor": "Стандартный редактор", + "Open": "Открыть", + "Owner": "Создатель", + "PartitionSize": "Размер раздела", + "Password": "Пароль", + "Perms": "Права доступа", + "RememberMe": "Запомнить меня", + "Rename": "Переименовать", + "Report Issue": "Сообщить о проблеме", + "Save": "Сохранить", + "Search": "Поиск", + "SelectAll": "Выбрать всё", + "Settings": "Свойства", + "Size": "Размер", + "SourceFolder": "Исходная папка", + "UnSelectAll": "Отменить выбор", + "UnZip": "Разархивировать", + "UnZipToFolder": "Разархивировать в папку", + "Upload": "Загрузить", + "UploadingFiles": "Загрузка файлов", + "Username": "Пользователь" + } + }, + { + "name": "Italiano", + "code": "it", + "translation": { + "AppName": "Tiny File Manager", + "AppTitle": "File Manager", + "Login": "Connettiti", + "Username": "Username", + "Password": "Password", + "Logout": "Disconnettiti", + "Copy": "Copia", + "Save": "Salva", + "SelectAll": "Seleziona tutto", + "UnSelectAll": "Deseleziona tutto", + "File": "File", + "Back": "Indietro", + "Size": "Dimensione", + "Perms": "Permessi", + "Modified": "Ultima modifica", + "Owner": "Proprietario", + "Search": "Cerca", + "NewItem": "Nuovo", + "Folder": "Cartelle", + "Delete": "Elimina", + "Rename": "Rinomina", + "CopyTo": "Copia su", + "DirectLink": "Link diretto", + "UploadingFiles": "Caricamento file", + "ChangePermissions": "Modifica permessi", + "Copying": "Copia in corso", + "CreateNewItem": "Nuovo", + "Name": "Nome", + "AdvancedEditor": "Editor avanzato", + "RememberMe": "Ricordami", + "Actions": "Azioni", + "Upload": "Carica", + "Cancel": "Annulla", + "InvertSelection": "Inverti selezione", + "DestinationFolder": "Cartella di destinazione", + "ItemType": "Tipo elemento", + "ItemName": "Nome", + "CreateNow": "Crea", + "Download": "Scarica", + "Open": "Apri", + "UnZip": "Decomprimi", + "UnZipToFolder": "Decomprimi in una cartella", + "Edit": "Modifica", + "NormalEditor": "Editor normale", + "BackUp": "Backup", + "SourceFolder": "Cartella di origine", + "Files": "File", + "Move": "Sposta", + "Change": "Cambia", + "Settings": "Impostazioni", + "Language": "Lingua", + "MemoryUsed": "Memoria utilizzata", + "PartitionSize": "Dimensione del disco", + "ErrorReporting": "Segnala errori", + "ShowHiddenFiles": "Mostra file nascosti", + "FullSize": "Dimensione cartella", + "Full size": "Dimensione cartella", + "Free of": "liberi su", + "FreeOf": "liberi su", + "Help Documents": "Documentazione", + "Generate": "Genera", + "HideColumns": "Nascondi le colonne dei permessi e del proprietario", + "Check Latest Version": "Scarica l'ultima versione", + "Help": "Aiuto", + "Preview": "Anteprima", + "Report Issue": "Segnala un problema", + "CalculateFolderSize": "Calcola dimensione della cartella", + "Generate new password hash": "Genera un nuovo hash della password" + } + }, + { + "name": "Français", + "code": "fr", + "translation": { + "Actions": "Actions", + "AdvancedEditor": "Editeur avancé", + "AppName": "Tiny File Manager", + "AppTitle": "Gestionnaire de fichiers", + "Back": "Retour", + "BackUp": "Sauvegarder", + "CalculateFolderSize": "Calculer la taille des dossiers", + "Cancel": "Annuler", + "Change": "Modifier", + "ChangePermissions": "Modifier les permissions", + "Check Latest Version": "Vérifier si une nouvelle version existe", + "Copy": "Copier", + "Copying": "Copier", + "CopyTo": "Copier vers", + "CreateNewItem": "Créer un nouvel élément", + "CreateNow": "Créer", + "Delete": "Supprimer", + "DestinationFolder": "Dossier destination", + "DirectLink": "Lien direct", + "Download": "Télécharger", + "Edit": "Editeur", + "ErrorReporting": "Rapport d'erreurs", + "File": "Fichier", + "Files": "Fichiers", + "Folder": "Dossier", + "Free of": "libres sur", + "FreeOf": "Espace libre : ", + "Full size": "Taille totale", + "Generate": "Générer", + "Generate new password hash": "Générer de nouveaux mots de passe 'hashés'", + "Help": "Aide", + "Help Documents": "Documentation", + "HideColumns": "Masquer les colonnes des droits", + "InvertSelection": "Inverser la sélection", + "ItemName": "Nom de l'élément", + "ItemType": "Type d'élement", + "Language": "Langue", + "Login": "Connexion", + "Logout": "Déconnexion", + "MemoryUsed": "Mémoire utilisée", + "Modified": "Modifié le", + "Move": "Déplacer", + "Name": "Nom", + "NewItem": "Nouvel élément", + "NormalEditor": "Éditeur normal", + "Open": "Ouvrir", + "Owner": "Propriétaire", + "PartitionSize": "Taille de la partition", + "Password": "Mot de passe", + "Perms": "Permissions", + "ProcessID": "Identifiant processus", + "RememberMe": "Se souvenir de moi", + "Rename": "Renommer", + "Save": "Sauvegarder", + "Search": "Recherche", + "SelectAll": "Tout sélectionner", + "Settings": "Réglages", + "ShowHiddenFiles": "Afficher les fichiers masqués", + "Size": "Taille", + "SourceFolder": "Dossier Source", + "UnSelectAll": "Tout déselectionner", + "Upload": "Envoyer", + "UploadingFiles": "Envoyer des fichiers", + "Username": "Utilisateur", + "UnZip": "Décompresser", + "UnZipToFolder": "Décompresser dans un dossier", + "You are logged in": "Vous êtes authentifié(e)" + } + }, + { + "name": "Español", + "code": "es", + "translation": { + "AppName": "Pequeño Administrador de Archivos", + "AppTitle": "Administrador de Archivos", + "Login": "Iniciar Sesión", + "Username": "Nombre de Usuario", + "Password": "Contraseña", + "Logout": "Desconectarse", + "Move": "Mover", + "Copy": "Copiar", + "Save": "Guardar", + "SelectAll": "Seleccionar Todo", + "UnSelectAll": "Des-seleccionar Todo", + "File": "Archivo", + "Back": "Atrás", + "Size": "Tamaño", + "Perms": "Permisos", + "Modified": "Modificado", + "Owner": "Propietario", + "Search": "Buscar", + "NewItem": "Nuevo Ítem", + "Folder": "Carpeta", + "Delete": "Borrar", + "Rename": "Cambiar Nombre", + "CopyTo": "Copiar en", + "DirectLink": "Link Directo", + "UploadingFiles": "Subir Archivos", + "ChangePermissions": "Cambiar Permisos", + "Copying": "Copiando", + "CreateNewItem": "Crear nuevo Item", + "Name": "Nombre", + "AdvancedEditor": "Editor Avanzado", + "RememberMe": "Recuérdame", + "Actions": "Acciones", + "Upload": "Subir", + "Cancel": "Cancelar", + "InvertSelection": "Invertir Selección", + "DestinationFolder": "Carpeta Destino", + "ItemType": "Tipo de Ítem", + "ItemName": "Nombre del Ítem", + "CreateNow": "Crear", + "Download": "Descargar", + "Open": "Abrir", + "UnZip": "Descomprimir", + "UnZipToFolder": "Descomprimir en Carpeta", + "Edit": "Editar", + "NormalEditor": "Editor Normal", + "BackUp": "Copia de Seguridad", + "SourceFolder": "Carpeta Actual", + "Files": "Archivos", + "Change": "Cambiar", + "Settings": "Preferencias", + "Language": "Lenguaje" + } + }, + { + "name": "Català", + "code": "ca", + "translation": { + "AppName": "Tiny File Manager", + "AppTitle": "Administrador d'Arxius", + "Login": "Iniciar Sessió", + "Username": "Nom d'Usuari", + "Password": "Contrasenya", + "Logout": "Desconnectar-se", + "Move": "Moure", + "Copy": "Copiar", + "Save": "Desar", + "SelectAll": "Seleccionar Tot", + "UnSelectAll": "Deseleccionar Tot", + "File": "Arxiu", + "Back": "Enrere", + "Size": "Mida", + "Perms": "Permisos", + "Modified": "Modificat", + "Owner": "Propietari", + "Search": "Cercar", + "NewItem": "Nou Ítem", + "Folder": "Carpeta", + "Delete": "Esborrar", + "Rename": "Canviar Nom", + "CopyTo": "Copiar a", + "DirectLink": "Enllaç Directe", + "UploadingFiles": "Pujar Arxius", + "ChangePermissions": "Canviar Permisos", + "Copying": "Copiant", + "CreateNewItem": "Crear un Nou Ítem", + "Name": "Nom", + "AdvancedEditor": "Editor Avançat", + "RememberMe": "Recorda'm", + "Actions": "Accions", + "Upload": "Pujar", + "Cancel": "Cancel·lar", + "InvertSelection": "Invertir Selecció", + "DestinationFolder": "Carpeta Destí", + "ItemType": "Tipus d'Ítem", + "ItemName": "Nom de l'Ítem", + "CreateNow": "Crear", + "Download": "Descarregar", + "Open": "Obrir", + "UnZip": "Descomprimir", + "UnZipToFolder": "Descomprimir a Carpeta", + "Edit": "Editar", + "NormalEditor": "Editor Normal", + "BackUp": "Còpia de Seguretat", + "SourceFolder": "Carpeta Actual", + "Files": "Arxius", + "Change": "Canviar", + "Settings": "Preferències", + "Language": "Idioma", + "MemoryUsed": "Memòria usada", + "PartitionSize": "Mida de la partició", + "ErrorReporting": "Informe d'errors", + "ShowHiddenFiles": "Mostra Fitxers Ocults", + "Full size": "Mida sencera", + "Help": "Ajuda", + "Free of": "Lliure de", + "Preview": "Previsualitzar", + "Help Documents": "Documents d'ajuda", + "Report Issue": "Informe del problema", + "Generate": "Generar", + "FullSize": "Mida Total", + "FreeOf": "lliure de", + "CalculateFolderSize": "Calcular mida de la carpeta", + "ProcessID": "Procés ID", + "Created": "Creat", + "HideColumns": "Amagar Permisos/Propietari columnes", + "Folder is empty": "La carpeta és buida", + "Check Latest Version": "Comprova l'última versió", + "Generate new password hash": "Crear una nou hash de contrasenya", + "You are logged in": "Estàs autenticat", + "Login failed. Invalid username or password": "Error d'inici de sessió. El nom d'usuari o contrasenya són incorrectes", + "password_hash not supported, Upgrade PHP version": "no és compatible password_hash. Actualitza la versió de PHP" + } + }, + { + "name": "Deutsch", + "code": "de", + "translation": { + "AppName": "Tiny File Manager", + "AppTitle": "Datei Manager", + "Login": "Einloggen", + "Username": "Benutzername", + "Password": "Passwort", + "Logout": "Ausloggen", + "Move": "Verschieben", + "Copy": "Kopieren", + "Save": "Speichern", + "SelectAll": "Alles auswählen", + "UnSelectAll": "Alles abwählen", + "File": "Datei", + "Back": "Zurück", + "Size": "Größe", + "Perms": "Berechtigungen", + "Modified": "Geändert", + "Owner": "Eigentümer", + "Search": "Suchen", + "NewItem": "Neues Element", + "Folder": "Ordner", + "Delete": "Löschen", + "Rename": "Umbenennen", + "CopyTo": "Kopieren nach", + "DirectLink": "Direktlink", + "UploadingFiles": "Datei hochladen", + "ChangePermissions": "Berechtigungen ändern", + "Copying": "Kopieren", + "CreateNewItem": "Neue Datei erstellen", + "Name": "Name", + "AdvancedEditor": "Erweiterter Editor", + "RememberMe": "Eingeloggt bleiben", + "Actions": "Aktionen", + "Upload": "Hochladen", + "Cancel": "Abbrechen", + "InvertSelection": "Auswahl umkehren", + "DestinationFolder": "Zielordner", + "ItemType": "Dateityp", + "ItemName": "Dateiname", + "CreateNow": "Jetzt erstellen", + "Download": "Download", + "Open": "Öffnen", + "UnZip": "Entpacken", + "UnZipToFolder": "Entpacken im Ordner", + "Edit": "Bearbeiten", + "NormalEditor": "Standard Editor", + "BackUp": "Backup", + "SourceFolder": "Quellordner", + "Files": "Dateien", + "Change": "Ändern", + "Settings": "Einstellungen", + "Language": "Sprache", + "You are logged in": "Du bist eingeloggt.", + "Login failed. Invalid username or password": "Login fehlgeschlagen. Falscher Benutzername oder Passwort.", + "password_hash not supported, Upgrade PHP version": "password_hash wird nicht unterstützt, aktualisiere die PHP-Version" + } + }, + { + "name": "ภาษาไทย", + "code": "th", + "translation": { + "AppName": "Tiny File Manager", + "AppTitle": "ตัวจัดการไฟล์", + "Login": "เข้าสู่ระบบ", + "Username": "ชื่อผู้ใช้งาน", + "Password": "รหัสผ่าน", + "Logout": "ออกจากระบบ", + "Move": "ย้าย", + "Copy": "คัดลอก", + "Save": "บันทึก", + "SelectAll": "เลือกท้งหมด", + "UnSelectAll": "ไม่เลือกทั้งหมด", + "File": "ไฟล์", + "Back": "กลับ", + "Size": "ขนาด", + "Perms": "รหัสสิทธิ์", + "Modified": "แก้ไขล่าสุดเมื่อ", + "Owner": "เจ้าของ", + "Search": "ค้นหา", + "NewItem": "สร้างใหม่", + "Folder": "โฟลเดอร์", + "Delete": "ลบ", + "Rename": "เปลี่ยนชื่อ", + "CopyTo": "คัดลอกไปยัง", + "DirectLink": "ไปยังลิ้งก์นั้น", + "UploadingFiles": "อัพโหลด", + "ChangePermissions": "เปลี่ยนสิทธิ์", + "Copying": "กำลังย้ายข้อมูล", + "CreateNewItem": "สร้างไฟล์ใหม่", + "Name": "ชื่อ", + "AdvancedEditor": "แก้ไขขั้นสูง", + "RememberMe": "จดจำฉันไว้", + "Actions": "การทำงาน", + "Upload": "อัพโหลด", + "Cancel": "ยกเลิก", + "InvertSelection": "เปลี่ยนข้อมูล", + "DestinationFolder": "โฟลเดอร์ปลายทาง", + "ItemType": "ข้อมูลประเภท", + "ItemName": "ชื่อไฟล์", + "CreateNow": "สร้างตอนนี้", + "Download": "ดาวโหลด", + "Open": "เปิด", + "UnZip": "แตก Zip", + "UnZipToFolder": "แตกไฟล์ในโฟเดอร์นี้", + "Edit": "แก้ไข", + "NormalEditor": "แก้ไขปกติ", + "BackUp": "สำรองข้อมูล", + "SourceFolder": "โฟลเดอร์ต้นทาง", + "Files": "ไฟล์", + "Change": "เปลี่ยน", + "Settings": "การตั้งค่า", + "Language": "ภาษา" + } + }, + { + "name": "简体中文", + "code": "zh-CN", + "translation": { + "AppName": "文件管理器", + "AppTitle": "文件管理器", + "Login": "登录", + "Username": "账号", + "Password": "密码", + "Logout": "退出", + "Move": "移动", + "Copy": "复制", + "Save": "保存", + "SelectAll": "全选", + "UnSelectAll": "取消全选", + "File": "文件", + "Back": "取消", + "Size": "大小", + "Perms": "权限", + "Modified": "修改时间", + "Owner": "拥有者", + "Search": "查找", + "NewItem": "创建新文件/文件夹", + "Folder": "文件夹", + "Delete": "删除", + "CopyTo": "复制到", + "DirectLink": "直链", + "UploadingFiles": "上传", + "ChangePermissions": "修改权限", + "Copying": "复制中", + "CreateNewItem": "创建新文件", + "Name": "文件名", + "AdvancedEditor": "高级编辑器", + "RememberMe": "记住登录信息", + "Actions": "执行操作", + "Upload": "上传", + "Cancel": "取消", + "InvertSelection": "反向选择", + "DestinationFolder": "目标文件夹", + "ItemType": "文件类型", + "ItemName": "创建名称", + "CreateNow": "创建", + "Download": "下载", + "UnZip": "解压缩", + "UnZipToFolder": "解压至目标文件夹", + "Edit": "编辑", + "NormalEditor": "编辑器", + "BackUp": "备份", + "SourceFolder": "源文件夹", + "Files": "文件", + "Change": "修改", + "Settings": "设置", + "Language": "语言", + "Open": "开启", + "Group": "用户组", + "Other": "其它用户", + "Read": "读取权限", + "Write": "写入权限", + "Execute": "执行权限", + "Rename": "重命名", + "enable": "启用", + "disable": "禁用", + "ErrorReporting": "上传错误报告", + "ShowHiddenFiles": "显示隐藏文件", + "Help": "帮助", + "HideColumns": "隐藏权限&拥有者", + "CalculateFolderSize": "显示文件夹大小", + "FullSize": "所有文件大小", + "MemoryUsed": "使用内存", + "PartitionSize": "可用空间", + "FreeOf": "磁盘大小", + "Check Latest Version": "检查更新", + "Generate new password hash": "生成新的hash密码", + "Report Issue": "报告问题", + "Help Documents": "帮助文档", + "Generate": "生成", + "Preview": "预览" + } + }, + { + "name": "中文(繁體)", + "code": "zh-TW", + "translation": { + "AppName": "檔案管理器", + "AppTitle": "檔案管理器", + "Login": "登入", + "Username": "帳號", + "Password": "密碼", + "Logout": "登出", + "Move": "移動", + "Copy": "複製", + "Save": "儲存", + "SelectAll": "選擇全部", + "UnSelectAll": "取消選擇全部", + "File": "檔案", + "Back": "返回", + "Size": "大小", + "Perms": "權限", + "Modified": "修改時間", + "Owner": "擁有者", + "Search": "搜尋", + "NewItem": "建立新檔案或資料夾", + "Folder": "資料夾", + "Delete": "刪除", + "CopyTo": "複製到", + "DirectLink": "直接連結", + "UploadingFiles": "上傳檔案", + "ChangePermissions": "變更權限", + "Copying": "複製", + "CreateNewItem": "建立新檔案", + "Name": "檔名", + "AdvancedEditor": "進階編輯", + "RememberMe": "記住我", + "Actions": "動作", + "Upload": "上傳", + "Cancel": "取消", + "InvertSelection": "選擇反轉", + "DestinationFolder": "目標資料夾", + "ItemType": "檔案類型", + "ItemName": "檔案檔名", + "CreateNow": "建立", + "Download": "下載", + "UnZip": "解壓縮", + "UnZipToFolder": "解壓縮至資料夾", + "Edit": "編輯", + "NormalEditor": "普通編輯", + "BackUp": "上傳", + "SourceFolder": "來源資料夾", + "Files": "檔案", + "Change": "變更", + "Settings": "設定", + "Language": "語言", + "Open": "開啟", + "Group": "群組", + "Other": "其他", + "Read": "讀取", + "Write": "寫入", + "Execute": "執行", + "Rename": "重新命名", + "enable": "開啟", + "disable": "關閉", + "ErrorReporting": "錯誤報告", + "Help": "幫助", + "ShowHiddenFiles": "顯示隱藏的檔案", + "HideColumns": "不顯示權限以及擁有者", + "CalculateFolderSize": "顯示資料夾大小", + "Help Documents": "幫助文件", + "Report Issue": "回報問題", + "Check Latest Version": "檢查最新版本", + "Generate new password hash": "建立新的密碼 Hash 函數", + "Generate": "建立", + "FullSize": "所有檔案容量", + "MemoryUsed": "使用的記憶體大小", + "PartitionSize": "剩餘可用空間", + "FreeOf": "硬碟容量:" + } + }, + { + "name": "Bahasa Indonesia", + "code": "id", + "translation": { + "AppName": "Tiny File Manager", + "AppTitle": "Pengelola Berkas", + "Login": "Masuk", + "Username": "Nama pengguna", + "Password": "Kata sandi", + "Logout": "Keluar", + "Move": "Pindah", + "Copy": "Salin", + "Save": "Simpan", + "SelectAll": "Tandai semua", + "UnSelectAll": "Urungkan tandai", + "File": "Berkas", + "Back": "Kembali", + "Size": "Ukuran", + "Perms": "Hak akses", + "Modified": "Terakhir diubah", + "Owner": "Pemilik", + "Search": "Cari", + "NewItem": "Item baru", + "Folder": "Folder", + "Delete": "Hapus", + "Rename": "Ganti nama", + "CopyTo": "Salin ke", + "DirectLink": "Tautan langsung", + "UploadingFiles": "Mengunggah berkas", + "ChangePermissions": "Ubah hak akses", + "Copying": "Menyalin", + "CreateNewItem": "Buat item baru", + "Name": "Nama", + "AdvancedEditor": "Editor tingkat lanjut", + "RememberMe": "Ingat saya", + "Actions": "Aksi", + "Upload": "Unggah", + "Cancel": "Urungkan", + "InvertSelection": "Tandai sebaliknya", + "DestinationFolder": "Folder tujuan", + "ItemType": "Tipe item", + "ItemName": "Nama item", + "CreateNow": "Buat sekarang", + "Download": "Unduh", + "Open": "Buka", + "UnZip": "UnZip", + "UnZipToFolder": "UnZip ke folder", + "Edit": "Edit", + "NormalEditor": "Editor normal", + "BackUp": "Cadangkan", + "SourceFolder": "Folder asal", + "Files": "Berkas-berkas", + "Change": "Ubah", + "Settings": "Setelan", + "Language": "Bahasa", + "MemoryUsed": "Memori digunakan", + "PartitionSize": "Ukuran partisi", + "ErrorReporting": "Pelaporan kesalahan", + "ShowHiddenFiles": "Tampilkan berkas tersembunyi", + "Full size": "Total ukuran", + "Help": "Bantuan", + "Free of": "dari", + "Preview": "Pratinjau", + "Help Documents": "Dokumen bantuan", + "Report Issue": "Laporkan masalah", + "Generate": "Hasilkan", + "FullSize": "Total ukuran", + "FreeOf": "dari", + "CalculateFolderSize": "Kalkulasi ukuran foler", + "ProcessID": "ID proses", + "Created": "Dibuat", + "HideColumns": "Sembunyikan kolom hak akses/pemilik", + "Folder is empty": "Folder kosong", + "Check Latest Version": "Periksa versi terbaru", + "Generate new password hash": "Buat hash kata sandi baru", + "You are logged in": "Anda sudah masuk", + "Login failed. Invalid username or password": "Gagal masuk. Nama pengguna atau kata sandi tidak valid", + "password_hash not supported, Upgrade PHP version": "Tidak mendukung password_hash, Perbarui versi PHP", + "Theme": "Tema", + "dark": "Gelap", + "light": "Terang" + } + }, + { + "name": "Ελληνικά", + "code": "gr", + "translation": { + "AppName": "Tiny File Manager", + "AppTitle": "File Manager", + "Login": "Είσοδος", + "Username": "Username", + "Password": "Password", + "Logout": "Αποσύνδεση", + "Move": "Μετακίνση", + "Copy": "Αντιγραφή", + "Save": "Αποθήκευση", + "SelectAll": "Επιλογή όλων", + "UnSelectAll": "Αποεπιλογή όλων", + "File": "Αρχείο", + "Back": "Πίσω", + "Size": "Μέγεθος", + "Perms": "Άδειες", + "Modified": "Τροποποιημένο", + "Owner": "Ιδιοκτήτης", + "Search": "Αναζήτηση", + "NewItem": "Νέο Αντικείμενο", + "Folder": "Φάκελος", + "Delete": "Διαγραφή", + "Rename": "Μετονομασία", + "CopyTo": "Αντιγραφή σε", + "DirectLink": "Direct Link", + "UploadingFiles": "Ανέβασμα αρχείων", + "ChangePermissions": "Αλλαγή αδειών", + "Copying": "Αντιγραφή σε εξέλιξη", + "CreateNewItem": "Δημιουργία νέου αντικειμένου", + "Name": "Όνομα", + "AdvancedEditor": "Editor για προχωρημένους", + "RememberMe": "Θυμήσου με", + "Actions": "Ενέργειες", + "Upload": "Ανέβασμα", + "Cancel": "Ακύρωση", + "InvertSelection": "Αναίρεση επιλογής", + "DestinationFolder": "Φάκελος προορισμού", + "ItemType": "Τύπος αντικειμένου", + "ItemName": "Όνομα αντικειμένου", + "CreateNow": "Δημιούργησε τώρα", + "Download": "Download", + "Open": "Άνοιξε", + "UnZip": "Αποσυμπίεση", + "UnZipToFolder": "Αποσυμπίεση σε φάκελο", + "Edit": "Επεξεργασία", + "NormalEditor": "Βασικός editor", + "BackUp": "Back-Up", + "SourceFolder": "Πηγή", + "Files": "Αρχεία", + "Change": "Τροποποίησε", + "Settings": "Ρυθμίσεις", + "Language": "Γλώσσα", + "MemoryUsed": "Η μνήμη χρησιμοποιείται", + "PartitionSize": "Μέγεθος partition" + } + }, + { + "name": "Português", + "code": "pt", + "translation": { + "AppName": "Gerenciador de arquivos Tiny", + "AppTitle": "Gerenciador de arquivos", + "Login": "Iniciar Sessão", + "Username": "Nome de usuário", + "Password": "Senha", + "Logout": "Sair", + "Move": "Mover", + "Copy": "Copiar", + "Save": "Salvar", + "SelectAll": "Selecionar tudo", + "UnSelectAll": "Desmarcar tudo", + "File": "Arquivo", + "Back": "Voltar", + "Size": "Tamanho", + "Perms": "Permissões", + "Modified": "Modificado", + "Owner": "Proprietário", + "Search": "Buscar", + "NewItem": "Novo Item", + "Folder": "Pasta", + "Delete": "Excluir", + "Rename": "Renomear", + "CopyTo": "Copiar em", + "DirectLink": "Link direto", + "UploadingFiles": "Upload de arquivos", + "ChangePermissions": "Alterar permissões", + "Copying": "Copiando", + "CreateNewItem": "Criar novo item", + "Name": "Nome", + "AdvancedEditor": "Editor Avançado", + "RememberMe": "Lembra de mim", + "Actions": "Ações", + "Upload": "Upload", + "Cancel": "Cancelar", + "InvertSelection": "Seleção reversa", + "DestinationFolder": "Pasta de destino", + "ItemType": "Tipo de Item", + "ItemName": "Nome do item", + "CreateNow": "Criar", + "Download": "Baixar", + "Open": "Abrir", + "UnZip": "Descompactar os arquivos", + "UnZipToFolder": "Descompactar na pasta", + "Edit": "Editar", + "NormalEditor": "Editor Normal", + "BackUp": "Copia de segurança", + "SourceFolder": "Pasta atual", + "Files": "Arquivos", + "Change": "Alterar", + "Settings": "Preferências", + "Language": "Idioma", + "Preview": "Visualizar", + "MemoryUsed": "Memória usada", + "PartitionSize": "Tamanho da partição", + "ErrorReporting": "Relatório de erros", + "ShowHiddenFiles": "Mostrar arquivos ocultos", + "Group": "Grupo", + "Other": "Outros", + "Read": "Ler", + "Write": "Escrever", + "Execute": "Executar", + "enable": "habilitar", + "disable": "desativar", + "FreeOf": "Livre de", + "Free Of": "Livre de", + "FullSize": "tamanho completo", + "Help": "Ajuda / Suporte", + "Generate": "Gerar", + "Report Issue": "Informar problema", + "Generate new password hash": "Gerar nova hash de senha", + "Help Documents": "Documentos de Ajuda", + "Check Latest Version": "Verifique a última versão", + "HideColumns": "Ocultar colunas Perms / Owner", + "CalculateFolderSize": "Calcular o tamanho da pasta", + + "Advanced Search": "Busca Avançada", + "Nothing selected": "Nada selecionado", + "Renamed from": "Renomeado de", + "Deleted": "Excluído", + "Copied from": "Copiado de", + "to": "Para", + "Not found": "Não encontrado", + "Archive": "Arquivo", + "Select folder": "Selecione uma pasta", + "already exists": "já existe", + "Create archive?": "Criar arquivo?", + "Archive unpacked": "Arquivo descompactado", + "Root path": "Caminho raiz", + "File not found": "Arquivo não encontrado", + "Error while copying fro": "Erro ao copiar para lá", + "Paths must be not equal": "Os caminhos não devem ser iguais", + "Archive not unpacked": "Arquivo não descompactado", + "Archive not created": "Arquivo não criado", + "Permissions changed": "Permissões alteradas", + "Saved Successfully": "Salvo com sucesso ", + "File Saved Successfully": "Arquivo salvo com sucesso ", + "Permissions not changed": "Permissões não alteradas", + "Source path not defined": "Caminho de origem não definido", + "Error while moving from": "Erro ao mudar de", + "Invalid file or folder name": "Nome de arquivo ou pasta inválido", + "File extension is not allowed": "A extensão do arquivo não é permitida", + "Error while renaming from": "Erro ao renomear de", + "Error while deleting items": "Erro ao excluir itens", + "Invalid characters in file name": "Caracteres inválidos no nome do arquivo", + "FILE EXTENSION HAS NOT SUPPORTED": "A EXTENSÃO DE ARQUIVO NÃO É SUPORTADA", + "Selected files and folder deleted": "Arquivos e pastas selecionados excluídos", + "Error while fetching archive info": "Erro ao obter informações do arquivo", + "Delete selected files and folders?": "Excluir arquivos e pastas selecionados?", + "Search file in folder and subfolders...": "Pesquisar arquivo na pasta e nas subpastas ...", + "Access denied. IP restriction applicable": "Acesso negado. Restrição de IP aplicável", + "Invalid characters in file or folder name": "Caracteres inválidos no nome do arquivo ou pasta", + "Operations with archives are not available": "Operações com arquivos não estão disponíveis", + "File or folder with this path already exists": "O arquivo ou pasta com este caminho já existe", + + "Folder is empty": "A pasta está vazia", + "Moved from": "Movido de", + "Created": "Criado", + "You are logged in": "Você está logado", + "Login failed. Invalid username or password": "Falha na autenticação. nome de usuário ou senha inválidos" + } + }, + { + "name": "Polski", + "code": "pl", + "translation": { + "AppName": "Tiny File Manager", + "AppTitle": "Menedżer plików", + "Login": "Login", + "Username": "Nazwa Użytkownika", + "Password": "Hasło", + "Logout": "Wyloguj", + "Move": "Przenieś", + "Copy": "Kopiuj", + "Save": "Zapisz", + "SelectAll": "Zaznacz wszystko", + "UnSelectAll": "Odznacz wszystko", + "File": "Plik", + "Back": "Cofnij", + "Size": "Rozmiar", + "Perms": "Uprawnienia", + "Modified": "Zmodyfikowano", + "Owner": "Właściciel", + "Search": "Szukaj", + "NewItem": "Nowy plik", + "Folder": "Folder", + "Delete": "Usuń", + "Rename": "Zmień nazwę", + "CopyTo": "Kopiuj do", + "DirectLink": "Link bezpośredni", + "UploadingFiles": "Wysyłanie plików", + "ChangePermissions": "Zmień uprawnienia", + "Copying": "Kopiowanie", + "CreateNewItem": "Utwórz nowy plik", + "Name": "Nazwa", + "AdvancedEditor": "Zaawansowany edytor", + "RememberMe": "Pamiętaj mnie", + "Actions": "Akcje", + "Upload": "Wyślij", + "Cancel": "Anuluj", + "InvertSelection": "Odwróć zaznaczenie", + "DestinationFolder": "Folder docelowy", + "ItemType": "Typ pliku", + "ItemName": "Nazwa pliku", + "CreateNow": "Utwórz nowy", + "Download": "Pobierz", + "Open": "Otwórz", + "UnZip": "Rozpakuj", + "UnZipToFolder": "Rozpakuj do", + "Edit": "Edytuj", + "NormalEditor": "Edytuj normalnie", + "BackUp": "Kopia zapasowa", + "SourceFolder": "Folder źródłowy", + "Files": "Pliki", + "Change": "Zmień", + "Settings": "Ustawienia", + "Language": "Język" + } + }, + { + "name": "Tiếng Việt", + "code": "vi", + "translation": { + "AppName": "Trình quản lí tệp Tiny", + "AppTitle": "Quản lý tệp", + "Login": "Đăng nhập", + "Username": "Tên đăng nhập", + "Password": "Mật khẩu", + "Logout": "Đăng xuất", + "Move": "Di chuyển", + "Copy": "Sao chép", + "Save": "Lưu", + "SelectAll": "Chọn tất cả", + "UnSelectAll": "Hủy chọn tất cả", + "File": "Tệp tin", + "Back": "Trở về", + "Size": "Kích cỡ", + "Perms": "Quyền", + "Modified": "Sửa đổi lần cuối", + "Search": "Tìm kiếm", + "NewItem": "Tạo mới", + "Folder": "Thư mục", + "Delete": "Xóa", + "Rename": "Đổi tên", + "CopyTo": "Sao chép đến", + "DirectLink": "Đường dẫn URL", + "UploadingFiles": "Tải lên file", + "ChangePermissions": "Thay đổi quyền", + "Copying": "Sao chép", + "CreateNewItem": "Tạo mới", + "Name": "Tên", + "AdvancedEditor": "Chỉnh sửa nâng cao", + "RememberMe": "Ghi nhớ đăng nhập", + "Actions": "Tùy Chọn", + "Upload": "Tải lên", + "Cancel": "Hủy", + "InvertSelection": "Đảo ngược vùng chọn", + "DestinationFolder": "Đến", + "ItemType": "Tạo mới", + "ItemName": "Tên tệp/thư mục", + "CreateNow": "Tạo", + "Download": "Tải xuống", + "Open": "Mở", + "UnZip": "Giải nén", + "UnZipToFolder": "Giải nén đến thư mục", + "Edit": "Chỉnh sửa", + "NormalEditor": "Chỉnh sửa thông thường", + "BackUp": "Sao lưu", + "SourceFolder": "Từ", + "Files": "Tệp tin", + "Change": "Thay đổi", + "Settings": "Cài đặt", + "Language": "Ngôn ngữ", + "PartitionSize": "Còn trống", + "Advanced Search": "Tìm kiếm nâng cao", + "Full size": "Đã dùng", + "Folder is empty": "Thư mực rỗng", + "Search file in folder and subfolders...": "Tìm file toàn thư mục...", + "Help": "Trợ gúp", + "You are logged in": "Đăng nhập thành công", + "ErrorReporting": "Báo cáo lỗi", + "ShowHiddenFiles": "Hiển thị file ẩn", + "Preview": "Xem", + "Help Documents": "Hướng dẫn", + "Report Issue": "Báo cáo lỗi", + "Generate": "Tạo", + "FullSize": "Tổng dung lượng", + "FreeOf": "trong tổng số", + "Calculate folder size": "Kích thước thư mục", + "Check Latest Version": "Kiểm tra phiên bản mới", + "Generate new password hash": "Trình tạo mật khẩu mã hash", + "HideColumns": "Ẩn cột quyền/chủ sỡ hữu", + "Owner": "Chủ sở hữu/Owner", + "Group": "Nhóm/Group", + "Other": "Khác/Other", + "Read": "Đọc", + "Write": "Ghi", + "Execute": "Thực thi", + "enable": "Bật", + "disable": "Tắt", + "Free Of": "trong tổng số", + "CalculateFolderSize": "Tính toán kích thước thư mục", + "Nothing selected": "Không có gì được chọn", + "Renamed from": "Đã đổi tên từ", + "Deleted": "đã được xóa", + "Copied from": "Được sao chép từ", + "to": "sang", + "Not found": "Không tìm thấy", + "Archive": "Lưu trữ", + "Select folder": "Chọn thư mục", + "already exists": "đã tồn tại", + "Create archive?": "Tạo kho lưu trữ?", + "Archive unpacked": "Lưu trữ đã được giải nén", + "Root path": "Đường dẫn gốc", + "File not found": "Không tìm thấy tệp", + "Error while copying from": "Lỗi khi sao chép từ", + "Paths must be not equal": "Đường dẫn không được giống nhau", + "Archive not unpacked": "Lưu trữ chưa được giải nén", + "Archive not created": "Bản lưu trữ chưa được tạo", + "Permissions changed": "Đã thay đổi quyền", + "Saved Successfully": "Thành công ", + "File Saved Successfully": "Thành công ", + "Permissions not changed": "Quyền không được thay đổi", + "Source path not defined": "Đường dẫn nguồn không được xác định", + "Error while moving from": "Lỗi khi di chuyển từ", + "Invalid file or folder name": "Tên tệp hoặc thư mục không hợp lệ", + "File extension is not allowed": "Định dạng không được hỗ trợ", + "Error while renaming from": "Lỗi khi đổi tên từ", + "Error while deleting items": "Lỗi khi xóa các mục", + "Invalid characters in file name": "Ký tự không hợp lệ", + "FILE EXTENSION HAS NOT SUPPORTED": "ĐỊNH DẠNG KHÔNG ĐƯỢC HỖ TRỢ", + "Selected files and folder deleted": "Đã xóa các tệp và thư mục được chọn", + "Error while fetching archive info": "Lỗi", + "Delete selected files and folders?": "Xóa các tệp và thư mục đã chọn?", + "Access denied. IP restriction applicable": "Từ chối quyền truy cập", + "Invalid characters in file or folder name": "Ký tự không hợp lệ", + "Operations with archives are not available": "Không khả dụng", + "File or folder with this path already exists": "Tệp hoặc thư mục đã tồn tại", + "Moved from": "Chuyển từ", + "Created": "đã tạo", + "Login failed. Invalid username or password": "Không tìm thấy người dùng", + "Theme": "Chủ đề" + } + }, + { + "name": "Hebrew", + "code": "he", + "translation": { + "AppName": "סייר קבצים - טיני", + "AppTitle": "סייר קבצים", + "Login": "התחבר", + "Username": "שם משתמש", + "Password": "סיסמה", + "Logout": "התנתק", + "Move": "העבר", + "Copy": "העתק", + "Save": "שמור", + "SelectAll": "בחר הכל", + "UnSelectAll": "בטל בחירה מהכל", + "File": "קובץ", + "Back": "חזור", + "Size": "גודל", + "Perms": "הרשאות", + "Modified": "עודכן בתאריך", + "Owner": "בעלים", + "Search": "חיפוש", + "NewItem": "חדש", + "Folder": "תיקייה", + "Delete": "מחק", + "Rename": "שנה שם", + "CopyTo": "העתק ל", + "DirectLink": "קישור ישיר", + "UploadingFiles": "מעלה קבצים", + "ChangePermissions": "שנה הרשאות", + "Copying": "העותק", + "CreateNewItem": "צור פריט חדש", + "Name": "שם", + "AdvancedEditor": "עורך מתקדם", + "RememberMe": "זכור אותי", + "Actions": "פעולות", + "Upload": "העלה", + "Cancel": "ביטול", + "InvertSelection": "הפוך את הבחירה", + "DestinationFolder": "תיקיית יעד", + "ItemType": "סוג פריט", + "ItemName": "שם הפריט", + "CreateNow": "צור עכשיו", + "Download": "הורד", + "Open": "פתח", + "UnZip": "חילוץ", + "UnZipToFolder": "חלץ לתיקייה", + "Edit": "ערוך", + "NormalEditor": "עורך רגיל", + "BackUp": "גיבוי", + "SourceFolder": "תקיית מקור", + "Files": "קבצים", + "Change": "שנה", + "Settings": "הגדרות", + "Language": "שפה", + "MemoryUsed": "זיכרון בשימוש", + "PartitionSize": "גודל מחיצה" + } + }, + { + "name": "العربية", + "code": "Ar", + "translation": { + "AppName": "مدير الملفات الصغير", + "AppTitle": "مدير الملفات", + "Login": "دخول", + "Username": "اسم المستخدم", + "Password": "كلمة المرور", + "Logout": "خروج", + "Move": "نقل", + "Copy": "نسخ", + "Save": "حفظ", + "SelectAll": "تحديد الكل", + "UnSelectAll": "الغاء تحديد الكل", + "File": "ملف", + "Back": "رجوع", + "Size": "حجم", + "Perms": "صلاحيات", + "Modified": "عدل بـ", + "Owner": "المالك", + "Search": "بحث", + "NewItem": "عنصر جديد", + "Folder": "مجلد", + "Delete": "حذف", + "Rename": "تسمية", + "CopyTo": "نسخ الى", + "DirectLink": "رابط مباشر", + "UploadingFiles": "رفع ملفات", + "ChangePermissions": "تغيير الصلاحيات", + "Copying": "جاري النسخ", + "CreateNewItem": "انشاء عنصر جديد", + "Name": "اسم", + "AdvancedEditor": "محرر متقدم", + "RememberMe": "تذكرني", + "Actions": "عمليات", + "Upload": "رفع", + "Cancel": "الغاء", + "InvertSelection": "عكس التحديد", + "DestinationFolder": "مجلد", + "ItemType": "نوع العنصر", + "ItemName": "اسم العنصر", + "CreateNow": "انشأ الآن", + "Download": "تحميل", + "Open": "فتح", + "UnZip": "فك الضغط", + "UnZipToFolder": "فك الصغط لملف", + "Edit": "نحرير", + "NormalEditor": "محرر عادي", + "BackUp": "نسخة احتياطية", + "SourceFolder": "مجلد المصدر", + "Files": "ملفات", + "Change": "تغيير", + "Settings": "اعدادات", + "Language": "لغة", + "MemoryUsed": "الذاكرة المستخدمة", + "PartitionSize": "حجم القسم", + "Free of": "مساحة فارغة من ", + "Preview": "عرض", + "Full size": "الحجم الكلي", + "ErrorReporting": "التبليغ باخطاء", + "ShowHiddenFiles": "اظهار الملفات المخفية", + "Help": "مساعدة", + "Generate": "توليد", + "Report Issue": "التبليغ بمشكلة", + "Generate new password hash": "توليد هاش لكلمة المرور", + "Help Documents": "وثائق المساعدة", + "Check Latest Version": "تفقد آخر الاصدارات" + } + }, + { + "name": "Česky", + "code": "cz", + "translation": { + "AppName": "Tiny File Manager", + "AppTitle": "File Manager", + "Login": "Přihlásit", + "Username": "Přihlašovací jméno", + "Password": "Heslo", + "Logout": "Odhlásit", + "Move": "Přesunout", + "Copy": "Kopírovat", + "Save": "Uložit", + "SelectAll": "Vybrat vše", + "UnSelectAll": "Odebrat vše", + "File": "Soubor", + "Back": "Zpět", + "Size": "Velikost", + "Perms": "Oprávnění", + "Modified": "Změněno", + "Owner": "Vlastník", + "Search": "Hledat", + "NewItem": "Nová položka", + "Folder": "Složka", + "Delete": "Smazat", + "Rename": "Přejmenovat", + "CopyTo": "Kopírovat do", + "DirectLink": "Přímý odkaz", + "UploadingFiles": "Nahrát soubory", + "ChangePermissions": "Změnit oprávnění", + "Copying": "Kopírování", + "CreateNewItem": "Vytvoř novou položku", + "Name": "Název", + "AdvancedEditor": "Vylepšený editor", + "RememberMe": "Pamatuj si mně", + "Actions": "Akce", + "Upload": "Nahrát", + "Cancel": "Zrušit", + "InvertSelection": "Obrať výběr", + "DestinationFolder": "Konečná složka", + "ItemType": "Typ položky", + "ItemName": "Název položky", + "CreateNow": "Vytvořit", + "Download": "Stáhnout", + "Open": "Otevřít", + "UnZip": "Rozbalit", + "UnZipToFolder": "Rozbalit do", + "Edit": "Upravit", + "NormalEditor": "Editor", + "BackUp": "Záloha", + "SourceFolder": "Zdrojová složka", + "Files": "Soubory", + "Change": "Změnit", + "Settings": "Nastavení", + "Language": "Jazyk", + "MemoryUsed": "Využitá paměť", + "PartitionSize": "Velikost oddílu", + "ErrorReporting": "Hlášení chyb", + "ShowHiddenFiles": "Zobrazit skryté soubory", + "Preview": "Náhled", + "Help": "Nápověda", + "FullSize": "Celková velikost", + "FreeOf": "volné z", + "Help Documents": "Dokumentace", + "Report Issue": "Nahlásit chybu", + "Generate": "Generovat", + "CalculateFolderSize": "Počítat velikosti složek", + "ProcessID": "ID procesu", + "Created": "Vytvořeno", + "HideColumns": "Skrýt sloupce oprávnění a vlastníka", + "Folder is empty": "Složka je prázdná", + "Check Latest Version": "Vyhledat aktualizace", + "Generate new password hash": "Vygenerovat nový hash hesla", + "You are logged in": "Jste přihlášen(a)", + "Login failed. Invalid username or password": "Chyba přihlášení: špatně zadané heslo nebo uživatelské jméno", + "password_hash not supported, Upgrade PHP version": "Funkce password_hash není dostupná, aktualizujte PHP na novější verzi" + } + }, + { + "name": "Türkçe", + "code": "tr", + "translation": { + "Tiny File Manager": "Tiny Dosya Yöneticisi", + "File Manager": "Dosya Yöneticisi", + "Sign in": "Giriş Yap", + "Username": "Kullanıcı adı", + "Password": "Parola", + "Sign Out": "Çıkış Yap", + "Move": "Taşı", + "Copy": "Kopyala", + "Save": "Kaydet", + "Select all": "Hepsini Seç", + "Unselect all": "Hepsini Bırak", + "File": "Dosya", + "Back": "Geri", + "Size": "Boyut", + "Perms": "İzinler", + "Modified": "Son Düzenleme", + "Owner": "Sahibi", + "Search": "Arama", + "New Item": "Yeni Dosya", + "Folder": "Klasör", + "Delete": "Sil", + "Rename": "Yeniden Adlandır", + "Copy to": "Şuraya Kopyala", + "Direct link": "Erişim Linki", + "Upload Files": "Dosyaları Yükle", + "Change Permissions": "İzinleri Değiştir", + "Copying": "Kopyalanıyor", + "Create New Item": "Yeni Dosya Oluştur", + "Name": "Ad", + "Advanced Editor": "Gelişmiş Düzenleyici", + "Remember Me": "Beni Hatırla", + "Actions": "Hareketler", + "Upload": "Yükle", + "Cancel": "İptal Et", + "Invert Selection": "Seçimi Geri Al", + "Destination Folder": "Hedef klasör", + "Item Type": "Dosya Türü", + "Item Name": "Dosya Adı", + "Create Now": "Oluştur", + "Download": "İndir", + "Open": "Aç", + "UnZip": "Arşivden çıkart", + "UnZip to folder": "Klasöre Çıkart", + "Edit": "Düzenle", + "Normal Editor": "Normal Düzenleyici", + "Back Up": "Yedekle", + "Source Folder": "Kaynak Klasör", + "Files": "Dosyalar", + "Change": "Değişim", + "Settings": "Ayarlar", + "Language": "Dil", + "Memory used": "Kullanılan Bellek", + "Partition size": "Disk Boyutu", + "Error Reporting": "Hata Raporlama", + "Show Hidden Files": "Gizli Dosyaları Göster", + "Full size": "Toplam Boyut", + "Help": "Yardım", + "Free of": "Boş Olan", + "Preview": "Görüntüle", + "Help Documents": "Dökümanlar", + "Report Issue": "Sorun Bildir", + "Generate": "Oluştur", + "Full Size": "Toplam Boyut", + "free of": "Boş olan", + "Calculate folder size": "Klasör Boyutlarını Hesapla", + "Check Latest Version": "Güncel Sürümü Kontrol Et", + "Generate new password hash": "Parola için Hash Üret", + "Hide Perms/Owner columns": "Yetki / Sahip Sütununu Gizle" + } + }, + { + "name": "Slovensky", + "code": "sk", + "translation": { + "AppName": "Tiny File Manager", + "AppTitle": "File Manager", + "Login": "Prihlásiť sa", + "Username": "Prihlasovacie meno", + "Password": "Heslo", + "Logout": "Odhlásiť", + "Move": "Presunúť", + "Copy": "Kopírovať", + "Save": "Uložiť", + "SelectAll": "Vybrať všetko", + "UnSelectAll": "Zrušiť výber", + "File": "Súbor", + "Back": "Späť", + "Size": "Veľkosť", + "Perms": "Oprávnenia", + "Modified": "Zmenené", + "Owner": "Vlastník", + "Search": "Hľadať", + "NewItem": "Nový súbor", + "Folder": "Priečinok", + "Delete": "Zmazať", + "Rename": "Premenovať", + "CopyTo": "Kopírovať do", + "DirectLink": "Priamy odkaz", + "UploadingFiles": "Nahrať súbory", + "ChangePermissions": "Zmeniť oprávnenia", + "Copying": "Kopírovanie", + "CreateNewItem": "Vytvoriť nový súbor", + "Name": "Názov", + "AdvancedEditor": "Pokročilý editor", + "RememberMe": "Zapamätať", + "Actions": "Akcie", + "Upload": "Nahrať", + "Cancel": "Zrušiť", + "InvertSelection": "Obrátiť výber", + "DestinationFolder": "Cieľový priečinok", + "ItemType": "Typ súboru", + "ItemName": "Názov súboru", + "CreateNow": "Vytvoriť", + "Download": "Stiahnúť", + "Open": "Otvoriť", + "UnZip": "Rozbaliť", + "UnZipToFolder": "Rozbaliť do", + "Edit": "Upraviť", + "NormalEditor": "Editor", + "BackUp": "Záloha", + "SourceFolder": "Zdrojový priečinok", + "Files": "Súbory", + "Change": "Zmeniť", + "Settings": "Nastavenia", + "Language": "Jazyk", + "MemoryUsed": "Využitá pamäť", + "PartitionSize": "Veľkosť oddielu", + "ErrorReporting": "Hlásenie chýb", + "ShowHiddenFiles": "Zobraziť skryté súbory", + "Preview": "Náhľad", + "Help": "Pomoc", + "FullSize": "Celková veľkosť", + "FreeOf": "voľné z" + } + }, + { + "name": "Slovensko", + "code": "sl", + "translation": { + "AppName": "Tiny File Manager", + "AppTitle": "Raziskovalec", + "Login": "Prijava", + "Username": "Uporabniško ime", + "Password": "Geslo", + "Logout": "Odjava", + "Move": "Premakni", + "Copy": "Kopiraj", + "Save": "Shrani", + "SelectAll": "Izberi vse", + "UnSelectAll": "Izberi nič", + "File": "Datoteka", + "Back": "Nazaj", + "Size": "Velikost", + "Perms": "Pravice", + "Modified": "Spremenjeno", + "Owner": "Lastnik", + "Search": "Iskanje", + "NewItem": "Nov objekt", + "Folder": "Mapa", + "Delete": "Izbriši", + "Rename": "Preimenuj", + "CopyTo": "Kopiraj v", + "DirectLink": "Direktlink", + "UploadingFiles": "Naloži datoteko", + "ChangePermissions": "Spremeni pravice", + "Copying": "Kopiranje", + "CreateNewItem": "Ustvari nov objekt", + "Name": "Ime", + "AdvancedEditor": "Razširjeni urejevalnik", + "RememberMe": "Ostani prijavljen", + "Actions": "Aktivnosti", + "Upload": "Naloži", + "Cancel": "Prekliči", + "InvertSelection": "Obrni izbor", + "DestinationFolder": "Ciljna mapa", + "ItemType": "Tip objekta", + "ItemName": "Ime objekta", + "CreateNow": "Ustvari nov", + "Download": "Prenesi", + "Open": "Odpri", + "UnZip": "Razširi", + "UnZipToFolder": "Razširi v mapo", + "Edit": "Uredi", + "NormalEditor": "Standardni urejevalnik", + "BackUp": "Varnostna kopija", + "SourceFolder": "Izhodiščna mapa", + "Files": "Datoteke", + "Change": "Spremeni", + "Settings": "Nastavitve", + "Language": "Jezik", + "You are logged in": "Ste uspešno prijavljeni", + "Login failed. Invalid username or password": "Prijava je spodletela. Napačno uporabniško ime ali geslo.", + "password_hash not supported, Upgrade PHP version": "password_hash ni podprt, nadgradite različico PHP" + } + }, + { + "name": "Suomi", + "code": "fi", + "translation": { + "AppName": "Tiny File Manager", + "AppTitle": "File Manager", + "Login": "Kirjautuminen", + "Username": "Käyttäjänimi", + "Password": "Salasana", + "Logout": "Kirjaudu ulos", + "Move": "Siirrä", + "Copy": "Kopioi", + "Save": "Tallenna", + "SelectAll": "Valitse kaikki", + "UnSelectAll": "Poista valinnat", + "File": "Tiedosto", + "Back": "Takaisin", + "Size": "Koko", + "Perms": "Oikeudet", + "Modified": "Muokattu", + "Owner": "Omistaja", + "Search": "Haku", + "NewItem": "Luo uusi...", + "Folder": "Kansio", + "Delete": "Poista", + "Rename": "Nimeä uudelleen", + "CopyTo": "Kopioi kohteeseen", + "DirectLink": "Suora linkki", + "UploadingFiles": "Siirrä tiedostoja", + "ChangePermissions": "Muuta oikeuksia", + "Copying": "Kopioidaan", + "CreateNewItem": "Luo uusi tiedosto tai kansio", + "Name": "Nimi", + "AdvancedEditor": "Edistynyt editori", + "RememberMe": "Muista minut", + "Actions": "Toiminnot", + "Upload": "Vie", + "Cancel": "Peruuta", + "InvertSelection": "Vaihda valinta", + "DestinationFolder": "Kohdekansio", + "ItemType": "Tiedoston tyyppi", + "ItemName": "Nimi", + "CreateNow": "Luo nyt", + "Download": "Lataa", + "Open": "Avaa", + "UnZip": "Pura", + "UnZipToFolder": "Pura kansioon", + "Edit": "Muokkaa", + "NormalEditor": "Editori", + "BackUp": "Varmuuskopioi", + "SourceFolder": "Kohdekansio", + "Files": "Tiedostot", + "Change": "Vaihda", + "Settings": "Asetukset", + "Language": "Kieli", + "MemoryUsed": "Muistia käytetty", + "PartitionSize": "Osion koko", + "ErrorReporting": "Virheraportit", + "ShowHiddenFiles": "Näytä piilotiedostot", + "Preview": "Esikatsele", + "Help": "Apua", + "FullSize": "Täysikokoinen", + "FreeOf": "Vapaana", + "CalculateFolderSize": "Laske kansion koko", + "CheckLatestVersion": "Tarkista päivitykset", + "Generate new password hash": "Luo uusi salasana-hash", + "HideColumns": "Piilota oikeudet-/omistaja-sarakkeet" + } + }, + { + "name": "한국어", + "code": "ko", + "translation": { + "Tiny File Manager": "Tiny File Manager", + "File Manager": "File Manager", + "Sign in": "로그인", + "Username": "아이디", + "Password": "비밀번호", + "Sign Out": "로그아웃", + "Move": "이동", + "Copy": "복사", + "Save": "저장", + "Select all": "전체 선택", + "Unselect all": "선택 해제", + "File": "파일", + "Back": "뒤로", + "Size": "용량", + "Perms": "권한", + "Modified": "마지막 수정", + "Owner": "소유자", + "Search": "검색", + "New Item": "새로 만들기", + "Folder": "폴더", + "Delete": "삭제", + "Rename": "이름 변경", + "Copy to": "지정된 위치로 복사", + "Direct link": "링크", + "Upload Files": "파일 업로드", + "Change Permissions": "권한 변경", + "Copying": "복사 중", + "Create New Item": "새로 만들기", + "Name": "이름", + "Advanced Editor": "고급 에디터", + "Remember Me": "로그인 정보 저장", + "Actions": "액션", + "Upload": "업로드", + "Cancel": "취소", + "Invert Selection": "선택 반전", + "Destination Folder": "대상 폴더", + "Item Type": "유형", + "Item Name": "이름", + "Create Now": "확인", + "Download": "다운로드", + "Open": "열기", + "UnZip": "압축 해제", + "UnZip to folder": "지정된 폴더에 압축 해제", + "Edit": "편집", + "Normal Editor": "일반 에디터", + "Back Up": "백업", + "Source Folder": "원본 폴더", + "Files": "파일", + "Change": "변경하기", + "Settings": "설정", + "Language": "언어", + "Memory used": "메모리 사용량", + "Partition size": "남은 용량", + "Error Reporting": "오류 보고", + "Show Hidden Files": "숨겨진 파일 보기", + "Full size": "현재 폴더 파일 용량", + "Help": "도움말", + "Free of": "파티션 총 용량:", + "Preview": "미리 보기", + "Help Documents": "참고 문서", + "Report Issue": "이슈 보고", + "Generate": "생성", + "Full Size": "총 용량", + "free of": "사용 가능 용량", + "Calculate folder size": "폴더 용량 표시", + "Check Latest Version": "최신 버전 체크", + "Generate new password hash": "새 비밀번호 해시 생성", + "Hide Perms/Owner columns": "권한/소유자 숨기기" + } + }, + { + "name": "日本語", + "code": "ja", + "translation": { + "AppName": "Tiny File Manager", + "AppTitle": "File Manager", + "Login": "ログイン", + "Username": "Username", + "Password": "Password", + "Logout": "ログアウト", + "Move": "移動", + "Copy": "コピー", + "Save": "保存", + "SelectAll": "すべて選択", + "UnSelectAll": "選択解除", + "File": "ファイル", + "Back": "戻る", + "Size": "サイズ", + "Perms": "権限", + "Modified": "更新日時", + "Owner": "所有者", + "Search": "検索", + "NewItem": "新規作成", + "Folder": "フォルダ", + "Delete": "削除", + "Rename": "名前の変更", + "CopyTo": "宛先を指定してコピー", + "DirectLink": "直接リンク", + "UploadingFiles": "ファイルをアップロード", + "ChangePermissions": "権限を変更", + "Copying": "ファイルをコピー", + "CreateNewItem": "新規作成", + "Name": "名前", + "AdvancedEditor": "拡張エディタで編集", + "RememberMe": "Remember Me", + "Actions": "アクション", + "Upload": "アップロード", + "Cancel": "キャンセル", + "InvertSelection": "選択の切り替え", + "DestinationFolder": "宛先フォルダ", + "ItemType": "種類", + "ItemName": "名前", + "CreateNow": "作成する", + "Download": "ダウンロード", + "Open": "開く", + "UnZip": "解凍", + "UnZipToFolder": "フォルダに解凍", + "Edit": "編集", + "NormalEditor": "通常エディタで編集", + "BackUp": "バックアップ", + "SourceFolder": "元フォルダ", + "Files": "ファイル", + "Change": "変更", + "Settings": "設定", + "Language": "言語", + "MemoryUsed": "メモリ使用量", + "PartitionSize": "パーティションサイズ", + "ErrorReporting": "エラーを表示", + "ShowHiddenFiles": "隠しファイルを表示", + "Full size": "合計サイズ", + "Help": "ヘルプ", + "Free of": "free of", + "Preview": "プレビュー", + "Help Documents": "ヘルプドキュメント", + "Report Issue": "問題を報告", + "Generate": "生成", + "FullSize": "合計サイズ", + "FreeOf": "free of", + "CalculateFolderSize": "フォルダサイズを計算", + "ProcessID": "プロセスID", + "HideColumns": "権限・所有者を非表示", + "Check Latest Version": "更新の確認", + "Generate new password hash": "パスワードハッシュを生成", + "Folder is empty": "空のフォルダです", + "Created": "作成しました", + "You are logged in": "ログインしました", + "Login failed. Invalid username or password": "Username もしくは Password が違います", + "password_hash not supported, Upgrade PHP version": "password_hash がサポートされていません。PHPをアップグレードしてください", + "Group": "グループ", + "Other": "その他", + "Read": "読み込み", + "Write": "書き込み", + "Execute": "実行" + } + }, + { + "name": "Монгол", + "code": "mn_MN", + "translation": { + "AppName": "Tiny File Manager", + "AppTitle": "Файл зохицуулагчr", + "Login": "Нэвтрэх", + "Username": "Хэрэглэгчийн нэр", + "Password": "Нууц үг", + "Logout": "Гарах", + "Move": "Зөөх", + "Copy": "Хуулах", + "Save": "Хадгалах", + "SelectAll": "Бүгдийг сонгох", + "UnSelectAll": "Бүгдийг цэвэрлэх", + "File": "Файл", + "Back": "Буцах", + "Size": "Хэмжээ", + "Perms": "Эрх", + "Modified": "Өөрчлөгдсөн", + "Owner": "Эзэн", + "Search": "Хайх", + "NewItem": "Шинэ зүйл", + "Folder": "Хавтас", + "Delete": "Устгах", + "Rename": "Нэр солих", + "CopyTo": "Руу хуулах", + "DirectLink": "Шууд холбоос", + "UploadingFiles": "Файлуудыг хуулж байна", + "ChangePermissions": "Эрх солих", + "Copying": "Хуулж байна", + "CreateNewItem": "Шинээр үүсгэх", + "Name": "Нэр", + "AdvancedEditor": "Нарийн үйлдэлтэй засварлагч", + "RememberMe": "Remember Me", + "Actions": "Үйлдлүүд", + "Upload": "Хуулах", + "Cancel": "Болих", + "InvertSelection": "Сонголтыг эсрэгээр", + "DestinationFolder": "Очих хавтас", + "ItemType": "Төрөл", + "ItemName": "Нэр", + "CreateNow": "Үүсгэх", + "Download": "Татах", + "Open": "Нээх", + "UnZip": "Задлах", + "UnZipToFolder": "Хавтсанд задлах", + "Edit": "Засах", + "NormalEditor": "Энгийн засварлагч", + "BackUp": "Бакап", + "SourceFolder": "Хаанаас хавтас", + "Files": "Файл", + "Change": "Солих", + "Settings": "Тохиргоо", + "Language": "Хэл", + "MemoryUsed": "Хэрэглэгдэж буй санах ой", + "PartitionSize": "Партишны зай", + "ErrorReporting": "Алдаа харуулах", + "ShowHiddenFiles": "Нууц файлуудыг харуулах", + "Full size": "Нийт хэмжээ", + "Help": "Тусламж", + "Free of": "Хоосон зай", + "Preview": "Урьдчилан харах", + "Help Documents": "Тусламж", + "Report Issue": "Алдаа мэдэгдэх", + "Generate": "Үүсгэх", + "FullSize": "Нийт хэмжээ", + "FreeOf": "Хоосон зай", + "CalculateFolderSize": "Хавтасны хэмжээг бодох", + "ProcessID": "Процессын ID", + "HideColumns": "Багануудыг нуух", + "Check Latest Version": "Шинчэлэлт байгаа эсэхийг шалгах", + "Generate new password hash": "Шинэ нууц үгийн хаш үүсгэх", + "Folder is empty": "Хавтас хоосон байна", + "Created": "Үүсгэсэн", + "You are logged in": "Нэвтэрсэн байна", + "Login failed. Invalid username or password": "Нэр юмуу нууц үг буруу байна", + "password_hash not supported, Upgrade PHP version": "password_hash функц байхгүй байна. PHP хувилбар ахиулна уу.", + "Group": "Бүлэг", + "Other": "Бусад", + "Read": "Унших", + "Write": "Бичих", + "Execute": "Ажиллуулах" + } + }, + { + "name": "Dutch", + "code": "nl", + "translation": { + "AppName": "Tiny File Manager", + "AppTitle": "Bestand beheerder ", + "Login": "Inloggen", + "Username": "Gebruikersnaam", + "Password": "Wachtwoord", + "Logout": "Uitloggen", + "Copy": "Kopiëren", + "Save": "Opslaan", + "SelectAll": "Alles selecteren", + "UnSelectAll": "Alles deselecteren", + "File": "Bestand", + "Back": "Terug", + "Size": "Grootte", + "Perms": "Rechten", + "Modified": "Aangepast", + "Owner": "Eigenaar", + "Search": "Zoeken", + "NewItem": "Nieuw item", + "Folder": "Map", + "Delete": "Verwijder", + "Rename": "Hernoem", + "CopyTo": "Kopiëren naar", + "DirectLink": "Directe link", + "UploadingFiles": "Bestanden opladen", + "ChangePermissions": "Rechten aanpassen", + "Copying": "Bezig met kopiëren", + "CreateNewItem": "Maak nieuw item aan", + "Name": "Naam", + "AdvancedEditor": "Geavanceerde bewerker", + "RememberMe": "Onthoud mij", + "Actions": "Acties", + "Upload": "Opladen", + "Cancel": "Annuleren", + "InvertSelection": "Keer selectie om", + "DestinationFolder": "Doelmap", + "ItemType": "Item type", + "ItemName": "Item naam", + "CreateNow": "Onmiddelijk aanmaken", + "Download": "Download", + "Open": "Openen", + "UnZip": "Uitpakken", + "UnZipToFolder": "Uitpakken in folder", + "Edit": "Aanpassen", + "NormalEditor": "Standaard bewerker", + "BackUp": "Back-up aanmaken", + "SourceFolder": "Bronmap", + "Files": "Bestanden", + "Move":"Verplaatsen", + "Change": "Aanpassen", + "Settings": "Instellingen", + "Language": "Taal", + "Folder is empty":"Map is leeg", + "PartitionSize":"Partitiegrootte", + "ErrorReporting":"Foutmeldingen", + "ShowHiddenFiles":"Toon onzichtbare bestanden", + "Full size":"Volledige groote", + "Help":"Hulp", + "Free of":"Ruimte vrij", + "Preview":"Voorbeeld", + "Help Documents":"Hulp documenten", + "Report Issue":"Probleem melden", + "Generate":"Genereer", + "FullSize":"Volledige groote", + "FreeOf":"Ruimte vrij", + "CalculateFolderSize":"Bereken map groote", + "ProcessID":"Proces-ID", + "Created":"Aangemaakt", + "HideColumns":"Verberg Rechten/Eigenaar kollomen", + "You are logged in":"U ben ingelogd", + "Check Latest Version":"Bekijk laatste versie", + "Generate new password hash":"Genereer een nieuw wachtwoord hash", + "Login failed. Invalid username or password":"Inloggen mislukt. Verkeerd wachtwoord of gebruikersnaam", + "password_hash not supported, Upgrade PHP version":"password_hash is niet ondersteund, Upgrade PHP versie", + "Advanced Search":"Geavanceerd zoeken", + "Error while copying from":"Fout bij het kopiëren van", + "Nothing selected":"Niets geselecteerd", + "Paths must be not equal":"Paden mogen niet gelijk zijn", + "Renamed from":"Hernoemd naar", + "Archive not unpacked":"Archief niet uitgepakt", + "Deleted":"Verwijdert", + "Archive not created":"Archief niet aangemaakt", + "Copied from":"Gekopiëerd van", + "Permissions change":"Rechten aanpassen", + "to":"naar", + "Saved Successfully":"Succesvol opgeslagen", + "not found!":"niet gevonden", + "File Saved Successfully":"Bestand succesvol opgeslagen", + "Archive":"Archief", + "Permissions not changed":"Rechten niet aangepast", + "Select folder":"Selecteer map", + "Source path not defined":"Bronmap is niet gedefinieerd", + "already exists":"bestaat al", + "Error while moving from":"Fout bij het verplaatsen van", + "Create archive?":"Creëer archief?", + "Invalid file or folder name":"Ongeldige bestand- of mapnaam", + "Archive unpacked":"Archief uitgepakt", + "File extension is not allowed":"Bestandstype is niet toegelaten", + "Root path":"Pad startpunt", + "Error while renaming from":"Fout bij het hernoemen van", + "File not found":"Bestand is niet gevonden", + "Error while deleting items":"Fout bij het verwijderen van items", + "Invalid characters in file name":"Ongeldige karakters in bestandsnaam", + "FILE EXTENSION HAS NOT SUPPORTED":"BESTANDSTYPE IS NIET ONDERSTEUND", + "Selected files and folder deleted":"Geselecteerde bestanden en mappen verwijderd", + "Error while fetching archive info":"Fout bij het verkrijgen van archief informatie", + "Delete selected files and folders?":"Verwijder de geselecteerde bestanden en mappen?", + "Search file in folder and subfolders...":"Zoek bestand in map en submappen...", + "Access denied. IP restriction applicable":"Toegang geweigerd. IP-beperking van toepassing", + "Invalid characters in file or folder name":"Ongeldige karakters in bestand- of mapnaam", + "Operations with archives are not available":"Bewerkingen met archieven zijn niet beschikbaar", + "File or folder with this path already exists":"Bestand of map met dit pad bestaat al", + "Moved from":"Verplaatst van" + } + } + ] +} diff --git a/scripts/index.html b/scripts/index.html index 4dc525f..a0a4aa8 100644 --- a/scripts/index.html +++ b/scripts/index.html @@ -59,8 +59,11 @@ a {
-
- + + +
+
+
@@ -80,7 +83,9 @@ a {
- +
+ +
@@ -100,5 +105,7 @@ a {
+
+
diff --git a/scripts/list_pages.php b/scripts/list_pages.php deleted file mode 100644 index 0d2b8bb..0000000 --- a/scripts/list_pages.php +++ /dev/null @@ -1,119 +0,0 @@ - - -
-
-
-$file
"; - if(is_dir($dir.'/'.$file)){ - printFoldersRecursive($dir.'/'.$file); - } - } -} - -printFoldersRecursive('/home/pi/BirdNET-Pi'); -?> -
-
-
- diff --git a/scripts/list_scripts.php b/scripts/list_scripts.php deleted file mode 100644 index 2ed0600..0000000 --- a/scripts/list_scripts.php +++ /dev/null @@ -1,115 +0,0 @@ - - -
-
-
-"; - if(is_dir($dir.'/'.$file)){ - printFoldersRecursive($dir.'/'.$file); - } - } -} - -printFoldersRecursive('.'); -?> -
-
-
- diff --git a/templates/gotty b/templates/gotty index e4fe5da..04e290f 100644 --- a/templates/gotty +++ b/templates/gotty @@ -1,5 +1,5 @@ preferences { - font_size = 16 + font_size = 18 foreground_color = "rgb(0, 0, 0)" background_color = "rgb(119, 196, 135)" }