pax_global_header00006660000000000000000000000064145125223500014511gustar00rootroot0000000000000052 comment=448bf8065c0014fc77dd96d57bd0a1f34e185e46 pdfarranger-1.10.1/000077500000000000000000000000001451252235000140645ustar00rootroot00000000000000pdfarranger-1.10.1/.coveragerc000066400000000000000000000001241451252235000162020ustar00rootroot00000000000000# Empty file just to avoid a crash in coverage with # --concurrency=multiprocessing pdfarranger-1.10.1/.github/000077500000000000000000000000001451252235000154245ustar00rootroot00000000000000pdfarranger-1.10.1/.github/ISSUE_TEMPLATE/000077500000000000000000000000001451252235000176075ustar00rootroot00000000000000pdfarranger-1.10.1/.github/ISSUE_TEMPLATE/bug_report.md000066400000000000000000000016551451252235000223100ustar00rootroot00000000000000--- name: Bug report about: Create a report to help us improve title: '' labels: '' assignees: '' --- Describe the bug ---------------- A clear and concise description of what the bug is. To Reproduce ------------ Steps to reproduce the behavior: 1. Go to '...' 2. Click on '....' 3. Scroll down to '....' 4. See error Expected behavior ----------------- A clear and concise description of what you expected to happen. Input files ----------- Check if the bug appear only with some PDF or image files. If the bug is specific to some files please attach one to the issue. Screenshots ----------- If applicable, add screenshots to help explain your problem. System and Versions ------------------- - PDF Arranger version and where you get it (distro package, flatpak, pip, git, download, ...) - pikepdf version and where you get it (distro package, pip, git, ...) - OS name and version (e.g.: Windows 10, Fedora 33, ...) pdfarranger-1.10.1/.github/workflows/000077500000000000000000000000001451252235000174615ustar00rootroot00000000000000pdfarranger-1.10.1/.github/workflows/codeql.yml000066400000000000000000000015011451252235000214500ustar00rootroot00000000000000name: "CodeQL" on: push: branches: [ "main" ] pull_request: branches: [ "main" ] schedule: - cron: "16 9 * * 2" jobs: analyze: name: Analyze runs-on: ubuntu-latest permissions: actions: read contents: read security-events: write strategy: fail-fast: false matrix: language: [ python ] steps: - name: Checkout uses: actions/checkout@v3 - name: Initialize CodeQL uses: github/codeql-action/init@v2 with: languages: ${{ matrix.language }} queries: +security-and-quality - name: Autobuild uses: github/codeql-action/autobuild@v2 - name: Perform CodeQL Analysis uses: github/codeql-action/analyze@v2 with: category: "/language:${{ matrix.language }}" pdfarranger-1.10.1/.github/workflows/install.yml000066400000000000000000000044101451252235000216510ustar00rootroot00000000000000name: pdfarranger on: push: branches: [ main, "1.10" ] pull_request: jobs: build: runs-on: ubuntu-latest # PikePDF 4.4.1 container: jeromerobert/pdfarranger-docker-ci:1.4.1 env: PDFARRANGER_COVERAGE: 1 steps: - uses: actions/checkout@v3 - name: Install run: pip3 install .[image] - name: AppStream run: appstreamcli validate /usr/share/metainfo/com.github.jeromerobert.pdfarranger.metainfo.xml - name: Validate Desktop File run: desktop-file-validate /usr/share/applications/com.github.jeromerobert.pdfarranger.desktop - name: Tests and Coverage run: python3 -X tracemalloc -u -m unittest discover -v -f -s tests - name: Combine Coverage run: python3 -m coverage combine - name: Codecov run: curl -s https://codecov.io/bash | bash build-pikepdf-6: runs-on: ubuntu-latest # PikePDF 6.0.1 container: jeromerobert/pdfarranger-docker-ci:1.5.0 steps: - uses: actions/checkout@v3 - name: Install run: pip3 install .[image] - name: Tests run: python3 -X tracemalloc -u -m unittest discover -v -f -s tests build-old-pikepdf: runs-on: ubuntu-latest # PikePDF 1.19 container: jeromerobert/pdfarranger-docker-ci:1.3.1 steps: - uses: actions/checkout@v3 - name: Install run: pip3 install .[image] - name: Tests run: python3 -X tracemalloc -u -m unittest discover -v -f -s tests build-win32: runs-on: ubuntu-latest container: image: jeromerobert/wine-mingw64:1.8.1 options: --user root steps: - uses: actions/checkout@v3 - run: ./setup.py build - run: HOME=/root wine python setup_win32.py bdist_msi - run: HOME=/root wine python setup_win32.py bdist_zip - uses: actions/upload-artifact@v3 with: name: pdfarranger-windows-installer-msi path: dist/*.msi - uses: actions/upload-artifact@v3 with: name: pdfarranger-windows-portable-zip path: dist/*.zip rpmbuild: runs-on: ubuntu-latest container: dreua/pdfarranger-docker-rpm steps: - name: RPM Build run: /pdfarranger/pdfarranger-build - uses: actions/upload-artifact@v3 with: name: pdfarranger-fedora-testbuild path: /github/home/rpmbuild/**/*.rpm pdfarranger-1.10.1/.gitignore000066400000000000000000000000221451252235000160460ustar00rootroot00000000000000__pycache__ venv/ pdfarranger-1.10.1/COPYING000066400000000000000000001045141451252235000151240ustar00rootroot00000000000000 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 . pdfarranger-1.10.1/README.md000066400000000000000000000134241451252235000153470ustar00rootroot00000000000000## About [![CodeQL](https://github.com/pdfarranger/pdfarranger/workflows/CodeQL/badge.svg)](https://github.com/pdfarranger/pdfarranger/actions?query=workflow%3ACodeQL "Code quality workflow status") [![Codacy Badge](https://app.codacy.com/project/badge/Grade/1be9c9a69f3a44b79612cc5b2887c0f7)](https://www.codacy.com/gh/pdfarranger/pdfarranger/dashboard?utm_source=github.com&utm_medium=referral&utm_content=pdfarranger/pdfarranger&utm_campaign=Badge_Grade) [![pdfarranger](https://github.com/pdfarranger/pdfarranger/workflows/pdfarranger/badge.svg)](https://github.com/pdfarranger/pdfarranger/actions?query=workflow%3Apdfarranger+branch%3Amain) [![codecov](https://codecov.io/gh/pdfarranger/pdfarranger/branch/main/graph/badge.svg)](https://codecov.io/gh/pdfarranger/pdfarranger) *PDF Arranger* is a small python-gtk application, which helps the user to merge or split PDF documents and rotate, crop and rearrange their pages using an interactive and intuitive graphical interface. It is a front end for [pikepdf](https://github.com/pikepdf/pikepdf). *PDF Arranger* is a fork of Konstantinos Poulios’s PDF-Shuffler (see [Savannah](https://savannah.nongnu.org/projects/pdfshuffler) or [Sourceforge](http://sourceforge.net/projects/pdfshuffler)). It’s a humble attempt to make the project a bit more active. ![screenshot of PDF Arranger](https://github.com/pdfarranger/pdfarranger/raw/main/data/screenshot.png) ## Downloads | [PDF Arranger for Windows](https://github.com/pdfarranger/pdfarranger/releases) | Download on Flathub | [More…](https://github.com/pdfarranger/pdfarranger/wiki/Binary-packages) | | --------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------- | ### Linux and BSD packages [![Linux packages](https://repology.org/badge/vertical-allrepos/pdfarranger.svg?columns=4&exclude_unsupported=1)](https://repology.org/project/pdfarranger/versions) ## Customization of keyboard shortcuts You can change the default keyboard shortcuts. To do so, set `enable_custom` to `true` and edit the shortcuts in `config.ini` in the `[accelerators]` section. * For Linux: `~/.config/pdfarranger/config.ini` * For Windows installer version: `C:\Users\username\AppData\Roaming\pdfarranger\config.ini` * For Windows portable version, the file is located in the same folder as pdfarranger.exe. Optionally, this file can be removed. The application will then use the same config file location as in the installer version. ## Set custom language Language can be selected in the `Preferences` dialog. (PDF Arranger > 1.9.2) ## Install from source *PDF Arranger* requires [pikepdf](https://github.com/pikepdf/pikepdf) >= 1.17.0. Pip will automatically install the latest pikepdf if there is no pikepdf installed on the system. **On Debian-based distributions** ``` sudo apt-get install python3-pip python3-wheel python3-gi python3-gi-cairo \ gir1.2-gtk-3.0 gir1.2-poppler-0.18 gir1.2-handy-1 python3-setuptools ``` **On Arch Linux** ``` sudo pacman -S poppler-glib python-pip python-gobject gtk3 python-cairo libhandy ``` **On Fedora** ``` sudo dnf install poppler-glib python3-pip python3-gobject gtk3 python3-cairo \ python3-wheel python3-pikepdf python3-img2pdf python3-dateutil libhandy ``` **On FreeBSD** ``` sudo pkg install devel/gettext devel/py-gobject3 devel/py-pip \ graphics/poppler-glib textproc/py-pikepdf x11-toolkits/gtk30 \ x11-toolkits/libhandy ``` **Then** ``` pip3 install --user --upgrade https://github.com/pdfarranger/pdfarranger/zipball/main ``` In addition, *PDF Arranger* supports image file import if [img2pdf](https://gitlab.mister-muffin.de/josch/img2pdf) is installed. ## For developers ``` git clone https://github.com/pdfarranger/pdfarranger.git cd pdfarranger ./setup.py build python3 -m pdfarranger ``` For Windows see [Win32.md](Win32.md). ## For translators * Download the main branch (see [For developers](#for-developers)) * Run `po/genpot.sh`. The `pot` is an automatically generated file and as such should not be in the repository. It is to make life of some translators easier, but it might be out of sync with the source code. If you can regenerate it before adding or updating a translation, then do it. * Translations are in the following files: * [`po`](po)`/*.po` * [data/com.github.jeromerobert.pdfarranger.metainfo.xml](data/com.github.jeromerobert.pdfarranger.metainfo.xml) * [data/com.github.jeromerobert.pdfarranger.desktop](data/com.github.jeromerobert.pdfarranger.desktop) * For mnemonics accelerators (letters preceded by an underscore) try to follow those rules by priority order: * be consistent with other GTK/GNOME software * pick a unique letter **within that given menu** if possible * pick the same letter as the original string if available * pick a strong letter (e.g. in "Search and replace" rather pick `s`, `r` or `p` than `a`) * If possible, test your translation to see it in context (see [For developers](#for-developers) and [Set custom language](#Set-custom-language)) * Do not include `pdfarranger.pot` (or any `*.po` file which was just automatically regenerated) in your pull request. Submit only the translations you actually updated or added. * If you don’t want or can’t use the developers tooling (`git`, `po/genpot.sh`, `python`, …) you can edit, download or upload the `*.po` files from the GitHub web pages. pdfarranger-1.10.1/TESTING.md000066400000000000000000000037731451252235000155350ustar00rootroot00000000000000This file aims at listing all GUI operation one should do to test the whole PDF Arranger source code. Those tests must currently be done manually. May one day, they'll be done with [Dogtail](https://gitlab.com/dogtail/dogtail) or another GUI testing framework. As testing is done manually this list should remain as short as possible. Duplicate tests should be avoided and each step should test as many features as possible. This list was created using [Coverage.py](https://coverage.readthedocs.io). - Run `python3 -m pdfarranger mypdf.pdf` - Crop and rotate one page - Rotate a page 4 time - Split a page - Crop white border on another page - Edit PDF properties, change some properties, set multiple creators using json syntax then validate the dialog with cursor still in the text field. - Delete one page - Undo delete, redo delete - Zoom / unzoom - Move one page using drag and drop - Cut / paste within same PDF Arranger instance - Save As - Import an image - Import a PDF file - Copy (`ctrl+c` / `ctrl+v`) a PDF file from a file explorer - Drag a PDF file from a file explorer - Copy a PDF file from another PDF Arranger instance and paste it interleaved - Select all pages, copy then paste odd - Select even page, then invert selection - Drag a PDF file from a PDF Arranger to a other PDF Arranger instance - Duplicate a page - Reverse order - Rubberband selection with scrolling - Open the about dialog - Quit, cancel - Quit without saving ## Dogtail Running Dogtail tests and coverage in Docker: ``` docker run -w /src -v $PWD:/src jeromerobert/pdfarranger-docker-ci sh -c "pip install .[image] ; python3 -X tracemalloc -u -m unittest discover -s tests -v -f ; python3 -m coverage combine ; python3 -m coverage html" ``` Running Dogtail tests with the legacy PikePDF in Podman: ``` podman run -w /src -v $PWD:/src docker.io/jeromerobert/pdfarranger-docker-ci:1.3.1 sh -c "pip install .[image] ; python3 -u -m unittest discover -s tests -v" ``` pdfarranger-1.10.1/Win32.md000066400000000000000000000052641451252235000153170ustar00rootroot00000000000000# PDF Arranger on Windows ## Prerequisites Install [MSYS2](http://www.msys2.org) then upgrade it: ``` pacman -Syu ``` You might need to run it again (it tells you to): ``` pacman -Su ``` Install the required dependencies: ``` pacman -S mingw-w64-x86_64-gtk3 mingw-w64-x86_64-python-gobject \ mingw-w64-x86_64-python-cairo mingw-w64-x86_64-poppler mingw-w64-x86_64-gcc \ mingw-w64-x86_64-python-lxml mingw-w64-x86_64-qpdf mingw-w64-x86_64-pybind11 \ mingw-w64-x86_64-gettext mingw-w64-x86_64-gnutls mingw-w64-x86_64-python-pillow \ mingw-w64-x86_64-python-dateutil mingw-w64-x86_64-python-pip mingw-w64-x86_64-libhandy \ mingw-w64-x86_64-python-setuptools-scm git python-pip ``` and ``` /mingw64/bin/python3 -m pip install --user keyboard darkdetect https://github.com/jeromerobert/cx_Freeze/zipball/pdfarranger ``` ## Building pikepdf pikepdf cannot be installed from PyPI for the MSYS2/Ming64 python. It must be built from source. First get the source: ``` git clone https://github.com/pikepdf/pikepdf.git cd pikepdf ``` Switch to the latest tag and build, for example: ``` git checkout v6.2.5 /mingw64/bin/python3.exe -m pip install --user --no-build-isolation . ``` Now that pikepdf is installed you may also install img2pdf: ``` /mingw64/bin/python3.exe -m pip install --user img2pdf ``` ## Building PDF Arranger Get the PDF Arranger sources from a MSYS2 shell: ``` cd git clone https://github.com/pdfarranger/pdfarranger.git ``` Then ``` cd pdfarranger ./setup.py build /mingw64/bin/python3 setup_win32.py bdist_msi /mingw64/bin/python3 setup_win32.py bdist_zip ``` ## Debug / hacking After running `setup.py build` it's possible to run PDF Arranger without creating the installer: ``` cd pdfarranger ./setup.py build /mingw64/bin/python3.exe -m pdfarranger ``` ## Wine MSYS2 no longer work in Wine (see ). To create a pdfarranger installer in Wine you must first install the required mingw-w64 packages on a real Windows box. Then copy the MSYS2 `/mingw64` to Linux and run installation process with `wine /path/to/mingw64/bin/python3` instead of `/mingw64/bin/python3`. To run the PDF Arranger in Wine you may have to: ``` unset $(env |grep ^XDG_ | cut -d= -f1) ``` ## Docker (This is currently outdated and broken) ``` alias pythonwin32="docker run -v local:/root/.wine/drive_c/users/root/.local -v $PWD:/pdfarranger -w /pdfarranger -it jeromerobert/wine-mingw64 wine cmd /c z:/mingw64/bin/python" cd pdfarranger ./setup.py build pythonwin32 -m pip install --user pikepdf==1.19.3 img2pdf python-dateutil https://github.com/jeromerobert/cx_Freeze/zipball/pdfarranger pythonwin32 setup_win32.py bdist_msi pythonwin32 setup_win32.py bdist_zip ``` pdfarranger-1.10.1/data/000077500000000000000000000000001451252235000147755ustar00rootroot00000000000000pdfarranger-1.10.1/data/com.github.jeromerobert.pdfarranger.desktop000066400000000000000000000062311451252235000254210ustar00rootroot00000000000000[Desktop Entry] Version=1.0 Name=PDF Arranger Name[ca]=Arranjador de PDF Name[de]=PDF Arranger Name[hr]=PDF uređivač Name[hu]=PDF-rendező Name[id]=Penyusun PDF Name[ko]=PDF 편집기 Name[nl]=PDF Arranger Name[pt]=PDF Arranger Name[tr]=PDF Düzenleyici Comment=PDF Merging, Rearranging, Splitting, Rotating and Cropping Comment[ca]=Fusionador, arranjador, divisor, rotador i retallador de PDF Comment[cs]=Program pro sloučení, přeuspořádání, rozdělení, otočení a oříznutí PDF Comment[da]=Sammensæt, omarranger, opdel, roter og beskær PDF-filer Comment[de]=PDFs zusammenfügen, umsortieren, trennen, rotieren und zuschneiden Comment[el]=Συγχώνευση, αναδιάταξη, διαχωρισμός, περιστροφή και περικοπή αρχειων PDF Comment[es]=Mezcle, reordene, divida, rote y recorte documentos PDF Comment[fi]=Yhdistä, järjestele, jaa, käännä ja rajaa PDF-tiedostoja Comment[fr]=Fusionner, réorganiser, découper, pivoter et recadrer des documents PDF Comment[he]=מיזוג, סידור מחדש, פיצול, הטיה וחיתוך PDF Comment[hr]=Sjedinjavanje, preraspoređivanje, rastavljanje, okretanje i obrezivanje PDF dokumenata Comment[hu]=PDF egyesítése, átrendezése, felosztása, elforgatása és körülvágása Comment[id]=Menggabungkan, Mengatur ulang, Memisahkan, Memutar, dan Memangkas file PDF. Comment[is]=Forrit til að sameina, endurraða, skipta upp, snúa og skera utan af síðum í PDF-skjölum Comment[it]=Unione, riorganizzazione, divisione, rotazione e ritaglio di PDF Comment[ko]=PDF 합치기, 재정렬, 나누기, 회전 및 잘라내기 Comment[nl]=Een klein programma voor het samenvoegen, herordenen, opsplitsen, draaien en bijsnijden van pdf-bestanden Comment[pt]=Aplicação para juntar, organizar, separar, rodar e recortar ficheiros PDF Comment[ru]=Приложение для объединения, изменения порядка страниц, разделения, вращение и обрезки документов PDF Comment[sk]=Grafický nástroj na manipuláciu s PDF Comment[sv]=Slå samman, arrangera om, dela, rotera och beskär PDF filer Comment[tr]=PDF Birleştirme, Yeniden Düzenleme, Bölme, Döndürme ve Kırpma Comment[uk]=Додаток для об'єднання, зміни порядку сторінок, розділу, обертання та обрізання PDF документів Type=Application Exec=pdfarranger %U Icon=com.github.jeromerobert.pdfarranger MimeType=application/pdf;application/postscript;application/x-ext-pdf;image/x-bmp;image/bmp;image/gif;image/tiff;image/jp2;image/jpeg;image/jpg;image/png;image/x-icon;image/x-portable-pixmap;image/x-gray;image/x-ico;image/x-png;image/vnd.zbrush.pcx;image/x-pcx; Categories=Office; Terminal=false StartupNotify=false Keywords=pdfarranger;pdfshuffler;PDF Shuffler; Actions=new-window; [Desktop Action new-window] Name=New Window Name[ca]=Finestra nova Name[de]=Neues Fenster Name[es]=Ventana nueva Name[fr]=Nouvelle fenêtre Name[hr]=Novi prozor Name[hu]=Új ablak Name[id]=Jendela Baru Name[is]=Nýr gluggi Name[it]=Nuova finestra Name[nl]=Nieuw venster Name[pt]=Nova janela Name[uk]=Нове вікно Exec=pdfarranger pdfarranger-1.10.1/data/com.github.jeromerobert.pdfarranger.metainfo.xml000066400000000000000000000251351451252235000263550ustar00rootroot00000000000000 com.github.jeromerobert.pdfarranger PDF Arranger PDF 편집기 PDF uređivač PDF-rendező Penyusun PDF PDF Düzenleyici Arranjador de PDF PDF Merging, Rearranging, Splitting, Rotating and Cropping Fusionador, arranjador, divisor, rotador i retallador de PDF Program pro sloučení, přeuspořádání, rozdělení, otočení a oříznutí PDF PDFs zusammenfügen, umsortieren, trennen, rotieren und zuschneiden Συγχώνευση, αναδιάταξη, διαχωρισμός, περιστροφή και περικοπή αρχείων PDF Mezcle, reordene, divida, rote y recorte documentos PDF Yhdistä, järjestele, jaa, käännä ja rajaa PDF-tiedostoja Fusionner, réorganiser, découper, pivoter et recadrer des documents PDF Sjedinjavanje, preraspoređivanje, rastavljanje, okretanje i obrezivanje PDF dokumenata PDF egyesítése, átrendezése, felosztása, elforgatása és körülvágása Menggabungkan, Mengatur ulang, Memisahkan, Memutar, dan Memangkas file PDF Een programma voor het samenvoegen, herordenen, opsplitsen, draaien en bijsnijden van pdf-bestanden Forrit til að sameina, endurraða, skipta upp, snúa og skera utan af síðum í PDF-skjölum Aplicação para juntar, organizar, separar, rodar e recortar ficheiros PDF Приложение для объединения, изменения порядка страниц, разделения, вращение и обрезки документов PDF Grafický nástroj na manipuláciu s PDF Slå samman, arrangera om, dela, rotera och beskär PDF filer PDF를 합치기, 재정렬, 나누기, 회전하거나 잘라내기 PDF Birleştirme, Yeniden Düzenleme, Bölme, Döndürme ve Kırpma Додаток для об'єднання, зміни порядку сторінок, розділу, обертання та обрізання PDF документів com.github.jeromerobert.pdfarranger.desktop CC0-1.0 Office

PDF Arranger is a small application, which helps the user to merge or split pdf documents and rotate, crop and rearrange their pages using an interactive and intuitive graphical interface.

It is a frontend for pikepdf.

El PDF Arranger és una aplicació petita, que ajuda l'usuari a fusionar o dividir els documents PDF i girar, escapçar i reorganitza les seves pàgines utilitzant una interfície interactiva, gràfica i intuïtiva.

És una interfície per pikepdf.

Το PDF Arranger είναι μια μικρή εφαρμογή, που βοηθά τον χρήστη να συγχωνεύσει η να διαχωρίσει αρχεία τύπου PDF και να περιστρέψει, περικόψει η αναδιατάξει τις σελίδες τους χρησιμοποιώντας ένα διαδραστικό και διαισθητικό γραφικό περιβάλλον.

Είναι ένα γραφικό περιβάλλον για το pikepdf.

PDF Arranger es una pequeña aplicación que ayuda al usuario a fusionar o dividir documentos pdf y rotar, recortar y reorganizar sus páginas usando una interfaz gráfica interactiva e intuitiva.

Es una interfaz para pikepdf.

PDF Arranger est une petite application qui aide l’utilisateur à fusionner ou découper des documents PDF et pivoter, recadrer et réarranger leurs pages en utilisant une interface graphique intuitive.

Il s’agit d’une interface pour pikepdf.

PDF uređivač je mali program koja pomaže korisniku sjediniti ili rastaviti pdf dokumente te okretati, obrezati i preurediti stranice tih dokumenata pomoću interaktivnog i intuitivnog grafičkog sučelja.

Radi se o sučelju za pikepdf.

A PDF-rendező egy kis alkalmazás, amely egy interaktív és intuitív grafikus felület segítségével segíti a felhasználót a pdf dokumentumok egyesítésében vagy felosztásában, valamint az oldalak elforgatásában, kivágásában és átrendezésében.

Ez a pikepdf kezelőfelülete.

PDF Arranger adalah aplikasi kecil yang membantu pengguna untuk menggabungkan atau memisahkan dokumen PDF serta memutar, mencrop, dan mengatur ulang halaman-halaman menggunakan antarmuka grafis yang interaktif dan intuitif.

Ini adalah antarmuka pengguna (frontend) untuk pikepdf.

PDF Arranger er lítið forrit sem hjálpar notendum að sameina eða skipta upp PDF-skjölum, auk þess að hægt er að endurraða, skera utan af eða snúa stökum síðum í þeim með einföldu gagnvirku viðmóti.

Þetta er viðmót fyrir pikepdf.

PDF 편집기는 사용자가 PDF 문서를 합치거나 나누고 페이지를 재정렬할 수 있는 다기능 그래픽 인터페이스를 사용하는 간단한 프로그램입니다.

pikepdf를 기반으로 합니다.

O PDF Arranger é uma pequena aplicação, que ajuda o utilizador a juntar ou dividir documentos pdf e a rodar, recortar e reorganizar as suas páginas usando uma interface gráfica interativa e intuitiva.

É uma interface gráfica para o pikepdf.

PDF Arranger is een klein programma waarmee pdf-bestanden kunnen worden gedraaid, bijgesneden, opgesplitst en pagina's worden herordend, allemaal vanuit een intuïtief, grafisch venster.

Het is een frontend voor pikepdf.

PDF Arranger - это небольшое python-gtk приложение, которое помогает пользователю объединять или разделять документы PDF, а также вращать, обрезать и изменять порядок страниц с помощью интерактивного и интуитивно понятного графического интерфейса.

Это клиентский интерфейс для pikepdf.

PDF Arranger, kullanıcının etkileşimli ve sezgisel bir grafiksel arayüz kullanarak PDF belgelerini birleştirmesine veya bölmesine ve sayfalarını döndürmesine, kırpmasına ve yeniden düzenlemesine yardımcı olan küçük bir uygulamadır.

pikepdf için bir önyüzdür.

PDF Arranger це маленький python-gtk додаток, який допоможе користувачу зливати разом або розділяти pdf документи і перегортати, обрізати і переставляти місцями сторінки за допомогою інтерактивного і інтуітивного графічного інтерфейсу.

Це графічна оболонка для pikepdf.

https://github.com/pdfarranger/pdfarranger/raw/main/data/screenshot.png GPL-3.0-or-later https://github.com/pdfarranger/pdfarranger https://github.com/pdfarranger/pdfarranger/issues https://github.com/pdfarranger/pdfarranger/discussions https://github.com/pdfarranger/pdfarranger#for-translators pointing keyboard touch 520
pdfarranger-1.10.1/data/icons/000077500000000000000000000000001451252235000161105ustar00rootroot00000000000000pdfarranger-1.10.1/data/icons/hicolor/000077500000000000000000000000001451252235000175475ustar00rootroot00000000000000pdfarranger-1.10.1/data/icons/hicolor/16x16/000077500000000000000000000000001451252235000203345ustar00rootroot00000000000000pdfarranger-1.10.1/data/icons/hicolor/16x16/apps/000077500000000000000000000000001451252235000212775ustar00rootroot00000000000000pdfarranger-1.10.1/data/icons/hicolor/16x16/apps/com.github.jeromerobert.pdfarranger.png000066400000000000000000000014671451252235000310440ustar00rootroot00000000000000PNG  IHDRa pHYs\rtEXtSoftwarewww.inkscape.org<IDATxu3-G؊m.cWImKWŶm^8+̳+?㾏e-C'=V0x4rZޜw=nNk&65/d ]Ƕnu[ѓObr ۭP޼rQR̟DnW6\ ScLBFUqBPؠIa+&ɂI[f<#)ަsȢ R"lNr[-nϠqR(E9K:U $} ͟Wl)+.]Ae]]`\#AJG0Yq)oE+b[a~yq~E6 1Yp,슛m7lI (t6{Q-xY2BbՋ5&Ss6$IG_*Qs1PA (#EL} pV+g,~m1a)џ>/W~ nD<~0=Tf"iy+xП8k=,żjl E,UQbP) 1>pAGhv7Q<i{gA9gD~OY8puCr;G^(Br 7v3'#XAc%NRnl$'Are-~WM*K0 17#PWڠT<2JDkVu{xWܖvI]]ugU=taFfLgPөʂTyB ^m]۝󈩾n:Vk{O]vpǚ-fTƮܑj$ ^L3mj;-fTьGznqTe*S9hh[Q~ >sv_15vqd\Vj0*fTk(4i춂ڮ3{﮾]SR *qz05\=z6k/uyn;Εg ~pSGFFAKD8tx\K .wm@^mn#z׋%vDW<, s7 d\cF.Ād܃ٲ8= " !Ⱥka$53=bwWa!/g^S~r_S6U^-mX OCZ22 ~i֡zqtHn/QiBU]/wz@Q@R`& ~!WuV_@ؖ@}Ӏ Km'yO&ܤ5 i̐ko<$b]ؙD}NfR[@mxg, n!pSǺbc ܛocΚM1tOMkior"7e4滸1w9+3sEIcG54S{28WhnAr):ن@Ic΍+L>~ ]G`>n4NWfӀs 7i r[RV]7\-{gt姙]عK4Wi*f\k+L; ]0h`isw{9zE_/ ޞƍ _L2?fY X 0 ;Aul\{r ~V ?A2-vVnCi0!#A*?G߭ ᆳkvk+m ;F oF?P>2hϢP)"sG>sPG X[o8l sm|ː`}MHYksp<φ7,:Ɓ=rӟLIGa(O]"\7>Ǎz39h MF?" Na$~€@H%6*}Q ?]19}Fﶯo6l ;iZk9rР3g B2(+GT 3I aU,BӶi`j-TS&p~`i}gu{Uv0)~?4P &h9]YB ro+nT`R8yˎ,ypg{vVҠ[C/j-wwQHAŴSyHC. OǍzd€rgNW ^aT \7QJPgyȕWJr[ 1"ʅ\pv?O}NdRϠ)AgBU>4 =&>Tt >7ۤ\<Ŧ  DXN6ư34H+dW; $UzǍ+I Syw)~?\ȂL (^;En|<]y`>y}7p`Qrx R(Zu8pW@% 0t@ѕ]N偮ߟhnULw+/,o7q}ɖ qǍq16te33UyZ DTy{΀URtmBbrbte)<ȍzrj!OAGY@Y@zdmLΫ#:6&g- |>PeԷ-qN/ sf.ETV‹;'wX To3yPҫ+ uK)u]){>7M;Xb>m3頜|<]= 9h1u]4o<>I <6vU4z^n){XsJM%e9nV|s> M} ^QDQ#>W_3/u@uzuY2jPS wMl0`ȫF+s?dVǣe6;๦MԎѥs#du:މ |{5m.6sGO{ԷMqLGP]KC %?O`W;Y 'G[HGȝyBKFZU=iAD6>\1"c0f;7oWU@,%b;x0|v N]4q[xqV*s+ĥ#TUBWR`xEfob+v& ɴ]Կ޵K\KqxBmB=,@ټJO[A{WC3!|P5n>SM=Y,MJ_qY5-wR٬:[\@4,O^Yѕ:s0 pqqu$QwIT8ѡ֠K<mᜮioX u|Eu<0H|\ys:<me V+~Tmd宛rg;vI ]@p57{G!Xq[w T5tt*[8;'D]`']@D<o:tpp/=N@]v-@{yЭJ-gazJ WC @:?xg j(gZu?Iv < (K9pAP- Aa{WӞ/оuG+o,ݸϚo;zRU*%9w9]'1@-X|fdշ`j\Nl.unvQ#݅L;Tc>1}=ъ0g‘j\#)-w8f;\YM:b̏k ͷѩV Mwg"r#!;C:wrܽq)Ǥ[v`-3gNg㲪$#I|G1rs)@#騁.`\9LZi_WL3΅rlu:W *1 Ĩ\?4HG-d!`N 7pM;z2foh{APE&8d˃p[,L gK\q-4(wր %h@\~r;%(.H?xԆKG:5b?:*^rXHCO7492Kc5(\Ղەlt fԅsm?Ѕ-A<Ǫҕ:nr,b)?rG :,<^ek|خc<ק9r<]>.!k7eF,a_nvHCj6Zt3:.JIxݫۼ9-A21O `'22 vt<jM۞79Pm1[nu߹Oݸ1B/KbL8p0oS졅n2K#w8 qR=ĻvE4/zK x:p0C%gWYVLuiuvs KUKUWbIiMK>p=.`tD| 4m)ڲttKlQu?ק)6fbi]R8p}@i:x|DM«FSP[z}%RXY} g鲡) p wS 7ݮ(*@[@jE,m{߆;J}֚ ?K\M!Prqcj^ }Zu·+1Jw5L]ܽ{lI`YAuN2«ξ>},3M.kf [x?w3#ߞ=~dr0 5ZS0\ vnvSx3 53,俕*b5үBP~oo7q}uv K|=mt/7jJiA |H[d y{U3mvgWX gie k6fկ¯'j&?n~šh$y yRnUHz:9~s1PlÏeoU) S<▍@M&qsFԠf87Z/U Lr- 8}B2M2`@Y?fJj9MO02%Rl Rzxyl'XP`(Ho|rʔ{?/Jq\v0U)~fd$Cwu.9a" 0 'ó,³߭ >m5x&c_$z~O\M/@=L3DW߮J6um K5 쿾 'ufdz9[if(ċL+L23io|" 4-Q0b9RY)^/| @BPЈ (DZrD]ULA("LV RoBPu5(,P]K57p]lCx#n4F]9 ;E@6kuY<~R=0u! .KMdYyH_>&MzFjpĎ@!W73V׃KVULE<|MŖrv:B*Ի: ۂ5LNNYFGjd؆M Nڥ'Qg\ 1"v Jh v{ ϥ. ; i*h^ua!@_ק[8%sY4IhRX S<ܩ#63JAs<BNO{PD'ېtobvV}硻xpÝ JV?QP^^=%~_[l ڍzCkp2 w]Կ=IYkr ׵, Uz 2B5ԏ{Y/v7ЂS@+YkQ`WOTS{OGB"YziJnCO.v8ȜϠTdr"TڇXU4o覯 U_]n~gP]HCsg:AS,p[7Nyb{cӀLdqxoc! 4ZU olܕL\"26d$PwI 7]_ğp0Sy`g8&g*j}K ՚IqߢW T b.B鯭'ԺsRS!q/}z@(#~&#5,gCMIJR3=yMՀAM(/㛻l`q4v:z7+B"NyNfP*2Rc`୊!,TKAGԖB\C5{lAn ɹVl_6g`8?bgRni!^a&|5 h'P@CHmӳ7w俛b@]e@hu0ɮ~>h>g `ۓ{5(Fy=[LmPg/;ax /ORmxo^{0k%R.<mWPA\ة!vtDqϽ2uJò ڳ0z::PbgY^[I bhHb:Νƶpwݨs 1@M+ <N!6篟iZ]sN͆&1w?nDo ݌ Ux_~n=k"˨J<72h F{6HA*ţ6{U܁OT\K:,  =]J `"7bcoew ՠGlq @rsWtO9!V x3o,GI/`sS`ʹf]6<x}v"i~f2-q;斟$:% ~9mf?P> ^aed.M";&r10j0za~Go o޷n蔭RY =)#iLFi#6b~X??;jjBO +ƢocEF,yxl?4Bz@C1(F%=c|@*9 oEi gҀ^hxo">w!H ZIRkFppoFYs`c;F`f9VM{@/H3}Xٷz+/7dHMEknԻ^yko2p{DNA:T rM*$SLW 58z'/Ǜ(!}0F2H%xt@}(p7F6"AV#\ BH`kDnj80zd"X)߰i7@Z}c'Bnׯ"r}ĝ@Ll/;.,ci(қ+:^[9͢үAP%lI:G؅ZTk@`eS4>-~N 'Bp,7*d>;>`׈ Feu"n`Z>IP{5sG0I1*"[\R,Ч93^Fex. hu _PQWγ_aJ֌/о'LR1,ka#0 Rȫҷf\kV&}*F^zƍ(8#R"S0+t"-x_ǬeRTB 9]@2 uBDZ5=lק`ɦJXvKGJ`n+/pT0sQ0 -@'VΦ^DF?=EY|JD8xu!a&Quu41}ᖻs"#piWU_|&Aja2 owJ?~hG8yKBW 7Kʃo 2.=ˆl鍊CX`ON)CahVpp\YKbٻT;e U4uTK+R* ;˝f/$ܬcA,ѹ OGƗYTY3r[3_zh=07q5]F?7 mv?Fr5:?^-o)[z+& \a\6p=u{ s9` Ya/q HaVz].|(nd4w;j4SǴs 3K/-wC_J_ g!ak[xͣ\%NI'jd9`K<vQO@ɚRǛf`wVi\e܍P$xcsr[];7qeUBa{ΎFh`Qpߤ'los`>@_bR5o5sXqP D~N@L <<'CPZ\cbe$h.vSY< V:ACZ9ԥiפ{9hhƸQ!&VRr4@c|zuШո0[Vͣ'Ҫy[~!*iI)dQ2g3Hp_I;5wٳӱc4Y]Af=Eyly!9>asWPF"?z5\1]K;?I"%qoBŜwZYJRlwVnag04S_v:r\A68}'`X&Uv6^E߷ٔqdx6`6@س jR%I5 {ZL_"dA/#3Ï$? &m ;-[w]7N ,Pv*c<`e4'и2NE8EX[T ? O;stw{4[1 d}\I6PJIKe(B '] 32Vh=/̹UoHݎ@V ,aFIENDB`pdfarranger-1.10.1/data/icons/hicolor/32x32/000077500000000000000000000000001451252235000203305ustar00rootroot00000000000000pdfarranger-1.10.1/data/icons/hicolor/32x32/apps/000077500000000000000000000000001451252235000212735ustar00rootroot00000000000000pdfarranger-1.10.1/data/icons/hicolor/32x32/apps/com.github.jeromerobert.pdfarranger.png000066400000000000000000000035261451252235000310360ustar00rootroot00000000000000PNG  IHDR szz pHYs'tEXtSoftwarewww.inkscape.org<IDATxVdA=Y'mm6ֶm۶m6{Ϩb93*2+$w#NvST4N]i78B#y$T4dQ 8 .AcH/aE&~yC:+&E{UpGp ^Q;@&L=%긌Zaؓi=Df:d[|tiAV~)R6' %]΃lF(h_E@1 g:>@K ɿHVir[0A1n7ý!V跧AI`5H~(IvS 7ӈ|G``n>MvC:)ʠyIb ˂vs S%G&& 3 Pq ϳбDs Gi;\ɪDY%8 '4#괝ǭG3l0C0oӿT+XɠoP$M $3e72=ݧ _͚[9>wqPwHw2aEQmp S@l9pk@^$/˭&ªepsr(ϪsB,0";63/Sn.hWv(J@jԠוg[M_?'EADLT2\k&•$,sl8}wycImKsPr&329Vu0q~PtgA|/w6+B`(µJ@.0k!?jϙPM'@m?)ӃHq 5,etTq]M}BS[,Ogas x߅D_a* |=$hi"HgrP\z] a]A9eח*M}d,0{ToCNn+7]%"$HH,s D (o4-,~p&$ .0f݋v9=VXD5vL!6e@Nwp٘ c54"$\b"$D'|:U60ZyKsLu[VШ01:{":GUH5>ȳf)/5t $k"bIkã14::ϫY+(,a3&ǪS D(`WQ8\<pD %iGRNi oy|+4{2qK,0mW;M#bYx`A"jJp߭ YZ_# x$NK;_F'΋M%Qs,&p^;iqjp q!/U!$@9H/S?Vh Iz9 JH^ʗ=?G*AyFŪ$Px8A| Fm aYtILPη~zBnNיTEDaT?US:<:<:CooWN&X?u?Y# |M  .\ jq;j]L My*SAlE6G&?WM.H@1H2"74RT"=QwEa eMkTHM(dSz`"d>ܺ"OHAMz\(u։s|`iqTsGۓIIǚQb0i.lxe xc`,i t&oh̰0w_'\^0oZB{w}$A܏-Rp G։-"dlIgF- Vde| ok"C^6O U՗!1^M9CU T&X<&3AJn32㶘 9}p{Ivc*I \pEݼ8>~A-ULsjjSgb)t WƁ; <,/ oM+WoC3oŘ|6T8<ˉQpq`߱9A߳_lD}DUةzX<6"p1#z~9@]Ia¥; vm  U5 =o$:; 7xm Vw#Pk1CcC)a']K2[mI8zin4&A. R.`p&5u@.'dm 4^L]NKH|b0<0 7fmt :"6G"%CP^ivH¥%W(usގd]\ـ4e*^4QD5 fqh=遛״>煆_ n.J5PUW7sCz2*И & nNmj7&p2$8Я 9! giw&MfG`N;M`Rީ_׼T?s6C[r*Ynk % Kr >bTefBvh+UXM>HS8vo|kϮl b5cWOkEEksK 눧|d-լޏ }%kf^=J=ڿ4xi }iv&fK3׻Z%]*\'\ |AOXg$Cr}qX.4op1H2EY28l1J |HĀ M_(Oׂ7SO|KHz'Iw5ND9 7)cIENDB`pdfarranger-1.10.1/data/icons/hicolor/scalable/000077500000000000000000000000001451252235000213155ustar00rootroot00000000000000pdfarranger-1.10.1/data/icons/hicolor/scalable/apps/000077500000000000000000000000001451252235000222605ustar00rootroot00000000000000pdfarranger-1.10.1/data/icons/hicolor/scalable/apps/com.github.jeromerobert.pdfarranger.svg000066400000000000000000000370651451252235000320430ustar00rootroot00000000000000 pdfarranger-1.10.1/data/icons/hicolor/symbolic/000077500000000000000000000000001451252235000213705ustar00rootroot00000000000000pdfarranger-1.10.1/data/icons/hicolor/symbolic/apps/000077500000000000000000000000001451252235000223335ustar00rootroot00000000000000pdfarranger-1.10.1/data/icons/hicolor/symbolic/apps/com.github.jeromerobert.pdfarranger-symbolic.svg000066400000000000000000000020551451252235000337240ustar00rootroot00000000000000 pdfarranger-1.10.1/data/menu.ui000066400000000000000000000420311451252235000163000ustar00rootroot00000000000000
_Open win.open
_Import win.import
_New Window win.new
_Save win.save document-save-symbolic Save _As… win.save-as document-save-as-symbolic E_xport
E_xport Selection to a Single File… win.export-selection 2 Export Selection to _Individual Files… win.export-selection 3 Export _All Pages to Individual Files… win.export-all
_Print… win.print document-print-symbolic
_Undo win.undo _Redo win.redo
_Edit
_Delete win.delete Cu_t win.cut _Copy win.copy Paste _After win.paste 0 Past_e Special Paste _Before win.paste 1 Paste As _Odd Pages win.paste 2 Paste As _Even Pages win.paste 3 Paste As O_verlay… win.paste 4 Paste As _Underlay… win.paste 5 Rotate _Left win.rotate -90 _Rotate Right win.rotate 90 _Page Format… win.page-format Crop White Borders win.crop-white-borders Dupl_icate win.duplicate Re_verse Order win.reverse-order _Split Pages… win.split _Merge Pages… win.merge Insert Blan_k Page… win.insert-blank-page Generate Booklet win.generate-booklet
_Select
Select _All win.select 0 _Deselect All win.select 1 Select _Odd Pages win.select 2 Select _Even Pages win.select 3 All From _Same File win.select-same-file 4 Same Page _Format win.select-same-format 5 _Invert Selection win.select 6
_View
Zoom _In win.zoom-in Zoom _Out win.zoom-out Zoom _Fit win.zoom-fit Full_screen win.fullscreen
Edit _Properties win.metadata
Pre_ferences win.preferences
_About win.about
_Close win.close
_Quit win.quit
_Delete win.delete Cu_t win.cut _Copy win.copy Paste _After win.paste 0 Past_e Special
Paste _Before win.paste 1 Paste As _Odd Pages win.paste 2 Paste As _Even Pages win.paste 3 Paste As O_verlay… win.paste 4 Paste As _Underlay… win.paste 5
_Select
Select _All win.select 0 _Deselect All win.select 1 Select _Odd Pages win.select 2 Select _Even Pages win.select 3 All From _Same File win.select-same-file 4 Same Page _Format win.select-same-format 5 _Invert Selection win.select 6
Rotate _Left win.rotate -90 _Rotate Right win.rotate 90 _Page Format… win.page-format Crop White Borders win.crop-white-borders Dupl_icate win.duplicate Re_verse Order win.reverse-order _Split Pages… win.split _Merge Pages… win.merge Insert Blan_k Page… win.insert-blank-page Generate Booklet win.generate-booklet
E_xport
E_xport Selection to a Single File… win.export-selection 2 Export Selection to _Individual Files… win.export-selection 3 Export _All Pages to Individual Files… win.export-all
pdfarranger-1.10.1/data/pdfarranger.ico000066400000000000000000002040761451252235000177750ustar00rootroot00000000000000 (( o,r-ro,h)c&^#]$Mb' N' S!MT!\&c'k+o-qd,@g(m+s.m+g(a%\#\#\#\#ß\"\#:@@@@T#:U ~T!T!T!T!Z$a'i+p.i+b&@@Ud&i)o,q-k*e(`%\#\#\#\#\#\#\"[#\"wZ#3S"U!fT!T!T!T!T!T!T!T!X#_&g*n-k,d(\%@@_#e'j*p-p,k+e'^$\#\#\#\#\#\#\#\#\#\#\#\#]#f[$U$T!US!T!T!T!T!T!T!T!T!T!T!T!V"^%e*l,m-f)^&X"\`%f(s-}2233|1s,h(_$\#\#\#\#\#\#\#\#\#\#\#\$О]#\#Hf M S GT!U!T!T!T!T!T!T!T!T!T!T!T!V"`&i+r0x3x3w2v1m-`'Y#U \#ue'|0333333332y/o+f']#\#\#\#\#\#\#\#\#\#\#\#]#\$z["5UUR"5T"yU"T!T!T!T!T!T!T!T!T!T!T!U!]&g*q/x2x3x3x3x3x3x3x3x3r0]&T!tb&}133333333333333w/m*b&]#\#\#\#\#\#\#\#\#\#\#\#[#\"wZ#3S"U!fT!T!T!T!T!T!T!T!T!T!T!T!T![$d)n.w2x3x3x3x3x3x3x3x3x3x3x3x3x3s1Y#f v.3333333333333333332v.k)a%\#\#\#\#\#\#\#\#\#\#\#\#[#]$U^(N' S"DT!T!T!T!T!T!T!T!T!T!T!T!T!W#`'j,t1x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3m-] k)i33333333333333333333333|1q,h(^$\#\#\#\#\#\#\#\#\#\#\#]#̞\$a$G^$9T wU!T!T!T!T!T!T!T!T!T!T!T!V"_'i+s0x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3c(gw-33336mI_QVSWTWTWTWTWTWTWTWTWTWTWTWTWTWTWTWTWTWTVTRRNPINELELELELELELELOFwc;gx/W#T!T!T!T!T!T!T!T!T!T!U!]%f*o/w3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3k,}1334b^?63w0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p{9hqPVejAX*T!T!T!T!T!T!T!T!T!T!T!Y$b(l-u2x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3s1n.,33~6Lq=:63w0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p~4lsJ[hcF\~0T!T!T!T!T!T!T!T!T!T!T!W"`'j,s1x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3d,.r,33Mh9=:63w0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p1owCak^K`w6U#T!T!T!T!T!T!T!T!T!T!V"^&g*q0x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3i-x/3hH69=;<>>>>>>>>>>>>>>>>I_covFY'T!T!T!T!T!T!T!T!T!T!T"[$e*n.w3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3n/}23Fe6:AEEEEEEEEEEEEEEL^v|sT_/T!T!T!T!T!T!T!T!T!T!T!Y$b(l-v1x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3t2t,K353v7CEEEEEEEEEEEHZm]h:U"T!T!T!T!T!T!T!T!T!T!V"`'j,s0x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3g)Ju.3w;3vBEEEEEEEEFTieo|CW$T!T!T!T!T!T!T!T!T!T!U!\%g*q0x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3k-{13t=9EEEEEEQdltzJZ(T!T!T!T!T!T!T!T!T!T!T!Y$b(l-v2x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3j-W$Ctg+x3x3x3x3x3x3x3x3x3x3x3x3x3o.`@23t=@EEEFjsl;T!T!T!T!T!T!T!T!T!T!T!X#`'j,u1x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3q0_(L6`6_@oKS!x3x3x3x3x3x3x3x3x3x3x3x3x3v2f3 q,h33rADEELKc([$T!T!T!T!T!T!T!V!^&g*q0x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3t1a(N :d3Y>kG|Q T!T!T!Px3x3x3x3x3x3x3p0x3x3x3x3x3x3g,hu-33mKEEG~Hl,e)]%V"T!T!U![$e*n.x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x2i,U#Br2Y:gExOT!T!T!T!T!T!T!T!q0x3x3u2d*Q!=j4[m-x3x3x3x3x3l-|033lNEEwgk,n-g*_&\%d)n-w2x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3l.X$Dx2Y6^@oLS!T!T!T!T!T!T!T!T!T!T!T!T!R">l1W;fDwOT!W$x3x3x3x3x3q0z3333lNEIi0i+p.j+p/x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3r0_(L8_5]@oIS!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!I~BsMS!T!T!T!T!Ox3x3x3x3x3x3l1r.333lNE[`'g*o.v2x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3u2d*Q!=j2X;fDwP T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!R w3x3x3x3x3x3g+v/333lNEhk^&f*w2x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x2i,U#Br2X8bBsLT!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!e*x3x3x3x3x3m-}1333lNEhh\%p/x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3n.Z&G{3[6^@oJS T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T"x3x3x3x3x3t1s-33333lNE\x\%w2x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3s0_(K7a3Y>kG|R T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!Q x3x3x3x3x3x3j+5s,3333lNEMb(x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3w2g+Q!=j3YkG|Q T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T"[$e*n.w3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3g,Ru.33333hMEENw3x3x3x3x3x3x3x3x3x3x3w2i,U#Br2W;fDwOT!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!Y$b(l-v1x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3k-z033333XFEEEv7x3x3x3x3x3x3x3n.Z&G{3Z8bBsLS!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!V"`'j,s0x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3p/j+ 233333NBEEEKx3x3x3x3x3t16\6^@oJR!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!U"^&g*q0x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3v2[$r.p333333OCEEEprx3x3x3x3x3x3NT!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T![$e*n.w2x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3j,ou.33333s,RDEEEGv3x3x3x3x3x3Q T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!X#`'j,u1x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3m,{033333_%RDEEEEw;x3x3x3x3x3\%T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!V!^&g*q0x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3o/[&H}^'x3x3x3x3x3r0s)233333W"RDEEEETx3x3x3x3x3s0S T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!U![$e*n.x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3u2d*Q!=j4Z=kH|Ox3x3x3x3x3x2f,#s,333331Z"RDEEEEdx3x3x3x3x3x3OT!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!Y$b(l-v2x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x2i,U#Br2Y;fDwOT!T!T!R x1x3x3x3x3x3i+w/33333k*\#RDEEEEEu3x3x3x3x3x3S"T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!W#`'j,t1x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3n.Z&G{3Z6^AqLS!T!T!T!T!T!T!T!d*x3x3x3x3x3o.}133333\#\#RDEEEEEy?x3x3x3x3x3b)T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!U"^&g*q0x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3r0_(L7_3Y>kG|R T!T!T!T!T!T!T!T!T!T!T!T!x3x3x3x3x3t1r,:333333V!\#RDEEEEE^x3x3x3x3x3v2R T!T!T!T!T!T!T!T!T!T!T!T!T!T!T"[$e*n.w3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3u2d*Q!=j2X;fDwP T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!Ox3x3x3x3x3x3k)>t,33333}2["\#RDEEEEETx3x3x3x3x3x3OT!T!T!T!T!T!T!T!T!T!T!Y$b(l-u2x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x2i,U#Br2X8bBsLT!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!S s2x3x3x3x3x3j,y/33333g(\#\#RDEEEEEDs2x3x3x3x3x3V"T!T!T!T!T!T!T!W"`'j,s1x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3n.Z&G{3[6^@oJS T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!^&x3x3x3x3x3o0߀233333Y"\#\#RDEEEEEDpkG|R T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!H|@pPT!T!T!T!T!T!R x3x3x3x3x3v223333333W!\#\#RDEEEEEDuoPx3x3x3x3x3x3^&e*o.w3x3x3x3x3x3x3x3x3x3x3w3j,V$Bs2X9d`(x3x3x3x3x3x3x3x3x3x3x3x3v2d*Q!]&x3x3x3NT!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!S!p0T#@pMT!T!T!T!Px3x3x3x3x3x3z323w33333x.\#\#\#RDEEEEED~7lw2x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3q0_(L6_6_@pKS T!Q!x3x3x3x3x3x3x3x3x3n.Z&Dw3W9dDuLx3x3x3P T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!Z%x3x3u2Y%?oG|T!T!T!n.x3x3x3x3x3y4v433333b&\#\#\#RDEEEEED0pq4x3x3x3x3x3x3x3x3x3x3x3x3t2d*Q!=j3Y>kG|Q T!T!T!T!T!O x3x3x3x3x3q0_(L5_6^@oJS T!T!S!u1x3x3\&T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!Px3x3x3x3x2_(BtT!T!Z%x3x3x3x3x3x2߀@333333W"\#\#\#RDEEEEED0pq@x3x3x3x3x3x3x3x3w2i,U#Br2W;fDwOT!T!T!T!T!T!T!T!T!T!m.t2d*Q!=j3Y>kG|Q T!T!T!T!T!T!T!_(x3x3q0T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!N>l:dLv2x3x3x3x3x3n.T!T!Q x3x3x3x3x3x3q9 4E333333X"\#\#\#RDEEEEED0pw_Xx3x3x3x3x3x3]'Du2Y8bBsLS!T!T!T!T!T!T!T!T!T!T!T!T!T!Bs1W;fDwPT!T!T!T!T!T!T!T!T!T!T!S!x3x3x3OT!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!Fz@nd*x2x3x3x3x3x3x3x3^&T!T!P x3x3x3x3x3x3x5D233333q,\#\#\#\#RDEEEEED0p3nv2x3x3x3x3x3P!JR!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!R T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!P x3x3x3S!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!LH}w2x3x3x3x3x3x3x3x3j-T!T!T!T!h+x3x3x3x3x3x3333333^$\#\#\#\#RDEEEEED0p0pq6x3x3x3x3x3_'T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!S!p/x3x3a'T!T!T!T!T!T!Q ICuBrCvNT!T!T!T!@nt1x3x3x3w3n.w3x3x3u1X#T!T!T!T!V"x3x3x3x3x3w33333333W"\#\#\#\#RDEEEEED0p0prDx3x3x3x3x3t1S T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!\&x3x3u2R T!R!H}?m;fG{W$b)c*\&G|=iQT!PS"x3x3x3k,W"T!k-x3x3`'T!T!T!T!T!Px3x3x3x3x3x3y14X33333ހ2Z"\#\#\#\#RDEEEEED0p0pzN`x3x3x3x3x3x3PT!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!Q x3x3x3O T!R W$k-x3x3x3x3x3x3x3o/DuR Dvm.x3x3j,T!T!T!b(x3j,T!T!T!T!T!T!S w2x3x3x3x3x3x2W333333j)\#\#\#\#\#RDEEEEED0p0p0pu2x3x3x3x3x3T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!Q x3x3x3V#T!T!i,x3x3x3x3x3x3x3x3x3v2T"Cux3x3w2W#T!T!T!X#h+V"T!T!T!T!T!T!T!c)x3x3x3x3x3x3333333[#\#\#\#\#\#SDEEEEED0p0p0pq9x3x3x3x3x3b)T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!j-x3x3g+T!T!^'x3x3v2m.e*f*o/x3x3o.R R"x3x3k,T!T!T!T!T!T!T!T!T!T!T!T!T!T!S"x3x3x3x3x3x30%333333W!\#\#\#\#\#V=EEEEED0p0p0psxLx3x3x3x3x3x1Q T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!W#x3x3x3Q T![$h+^&U"T!T!T!T!b'w3d)G{i,x3x3c)T!T!T!T!T!T!T!T!T!T!T!T!T!T!Ox3x3x3x3x3x3x2$3j33333߀2\#\#\#\#\#\#X9EEEEED0p0p0p|@gx2x3x3x3x3x3P T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!Px3x3x3PT!T!T!T!T!T!T!T!T!T!_&X#Crx3x3x3[$T!T!T!T!T!N=lAqOT!T!T!T!T!T r0x3x3x3x3x3w3i3333333x.m+c&\#\#\#X9EEEEED0p0p0p0ps2x3x3x3x3x3W$T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!R x1x3x3Y$T!T!T!T!T!T!T!T!T!T!T!T O x3x3r0T!KT!T!T!T!P x2q0R"@nMT!T!T!T!]&x3x3x3x3x3w4U33333333332v.k)\;EEEEED0p0p0p0pq=x3x3x3x3x3j,T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!e*x3x3n.T!T!T!T!T!T!T!T!T!T!T!Jd*x3x3g+Q FyEwT!T!T!S!r1x3x3t2W$?nIT!T!Q!x3x3x3x3x3w3UU283333333333333xFEEEEED0p0p0p0pukQx3x3x3x3x3x3P T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T"x3x3x3O T!T!T!T!T!T!T!T!T!T!Bsv2x3x3`'Gzn.e*BrR!T!Na)x3x3x3x3w2]&EvT!Px3x3x3x3x3x3y373|3333332333333xFEEEEED0p0p0p0p~6lw3x3x3x3x3x3P T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!O x3x3x3R!T!T!T!T!T!T!T!T!T!T!Lx3x3w2W"F{x3x3m.M JU#n.x3x3x3x3x3x3T"T!T!l.x3x3x3x3x3x4{433333c&`8~H]$r-333xFEEEEED0p0p0p0p0pr5x3x3x3x3x3[%T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!S s1x3x3]'T!T!T!T!T!T!T!T!T!M`(x3x3l.T!U"x3x3x3x3x3x3x3x3x3x3x3x3f*T!T!T!X%x3x3x3x3x3x2. 333333W"[#QyFg;f;Mb'pDEEEEED0p0p0p0p0pqAx3x3x3x3x3q/S!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!_&x3x3r0S T!T!T!T!T!T!T!R @pu2x3x3e)T!U!f+x3x3x3x3x3x3x3x3x3x3s0W"T!T!T!Ox3x3x3x3x3x3+ 4J333333X"\#\#\#\#X"NtDp:.EEEEED0p0p0p0p0pxYZx3x3x3x3x3x3O T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!Q x3x3x3OT!T!T!T!R H}=jx3x3x3x3x3X$T!T!T!T!T!T!T!T!T!Y$b(l-v2x3x3x3x3x3x3x3x3x3x3x3n.Z&G{3Z8bBsLS!T!T!T!S w2x3x3[%T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!V"^&g*q0x3x3x3x3x3x3x3x3x3x4@333333X"\#\#\#\#\#\#\#\#\#\#X9EEEEECo)`o)`o)`o)`o)`o)`o)`o)`s|Jx3x3x3x3x3l-T!T!T!T!T!W#`'j,t1x3x3x3x3x3x3x3x3x3x3x3r0_(L7_3Y>kI~R!T!T!T!T!T!T!T!T!b)x3x3o/T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T"[$e*n.w3x3x3x3x3x3x3x3x3x3x3x3x3x3f32=333333X!\#\#\#\#\#\#\#\#\#\#X9EEEEED0p0p0p0p0p0p0p0p}Vbx3x3x3x3x3x3V"V!^&g*q0x3x3x3x3x3x3x3x3x3x3x3t2c)O ;g1W;fDwP T!T!T!T!T!T!T!T!T!T!T!T!S"x3x3x3PT!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!Y$b(l-v1x3x3x3x3x3x3x3x3x3x3v2x3x3x3x3x3x3w3<333333u.\#\#\#\#\#\#\#\#\#\#\#X9EEEEED0p0p0p0p0p0p0p0p2ox6x3x3x3x3x3t1x2x3x3x3x3x3x3x3x3x3x3x2i,U#Br3Y:fDvNT!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!Px3x3x3R T!T!T!T!T!T!T!T!T!T!T!T!T!V"`'j,s0x3x3x3x3x3x3x3x3x3x3x3n.Z&G{4[m.x3x3x3x3x3x4233333_%\#\#\#\#\#\#\#\#\#\#\#X9EEEEED0p0p0p0p0p0p0p0p0pzFx3x3x3x3x3x3x3x3x3x3x3x3x3x3n.Z&G{3[6^@oJS T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T s0x3x3_'T!T!T!T!T!T!T!T!T!U"^&g*q0x3x3x3x3x3x3x3x3x3x3x3q0_(L6_6^@oJS X$x3x3x3x3x3x3; 333333W!\#\#\#\#\#\#\#\#\#\#\#X9EEEEED0p0p0p0p0p0p0p0p0p|tVx3x3x3x3x3x3x3x3x3x3s0_(L7a3Y>kG|R T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!]'x3x3t1U!T!T!T!T!T!Y$b(l-v2x3x3x3x3x3x3x3x3x3x3u2d*Q!=j3Y>kG|Q T!T!T!T!Px3x3x3x3x3x3w34O333332Y"\#\#\#\#\#\#\#\#\#\#\#X9EEEEED0p0p0p0p0p0p0p0p0p~Jfx3x3x3x3x3x3v2d*Q!=j3X;fDwPT!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!Q!x3x3x3^&T!X#`'j,u1x3x3x3x3x3x3x3x3x3x3x2i,U#Br3X;fDwOT!T!T!T!T!T!T!T!Q x1x3x3x3x3x3y4N233333m*\#\#\#\#\#\#\#\#\#\#\#\#X9EEEEED0p0p0p0p0p0p0p0p0p0py9x3x3x3x3x3R!9eDuMT!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!O x3x3x3p/s1x3x3x3x3x3x3x3x3x3x3x3k-W$Cv3Y9bBsMS!T!T!T!T!T!T!T!T!T!T!T!T!d*x3x3x3x3x3y3333333\$\#\#\#\#\#\#\#\#\#\#\#\#X9EEEEED0p0p0p0p0p0p0p0p0p0pzJx3x3x3x3x3a(T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!l.x3x3x3x3x3x3x3x3x3x3x3r0_(L7`4[@oJR!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!U#x3x3x3x3x3x3/333333X!\#\#\#\#\#\#\#\#\#\#\#\#X9EEEEED0p0p0p0p0p0p0p0p0p0p|jZx3x3x3x3x3u2R!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!Y$x3x3x3x3x3x3x3t2c)N :f1W;fDwP T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!Ox3x3x3x3x3x3{52a333333_$\#\#\#\#\#\#\#\#\#\#\#\#X9EEEEED0p0p0p0p0p0p0p0p0p0p?kx3x3x3x3x3x3OT!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!Px3x3x3x2i,U#Br3Y:fEwNT!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!W"w3x3x3x3x3x3x2`33333332z0p+f(\#\#\#\#\#\#\#\#\#X9EEEEED0p0p0p0p0p0p0p0p0p0p0py>x3x3x3x3x3U#T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!Q n.Z&G{3[6^@oJS T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T"[$e*n.w3x3x3x3x3x3x3y333333333333߀3v.l*b%\#\#\#\#\#X9EEEEED0p0p0p0p0p0p0p0p0p0p0p{Nx3x3x3x3x3e+T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!;f?nIR!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!Z$d)m.v3x3x3x3x3x3x3x3x3x3x3x31/333333333333333~1v.k)a%\#X9EEEEED0p0p0p0p0p0p0p0p0p0p0p}^^x3x3x3x3x3x3Q T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!W"`'j,t1x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3z2.3t33333}1m*233333333333}1kAEEEEED0p0p0p0p0p0p0p0p0p0p0p7mx5x3x3x3x3x3PT!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!V"^&g*q0x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3s333333d'm?_6yE]$r-333333333xFEEEEED0p0p0p0p0p0p0p0p0p0p0p0pyBx3x3x3x3x3X$T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T"[$e*n.w3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x4Հ+333333X"\#\#T ~Ik>f:Mb'x/33333xFEEEEED0p0p0p0p0p0p0p0p0p0p0p0p{~Sx3x3x3x3x3m/T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!Y$b(l-v1x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3m$2B333333X"\#\#\#\#\#Z"QyFg;l=S h)}03xFEEEEED0p0p0p0p0p0p0p0p0p0p0p0p~Scx3x3x3x3x3x3PT!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!V"`'j,s0x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3z3A333333r,\#\#\#\#\#\#\#\#\#\#X"NtDb8tCU9EEEEED0p0p0p0p0p0p0p0p0p0p0p0p1px7x3x3x3x3x3Q!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!U"^&g*q0x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3y4233333n+\#\#\#\#\#\#\#\#\#\#\#\#\#\#W!J4EEEEED0p0p0p0p0p0p0p0p0p0p0p0p0pzGx3x3x3x3x3]&T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!Y$b(m.w2x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3y3333333}1q,g(]#\#\#\#\#\#\#\#\#\#\#\#\#X9EEEEED0p0p0p0p0p0p0p0p0p0p0p0p0p|qWx3x3x3x3x3r0S T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!X#`'j,u1x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x33333333333z0p+f(\#\#\#\#\#\#\#\#\#X9EEEEED0p0p0p0p0p0p0p0p0p0p0p0p0p~Ggx3x3x3x3x3x3OT!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!V!^&g*q0x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x33333333333333߀3x.n+d&\#\#\#\#\#X9EEEEEE0p0p0p0p0p0p0p0p0p0p0p0p0p0py;x3x3x3x3x3S"T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!U![$e*n.x3x3x3x3x3x3x3x3x3x3x3w2g,x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x333333333333333333~1v.k)`$\#X9EEEEEECCCCCCCCCCCCCC\x3x3x3x3x3b)T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!Y$b(l-v2x3x3x3x3x3x3x3x3x3x3x3n.Z&G{4[8bj,x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3433333333333333333333}1kAEEEEEEEEEEEEEEEEEEEEt{x3x3x3x3x3v2R T!T!T!T!T!T!T!T!T!T!T!T!T!T!T!W#`'j,t1x3x3x3x3x3x3x3x3x3x3x3r0_(L7`3Y>kG|R T!W"x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x32)333333333333333333333xFEEEEEEEEEEEEEEEEEEEEPx4x3x3x3x3x3OT!T!T!T!T!T!T!T!T!T!T!U"^&g*q0x3x3x3x3x3x3x3x3x3x3x3v2d*Q!=j3X;fDwP T!T!T!T!T!Ox3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3y3(3t33333333333333333333xFEEEEEEEEEEEEEEEEEEEEEIx3x3x3x3x3W"T!T!T!T!T!T!T!T"[$e*n.w3x3x3x3x3x3x3x3x3x3x3w3i,U#Br3V8bBsLT!T!T!T!T!T!T!T!T!R v2x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x4q4{3333333333333333333xFEEEEEDNBNBNBNBNBNBNBNBNBNBNBNBNBNBNBd{:x3x3x3x3x3h+T!T!T!T!Y$b(l-u2x3x3x3x3x3x3x3x3x3x3x3n.[%Fz3[6^@oJS T!T!T!T!T!T!T!T!T!T!T!T!T!l-x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3w3x46333333333333333333xFEEEEED0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p}Z`x3x3x3x3x3x3[%`'j,s1x3x3x3x3x3x3x3x3x3x3x3t1b)L8b4[?mI~R T!T!T!T!T!T!T!T!T!T!T!T!T!T!U!]&g*s1x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x5562V333333333333333xFEEEEED0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p5nx5x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3w2i,U#Br2Y;fDwOT!T!T!T!T!T!T!T!T!T!T!T!T!T!T!Y$b(l-v2x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3w3w3w2Vy65"2f33333333333xFEEEEED0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0pzCx3x3x3x3x3x3x3x3x3x3x3x3x3n.Z&G{3[8bBsLT!T!T!T!T!T!T!T!T!T!T!T!T!T!T!W#`'j,t1x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x2x3wx23233w2333333xFEEEEED0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p|{Tx3x3x3x3x3x3x3x3x3q0_(L6_6^@oJS T!T!T!T!T!T!T!T!T!T!T!T!T!T!V"^&g*q0x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x5Df39 5D3333xFEEEEEE4z4z4z4z4z4z4z4z4z4z4z4z4z4z4z4zSlx3x3x3x3x3x3e*M9d3Y>kG|Q T!T!T!T!T!T!T!T!T!T!T!T!T!T!T"[$e*n.w3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x3x4x3U713UsQEEEEEEEEEEEEEEEEEEEEEEF} False True 4 True True True True False False Open win.open True document-open-symbolic True False True 0 True False False Import win.import True insert-image-symbolic True False True 1 True False Save win.save True document-save-symbolic False True 2 True False Save As win.save-as True document-save-as-symbolic False True 3 True False False Main Menu True open-menu-symbolic end 1 True True True False False Zoom In win.zoom-in True zoom-in-symbolic False True 0 True False False Zoom Out win.zoom-out True zoom-out-symbolic False True 1 end 2 True True True False False Rotate Left win.rotate -90 True object-rotate-left-symbolic False True 0 True False False Rotate Right win.rotate 90 True object-rotate-right-symbolic False True 1 end 3 True vertical True True True 2 True False True 3 True 10 True 4 4 4 4 True vertical 1 0 0 True end 4 4 4 4 True vertical 1 1 0 False True 4 pdfarranger-1.10.1/data/screenshot.png000066400000000000000000002541771451252235000177000ustar00rootroot00000000000000PNG  IHDR-dPLTE((&453>AAFHFQTR]^\geclnlmpxN>>,*'}ԏօ ##)+.<լ<ޮ}n {_relm jkla!]R Wt:Qd~ȽƯ–ylӼOԬdʪyǭqp{bVULx=Xe]PM?}:f+}5Om\bZQT MD;40'",7 ? D.aIlC.[Ir7VI)UGKLlk7jlIygH{f8}p0k~nܡ׋`Ŷ诱{zxtvt˵ûþ۵ҾoH>^j͇x}wmOkҪ;PE˕ΦŰȺˬج柨7V{8^zɫWjusmkVU=?+DHqtQ JVQCHC6<6*046!Ӫ;V~zɓ]䲉Y}mOy6W U:IDATx1 a+`)C?лΕ죤Eb,J~_ XNJaN IyxpvFrs`JTR lNg8x p:~Xu?)[MU4(A *oЦV~ד^j_ c d&%rihݾI\p#m7GvT9_fҦV~9&wS@a|"Gyz%6:zpi@)qa"/\\@r+A@P$SPoutu0 wL Lf039p suוGAl nR(o{?72CB hH" <^'(%i)U(`J]ť*:N*%L6#E씮u܆f6 / ,l)a`_ lLn 'J/T :Xi7,fMZӈ0&m0&ͧ1і,8/7lV<r&e:!""n uI )^w4\R$-Q젂4?@{uGYnQ[/;HpH|t[b[(LqZ;#~Fi6Lql3w;K3-[`o?OPI/^l e`3 ž,`@z08d}Bg rq`_ʅ:o xg9%n87Hh6Fs`9h^7DfZȁU#>â_MYU _iqXw iܗ*f~l6[ٶ QȤW`NӢ.?+9,hYh>? 0MG4 0uwʫϷaTVF8+7Qҹv:LL]9K #Raj )J *%@ԙuI|dik~S[^WM;Hp2TA_\d47sHŢX=ˁ% 1h 4 ZP_,@tԢ̅L.(oĵj_^ 7> p8+-O 0 2^61 J s v;Rɽj Uz G;*CTp[_p`O9m 0f;L!Ҳcn9%@#1Z dw`< pxdLx dbx7y,'7n x%s)!?D&#Hٶm+P;f)υI)8tJ,zJiQ{5,P,4/!ۚ_ 9~%@{ C)~scV`^ ' Ro υR"m,R"e/kKXs 8ۚPR)@ƫ6I,hV 7 pf) ; }Bp#K 1JѸIOBl3ܥąғ5$ldFQ:ȅH٫2x(,4KO=W9/1ah gqT_TQ 2Jư:~.H|]x)\2,%.|gH 6Yj3Tx;B͔rv3xE:  |>=]Ne}|t LlKZ8Z(aH 8;tz[10Ea;v{y~/?LiAj !!@dn(`kƝjE0'x?AF +}}> #N?@7Z3| H5iy߳h2"&::<&EWv\.~%{ſוM&mwEjU~%9e?2@x#'x~ ?{߶(΄:?To UZ>53btOFXAR EaTKuRK-Zje/Abrl7Y.Hi_`q|,D/!QX$!#ʼχG,D_,"1|UpnM<<5OcC#Tf0DiPNØL:-|8\~ѳ #c&&܏'#S Q׿fEfzٹܒ>t7̥|%|#;zcDk\5lJ"*emwvsݢ]i8Ejەṕ:⛿J{P'YM~x'wl^ :˨(ujx"K 2YOZh$˜Y2fΨO8R>2drojF-Bj2'L~iVbζ߹'|\E_n/e _:. Q0QTI$ S|>sC >(p! #MI{^L/h.fb,=Y eYYN Ct`02[Qlsq"ˊƼAG1iF~wO61C0?(;wլ.mA.ݬe y9k.}`R?|:@|[sUM/|kH>s@:8,QpD2=.ĦbBh՜t8>%W067^N ~D2UΡˢ@bnpߑ)h!hH>cbQŦK1GQdVx}|J- u#X2KܾŶO{`?,5U0^n[Y1BVΪmSDwmڀY#{q%ódj6}w7SO;oQٶOܬngI+Ҹ[Wo m H>szU3&4B|:#I =+ -%.2ۀ,-PYkrYT{цU8^+7$4qG2`U,FŏQ fr0P3!@Jo .pXy0QnEw(=.) $y1WxYSrG~ipâY#.hq.SS Dr?egb\ g28de%2e_j$wt(AE !nJYBG4d!k&%awQ5qe{ٴme zm ^)U'MuQR֕ЉPxLzҧA|dD7t9\4+K&acxI_Ӆ9H!+]ؒH>s ]Di4 ?f5/ $TeE,#<ۥ$&>^ W eg e2HYa rCк+_)Бܙ4.?ry.Byjεم"\1;&$Rp$´.QL;Q$L/#P&`AZ"c\ :޶&x_k \k{[-?sv'X$~eSfMS]!uմx]0TL׸+Bά@NKw(!!Cиyeuw@TjA܌HxКd֜R݃`O촀ݧx!Go92qWΗk7s(O!y Qc%DXHKHQXdq,9OH~ aMt׵X8en^:ͨ~} ]`uymB\yzlwnD w=?.rB:mUuY~Vۮ5m~{ !Eu_o [F>ٶ[@ iwߘrxEmu9NXmHgAb>I"}cMVt~ h1b@hpX֗!j,$y44`q 1a,gFf{9vOR0\`Ux-UlQ]Vz%8 r/5U ZsuT?}5}g1 ǧ'L;h4H uM adm&#Ah51+鎍J ~;eIze |R\`u? s\ց 1aӤx|_x<u3>{FTC>uu](鎃w <Ǭl:@% wL/ǒdeL䝣>suTjM^~4!g?J/AM횖~ƯV¥ېaVgP17D9<4 /֖öt3ch]~նc%y]J;[sumcI~58eEcp>8anE_}]p0Hc(?`sGsǧlӡ:P\hEz16L!j$俯3`PHq`x<CzcF\1l mN \cz)0WyL{$N8F~ Q\2T a,We< iĺńJk|na5z&@br ع/f4vONݬ8+@LȏęЍ O^D4ݣ& 4ZDo~)D@+VȢl<^7e3|l^#Y$>ECYL(6=blB*eɝ1u9:J -qhF=VtX02qJ||VOܾ:wnD6hHn |.}oYRvrVm5 ;"v͠:O:@^*xgB骑?f9 2L%7iF2LV0H͐%blu8I3Z9ZTAܡ.FjY@uW.3FsW1'`G$J!2?೤[Q1K`3k f(;,۟pc$DC>$tEJ]pqr.1%sFRcoemjAB0>vkxD+OmQVԶk ЗD>Hڢzj]\1OjyiAQՌA)mmgo<!yq1kqB(su(dAI׻0[nk俬?~?KӶx /B誑|0w򗡻p}o۫ی[1=\ǃR#7EjeF\@)Dj1&r5!F ̏Q H'r'z`gs1^iIP jegmHNzk}@V_~\~GTfͲmҙHBΙ5$Q݁p]S4@]>*|$fp֐Бl:š|9a7&!N*h!,l:2痜{W }\~AX&m?3kTnC9ϒOž!8RLt1tA_xɅ~;r9a .ɓwQg)N@|Ll?m`I>ۨ[Oy',w;_}{{D_v] @jRax%҈8p˼`m?D}Df`Ji KoS>WGuo<(eW pH^ƘNs==x1eeƘc2χ\M1o f׭yC }e"4{  P @(f%2ˬmeYf?CPK`.  } 6 ai#@~Q# @}KӓcAn惄R?-yU_TS@Yՙ?8$ibKQD-n1m! wVguV/O@GOyoD5v^m:#_דMK\P_6x``7<0aNqXݷ!A`]'&[3h㎩)U:|uԏYatn~::sXD-DKWR7IpC __\7L,~X3wn~::sXS ĝ<߾rʺwE\7uVguV -*Or6Z`s /LY9FPK\ <qW4 f}y`! \\z<05P}}8 @SWtwJTbۗt6bCis70a(:yȓ) npYYy0G|!WBͧoۗQguVguOM ::]U.#g,5APguVgu((( ꗗ-g' 9Hrd9wD4}d' 9rRXQΝq)58vg*hBvgQUu().@NIDӥIB%.rLQx'ə x qTt9%I:%.r" p)ƙ'}!9Ǚ)9q\<XwH9||po5➳.@NIlҙc9hZ:qvbVr cd=-v*.@NI.tEC$D=NgQη&Y1b $6Usq|8sU[@\]ODaekhZS@=\6l{$.e6       L'plUV.!eoDRg%(w  Ќ3?ϲy6{.=|z6  4Ý^k9$SJ6{- ?Ej5{F DMS9I\Siԍ^u60Wkxݜn6;Le+&  2 X2cA0`5f41HFahsfC^3u7{6 ˌCF`¾~ sj3Ų]K玟ė|s1;wlSE*;(]doȨ[W+PTb[7`m\A1|1(xsi;ߤ}=̓p>Õ, y\Fzzqxeyhƀx >~xa8yQU Bo H H H H w5]7 Ӗ-@7ksWs^cCsn }c+2n/VAKc,`Wך7k]#mK|&ؔBD)K+3Q1 o5]'jKz(@˲ Vd:-V̍^Y-n`e!XUCdUU9`G˟/C|Cc$\jdJ1$i۾R~qr2fUfJOIu)YMn!{\=V_ &FX )-=+ZӠ3|< l2J|BQ͜/@ R LaŇ4ͳȍF:)\!ZqS.,=c9,1}.0@no>BO9]ưƳ:إ.K4jpz^Lōr׽ >{ՏD#nzo&L|Xf2ݽj6Cs6)ǒsf/XV3rwhz..3Ӿ~{Jzyʧ)i 锒q$ƨ)|A򍞱\`>t8Q/K];W5vC#3l"3 ;_?g8љ ?$\>/}wA=؟GYO/fTpNH7 3O@1xd=.fO8Zy`rzWxb@c}P='fUuP' W0 ',?A j_NvW' >~ٺxx3;*! Q~Z7P)~'SQ {*'C$1Hc}Xr7sG[4KC{[1sZ̈;>7L/%Tq)(t@DꞳWy>B"1 ѻ:>QO(ZwhD cc:N'I HV.۷Ǜ׿ؼs{L7 1..1LÞp/NNk` ™l:4֍ _t#띤"a\_C_68;{/hw)}zF(B6+F#$#-?/ 61l0^^٘rWb7 A+yz|r hpk>:VvKlZջ,8=?㉶omJNo:ֵRdu* !OVpIT&''ɕe/]"萵Ţ pF~E٢ruHXutv|)[4f4dȩ *i<7 ݠn@1b27XYy!cVrtivQ`I9Wx/C_<{#[S^os{D]W_o]F՛YPm{5 q^X~*QÊP|HIR[+f&Mݻ/U] 8t2-t6Z_I*TRU28?k}@H ʉciCO-`U.|ⅣH dJg%J<=<RlƬnu@z~*A>?>=fc.4L٥vcLe$˗Z޺7_{{g'w_/흏|n~ K޻olt#e("8P!D8q=Oxa(ґiL9ɜ89C!Mtm"`l ʹxᵘ  $PϜHXG̑¾HϨsBb!%:ՊVQC@H$*zBRY1sg`9_>"ljx5*M9V >N𭡡Kk#Us)܎ajU( q=nhIBaRqѾ#^:Q 8ݫ{,',j/:&э뽅pi. — d;Gj=t:ۂz|=n$_8ŌK3M."x2_m{ m@=(JʿBdZ׈"sV ᠥy /ڗ{Fpb޿<<67P`M ?2zBhml0lm񷷷'<&<V˝D50<4ҽLJ@{+ӧ=}Tx3fVX&6(@=D.LC*yfP|1x/ė|t Xa(C*1RHIuT=.fH\PLT X!ZA| ZBڦ/~+c^D.p@`wG',Џ ($<_cZ,IɁS_:}r`=دP@cEϞ'O_3 3 b+i)ʢ=?Py/ [bt2([IB!ŸCe%%*i zX(UzI:"UUYU[3GB&*9 8eoau e>tg׫ V}O5H"qd2[F#3g@Z#P}?83 {d.TBw#vvAp/3(LRmaw`2^#\A ;S)D? !D~$|F!,%+p11Ee R0PpA)BY/< }{^b ?88 13i3f`'-0/~)lj"CveXZ`Zc:1Jr,H*"R1܁jA"c"#Kq+HR\H"B6&FvL")BhÚ{ݻw0nOjX]=@h;ڈ_h6lF3m?fpjt- /=ۋ,:p0k47=/oϽ Mvv˥=cҽM%*ZRB؅R2VVKJGQ|qBYJ_$~UtP+$IEFSy y= ,urFpN-<|q*|qsnݼ5~㮫6I61q֭ ޞ@3MFSd6{M@?p9 89N fuvh= J kQbS;v&J$y$?0y T$'R.-ee*F~rԿM(\itP+)DЕ%R2\k*3 ;QJTx{ޟuM'CY{fDٌh2MaCFsHD.-Ot?'? o"ӑ k"ǵbN^1ƻB2y&@ۘefD#`qQN\_b-oM\R%./KK f7>'XtG@={%8uԈfF`2{FF[+K ?u ܉cZ to 0 tͦti:#KPG)Z>2`}%EdXX~8#ѝ@=N1wb0Q6SBGmEiLCh|Fbs X15bf#diud d2f( »ռ(J1YY+JZғLd%qpfdëQ^#wT8JgTV5P= كRjBb~,M%ʨt܍eOQ܋jUJ ̼rs SPoşgQ*H DKO *zDh 41 *Xv 8%7Z4sC`x+v !AbNԴ S(@_XfFJh+ moQ/vEJhRn;d{< 7&X/""PD(7N۷4>I@v%p91 >`## 0Hx dVg\6A4PcgaAS@w,S%Ix.?&O.@n u"->_  ';&'&gk6W[s:BӇ(Gğ ;|h4> >o ݾ,.>gp;.+q$7R][⳸Z8bڟԤܘ.Vǁ@6 VcG3HW{a`s xmX1>V^z_}J …bav;ׯol71 rI>*)g1&F lRb/>r$,WJW%4:ǃtFOUq{ ;/% v{k@n_[[ j,Gh$Y&z }^LX xu{W+lb1LJΞ'<`<A0<ǺLEUj qV+6*+ssο/Y/'&`ZҴ=/YFb#N>Vz}^9G_X`|;#Gs|*WHA y!`*(cf t:(re6||FO-$w 7vL8BQ3pqL+:gG kfNy!H[;e0Y%3W ef(\`GZz5n] /w ^?~+M\ٹjhTںAgfw#n"ܹ!kޣyQC8"6O7wzV'[%y% UCk _YG 9Rg#}}|[Ҁ;C2֬#_1ʕ/F@U/-\wcV4 ,͈+v`|[ug-# ,\e&b0Tը1rdO g򧌫.XUtK\I;{}5uS+?RI֭XjEfچT-P[9YWќ֡h<9%H4r3DGU ȭ$}/ jik.z&޲m[_D))YH qWyEyF79TgP<3b Y9] }pEn艖R4O0T2܊QWE*Bc"]2>L IyE$0h<5Ǵb SS$5b;I*̩89D(&5ghLffi?L2Yw&) BTp|WmўR QI| >lgRטLZWk>ѱJ #Ttܖ{@E G? z5Ծ0cKFHCniMxG/|4f0e\›?[f+;?aZժf mS;4PCºtt]'՚FkɘD:&QF>FK:>6RLDVٯttéD+rPiZ[)ًR78OC7O<9f3qTGpILLFMLmc闙dylrST:$c^?!4;rI[Q_%,X&jL*YvG&Wkxvduh >(p?m<qt9ex9 i_|oxaBmл%`ݚwdiJ,aglYVl&?%OkD{G)FydNMMMKS'nI'h7INy0ت&8S]5: fՑ}6ЦG{}3+1}Ư1p]uA>f;ٍk,kVm>ݯ((9#7\ $)C?q{Ej5_8@y <-ܻw[~v ({kޛ/+F`>_1iv!L>?<=jIې #hҞh5"u/!Υ0\Jé#v&ņNx.*70u%@e.fjóRS`Sv9 nlˮ~džry:`h|0p&}[_ shך )=U9bza ofĵY#y?L~`(>0? Cb bu8fH> 4ym2j}2GwwwcxUv]G>ހgw1r@!e~00W}ʹ>.\%@#=w,_Eskx臗CZH)\{{Bsf6?3gΤecyә>u(4 @cQ?7{R2/!'Sdfq%2/ dqKQ'ExK,.:hAGF4+(kf ؙ3pz@ex3S#YǃDHk)2uvukcCZqH,2g(1  ~k@('O¥ &9\Ξm\{!|;!)l5m߁>eйC{?{sWsqrs^~[FF=aωێ=&s7GH ;@'=`/@瞃-Ut r %^!:}w8皋TE7~j)_{ƞ B=P(q~aM1Ryz%xG%TtȢb #H0C4RWtfD$hwLBr[Xd$ cvD=. Dʢ)gxO0կO^ϟuvL_ըEqɸyM>=dX<|9~Ҟa೛&&vA4xB-;w99@9,3ȣ>أ/Oֿ_C)|<Mٕ:iqff6'P2ˁ95$kHM~9B<ŋqM.EPYުl&/AsQɳbbFπ%?ZIAHej0?8L ׷g㷋872Rya( c>6ܵ=p@7 pg3q?ßsG]8F[n??H"2t tY(Tg F}0kݙiŞ6?r-&]d_*o'蠋é@L(e X򢛈1sL@F1[v?:b VO[s9~.vgӵ(8N<F$HE [D27g9Se-9Xyʙj f#`;f yE׷ݔ /)69òsBb5hWkKղ%f+` ߕ?.ov 7m``C}ێ ËR4&`<}n@Р43V.,عP;$G0mR&lb%`6Fujui/yd0mѩVG~ڸԿg'Y} .p"lt``ר{hx ,ּ@̛BBp3Ӏ^={݃~O=t"(:uƁJc-eƃ!`5SEd\ 0?Y;ItaPlXk_*|`TdE,d/3EĒmZBiC1ZdU!'Ka b,JTS(֐Q6v/ܥL+tC adJg./& -s BOso9kѪOA^<07+x`r,䂷tl˫=wz7"~lQ C)g8'3ccMkQCJ#'k'<EkJM Si X0CFp Iem AB~Z;s80Xʬ2nZmXL [D#lm0Kg[j`>Ka !` VDYdq ×By/6|~,x(t;T(ܶual Fɢ^;M&9Yz[K6c+c|y`8gޤta7p"K+_ |@aHmVcc]sch,39c./-zyy?g0t\-v9:=]ɬ.64-vX`nsuvt;:;F]}[[wc0Dm4Ӷ aNJWdGpǢ?@^`=ʛbypBQxğ5 qz{r&%qKG."( DádA&%ScAj=bI1~0n_,‚L-HǿrF]$>$P*2Qhvw[[uUʃYD́A\ФR7xm^j'gv|&֙2;_|gADwMn c֏5::S9[\n7y~ vk*1 h=:Y-;Vkfh鴶mV[;{_ FkƻmszO-sL*H}/E; Q|IҸcndj#on."`ˌBQ)vqa"qz{r*HI}\rjmj>6ɂL `+]0fؓ(4uhaQ|tFqî}d?g7`ށ-EH;U|%1%XXO$dj̸ .e j{fk!ci0Swer'%wm&덍F]fnEYqnnqiLGm~fWg)7d՚ j{¬in4h\Y;v ߍ"K/ ~}QhMDe{#T'TVAm%gjggNMBt1¤G/Og4Z`P_+xZۃiz׾6gE/?"+Qyep`lMT/j C +|wp?XInXp&==0f$̘_n[**ͦA]Qazi*F*(8`f77^0p3ݝV ?Hf=γ#S'zC rkvdzױcS׏zZKSH q$1-%{gN5F-[gݩJk.V|4?p;1,2p)a\O) -m ED-2~_/c6͈&ndf[f9#-cƖBihTTT,>34X~Eq[T6tZUj6{:uFQO{?{vH89p:vtqzhkر[S׏?5ub X$6&)&8l%h|3E 6##\,I1-u(HQ)>)>.kWKtܩʕ&tgdrrdcEp 0PX Som/jX|'Wꗾeƿ;@Jyw{u!Q_b+`ۆ6XssN⮪2^pRm0t{mjZ{z=JyjS$KeC,ln>لKHj Y!.rśb~ӢZBŒ՞óL0^]B+8S 2Kv (3i1H)!|D,=K"5[YAu֢#ΜX _WO{mmn}.pF rYϜIϭ}ao7bveJ=M7jT `-| j3GR{,q&9=#q(=M S|\1__ ʔ\s8~tIR9^xSx W/^x (m *i+%b:01ZSYrX}g {o?E3@@fyF}fg9ێ!Rxs4D PHs4kVTѩzpZZ{gG8ZU TLr/_x>s Kw.n;ENBڥrꋎ_nZ!ց|<6Cf_"N szGo?W-n.Ep5Z5֤/ÿBSQ1 +{ /r4:d֩&ތy0JA)ο!"fnI$4 d!*p+a^e=海5R8%{o|]"qϣkKL *$? Iv. KT;|9t:|¤_uPxГM6g&`2`D4$RӮk5b V,8v-ܑcͅg)yyydf³QcIe v8$a~&6F {YNkk+xPA3GP߲10.6ƐÒC1j-Mu: *sBsCYCcZfsx|dt50.)n9/r9"2گ\nNq$GrED@ |cAHȩs٢2V[_;>˟d7Vȭ g6|gKY-Zo@16LC_ʻ}Th!bg,EzeMޚh`;|L קSS<@V)ag*&6=,#\ r BHA O\F" }(jq;u JIuWu&DrNeqN0Ie:TCkxj*O;1> ."%:VU!?^^^ k};^'{cx4m#1v{`1E,|#1gxyNiR<0H}0@r =@0Y?G<4IW+Wr+ZF.Kԏ*|7T1&wө|) df] 3jәZî{5r`Ooo7⏌# i÷YMYT 1.Noh0\X"!+6tVKD 3O0 A:v% ~z=u:4`0>[I֋׸?I /l+bIRzr$k{a9DO -)i0e;>nX\dMuҜS>zFt9""#SBlAVpʡNe]@H@m}/dݿ_ER} &S)2C^?~ >z1"<)/@$1b8Uuz9ԉG7'&Cs#s ju!\PP!t{ޙ<|haQ6H(dIӾkieǏ(L -\&ǠO$@C°NP/HmD,.žqzA5 =>:r$rWog_B\~Э*g81 F izcWĿ+uRPx(lAr&P(T*:Mj84CYĹ?H09@m̲o돦( 67^8󆒒Rӄ 5 yL!3'ƔW.AEVo׭]aU^s3A wtΑ;fPpyAn ''xe+L=A` 0^ę2fm4\O(fYeffEl2(a$lG->1dQWNsRK.Kc|(g»3@W.+e;6%n:Er2­ug#x+.rjxZ,PTιrw?^Z t"m;  $K 60wTGD$9ñ/|=Yg~#ji&ƮS;%J +!F[pȮDRĻkr aTRW|>x]V 0k$X-X J:m-p=vdQ璢УN#q۵ZP.Ԙ]phAUWW 4Tyˣp|ط7tw}_G\ys7v~p| i=be !+K1,XRrp(O޻ז1?(f>(\(Bo+n lm8|RI"t:3 ۭpcer\v;FPH xrWf^-Ά4 /~/7I$;?vv,%;녅`V*E99h$D3̄ Nh&X)& VYj.)7R3CĜ9ߋwr`}a (OтgN$$B[(:R>_5: LW@a *R#gPȼá5K][?ߤ\兘 ֏|9Jdy`y}r!z?}tU6]BLBiz tTϛdbF.r(~`F̋6X;&6|z>x>x@^t!LOD5 @)0I)H>5Vzh,XZ>D(9Z%"D;>J@@Gժ,L3V|s/ZXY ,>I HFj--/b.yV-z )(!ƌJ. ϟ7ͦB;}ɋ )v?d(oY}8`e^Nc;B/UzMх{"쉳E&2=6]S#)8Ȁqa!%q<]RN L@p(U*%j5yi@,8؀;2a gKΗrHooo.9\|Lp^DzEmB!~FH9"^xs @HwQ4le\| dscOx u{cdwlw ٣BЏ(2ϜC\h"`q>AP-Sk0}jWc4O-jmg JKmʯmn_y#]3@ЮjŪ-G0,#A?~=!5Ż/ ~0H@2 #"3Y%aK`OWГ#d*%PΏ^W*!3S>s?aϤE*Uj>zðkǾoYf] >N~9d)}# pOxĿ_ ?/rs@!eX=D"ɖ<|a!wIq/Dʓ ݣG*zEp^O*^|A Wg^EҢnhU5-05<FSzp7 d?_f1;qB5?߽gΌh} vhb88%I.X\708ؔȿMWoxKl{套i{{{hŬJ 9dY+NJDiC@S(5\6{չq/`*,5YJ 1ԗZ& k{1^c>#r3V.ܹ3k>>tt `vSVgofŸ=80PS.Yuj[$7gּ#Z#z;x0>$ODIyyAKCLc(q "?s/ !w_y/IҋE>Z3 d5rQ+ vuv.D1Q? 'o} _mT x>Q%@`i!k(y3e"6|YNp9-J3*΢> `E]֧V>d}%`AO3 z{,k]AFyfb* e!L] F 3%CSCx).ٞ{<8y]{_x%yPhW둙ʋ|ۈ0ΆlvN.؉#"֙iˈ}w._ KVxR%@g3A}u&ee͛ef.:*h #thB^Y^ 3ˋKIKh"%Z1p㩞g+' q];ꚞQ4U@ԳlrI &tR,vQ `5I.XJuqhK3 .6/]b0F_$nc].sLFhH1F䓷>G฻w +a4k]XQTZjPQH~(2r? qI0Dt?|d*3?b!,:Ȕ;*-F'@, NFj`ڛbx/7v455Rl!RAOl2p6luT;v=TهUh])Mm%.諃:X+0@x# mFҧ |Qξ=:퓟>}_\/~_[7nw|FD{6$Nի$EBK/ժGS )|5+ q|P{6U\lZu#]^ٶkVu4B*=NIr VPC se)-)n.ӶS z<j(AD@'ŽzWAW%)(Oyu1z'4444X910ȳ}ϔ 1=&.x~I!K>V2݊H' ,6\ޢ ziE#'@*g Š?zحVA?=4zЗO.mBaJ iȊeqz!U\ a> b̚}mW]x=!)  Y | 0}ߵkW}\i)-/ڍ0p&MCRF8 hO9R\`*^Xyp)/7U @+X=~ 0iY 8yL=XPc =):Q=@\yDB_@Wˠv,+WxIpI|/ JP~Nn`!L``>"vw!# ,Em] bG˽X"i KH+lLl=f|P>4Nz߈z }qGsx yy^D@T "l軧{)YG̓dx}[Dww[ Fx5.0 '>GU+WV+*-U,>N)PX|A`\CG3=qk?`;L@[O7K7_/f0Ħ"v뫺WG2l&};!q*h{tFB,^Ti~~:Gtd#!NIP5"DP.Gdxlmokؾk֥uw:≝PB4r ϼ5gM-ueε)no'w Y0`0(p1oCg71,GlQ362B|S &z¯&@6yu]{w8²cc@gT˺d R'"3 cF--֖!._t/͞}n[{̼YkxYy ȈH*Ƣx_z Ee]W: ,g嬩ضB˂^ZG{HޏQ .}yNnUŋ.n00z=IM"Oٕ?iJ7۳' [4exC!~}ژ7YDN^G!17 QWJ9?ĕaȋ|;+[m*dܒEPZhT{t9'cGn}]wg^wiKj*kj. 8^>ym~wT,r+/ی%[K] ԇ`'΂x|MN!/!JL Xb8Qd1d~ѣsא xA%@A++j❁>! PG'P0qơ o zMS;J0&¼` ǜ (DFHPPC3?tYΌ6.I>!|@5J:/zi;"76ZSm >1j@8B}eA9ŽΓwF(3YF`mkdgT>fUTC5R&Fx-\y_C͹u%W\R0<ב֐# LL # vϵ^1Q?{M\L $lajʡ>^Y[{|N߳M.-QWH>ma|/Xo6g3Dq!l-Dޖ6|7'~/Q`s@rc `v1KvNՖ5/XjN^˖^(++Vo]mlb\\B.W``{b줟NHv;҃F"A_1s9R @{jz9 Ӈ*d{CFO.B"{ ."@V/^B B^h,_P8>/UV_H|bJa[E!_fR@ \/ilv@Y ؏WȩKJVT1{FkH0ӆɝŖPް!=22ZbޢyE#kj"pMr0ߗN4tzd;Q? ?nS2)NJ[GI#E3K3y.i8DILëQwGO.cN'#p \k5;g>Us-jWLszrlcdZ~&KG/ ?ywa'v[ǂa.5@]CMq0B-kп c}?&%:p0pp.k3Fի @yE!ȃ[?T;`w+`MxxJFPnw;X̪gUU~EfR)0q e.ȁBW,W,@/)K%5D.tfF桋ٙ(--;\{A'VtN*x)IS)Iļf=A D'\2i0.d&\-\G,HVGi3>ZD)Q:|pyx9B`:;k=șQz-yXhhb_Awfr Іlpz8ǻ+`fegW{\UWTe`@|9>v=Le>H23*+fe֭^ϢWY7}w|d1d֟y(Ē\ Ѳ+Z$Kq&.-3{STff^')u'tq(~~s>Is+~j).A…(% (j*<?/!idS, Ev XegMFia,Yxgf?Gᩘ } JGDž7#i38&POH(QLv,$Ϟ| akW?CbNZW^u^oK,k",zBDß(4^HNlNh`@DOC֍Ku!kFɈ%1zm7`*muzԭQ3WNVpbknj΋s|V<6s9 0H?̢9WXI*q񒼜Y,.EVk~ ?xW]iA& #AVbV z{b>Nut27܄&&P4>W/4;&k<=ll w|rSfkJU>&I-rk'4}&ثm˽&: [g-1Zƶm=vb$4y( n|bB9Ͻ_e~Qk4r Jd#3m@@%ozDMl )bI*O Az7?weiEԴ(=a3עm|?;+jRJ(MMJ0躨0ZȱVk#o?EB5>8N(rkPZ #x63x۫SӰ{`7B.'ʱcS'%%vkqDE^b˲7?ڛ~).z6[ѣS+s-efeGҟC1]rq$;o`:p4עҤn2tw:b"MO6\DpBYnTg B9kY*rT<={;^οX*RةJaq{biy [`P4S8Ux.=CI{B4Шm')S "qNs%*Ս EοzD424n8;B#3d.Kir3R,+ ?5=3D}y): ]?~8 PEKr0 PG8뢄@X Pʲ.o,}M -TNNWF4f_Ӱ J)3Rez{JY~>sFkP55\ i#-κM[oߩ9|'I^&1%O9$ #0ښ4Ii=r*&1k%[d O+0΍ OWk XW. S}E~1X./(2?RQ ˙I ;pcfQZ,0вvf;<3b=.ӷv:ZO۝5}9YN5b8yigQ3=U5Vg ֱhFӶ۞3IV|Nh(Fm54wэӸjX1xc`eyX66TP$j8x+` |Ua$]bKIAqS$/v^EMf'8!('sS,²"VJ89=|C/4O?}>|i:aNȘ~! n*A0U|-7gqœ,tA|azl?p]b~4.XEuuk1/d?ͰڙH$ Fmռ:^3O]] ltx= w3o|]uzg=9Nfn.eLRW` |=a.*k ϝ%!(ZtxD*.u) vj4퉨\eiIz=^l+'eO~n+Ju{U:$(R rf &2rU7`l!;#'O." ;;kw` -[5G9'hc=&rk m(˼%)uJ2v+)C.= UEZaᏂ~U*?$!TdEx1y)@PEQd7cEPO?G(_q4~KuP@3vE_BS;-0n혚cIa [E.ںM^Ϫ:ZboAˁhA|IBOt`5M?UhU74Mk88κ=Fp;MBWz~Z^reCLTYVRx:H$ED BJ 'W}hnk?~Awqס5#}^gCh Baea8hwnAk#G2Gq6C([O#UL50Z@b:CGg "JӪNQpu)8ChL Ӆwfijuy| '/Tk$d JT,"~"0p6 F'̱_!t"^#?W}yTfdAzfGsjj2FpxyAsNpHw?ػ}#.9G/ `H},BRYӛCrJ*aZF80aqXT-8י;VHM8}*sJvD‰yV|pVE@3Ӣ!& D!?R\*r ٞuyEXh[S's';k:l1( F9Z1M&)]w#j uG<4D.ǹ9^L2n\^(%^R7#nAptwϗ-X._;hucpf_N"/FQdO6@qSLO鮨}z|;Kؼ5Anw1ёxH¯b`js Xw)M$%>XPeg OW\s@;TM*g]tdo#ئa ’4[}JRJ'TW"ҌjG (qN""Kl!Z)Ms" ʬÈ+Cq&82gg☑ }vGr.ok=̇81R]rT&v.bPTj~ A'A&=7RSL}P g\M]~}yih!sӴ8G@I=Xo%橐Uɫ>G/Ѕm4e! !X !T#-4YM+:sCq&bD\_Iz}@=gYn95,VzlJ[:&:B^#7ګ1<1R~á;]i V &yi'A+tNՐ.vtmM)6/?vC{E=|H`i-Ǹ槰Lu<!"D\~PS˪#$"; 9ٌ RFUo F=(_D!/P ̺ xfPaYn 0* P_7_׃g>Yk\#Hn$7A7V =mv%ÐҠ ~ ScֲQdφ(h^vC{,P].N~~yk9CUݪɉ|gv?BS%)5e[!/9#v-Uޱ;j.f]J.Ok0#/Id]Rk ߯?o?O|3&nhm3 :LC2 ȤR2*Sa>h ʈ\26Op;RBK4D23183\ ʓ fƄQ(CJj2M*B-CVU#G<W0L+Fkc7Gcmc-qvnm &:G񵣶k!ˁ;BMꂪKƸpS)(9ZήEɡ|PsEJ( '+nZD?$CY rn*%f`H,_u%6w#MXPAG70yMk<[(='PSs]/!l':lOiHԳ\J|ɲDͳ-Jj^ Գ=L˕Of7,^{'p`MyaM-Y2;5qMnΓ8Pj٠HZnMQ#p kDe2T>LgM s`ETV RD(k'P'sg4.ݚJO)V '=P҃82'+.뢁x*5I@Cj4})P34gz4lEʠs5}LB(v"J漠YfhF+{I +k@NU(Dnv!p8ѱvB/bGN.!S~W=5l|8 {ycr [v%}rX_h;jL&1]F7{-5g2 h }0wYEN 1KTAth/gLҿcN!J;@ZvgJ~X&S3(] '.F. Z_،h[>D.\+M%ͤG54dl̵uIfiD$Pk|RrUj# M&Z7u($~5z(mF1Z܃aԂ cQmM\m*⳼"c$f0x\Ui;"[\+H>p]Hmfiyo9䯙,kABm*K!-*O8v!+u=k<m90댽$N\ PT+MᝲMf }ߵ V5^`vaynFC:I5~kՙ7j(%^!7W{ᅡo_}m47I?|VDBzwvtk53>oo݂xsBY1_)f$Ȣ  QZA|dUbf& ږXюTuDvV$b r}(]bAT*[-yL[g$TsIO~)).fFm-]2tJUOzGßA(F՛'?'P5fCEMwGiqML^VqYюT1v$ױ}=pSmG%/&я*74k:W0ht63EP@A| A? uimVٽ!rwb?k{s)-Yh@ʙZJɴeɦΚ1_Xu[-T㣯k^6<B5-GbDaGN,ZnsOҠTLbA#,pP22YTOЃ:ggO Դp6Qh㠭CjdؼXa?_/^e׽6z6a3infm!]sV9lNq:RPAqYM A\a1M)U]yŽuwznX yKIȖm wλYʺЅvhW ɖ*6hxӴ8+v_II:pv& >u0.;z(w#g]D"kdZ߸8.X-q?#s3)B @Ɓfk(dr΂0MYufGkd 12l#R?jo}o-?*C&b<1Jg}<l :wruG8R/Hgr:B=Ŝ>m! ǵXFgu9=I 9l ^A}BMSɖU~u*Bvm\O}ޱ hּ1M JBh'0z%~) ĊȍldY+X%:Xk//GjYDl`y %9q&ˢE,|7WYחweA8 Z*ь/Ԥ&2JK f/v)jJŹl U)+<]yT5?G  #3't&C88)dwcF;GB6BvDב8 xTGR i YZŊ5h\ O@_ٜ8Wy % JɱI{)8R98YHLlp,f Q*FC-KE0S86t#ms(< ?Dwkxx ' Τ}J(=@TX*G0nl˘)ҭDk@o2z˚fI>*<{^3R9pH-)Q4w뒪k [' FNպ+ż^ M$m-^D%pu5wGe}ҭCq"o!(sHHQ9p6,Ly4w7[oSױ Wڋ uɻH^%/d H/(>#򼹼4QEQYrdO[ͧxUgy#|9{] ;QN{u %g2[:Q!/\?e>")i4pH~hc0۠=C21M3h\Ӄ@IJV;ToƓhV>>oh8u#;TILRGmi %Vc%YGjb6Y! 2'l Yr)2A}+RMz#13=>oVb0*4rN  4HL^voc2e%[M1p6xG+)T.>:GUu7*d DJ# AF(U [Cfאo Zm_DvȎ8=YO<CXoȄ5:K>F3?<%szV[f5/ 4eny'r8d'/Xvf2bWg]hNֹuԞ3-,g_n1<ݽ$HUZ طH*I1gٿCק`SpRQb5QA~mgmk9-;'8폲'dKo{1?ɹ{tt}{z 2IlWۨ@T-/ m)p7 [)=y0D#'J,h' "v!t_$d!:dn55h] j&ҘGS[+*3|Ֆ*0by0xCධ@N~bwi$N26_ѝC|D'|/=4ÃQvwDr~wv+U1,vŠoG FzAv52u#!|HHi0$ 5 U`Jh宑Hk<J8FjL$"'^7E8xL +YbF g FDOR7t,B y3( +2L6|--̷@[ݳ%+lMq vzǡ@B|/zԽ}At2/Z9)͆6ҹ)9KEyRTA Z-~//@~Dh>:($%{` qw ^VY e|D q) X!q_awb76&0k Y8X?>ƨWRJD=v7_?_q/_m,o آz%Y7%igQ MkC uپLchuϓ\DU5,yFb2qT{@vtݛX>UOԓ o7J~7˟]+H_#)\YiRf֙G'o :aœdB?Ǭ7_YH3f9EOqb[e=Y<8~1_~_~ex5=MWGg$k~ ~{ aU>k-X7߯ Y?O > wZ?l:W[<7'&A*z(3g4eX@fI4Hv[ebo/ŗ_/_9XBaqEb$ō53엺 Ƀ `uI<85=RP\>Sʏ#p `}AK* 4M7+qv]#QR S00Bf$Ntf" %c|p!R*P/ FZe46OƟ9M  xr[ 3+MMSPbp%W8܉ܭ#pXMMgk]#sD@ Hmb2.xe/Un#m1ř펷 CLc^@:,ZO Ns@A_௿ع/xO`eH[U5d4BĔiԡ5zZ)uނK1́;L L$~#莡9#?p¨g8Ze ݭF%/sK^ns Ā7W9.ݖySÑL2UnDz{u`ʼn;׋K9%Dw q$~nCM!Hc Gg1FHmoWv?DGmO-B^y,umQV /[4a&"_$Zѩn`a#2=eC'l*0yDeI-2}JsV-ѧzZq>wsslo_N1?`bh 6e,:ĈA1iV JBk 9nQVf .Hsm1u;ĭ,ƉuUdt֑yp<#>M?.=i{Ṗf3KF.Zש4 Fl2 ?ǿ뿾XE(9\Bʊ4c4V u(oiu~ 1k=)wHJ6dN̘; 7.9eBH"!n~ zx 6ĉFsuYEF=с*1#k*%yf O ^:N4\]c@aV"26|2g7٧6>Ce,(Xa^JɬphNI9C0(*<̙BLj\^7gO+a3Ϲ.?&)?weR4nysz*W^,;@ ? ARȯ8fLF\b׀RKc$*KIDUY#+ MĞYQx`IK^æPXMZzawҐɺ0 &:j .;{i+86(]Z;bY?ҐkVbꬨE6SF=}T*I"& G>T T1?32ChѤ Y4fii m&Ae e>P&ӎ15X|==2|!جV(c{ a n=!i6*DEɹ[dVFg`!s8,rDpF[:B~zKe".vo!wUr"w6 9[۬x#W["<{Mf)COxC{}YQ c|HR*Љֆ}ufjR:VʭF*l@spUͷ~s_VZ*ߟO6,0&WI)Og֡mO3sA#e'7{tGҍC3n"W$Eqx8zytBr]w':qϒU/)\H֐;`}ľ/C/KJN.ɩ%I ɽ_?*#͕mʣlNg>`ɰ_fu/^)Y`y9CϺ_-lVuj͜Q]:xHXiq$S=t46N‚%ȏz0{~n4U6M9&9M #9SԬu&:BdS" -X ֪Qe@GY!xJyfOȎ 턚b|t=wa;+Q9c`N{V=@P?fQ'迹"^dsFx(n%x۟ H{KlJ"P2 ȏk{a_fÞ_/HVrxÙrf)as3QK"X»uF_`}'fTA_#0#RwAG<FyF%*E 6Ryv$$4MctH{i@< ~`'~"5u.9,KF9ǜ- '+_ߣi(\& jA0wl)H&EΏIBNY Uø6!5._2/*uftCtȣ;Cξ%̰]g ==x}@ H`bSad(R?5^'A^`yl}L.4N4DQaJ V.fޓg%00**ןiYV=<@ 8*qU59ta!XL}-/CRI&Gi/z%0Vf`/6 |ӠL7\Zyx1;UA6x ]/3"wk{}C%MSA^ugT !G%--dDdR)TGhᇹ, `$8H/y;d2ِC2V52PQTR4h@a| Mk`.]y'_zTj̤f$TUrəAC~!0lg A*~ uB,JsP oVC/e,Uzg4j+G*Ny#gMnc6Q;x<H6:D1ЅFobh|~qj&8CpN}S#^0pQhCGr7=s@@w$ӡҥ2$ 1!fDE E|h(Kk"Yat0Fj,t /ted.irF72]:w:P!p(~Q-$K/fo639{9! Wb?+<8ZB}c_$UHF_C?HQNahQ[ėHYmm85zFhXb[ޢU;t[I ?YNJc<"붙}{I$la*D%l{A;ѯQ af$a%t;`h z2^Ȭ*RjB˹mCN*&[/NYe:h-r5E%޹dlr^ۧ>ʷǕBTY\5_?|˂'0+WpYҤvG+N%Rn&Ր@ y0YU WB8@Ar*ܮa81VLZq)!dD?‰ :5CH( Oҷnw0u D5¬fB+ϸ<6xz]~ [{F'ptB01(M'?;3z Uߣg؜C9뭗xO@}dK' T^Z&?f₎Wgf!\]8POUIY4/qG,T9K'1W WcQz)!Wț7 5_O,E|#)Z߹As(Av;:a޵xs@Mc-,_o,KôyTLLDihs¬`cт)`Ir8&iᢷXVHJbN&'h1nMjкD_lKh"/c#ܽ)jTND "XHHgM@CsNWpm`ƉSͤ6bmzyIApPrBPY*zbsH L[)A|zO̬cVx'RI_ VFIr2Gvղj&MAD@Aډ ,|z bR&hs Z챫utg{\n -(㾵ׄ,Y YM )GB~" 7{az)'}XV@āSJNQ,g[YlpUsxkr w? wr'SP񷮖W-)tV}^<>if^A2tY C[bWIP¹ޅػ6]3.()u䩀=;^-fYfYf1@@{>6e>f&%<78%,7n;Jp^pw\pwho!eLEpӜV,&&3>61Y m0 @b@@@[fm?@A}ΣN St;N6 #On)?uX@@sw읁j@a&8r43I Ky 9vaCvK|mA5\Ä7z0&Sjn恝њf "hWYK҉Vt {[ɼHdm\xYP{LNvCkVcsb6[cwLVn HT!`.up sw"-$YkI4;I=k~gyI[YݦW2/_R0ғ-3)9 њoC } 07${8Y#Htp ?pbsd"hZ莟ҩ1#- jZ񱮫E%uU0Gjg3hi)nvGkVb8i^5"Z";D{;@ޭm6,"ۦv Xۛ~Yk.fi4_SmyBfY&{q|H4- hל__̠恟@kVbKAD`<`|[=?m{=^,:AZ7F3 n<Z f zQ̀Hk |q;Xp{3Кw8 pD[ U[EldC)g0fYt絼loxvVM c\ncZčppy0 .Ѯ!aK,pw>n3Z,J˄,/%ukb?tGd/֬ k{}q06 N 0v T@\ fx^{5k~e;Jm3WeFܟu%^I f5H=G!pYkFM=RKH٪n֬c]&GhZL.ѣfhf5t,k%?EК~fb).EAњ?0@FI(F@TFс_ܸ-Z3qwGyyXrhS0M! Lk4bs|Y͜! 3 xB(ӼkDlOBr(Sq#0@,S9f4v"591bfi@cODfWl*"OϚSVĭ8!š1 aFr8^c/|/|R92ox-- @4N9GrgMq|U[ir&^V,C| Py ƥٜ"`]@ǑY!KIfixCU5k4L #g2kre,f{TB{c5Qi~gfZWl*DRHQ$NPa5k4L88^c/kT8ta Pɨ4ccp5@N%Gr'UТ<% 5kl0]59tLNƤ" 'Љ#Eͼϔ1ǁլ I C8^c/24רmlT.^rBr(G}:j,ԑ a>i59@GXTj6Ƥy94J?$Gr' Pj.V&^kqhMi'V腨O.}[!A|ol4PYlקeU|0np^s&6<~ Iѹw\l5o 'Ebs   ¾~esS$v{kwEh      0Aؼ!6t 5ǶؼU6{@@įڼ6   cv(m~l]wmc0eQr^gR!@Wd CdR^0.+PH#*LyGĪ7%@RfS=ʟa>)-_YU';J"SέϭϭϕG`<6Ă@'&Ń);L"ic fǕ(M`)%=i)Ǣ&Y*%[[[?=H]-x ;Ǟ0D}-AΌ5=(fd;a9}`̱_M?!OL^"qn}n}n}H[|-tt-a\&u9>>>^>vW [[[?oWƭqns `CCCC3f ] zBc3MYtXS&UrO/W|TsƹJOaj_UX1qtڂL*z 9Q;&%=&i&1NV9%jӄ3-),Ck1`,I%4H[ rF=a'SR^'0҉M_ jo94wsg:ȴ@NFђEuEHLy;p W-+)6`_FB*ְIEg#,r-A"6"`޹.d&(O,IHVR}eg'qZ[E~!<E'9qxM\-߉j;NߋL3֟rEU* >#* `rnjhu^(>G1d4׳󻽐 T$,AdBy[V'rPE ȼ]M<Vcֵ}eYnA[0e͟Niē@dӮK܁f݁=λOUq?L9,BE㣕yr Zg믻!P!M`wQxο*tKIi(Q?t3XtY[Uy?ݻspēRZFOh UDk0x3*!T,E h`!%HPtwĂha+h ?X;2l%u6Nv'NfWuƸbkfr6i2泲ͧl6ot^NF}Mi'a8Msm@wopWT V+m_aq@HcQc[M)F1Lg8 C<'y8\GWUA"vC+cL)፻TDo]/[Ѷ@{=1J{P@]ҴPcQ0QʴRhwPB@H``hl`[Ioћ*+`thO0NW)jͽV+AU]/nbQ}KFwٹbBgD$zks3zI9#W|ܽÅ`ɘլD$h%Kdi)EK숁)Hr>pb1()9V$l2b.SDXI@ Iڙj` @i5FzN&n*~L:/1&;Nt\\'YThF :m I|d8q66kH;0,Nfx=Rk<3sx[,Ӌ~ͫjHmSyP*h+hSrj(Kt1 fM 6ݭdLU) pQ~X?>N4ohs67=9+_FolrD449rZ)en[pJAXL@쑘 .nݫ%1Rgn*&X넞GLWK\bU>-NǨx$W˖< bWBȅ ]$BAv: foCR-CHЇ@T >o{ 񕉩tZNxCO2 U}k,3E*B-b{1zZ@KhC#q'M)`GZ# 9`SOtKK#q1+hO&n}U?o9} Q/W>5ū_3ep4Ѥ9}y?o\5gaW5Bƥ+] __~w]?J$Dž^hBf_BL tq {tTw@L&xaLbWE]ycdje`jL p ;2&ŭO/&s,0Ix7_+~u03+vV]g&ƎH?]c,I2lJN֦l^hÔi"Ɍ <4.݂Wiy9vƹCGe%m ܓql yT965 2 L 6$ ŧ 7uk0tܖ]:9UCDU}N FPAފbup Sc]}G?yP14DF]g&ƎH?n;b$\@zZWv_A9j'Ⱦf蘁"BrA^ZUЪkǕ;8FI|U}; G/} ig,&! Co:bx$sö O/D7"ov毭_ϡ_= yLs֖v 7;;Ї6x$޳sInv).{$I|;,(!lO,Hfh-`wpO ޺޹34ߠM ό v{~ Wl-sn?@| )X 7*^{8#Yk^sž_Lm˛!&{OQwgX\ &]fg3Jv8F>Ǿ㪯~j6KڔH6 >.t#-%&Y&ݣD2K@?-%f&Y!GZpd"!j=< Fxlprkb0{Llz༏t˅ #V 7{nbd{I*O`E&1#dphHE'0iڊh b`aX lrRW;}]L ~@'E=Jt)UY޽O&sO'*0Ϟ2ڋ5,䴔 xU+V}yUmyQprqxd:5r/ˣP1_nk͙WRt".CaH"XR`sh^"d\I?J]L {[b`j`tǵC|>سre Yʀ74h^_VՃgX:ѱ(^$~+@#-ho"zhob> od?.vFx`kQ8͖pވuK{'Vpp~ɗSH=<2N{_ٕpNj UV*xB{G%k%v7:IǃNNӶ.iøIQ늑6S"V& tq~nǯw.`]c|Fwnm\ei@he,!`?@ -ٖTنHVPbu wNu[m作=owy ,|35Ҷo_0ŏkH$ |㫱X"j<~#"H+} ŇO^pIp[υ=d ۷@_ƻKIbɄ{49ƹ=H_ FϹWi2R,B頖p58rK.$ )2x@{H-!!7&Gߘt՝F+7eA$lz$D%0~ Lu'bhL0FԇvQ$0|~*+T === Xw#8#hs9#o|Hĥ8NtSzԹy<[ O^MU5S 5@\Weaf܅\ZN0]TĠsoPkDr9S9U^IO5ZCk5ӊ--gXc \ή gp[jp ?oC,f`߸1ns݁Ox>ůxvtNvOLacX7c0mN z`[pkGc{ ߮ noIZˏXl֜`$+ X/y#OE6?}G+ z%?.׿3[E7?v?egc_b#G&/8q`]%Q_ o(S1"Q׽$u1V׷#((%FӜ`:rJ*ZWR,O&ÒHV4z)]!S#˃2s1afm܎)0Mܿϟwquo o1=r\vGdwvK#_ܻ+_L|r,>v)}}'UmUTr |]* XB2p'P_'G<(`Ee.-~="p_:HMm$t I5@Mǔ^{hl7`+]eٽ@d24R 4C.W!Xl1oȦ2s Smlx8ճ#?<`3Nݞɣݎw(ÝG{ߏ` " ,j{ uSqjs^LQ'zIvLxEZ^QM[\D3T-S2D/%ez1?^ZkNIߪև| %^2#ʠ%tU|^a?}%Yq%S퓾j9s)ͯζ?elnvC~>.Р'[e_| [ @r8]n0L7&[F U#2R²C/}kU94I"S% bsaM(a \c5 @U?(c/ZDBQ,g!gޒv/HZ"j,`dJHE1IPA:DKJ j9rhR6U6gap?X+ܹP7fa</ 1N^z8[P6>:)^?\NZjVTt_zKek,|_U3@ư vMcڪlBWV裏ᅶAmcĴh $ݸr,\ezenfW0xx@z [pxc/wUfg *V45æE}c`o8>(V!UBR 0nQo(=o+B bͭ->x9 } fU*0Y#ivMư -~„W0VB ^hkmv8?,`0lÃQˑDiK[:2s&,XuR"_3닌C_6  戮w)pD  Ɓ}!{9hoXJu.)kU$m@r2M,@iW<-.)4ɂl0hl;B/1 pNCY{!k=x7d ~W|ȄwaJ4XD9`Ϙ"uNY^cyT4eE)B&EY/j4e ',D46mH9.U_+:iqtQpLއ^9cp^f*t?^d#x2K 7\`{ p/f'N ZȎ'^9Yi dZSCoom…Vw lK`%9KdIhTz`mǸ`TDhtV40W,d|Ne4XJY :i49Vp8'r(pN;d,IxtKi6{\/* ?O/rGJe,!F'&`'(ΜH a ؂@38?xWVfb}Q-(tME/RVV(hʲh4WQM y4-p;ix"ޥ{4ИE .,I( =zWS+1WfY|0`s1`:;{׀(yp ;\ _6JUY0KK"͂7Ag[Zum̧]` i&#O r(cR}osskm/ klȬ7} G_:*g(xw/mo-䲦Q*])M|zBkIz[j6w( áptu~׺\'`} gp|d@@|{p(<9>k< [M% @3rӌi}$D1J>CƲS,!P}# wn WD4,CQ†op[4ŷ 5~>0: GF9<Èp-pg~] 0'0c@ρsNr`(D }zSeoy1PMG/\;bN+XNHӎj%H CHLaD1?^{/aqAD.`YSR C op[4U?>`84|ilDF=n|}a C@O9 yܹWE}/#c6 5lA.4ksp0]7B_-.F}g7vۓ'3^OtC8pGwY>$ $ lZq ාG5Z G鎐#t]1~Ҽ92^VbI!LN(V# ~. (r `l4ɟ߾8w^0s:`xG5 "+`s3]4GOqB5+Zrsi.OZA W͌_5eYb>^Uv&6c< NTLhePi][pj"=SO^&Ԕ KXE` W%gpC[[T۱=Ұ LÒTTC}j@V,ʧ;2:)PGA6oE-c Т0mx2p4 ^ةK!܍7UsǧU q˜=/Apbx,:M&^[+޺{w[VZVUoj 5>`.K@ H.<J1E̢M$ d9 :p5R,iZd&ży)؞#:|b!qNb )+6Ě=pKփs<7 ;Aˎgt y:0 ǀ[cSphv6F :À3 Csb0'Reob^c1$}S DJO$&W`ݷ a1+V}>٤/\1 {HARL}7!,L39lz `&k&I lO&UNFDdńw=It0ˊBQ6wsw6 lY^.E frlӧ;u|w|h/A?nTpB;].uz:>NߺS= >ŇwSEl"9&0N W B *\[$Y% Mf61i1 Y7677נãJS 5A>z4FEl]|*)P>%.1B(ȾHXS~4@6WE0%:59O}yu9N`  >` G$ȿa?+eǽ?~nY:޲f}w>cTt苮YFػ$=IZ$&Ѽ9 y=AH)4AȇMr-p5t9v)]U`K2eâtOWu_n7(NiLBvТAI0I3EV@№Zh9 [>,4wuF(?$t$eNTitc[R`0F*v.5Dw2gB80)W/_Z- s(I$K/sL6)!Ϣ`f}?ܭGa xƳ 1Ayτ* o߿CGϿ?ѦΦfZk,dg0$3-:f`jh@ [>c^dtlS3 Ch M+.s?J~d퀲M0 :ޥ`M:tX$5$`JJ4=M6(~!",_lZQ(4 y: spsF1">;}6J[]]*o_ݺ*Ȓ@cM }o~r1|<5ZEC=ch6 -u{GbC;.A1 :LN4]?:@ћ*ۧu5$-20a u"Zuw߻?KvL+Jm( /D- ,:@/L'2[OV_~,0AG(c+m]sp9E(qa"0HՖN zl {qf?4:rԁ1x+~>/"Pt5`﷩)l> S3U|R?(D>_I4f>>Gm"l0V/pɠQm\8ip9~TU`Ck3?9?5X`V/w9L 0\ K| Z.Xy,ƫ>ya!F$֙wJj!w]Iэ82ĉ8:E` B\6|h C6!QΘ m/t|ߤP|usSfu~~WuF9OaRP;B%EC2UANQ "//aQL &rc:>,3OnzDPe0́7GnHC{w=Ql=;@01`vOײԁZVZc`nZ>@@fyJ̹lv:_*-g._ƍ}t:wa~ -QӳIdH+!}5GyZӃ G[4ӇRG9c&0dܕ/[cNQ [#f0L4cZuYŒб {VagY4)L˰)Qkm +F{x$>GL)J;B"!Js<ތ_<ָ+P`. &{=_c(Uyl&;\y/ܬWkzcffn^}/3|p:.0;}]x(aZ=3B-(||ȯA 7-%#&y#qjܛ m=*|wh9 *p?GP]ӯY+ZR2g{cl |+{兗^ɮ_m2 s`AE(^_ʞ+\k,7O=Sca(T>b<{8C%.7GZP0rLS<|6@x>\i1)IUDt7!FJ 37,=n`6+n^]_Y\`N tyƽy p.3j! a5]U04fM~ <'lϺLLxWKd{jߩ)WӔȐkj/ `B2$G}\V 5P7)0xqp]`K9C)j|v2k\Wfg ,`ܸo~|1 +J2q B}lV/k9^dwq}N˲K,~6'%ۅ> }|і١\"bFhR< Ctī%ӑ28S3;l7rC/$ȓpBD~`_qz*OɩbR.Tת}Pl4ֿ\apr { LVϡ pn:]^ZZ[V^=ٟo~U)yg v}83Udž /X;F[ 51YHHՋ|Qs%Q!{oA0 2ZP]vP^9¹"B㥙/LW^:w$;"`bqzƫ}T0քEҖt~^xpy 0yJeGJ\AH6AZmeB\v#We3 b.Y[-W@]ݾv^l>~sW~c_t $PGwSO$cS<1)0Q$gEE'v|s GoV ` #6b+3O7sQW+J22ljNƘަaבzzWPֶʎ`4l9#(燑0k 8PP"4\0(```V8 J]o 5GD%- .E"mM]ZyqYᆡpAڛ dXx`Pkj~F̨U:xTB<=)W2x fo|fybbV]WWK _[lʍo~ Զ;A3t(-atH| eY#"qm9cG22G`0CM6FYnZd6qm2fQ3o<~>8P􀩝A;d뺔Im_%ĕz:4EsC,c2$Ppj1(D6UC wM=04vJ 'oq7\R[+d''ˀ~k/\(T@J0_J~dVT@TZOg]A6ۿ?Sa,'i 4^Ġv:-(/ڼ`S "68AlTR/Q4 :! Fk=, Baj8CN #0:&~&8~"1MH/:v2"o+[fcVϡ!E⣯hPLDʻ=>ebI;B{ fP+UTZ[oTʹ$'.+"kEr+-gnM!``(~zpk>S P,N+)(О2/.5^! nLQZWlY4hsv9񤶺jܯ'XM(S4~8L}9\l c3z*0DK,ܠ N"jUFBPl/$(!S:4 M=0Uz$ xhb'° ̱ &d,/ҽ'&bej n T:* pƱX.A @É3&&`Be2 %(|3,om@otlt{*I<vfd7MCG7p2MݤBlq s5&lLjdKC^ځ1#PSw-kxc2߲ JQqWlY24{.'u mXxJS|2 G}(4Jn@@ElgHMQUbD!i,AI);]AVO|G X`̲HIP(×S;ܤc0R0$$~1ɉsÂ0S||KF)*pX)N媨Wۀ\uQ\\Y,aW.#Dnߺ5V[_C\G,@'Mmbˈ z5tWzw#Q^L @ oS"QĘVL=⵬eGN?w#hHoYڻ{kA-jIM]Td2y T)%S7QAb83 {1Tu3tvA"cmƋH<^TLM/xhȒuq |RR{+?AWTlL@.R J(+_jlo?wݍHxyn ?:tP$UzCjs9i#H1FIHRS>|u0;*&7>跦4Mt7Ou؟7PB ^'%bҵ=vl\f,9h- 5h;Cwİ,@贉eNDom$t7ipq% 5-W޾vXݾĶ跿J4k34ϼ_S=M3'|wPһ0&Sz >%~5cN-(( 4U Bw!3ו -(i=J>RItb;cދUY{=< י^L@{JQF'9 SBt#1 y @A:/yz؀K8Ц }4ڦ.rgp ~h47HWU*of[4bYL ;$ o^0\qYB (h-:WaT:Iri Te-,B4:fd y7hdLT  Fc# XgOJV3[XrxayZh D95#Iurfѱ< Ĵ`DPBOJ$a7"{We^L0ƑtaV6VZz2BBjkw3S7<whۜ]N!fú}Eio^iBt`2Z:qub:NѦx9eqRgr6.um܁*&.G$\[LSKK z[Ҏ4OO$,K~GJ9Q`FQ7D?kfhuI'W{ɽQaI%c*Ec2q)-O݌]ޯ_^|q m㫎K2a 7~9(F2`%au1= \uXM=T-קq%[`l]!\ @ɗα ;,w=R`B5\i0<ټ\.CpH@?S 7G YgRD3eKe\K%E“S1-pRIԜE0{㣈ID9.-* 5Nav2D>ʷҟS#u^|<v1wkҐq@rmdQ? "AC@C [9$7-Idž[W}H@t)'fw>|~o7 g뫈*5c76IKLA&0颜zG!:61c*$"v21گB9ux}=Ai~k{-FD0/8R s{k({h.КeA_K9Ǟ3[.rlk /|_-ʢp2A RMsL6Pa}NIa%/nO[o:h  *@tֱ<+l ЦwⰽJ ~hV1T4PC*r5zuτ<*V-UjF9A$- ++pV>< k?v .mMxBd p!P#[oCWOUʚ67L,܂8RHrͥ0mPHx}M)P2Rb4(uQ谽S \["ЫF? &5 V8BPdGJ)͠^w@&КfDF"Ƿ[,ñkD=o~g¨Ģۚbqy[F1[ygo|(/OW͗AH̹J@(oW~)\rkt/9w;Q;b 3KqCR򤃁Gq'#wxv.SOC_x{ _`?OێqR#{pB(/K Gd3E:%LXICIɶ)?]̛2'w2[ԣ'.*w7nYv= lt #UHm^ Vݮ/"g0@2n̲>(06` :=e&.DL'\e Cy fߧ`ix \q:d冁(Pé)03Ä屃ߘk _F ?]\Ιe͖GnN`׮!aW# QOݵSm@DPL"VZ?ĆmPp'+bWĒvG:eqjzto7m˯&&`YUUM*,J;aN 4B(1Fiϥ(XGr"$DF7Q)Eѿ=`.G~ܖC!Zg.,/r.OKYr ,mBQ q |FD1iqF8FJ ?ZQ==sŧDZ) W'Y}KϷ_$sԚěxpc==Oyeӭ#woJ½ W:iU.wN &yt&몳?ػ4UziIπ(ˮanɸH.zc^ Q±t5}Yw'upΕY>kR7Y݊~/՛Fohd~ #Eև0<@V|.1FPfHtVK+)Tୱ:x(J1bx.S+ϻop ;amup\DMȪùy4(xZmCNҦ`Dy# Us*@1SG\v x^~un>wip$5 ʛQ`uV-Rk嵙C8m\F2{Lun>˯ZUY;ȊtZc`b6M?$J80Fy\Ln&zg‡0+hcXIe>/}^hkֹ(9? GIUX\2}o`гT8㞹,Չ#szYdJl_ ԅ*'%l%V$E}э/BemOl%X;>F -`-fdNNbYe,3L7gP*lW& hδe2J ؂e_G\gM`Mڹ:P}ə;ʼnS.^^^N/ZYɮX(S6sa)x+^ԋar"_`T0]I啳5Q :nQ|]7[,ȃ?,cM $lS]+Ĵ1!l m#♖04 !"˺eT_[jBhZlSC]uQ^RCp-ֆ ͻ E <j>_ҵs]v>:k[gk|ZmC~eW=ua9uLqz<TPB ҵ,^CED ;7@Ȋ#Խ7哶&y g^9mTD394~lY|*ej5tKvv{c5xMՙɬf4Me2=%3b^ܼ$-G ~l : AV@O5krx!U>|=*{N.D(v8D2 _@ y->{'; +']{!e}f?$#NoY}&xNO*r?RAR`Lɬ)eaD٬i1#b W nVy?u *s~I'\MFy}.0vwIZ5STyU pe_'X5K5_ݴ{@(JZ}[>)J0!33Fݾ8./ $_ :uڀ¢>8-/"hBr⼦W J9 j=TFr.64H?_=>}} IؑFA׻/N1M fY[.~o_D,q MݫZk?_guz;2έGs[W+(/\ &WhHy^"K-mBSrSVD;`xK[}$b[fya4,ދ*o4( n3‏ZFMFVd6 gĉU2(ε`N0\^ 7>9-O"-#t0xfɧZ 6bJ=Y׋q?O` N2-3@<"L1N0U$@J$vFz Ib&⌝2H(FkЏ!Q.x&|0a *4BGXrFn~1I$@ͼC9C+ +J` -f_ޯm[сDΕ*zZpw$*w~;ّ8?ڃNdr:3p>p`۵rϼ` -^`t2I!'1[wg6aJ'0IuϻLpJ )Fa6Kko3+et*Ž>Yq)c MVe1Vo6Zr”mC/?." vz%Ȓ+Sᚇwx d9JӲ%:cc/G=3=tc ,`@\̿Y|6p.-Py[ p[sR8"w~u=jOy^JRi,¡ hS 2 Nho( Sy5/_~_zɎ o~쑷ߺ!`j3 2.! Op^ŧ^PXH¡.4OzngGԦ 7 O*B6q wu9\%tڵ~hP`U5Uy &5$t`@A!Ս0*v ~q}#ch &5h-w#mmL[a55Ø h!jvqHAZ*V|]Qd~0-Oi~6OLx7߸)IPmEFrHJ5znxMB:B].fKq>ݭ!rcV|Dt o p"~?i6Z?,)Rag "NDJX.) [4C#b e/}>2NrIbCUAVvCY KA p/@jn[´ݪ`)Rh!I+Y99Dܟ}-GdDA( +tʮ4ZzuJ99Z\8/uF0s0.D08s0nyR+Xs\U9@^ۗj={9L d0fl١W88 Jͤz YvR`D3[RzĀ.R[ ͌{Խ2bF@xcc_D+S_QH'n~y rATO<촂܉!(_? sbv@Hv[- t yؠjD:,s5KmÂR&Qc}8Ѡ$ lo a3Fg. ?rPm߫="` &"%XJ"nWs-U|ړ>yQB 5ѤIAhqA^;&J!rrO O,~(^a׃L/2W 4n8 ]SXN՛ aq2ѕle·է?X f.ʂx.KRvJ0m?>7;|']Ӌ&y!.t}h@$HtKfk[5} iQRB0!U+(].YR]##YZ&V[yw7oܕTI:YH'BjZ҆2 hy:9W0 * R *xM/LIҢ'.Ӽ MI!:U,|s Q#C^~ A ۮ@Bt5M\{V@K>Aܵ/2dL7mWx}_v}/>>` M;8dA'4@ɵ*e{vzG7{R%Yj#T`\-m?w/Kk}$ir݈av5Gxo|8N.7P, "״Zl j[lXYOhѢEP *n?XIENDB`pdfarranger-1.10.1/doc/000077500000000000000000000000001451252235000146315ustar00rootroot00000000000000pdfarranger-1.10.1/doc/pdfarranger.1000066400000000000000000000017441451252235000172140ustar00rootroot00000000000000.TH PDFARRANGER 1 "May 2019" "version 1.2" "User Manuals" .SH "NAME" pdfarranger \- Application for PDF Merging, Rearranging, Splitting, and Cropping .SH "SYNOPSIS" .B pdfarranger [file1] [file2] ... .SH "DESCRIPTION" .B PDF Arranger is a small python-gtk application, which helps the user to merge or split pdf documents and rearrange their pages using an interactive and intuitive graphical interface. In the current version, page rotation and cropping is also supported. PDF Arranger is a frontend for pikepdf. .SH "OPTIONS" Currently PDF Arranger doesn't receive any options. .SH "FILES" $HOME/.config/pdfarranger/config.ini .SH "ENVIRONMENT" All gtk related environment variables. .SH "DIAGNOSTICS" Common python and gtk diagnostics. .SH "AUTHOR" Konstantinos Poulios , Jerome Robert .SH COPYRIGHT Copyright \(co 2008-2017 Konstantinos Poulios, 2018-2019 Jerome Robert .br .SH LICENSE GNU GPL version 3 or later . pdfarranger-1.10.1/pdfarranger.spec000066400000000000000000000142661451252235000172440ustar00rootroot00000000000000# If you change this file, please inform @dreua since I most likely have to # apply these changes to the other pdfarranger spec file I maintain, too. # Help for future-me: meld ~/fedora-scm/pdfarranger/*.spec ~/git/pdfarranger/*.spec # These must come from the calling environment %global repo %{getenv:GITHUB_REPOSITORY} %global sha %{getenv:GITHUB_SHA} %global shortcommit %(c=%{sha}; echo ${c:0:7}) %define build_timestamp %(date +"%%Y%%m%%d") Name: pdfarranger Version: 0 Release: %{build_timestamp}git%{shortcommit}%{?dist} Summary: PDF file merging, rearranging, and splitting License: GPLv3 URL: https://github.com/%{repo} Source0: %{url}/archive/%{shortcommit}/%{name}-%{shortcommit}.tar.gz BuildArch: noarch # https://fedoraproject.org/wiki/Changes/EncourageI686LeafRemoval ExcludeArch: %{ix86} BuildRequires: gettext BuildRequires: python3-devel BuildRequires: python3-setuptools BuildRequires: python3-wheel BuildRequires: python3-pip # For checks only BuildRequires: libappstream-glib BuildRequires: desktop-file-utils Requires: python3-pikepdf >= 1.15.1 Recommends: python3-img2pdf >= 0.3.4 # These seem to be included in the default desktop install Requires: python3-gobject Requires: gtk3 Requires: python3-cairo Requires: poppler-glib Requires: python3-dateutil >= 2.4.0 Provides: pdfshuffler = %{version}-%{release} Obsoletes: pdfshuffler < 0.6.1-1 # The repository changed to pdfarranger/pdfarranger but we leave the app_id # for now. %global app_id com.github.jeromerobert.pdfarranger %global python3_wheelname %{name}-*-py3-none-any.whl %description PDF Arranger is a small python-gtk application, which helps the user to merge or split pdf documents and rotate, crop and rearrange their pages using an interactive and intuitive graphical interface. It is a frontend for pikepdf. PDF Arranger is a fork of Konstantinos Poulios’s PDF-Shuffler. %prep %autosetup -n %{name}-%{sha} # py3_build / py3_install do not work with this setup.py but building # a wheel works just fine %build %py3_build_wheel %install %py3_install_wheel %{python3_wheelname} %find_lang %{name} ln -s pdfarranger %{buildroot}%{_bindir}/pdfshuffler %check desktop-file-validate %{buildroot}/%{_datadir}/applications/%{app_id}.desktop appstream-util validate-relax --nonet %{buildroot}%{_metainfodir}/*.metainfo.xml %files -f %{name}.lang %license COPYING %doc README.md %{python3_sitelib}/%{name}/ %{python3_sitelib}/%{name}-*.dist-info/ %{_mandir}/man*/*.* %{_datadir}/icons/hicolor/*/apps/* %{_metainfodir}/%{app_id}.metainfo.xml %{_datadir}/applications/%{app_id}.desktop %{_datadir}/%{name}/ %{_bindir}/pdfarranger %if 0%{?fedora} > 31 %{_bindir}/pdfshuffler %endif %changelog * Sat Dec 12 2020 David Auer - 0-20201212git%{shortcommmit}.0.1 - Modified for pdfarranger-CI: Build given commit. * Thu Mar 18 2021 David Auer - 1.7.1-1 - Update to 1.7.1 - Update repository URL (was a redirection anyway) * Tue Jan 26 2021 Fedora Release Engineering - 1.7.0-3 - Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild * Sun Jan 24 2021 David Auer - 1.7.0-2 - Add dependency: dateutil * Sun Jan 24 2021 David Auer - 1.7.0-1 - Update to 1.7.0 * Sat Aug 01 2020 David Auer - 1.6.2-1 - Update to 1.6.2 * Tue Jul 28 2020 Fedora Release Engineering - 1.6.0-3 - Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild * Thu Jul 16 2020 David Auer - 1.6.0-2 - Recommend img2pdf * Wed Jul 15 2020 David Auer - 1.6.0-1 - Update to 1.6.0 - Require pikepdf >= 1.15.1 as suggested in Readme. * Wed Jun 24 2020 David Auer - 1.5.3-3 - Explicitly require python3-setuptools * Tue May 26 2020 Miro Hrončok - 1.5.3-2 - Rebuilt for Python 3.9 * Sun May 17 2020 David Auer - 1.5.3-1 - Update to 1.5.3 * Mon Apr 20 2020 David Auer - 1.5.1-1 - Update to 1.5.1 (#1823971) - Fixes rhbz#1824017 * Wed Apr 15 2020 David Auer - 1.5.0-1 - Update to 1.5.0 (#1823971) * Tue Mar 17 2020 Fabian Affolter - 1.4.2-1 - Update to new upstream version 1.4.2 (rhbz#1814032) * Sun Feb 09 2020 Fedora Release Monitoring - 1.4.1-1 - Update to 1.4.1 (#1800993) * Sat Feb 01 2020 David Auer - 1.4.0-1 - New version, see https://github.com/jeromerobert/pdfarranger/releases/tag/1.4.0 - Replace python3-PyPDF2 with python3-pikepdf * Wed Jan 29 2020 Fedora Release Engineering - 1.3.1-3 - Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild * Wed Sep 25 2019 David Auer - 1.3.1-2 - replace pdfshuffler on f32+ * Sun Sep 22 2019 David Auer - 1.3.1-1 - New version, see https://github.com/jeromerobert/pdfarranger/releases/tag/1.3.1 * Wed Sep 11 2019 David Auer - 1.3.0-2 - Add missing dependency - Remove unnecessary python_provide macro * Sun Aug 11 2019 David Auer - 1.3.0-1 - New version, see https://github.com/jeromerobert/pdfarranger/releases/tag/1.3.0 - Remove obsolete downstream fixes * Tue Jun 11 2019 David Auer - 1.2.1-8 - Better source URL * Mon May 20 2019 David Auer - 1.2.1-7 - Fix directory ownership - Replace obsolete srcname by name * Mon May 20 2019 David Auer - 1.2.1-6 - Name changed from python-pdfarranger to pdfarranger - Remove shebang in __main__.py * Sat May 18 2019 David Auer - 1.2.1-5 - Fix rpmlint errors and warnings * Sat May 18 2019 David Auer - 1.2.1-4 - Building with wheel to get lang and icons right * Sat May 18 2019 David Auer - 1.2.1-3 - Move Requires to the right location * Sat May 18 2019 David Auer - 1.2.1-2 - Add missing requires * Sat May 18 2019 David Auer - 1.2.1 - Packaging pdfarranger based on pdfshuffler's spec file and https://docs.fedoraproject.org/en-US/packaging-guidelines/Python/#_example_python_spec_file pdfarranger-1.10.1/pdfarranger/000077500000000000000000000000001451252235000163575ustar00rootroot00000000000000pdfarranger-1.10.1/pdfarranger/__init__.py000066400000000000000000000000001451252235000204560ustar00rootroot00000000000000pdfarranger-1.10.1/pdfarranger/__main__.py000066400000000000000000000001301451252235000204430ustar00rootroot00000000000000import sys from pdfarranger import pdfarranger pdfarranger.PdfArranger().run(sys.argv) pdfarranger-1.10.1/pdfarranger/config.py000066400000000000000000000241111451252235000201750ustar00rootroot00000000000000# Copyright (C) 2020 pdfarranger contributors # # pdfarranger 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, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import platform import configparser import os import sys import gettext from gi.repository import Gdk from gi.repository import Gtk _ = gettext.gettext # See https://gitlab.gnome.org/GNOME/gtk/-/blob/3.24.23/gdk/keynames.txt for list of keys _DEFAULT_ACCELS = [ ('delete', 'Delete'), ('page-format', 'c'), ('rotate(90)', 'Right'), ('rotate(-90)', 'Left'), ('save', 's'), ('save-as', 's'), ('export-selection(2)', 'e'), ('export-all', 'e'), ('print', 'p'), ('close', 'w'), ('quit', 'q'), ('new', 'n'), ('open', 'o'), ('import', 'i'), ('zoom-in', 'plus KP_Add plus KP_Add'), ('zoom-out', 'minus KP_Subtract minus KP_Subtract'), ('zoom-fit', 'f'), ('fullscreen', 'F11'), ('undo', 'z'), ('redo', 'y'), ('cut', 'x'), ('copy', 'c'), ('paste(0)', 'v'), ('paste(1)', 'v'), ('paste(4)', 'o'), ('paste(5)', 'u'), ('select(0)', 'a'), ('select(1)', 'a'), ('main-menu', 'F10'), ('metadata', 'Return'), ] class Config(object): """Wrap a ConfigParser object for PDFArranger""" @staticmethod def __get_action_list(m, r): for i in range(m.get_n_items()): it = m.iterate_item_attributes(i) target, action = None, None while it.next(): if it.get_name() == 'target': target = it.get_value() elif it.get_name() == 'action': action = it.get_value() if action is not None: action = action.get_string()[4:] if target is not None: action += "({})".format(target) r.append(action) it = m.iterate_item_links(i) while it.next(): Config.__get_action_list(it.get_value(), r) return r @staticmethod def _config_file(domain): """Return the location of the configuration file""" if os.name == 'nt' and getattr(sys, 'frozen', False): p = os.path.dirname(sys.executable) config_ini = os.path.join(p, 'config.ini') if os.path.isfile(config_ini): return config_ini home = os.path.expanduser("~") if platform.system() == 'Darwin': p = os.path.join(home, 'Library', 'Preferences') elif 'APPDATA' in os.environ: p = os.getenv('APPDATA') elif 'XDG_CONFIG_HOME' in os.environ: p = os.getenv('XDG_CONFIG_HOME') else: p = os.path.join(home, '.config') p = os.path.join(p, domain) os.makedirs(p, exist_ok=True) return os.path.join(p, 'config.ini') def __init__(self, domain): self.domain = domain self.data = configparser.ConfigParser() self.data.add_section('window') self.data.read(Config._config_file(domain)) if 'preferences' not in self.data: self.data.add_section('preferences') if 'accelerators' not in self.data: self.data.add_section('accelerators') a = self.data['accelerators'] if 'enable_custom' not in a: a['enable_custom'] = 'false' enable_custom = a.getboolean('enable_custom') for k, v in _DEFAULT_ACCELS: if not enable_custom or k not in a: a[k] = v def window_size(self): ds = Gdk.Screen.get_default() return self.data.getint('window', 'width', fallback=int(min(700, ds.get_width() / 2))), \ self.data.getint('window', 'height', fallback=int(min(600, ds.get_height() - 50))) def set_window_size(self, size): self.data.set('window', 'width', str(size[0])) self.data.set('window', 'height', str(size[1])) def set_position(self, position): self.data.set('window', 'root_x', str(position[0])) self.data.set('window', 'root_y', str(position[1])) def position(self): return self.data.getint('window', 'root_x', fallback=10), self.data.getint('window', 'root_y', fallback=10) def maximized(self): return self.data.getboolean('window', 'maximized', fallback=False) def set_maximized(self, maximized): self.data.set('window', 'maximized', str(maximized)) def zoom_level(self): return self.data.getint('preferences', 'zoom-level', fallback=0) def set_zoom_level(self, level): self.data.set('preferences', 'zoom-level', str(level)) def content_loss_warning(self): return self.data.getboolean('preferences', 'content-loss-warning', fallback=True) def set_content_loss_warning(self, enabled): self.data.set('preferences', 'content-loss-warning', str(enabled)) def show_save_warnings(self): return self.data.getboolean('preferences', 'show-save-warnings', fallback=True) def set_show_save_warnings(self, enabled): self.data.set('preferences', 'show-save-warnings', str(enabled)) def language(self): return self.data.get('preferences', 'language', fallback="") def set_language(self, language): self.data.set('preferences', 'language', language) def theme(self): return self.data.get('preferences', 'theme', fallback="") def set_theme(self, theme): self.data.set('preferences', 'theme', theme) def save(self): conffile = Config._config_file(self.domain) os.makedirs(os.path.dirname(conffile), exist_ok=True) with open(conffile, 'w') as f: self.data.write(f) def set_actions(self, builder): """ Set the list of actions to which shortcuts may be associated. :param builder: A Gtk.Builder from which to get actions """ actions = [] for m in builder.get_objects(): self.__get_action_list(m, actions) actions = set(actions) accels_section = self.data['accelerators'] for a in actions: if a not in accels_section: accels_section[a] = "" # Have accelerators sorted in the .ini file (cosmetic) sortedaccels = [(k, v) for k, v in accels_section.items() if k != 'enable_custom'] sortedaccels = sorted(sortedaccels) enable_custom = accels_section['enable_custom'] accels_section.clear() accels_section['enable_custom'] = enable_custom accels_section.update(sortedaccels) def get_accels(self): """Return the accelerators for each actions.""" return [ (k, v.split()) for k, v in self.data["accelerators"].items() if k != "enable_custom" ] def preferences_dialog(self, parent, localedir, handy_available): """A dialog where language and theme can be selected.""" d = Gtk.Dialog(title=_("Preferences"), parent=parent, flags=Gtk.DialogFlags.MODAL, buttons=( _("_Cancel"), Gtk.ResponseType.CANCEL, _("_OK"), Gtk.ResponseType.OK, ), ) d.set_resizable(False) hbox = Gtk.Box(spacing=6, margin=8) frame = Gtk.Frame(label=_("Language"), margin=8) combo = Gtk.ComboBoxText(margin=8) label = Gtk.Label(_("(Requires restart)")) hbox.pack_start(combo, False, False, 8) hbox.pack_start(label, False, False, 8) frame.add(hbox) d.vbox.pack_start(frame, False, False, 8) hbox2 = Gtk.Box(spacing=6, margin=8) frame2 = Gtk.Frame(label=_("Theme"), margin=8) combo2 = Gtk.ComboBoxText(margin=8) label2 = Gtk.Label("" if handy_available else _("(Libhandy missing)")) hbox2.pack_start(combo2, False, False, 8) hbox2.pack_start(label2, False, False, 8) frame2.add(hbox2) d.vbox.pack_start(frame2, False, False, 8) t = _("For more options see:") frame3 = Gtk.Frame(label=t, shadow_type=Gtk.ShadowType.NONE, margin=8) label3 = Gtk.Label(self._config_file(self.domain), selectable=True, margin=8) frame3.add(label3) d.vbox.pack_start(frame3, False, False, 8) langs = [] if os.path.isdir(localedir): langs = os.listdir(localedir) langs.append("en") langs.sort() langs.insert(0, _("System setting")) for lan in langs: combo.append(None, lan) lang = self.language() if lang in langs: combo.set_active(langs.index(lang)) else: combo.set_active(0) themes = [_("System setting"), "light", "dark"] for the in themes: combo2.append(None, the) theme = self.theme() if theme in themes: combo2.set_active(themes.index(theme)) else: combo2.set_active(0) combo2.set_sensitive(handy_available) d.show_all() result = d.run() if result == Gtk.ResponseType.OK: num = combo.get_active() language = langs[num] if num != 0 else "" self.set_language(language) num2 = combo2.get_active() theme = themes[num2] if num2 != 0 else "" self.set_theme(theme) d.destroy() pdfarranger-1.10.1/pdfarranger/core.py000066400000000000000000000673051451252235000176740ustar00rootroot00000000000000# Copyright (C) 2020 pdfarranger contributors # # pdfarranger 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, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. __all__ = [ "img2pdf_supported_img", "Page", "PageAdder", "PDFDoc", "PDFDocError", "PDFRenderer", ] import sys import os import traceback import mimetypes import copy import pathlib import shutil import tempfile import threading import gettext import gi from gi.repository import GObject from gi.repository import GLib from gi.repository import Gtk gi.require_version("Poppler", "0.18") from gi.repository import Poppler # for the rendering of pdf pages import cairo from math import pi try: import img2pdf img2pdf.Image.init() img2pdf_supported_img = [ i for i in img2pdf.Image.MIME.values() if i.split("/")[0] == "image" ] except ImportError: img2pdf_supported_img = [] img2pdf = None _ = gettext.gettext class Page: def __init__(self, nfile, npage, zoom, copyname, angle, scale, crop, size, basename, layerpages): #: The ID (from 1 to n) of the PDF file owning the page self.nfile = nfile #: The ID (from 1 to n) of the page in its owner PDF document self.npage = npage self.zoom = zoom #: Filepath to the temporary stored file self.copyname = copyname #: Left, right, top, bottom crop self.crop = list(crop) #: Width and height of the original page self.size_orig = list(size) #: Width and height self.size = list(size) if angle in [0, 180] else list(reversed(size)) self.angle = angle self.thumbnail = None self.resample = -1 #: A low resolution thumbnail self.preview = None self.scale = scale #: The name of the original file self.basename = basename self.layerpages = list(layerpages) def description(self): shortname = os.path.splitext(self.basename)[0] return "".join([shortname, "\n", _("page"), " ", str(self.npage)]) def width_in_points(self): """Return the page width in PDF points.""" return (self.scale * self.size[0]) * (1 - self.crop[0] - self.crop[1]) def height_in_points(self): """Return the page height in PDF points.""" return (self.scale * self.size[1]) * (1 - self.crop[2] - self.crop[3]) def size_in_points(self): """Return the page size in PDF points.""" return (self.width_in_points(), self.height_in_points()) def width_in_pixel(self): return int(0.5 + self.zoom * self.width_in_points()) def height_in_pixel(self): return int(0.5 + self.zoom * self.height_in_points()) @staticmethod def rotate_times(angle): """Convert an angle in degree to a number of 90° rotation (integer)""" return int(round(((-angle) % 360) / 90) % 4) @staticmethod def rotate_crop(croparray, rotate_times): """Rotate a given crop array (left, right, top bottom) a number of time""" perm = [0, 2, 1, 3] for __ in range(rotate_times): perm.append(perm.pop(0)) perm.insert(1, perm.pop(2)) return [croparray[x] for x in perm] def rotate(self, angle): rt = self.rotate_times(angle) if rt == 0: return False self.crop = self.rotate_crop(self.crop, rt) self.angle = (self.angle + int(angle)) % 360 self.size = self.size_orig if self.angle in [0, 180] else list(reversed(self.size_orig)) for lp in self.layerpages: lp.rotate(angle) return True def unmodified(self): u = self.angle == 0 and self.crop == [0]*4 and self.scale == 1 and len(self.layerpages) == 0 return u def serialize(self): """Convert to string for copy/past operations.""" lpdata = [lp.serialize() for lp in self.layerpages] ts = [self.copyname, self.npage, self.basename, self.angle, self.scale] ts += list(self.crop) + list(lpdata) return "\n".join([str(v) for v in ts]) def duplicate(self, incl_thumbnail=True): r = copy.copy(self) r.crop = list(r.crop) r.size = list(r.size) r.layerpages = [lp.duplicate() for lp in r.layerpages] if incl_thumbnail == False: del r.thumbnail # to save ram r.thumbnail = None r.preview = None return r def split(self, vcrops, hcrops): """Split this page into a grid and return all but the top-left page.""" newpages = [] left, right, top, bottom = self.crop # If the page is cropped, adjust the new crop for the visible part of the page. hscale = 1 - (left + right) vscale = 1 - (top + bottom) vcrops = [(l * hscale, r * hscale) for (l, r) in vcrops] hcrops = [ (t * vscale, b * vscale) for (t, b) in hcrops] for (t, b) in reversed(hcrops): topcrop = top + t row_height = b - t bottomcrop = 1 - (topcrop + row_height) for (l, r) in reversed(vcrops): leftcrop = left + l col_width = r - l rightcrop = 1 - (leftcrop + col_width) crop = [leftcrop, rightcrop, topcrop, bottomcrop] if l == 0.0 and t == 0.0: # Update the original page self.crop = crop else: # Create a new cropped page new = self.duplicate() new.crop = crop newpages.append(new) return newpages class LayerPage: """Page added as overlay or underlay on a Page.""" def __init__(self, nfile, npage, copyname, angle, scale, crop, offset, laypos, size): self.nfile = nfile self.npage = npage self.copyname = copyname self.angle = angle self.scale = scale #: Left, right, top, bottom crop self.crop = crop #: Left, right, top, bottom offset from dest page edges self.offset = offset #: OVERLAY or UNDERLAY self.laypos = laypos #: Width and height of the original page self.size_orig = list(size) #: Width and height self.size = list(size) if angle in [0, 180] else list(reversed(size)) def width_in_points(self): """Return the page width in PDF points.""" return self.scale * self.size[0] * (1 - self.crop[0] - self.crop[1]) def height_in_points(self): """Return the page height in PDF points.""" return self.scale * self.size[1] * (1 - self.crop[2] - self.crop[3]) @staticmethod def rotate_times(angle): """Convert an angle in degree to a number of 90° rotation (integer).""" return int(round(((-angle) % 360) / 90) % 4) @staticmethod def rotate_array(array, rotate_times): """Rotate a given crop or offset array (left, right, top bottom) a number of times.""" perm = [0, 2, 1, 3] for __ in range(rotate_times): perm.append(perm.pop(0)) perm.insert(1, perm.pop(2)) return [array[x] for x in perm] def rotate(self, angle): rt = self.rotate_times(angle) if rt == 0: return False self.crop = self.rotate_array(self.crop, rt) self.offset = self.rotate_array(self.offset, rt) self.angle = (self.angle + int(angle)) % 360 self.size = self.size_orig if self.angle in [0, 180] else list(reversed(self.size_orig)) return True def serialize(self): """Convert to string for copy/past operations.""" ts = [self.copyname, self.npage, self.angle, self.scale, self.laypos] ts += list(self.crop) + list(self.offset) return "\n".join([str(v) for v in ts]) def duplicate(self): r = copy.copy(self) r.crop = list(r.crop) r.offset = list(r.offset) return r class PDFDocError(Exception): def __init__(self, message): self.message = message class _UnknownPasswordException(Exception): pass class PasswordDialog(Gtk.Dialog): def __init__(self, parent, filename): super().__init__( title=_("Password required"), parent=parent, flags=Gtk.DialogFlags.MODAL, buttons=( "_Cancel", Gtk.ResponseType.CANCEL, "_OK", Gtk.ResponseType.OK, ), ) self.set_default_response(Gtk.ResponseType.OK) bottommsg = _("The password will be remembered until you close PDF Arranger.") topmsg = _("The document “{}” is locked and requires a password before it can be opened.") label = Gtk.Label(label=topmsg.format(filename)) label.set_max_width_chars(len(bottommsg)-6) label.set_line_wrap(True) label.set_size_request(0, -1) self.vbox.pack_start(label, False, False, 12) box = Gtk.HBox() self.entry = Gtk.Entry() self.entry.set_visibility(False) self.entry.set_activates_default(True) box.pack_start(Gtk.Label(label=_("Password")), False, False, 6) box.pack_start(self.entry, True, True, 6) self.vbox.pack_start(box, True, True, 0) self.vbox.pack_start(Gtk.Label(label=bottommsg), False, False, 12) self.set_resizable(False) def get_password(self): self.show_all() r = self.run() t = self.entry.props.text self.destroy() if r == Gtk.ResponseType.OK: return t else: raise _UnknownPasswordException() def _img_to_pdf(filename, tmp_dir): """Wrap img2pdf.convert to handle some corner cases""" fd, pdf_file_name = tempfile.mkstemp(suffix=".pdf", dir=tmp_dir) os.close(fd) with open(pdf_file_name, "wb") as f: img = img2pdf.Image.open(filename) if (img.mode == "LA") or (img.mode != "RGBA" and "transparency" in img.info): # TODO: Find a way to keep image in P or L format and remove transparency. # This will work but converting from 1, L, P to RGB is not optimal. img = img.convert("RGBA") if img.mode == "RGBA": bg = img2pdf.Image.new("RGB", img.size, (255, 255, 255)) bg.paste(img, mask=img.split()[-1]) imgio = img2pdf.BytesIO() bg.save(imgio, "PNG") imgio.seek(0) f.write(img2pdf.convert(imgio)) else: try: # Try to handle invalid EXIF rotation rot = img2pdf.Rotation.ifvalid except AttributeError: # img2pdf is too old so we can't support invalid EXIF rotation rot = None f.write(img2pdf.convert(filename, rotation=rot)) return pdf_file_name class PDFDoc: """Class handling PDF documents.""" def __from_file(self, parent, basename): uri = pathlib.Path(self.copyname).as_uri() askpass = False while True: try: if askpass: self.password = PasswordDialog(parent, basename).get_password() self.document = Poppler.Document.new_from_file(uri, self.password) # When there is no encryption Poppler want None as password # while PikePDF want an empty string self.password = "" if self.password is None else self.password return except GLib.Error as e: askpass = e.message == "Document is encrypted" if not askpass: raise e def __init__(self, filename, basename, stat, tmp_dir, parent): self.render_lock = threading.Lock() self.filename = os.path.abspath(filename) self.stat = stat if basename is None: # When importing files self.basename = os.path.basename(filename) else: # When copy-pasting self.basename = basename self.password = "" filemime = mimetypes.guess_type(self.filename)[0] if not filemime: raise PDFDocError(_("Unknown file format")) if filemime == "application/pdf": if self.filename.startswith(tmp_dir) and basename is None: # In the "Insert Blank Page" we don't need to copy self.filename self.copyname = self.filename self.basename = "" else: fd, self.copyname = tempfile.mkstemp(suffix=".pdf", dir=tmp_dir) os.close(fd) shutil.copy(self.filename, self.copyname) try: self.__from_file(parent, self.basename) except GLib.Error as e: raise PDFDocError(e.message + ": " + filename) elif filemime.split("/")[0] == "image": if not img2pdf: raise PDFDocError(_("Image files are only supported with img2pdf")) if mimetypes.guess_type(filename)[0] in img2pdf_supported_img: self.copyname = _img_to_pdf(filename, tmp_dir) uri = pathlib.Path(self.copyname).as_uri() self.document = Poppler.Document.new_from_file(uri, None) else: raise PDFDocError(_("Image format is not supported by img2pdf")) if filename.startswith(tmp_dir) and filename.endswith(".png"): os.remove(filename) self.basename = _("Clipboard image") else: raise PDFDocError(_("File is neither pdf nor image")) self.transparent_link_annots_removed = [False] * self.document.get_n_pages() def get_page(self, n_page): """Get a page where transparent link annotations are removed. By removing them memory usage will be lower. """ page = self.document.get_page(n_page) if self.transparent_link_annots_removed[n_page]: return page annot_mapping_list = page.get_annot_mapping() for annot_mapping in annot_mapping_list: a = annot_mapping.annot if a.get_annot_type() == Poppler.AnnotType.LINK and a.get_color() is None: page.remove_annot(a) self.transparent_link_annots_removed[n_page] = True return page class PageAdder: """Helper class to add pages to the current model.""" def __init__(self, app): #: A PdfArranger instance self.app = app #: The pages which will be added by the commit method self.pages = [] #: Where to insert pages relatively to treerowref self.before = False #: Where to insert pages. If None pages are inserted at the end self.treerowref = None self.stat_cache = {} self.content = [] self.pdfqueue_used = True def move(self, treerowref, before): """Insert pages at the given location.""" self.before = before self.treerowref = treerowref def get_pdfdoc(self, filename, basename=None): """Get the pdfdoc object for the filename. pdfqueue is searched for the filename. If it is not found a pdfdoc is created and added to pdfqueue. Returns: pdfdoc object, it's file number, if a new pdfdoc was created. """ pdfdoc = None nfile = None doc_added = False for i, it_pdfdoc in enumerate(self.app.pdfqueue): if filename == it_pdfdoc.copyname: # File of copy-pasted page was found in pdfqueue. # Files in tmp_dir are never modified by the app and are not expected # to be modified by the user either -> files are equal if names match. pdfdoc = it_pdfdoc nfile = i + 1 break if pdfdoc is None: if not filename in self.stat_cache: try: s = os.stat(filename) self.stat_cache[filename] = s.st_dev, s.st_ino, s.st_mtime except OSError as e: print(traceback.format_exc()) self.app.error_message_dialog(e) return None for i, it_pdfdoc in enumerate(self.app.pdfqueue): if self.stat_cache[filename] == it_pdfdoc.stat: # Imported file was found in pdfqueue pdfdoc = it_pdfdoc nfile = i + 1 break if pdfdoc is None: try: pdfdoc = PDFDoc(filename, basename, self.stat_cache[filename], self.app.tmp_dir, self.app.window) except _UnknownPasswordException: return None except PDFDocError as e: print(e.message, file=sys.stderr) self.app.error_message_dialog(e.message) return None self.app.pdfqueue.append(pdfdoc) nfile = len(self.app.pdfqueue) doc_added = True return pdfdoc, nfile, doc_added def get_layerpages(self, layerdata): """Create LayerPage objects from layerdata.""" layerpages = [] if layerdata is None: return layerpages for filename, npage, angle, scale, laypos, crop, offset in layerdata: doc_data = self.get_pdfdoc(filename) if doc_data is None: return None pdfdoc, nfile, _ = doc_data copyname = pdfdoc.copyname size = pdfdoc.get_page(npage - 1).get_size() ld = nfile, npage, copyname, angle, scale, crop, offset, laypos, size layerpages.append(LayerPage(*ld)) return layerpages def addpages(self, filename, page=-1, basename=None, angle=0, scale=1.0, crop=None, layerdata=None): crop = [0] * 4 if crop is None else crop c = 'pdf' if page == -1 and os.path.splitext(filename)[1].lower() == '.pdf' else 'other' self.content.append(c) self.pdfqueue_used = len(self.app.pdfqueue) > 0 doc_data = self.get_pdfdoc(filename, basename) if doc_data is None: return pdfdoc, nfile, doc_added = doc_data if (doc_added and pdfdoc.copyname != pdfdoc.filename and basename is None and not (filename.startswith(self.app.tmp_dir) and filename.endswith(".png"))): self.app.import_directory = os.path.split(filename)[0] self.app.export_directory = self.app.import_directory n_end = pdfdoc.document.get_n_pages() n_start = min(n_end, max(1, page)) if page != -1: n_end = max(n_start, min(n_end, page)) layerpages = self.get_layerpages(layerdata) if layerpages is None: return for npage in range(n_start, n_end + 1): page = pdfdoc.document.get_page(npage - 1) self.pages.append( Page( nfile, npage, self.app.zoom_scale, pdfdoc.copyname, angle, scale, crop, page.get_size(), pdfdoc.basename, layerpages, ) ) def commit(self, select_added, add_to_undomanager): if len(self.pages) == 0: return False if add_to_undomanager: self.app.undomanager.commit("Add") if self.pdfqueue_used or len(self.content) > 1 or self.content[0] != 'pdf': self.app.set_unsaved(True) self.content = [] with self.app.render_lock(): for p in self.pages: m = [p, p.description()] if self.treerowref: iter_to = self.app.model.get_iter(self.treerowref.get_path()) if self.before: it = self.app.model.insert_before(iter_to, m) else: it = self.app.model.insert_after(iter_to, m) else: it = self.app.model.append(m) if select_added: path = self.app.model.get_path(it) self.app.iconview.select_path(path) if add_to_undomanager: self.app.update_iconview_geometry() GObject.idle_add(self.app.retitle) self.app.update_max_zoom_level() self.app.silent_render() self.app.update_statusbar() self.scroll() self.pages = [] return True def scroll(self): """Scroll to first added page.""" if len(self.app.model) - len(self.pages) == 0: return if self.treerowref: iref = self.treerowref.get_path().get_indices()[0] else: iref = len(self.app.model) - 1 - len(self.pages) self.before = False if self.before: scroll_path = Gtk.TreePath.new_from_indices([max(iref - len(self.pages), 0)]) else: scroll_path = Gtk.TreePath.new_from_indices([max(iref + 1, 0)]) self.app.iconview.scroll_to_path(scroll_path, False, 0, 0) class PDFRenderer(threading.Thread, GObject.GObject): def __init__(self, model, pdfqueue, visible_range, columns_nr): threading.Thread.__init__(self) GObject.GObject.__init__(self) self.model = model self.pdfqueue = pdfqueue self.visible_start = visible_range[0] self.visible_end = visible_range[1] self.columns_nr = columns_nr self.mem_usage = 0 self.model_lock = threading.Lock() self.quit = False def run(self): """Render thumbnails and less memory consuming previews. Thumbnails are rendered for the visible range and its near area. Memory usage is estimated and if it goes too high distant thumbnails are replaced with previews. Previews will be rendered for all pages. """ for num in range(self.visible_start, self.visible_end + 1): if self.quit: return with self.model_lock: if not 0 <= num < len(self.model): break path = Gtk.TreePath.new_from_indices([num]) ref = Gtk.TreeRowReference.new(self.model, path) p = self.model[path][0].duplicate() if p.resample != 1 / p.zoom: self.update(p, ref, p.zoom, False) mem_limit = False for off in range(1, len(self.model)): for num in self.visible_end + off, self.visible_start - off: if self.quit: return with self.model_lock: if not 0 <= num < len(self.model): continue path = Gtk.TreePath.new_from_indices([num]) ref = Gtk.TreeRowReference.new(self.model, path) p = self.model[path][0].duplicate() if off <= self.columns_nr * 5: # Thumbnail zoom = p.zoom is_preview = False elif mem_limit or p.resample < 0: # Preview. Always render to about 4000 pixels = about 16kb zoom = (1 / p.scale) * (4000 / (p.size[0] * p.size[1])) ** .5 is_preview = True else: # Thumbnail is distant and total mem usage is small # -> don't update thumbnail, just take memory usage into account zoom = 1 / p.resample if p.resample != 1 / zoom: size = self.update(p, ref, zoom, is_preview) else: size = p.thumbnail.get_width(), p.thumbnail.get_height() mem_limit = self.mem_at_limit(size) self.finish() def mem_at_limit(self, size): """Estimate memory usage of rendered thumbnails. Return True when mem_usage > mem_limit.""" mem_limit = 300 # Mb (About. Size will depend on thumbnail content.) if self.mem_usage > mem_limit: return True self.mem_usage += size[0] * size[1] * 4 / (1024 * 1024) # 4 byte/pixel return False def render(self, cr, p): if self.quit: return pdfdoc = self.pdfqueue[p.nfile - 1] page = pdfdoc.get_page(p.npage - 1) with pdfdoc.render_lock: page.render(cr) def update(self, p, ref, zoom, is_preview): """Render and emit updated thumbnails.""" if (is_preview and p.preview) and (p.resample != -1): # Reuse the preview if it exist, unless it is marked for re-render thumbnail = p.preview else: wpoi = p.size[0] * (1 - p.crop[0] - p.crop[1]) hpoi = p.size[1] * (1 - p.crop[2] - p.crop[3]) wpix = int(0.5 + wpoi * p.scale * zoom) hpix = int(0.5 + hpoi * p.scale * zoom) wpix0, hpix0 = (wpix, hpix) if p.angle in [0, 180] else (hpix, wpix) rotation = round((int(p.angle) % 360) / 90) * 90 thumbnail = cairo.ImageSurface(cairo.FORMAT_ARGB32, wpix0, hpix0) cr = cairo.Context(thumbnail) if rotation > 0: cr.translate(wpix0 / 2, hpix0 / 2) cr.rotate(-rotation * pi / 180) cr.translate(-wpix / 2, -hpix / 2) cr.scale(wpix / wpoi, hpix / hpoi) cr.translate(-p.crop[0] * p.size[0], -p.crop[2] * p.size[1]) self.add_layers(cr, p, layer='UNDERLAY') cr.save() if rotation > 0: cr.translate(p.size[0] / 2, p.size[1] / 2) cr.rotate(rotation * pi / 180) cr.translate(-p.size_orig[0] / 2, -p.size_orig[1] / 2) self.render(cr, p) cr.restore() self.add_layers(cr, p, layer='OVERLAY') if self.quit: return 0, 0 GObject.idle_add( self.emit, "update_thumbnail", ref, thumbnail, zoom, p.scale, is_preview, priority=GObject.PRIORITY_LOW, ) return thumbnail.get_width(), thumbnail.get_height() def add_layers(self, cr, p, layer): layerpages = p.layerpages if layer == 'OVERLAY' else reversed(p.layerpages) for lp in layerpages: if self.quit: return if layer != lp.laypos: continue cr.save() cr.translate(p.size[0] * lp.offset[0], p.size[1] * lp.offset[2]) cr.scale(lp.scale / p.scale, lp.scale / p.scale) x = lp.size[0] * lp.crop[0] y = lp.size[1] * lp.crop[2] w = lp.size[0] * (1 - lp.crop[0] - lp.crop[1]) h = lp.size[1] * (1 - lp.crop[2] - lp.crop[3]) cr.translate(-x, -y) cr.rectangle(x, y, w, h) cr.clip() rotation = round((int(lp.angle) % 360) / 90) * 90 if rotation > 0: cr.translate(lp.size[0] / 2, lp.size[1] / 2) cr.rotate(rotation * pi / 180) cr.translate(-lp.size_orig[0] / 2, -lp.size_orig[1] / 2) self.render(cr, lp) cr.restore() def finish(self): """Signal rendering ended (for statusbar and malloc_trim).""" GObject.idle_add( self.emit, "update_thumbnail", None, None, 0, 0, False, priority=GObject.PRIORITY_LOW, ) pdfarranger-1.10.1/pdfarranger/exporter.py000066400000000000000000000463651451252235000206170ustar00rootroot00000000000000# Copyright (C) 2008-2017 Konstantinos Poulios, 2018-2019 Jerome Robert # # pdfarranger 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, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import pikepdf import os import traceback import sys import warnings import tempfile import io import gi import locale from . import metadata from gi.repository import Gtk gi.require_version("Poppler", "0.18") from gi.repository import Poppler import gettext _ = gettext.gettext # pikepdf.Page.add_overlay()/add_underlay() can't place a page exactly # if for example LC_NUMERIC=fi_FI try: locale.setlocale(locale.LC_NUMERIC, 'C') except locale.Error: pass # Gtk already prints a warning def layer_support(): """Pikepdf >= 3 has overlay/underlay support in pdfarranger.""" layer_support = True pdf1 = pikepdf.Pdf.new() pdf1.add_blank_page() pdf2 = pikepdf.Pdf.new() pdf2.add_blank_page() try: fpage = pdf1.copy_foreign(pdf2.pages[0]) except NotImplementedError: # This is pikepdf >= 6 pass else: try: pdf1.pages[0].add_overlay(fpage) except AttributeError: # This is pikepdf < 3 layer_support = False pdf1.close() pdf2.close() return layer_support def create_blank_page(tmpdir, size, npages=1): """ Create a temporary PDF file with npages empty pages. The size is in PDF unit (1/72 of inch). """ f, filename = make_tmp_file(tmpdir) f.add_blank_page(page_size=size) for __ in range(npages - 1): f.pages.append(f.pages[0]) f.save(filename) return filename def make_tmp_file(tmpdir): fd, filename = tempfile.mkstemp(suffix=".pdf", dir=tmpdir) os.close(fd) f = pikepdf.Pdf.new() return f, filename def _normalize_rectangle(rect): """ PDF Specification 1.7, 7.9.5, although rectangles are conventionally specified by their lower-left and upper-right corners, it is acceptable to specify any two diagonally opposite corners. Applications that process PDF should be prepared to normalize such rectangles in situations where specific corners are required. """ rect = [float(x) for x in rect] if rect[0] > rect[2]: rect[0], rect[2] = rect[2], rect[0] if rect[1] > rect[3]: rect[1], rect[3] = rect[3], rect[1] return rect def _intersect_rectangle(rect1, rect2): return [ max(rect1[0], rect2[0]), max(rect1[1], rect2[1]), min(rect1[2], rect2[2]), min(rect1[3], rect2[3]), ] def _mediabox(page, crop=None): """ Return the media box for a given page. """ # PDF files which do not have mediabox default to Portrait Letter / ANSI A cmb = page.MediaBox if "/MediaBox" in page else [0, 0, 612, 792] cmb = _normalize_rectangle(cmb) if "/CropBox" in page: # PDF specification §14.11.2.1, "If they do, they are effectively # reduced to their intersection with the media box" cmb = _intersect_rectangle(cmb, _normalize_rectangle(page.CropBox)) if crop is None or crop == [0., 0., 0., 0.]: return cmb angle = page.Rotate if '/Rotate' in page else 0 rotate_times = int(round(((angle) % 360) / 90) % 4) crop_init = crop if rotate_times != 0: perm = [0, 2, 1, 3] for _ in range(rotate_times): perm.append(perm.pop(0)) perm.insert(1, perm.pop(2)) crop = [crop_init[perm[side]] for side in range(4)] x1, y1, x2, y2 = [float(x) for x in cmb] x1_new = x1 + (x2 - x1) * crop[0] x2_new = x2 - (x2 - x1) * crop[1] y1_new = y1 + (y2 - y1) * crop[3] y2_new = y2 - (y2 - y1) * crop[2] return [x1_new, y1_new, x2_new, y2_new] def _set_meta(mdata, pdf_input, pdf_output): ppae = metadata.PRODUCER not in mdata with pdf_output.open_metadata(set_pikepdf_as_editor=ppae) as outmeta: if len(pdf_input) > 0: metadata.load_from_docinfo(outmeta, pdf_input[0]) for k, v in mdata.items(): outmeta[k] = v def _scale(doc, page, factor): """ Scale a page """ if factor == 1: return page rotate = 0 if "/Rotate" in page: # We'll set the rotate attribute on the resulting page so we must # unset it on the input page before rotate = page.Rotate page.Rotate = 0 page_id = len(doc.pages) newmediabox = [factor * float(x) for x in page.MediaBox] content = "q {} 0 0 {} 0 0 cm /p{} Do Q".format(factor, factor, page_id) xobject = pikepdf.Page(page).as_form_xobject() new_page = pikepdf.Dictionary( Type=pikepdf.Name.Page, MediaBox=newmediabox, Contents=doc.make_stream(content.encode()), Resources={'/XObject': {'/p{}'.format(page_id): xobject}}, Rotate=rotate, ) # This was needed for pikepdf <= 2.6.0. See https://github.com/pikepdf/pikepdf/issues/174 # It's also needed with pikepdf 4.2 else we get: # RuntimeError: QPDFPageObjectHelper::getFormXObjectForPage called with a direct object # when calling as_form_xobject in generate_booklet new_page = doc.make_indirect(new_page) return new_page def check_content(parent, pdf_list): """ Warn about fillable forms or outlines that are lost on export.""" warn = False for pdf in [pikepdf.open(p.copyname, password=p.password) for p in pdf_list]: if "/AcroForm" in pdf.Root.keys(): # fillable form warn = True break if pdf.open_outline().root: # table of contents warn = True break if warn: d = Gtk.Dialog(_('Warning'), parent=parent, flags=Gtk.DialogFlags.MODAL, buttons=("_Cancel", Gtk.ResponseType.CANCEL, "_OK", Gtk.ResponseType.OK)) label = Gtk.Label(_('Forms and outlines are lost on saving.')) d.vbox.pack_start(label, False, False, 6) checkbutton = Gtk.CheckButton(_('Do not show this dialog again.')) d.vbox.pack_start(checkbutton, False, False, 6) buttonbox = d.get_action_area() buttons = buttonbox.get_children() d.set_focus(buttons[1]) d.show_all() response = d.run() enable_warnings = not checkbutton.get_active() d.destroy() return response, enable_warnings return Gtk.ResponseType.OK, True def _update_angle(model_page, source_page, output_page): angle = model_page.angle angle0 = source_page.Rotate if '/Rotate' in source_page else 0 if angle != 0: new_angle = angle + angle0 if new_angle >= 360: new_angle -= 360 output_page.Rotate = new_angle def _apply_geom_transform(pdf_output, new_page, row): _update_angle(row, new_page, new_page) new_page.MediaBox = _mediabox(new_page, row.crop) # add_overlay() & add_underlay() will use TrimBox or CropBox if they exist if '/TrimBox' in new_page: del new_page.TrimBox if '/CropBox' in new_page: del new_page.CropBox return _scale(pdf_output, new_page, row.scale) def _remove_unreferenced_resources(pdfdoc): try: pdfdoc.remove_unreferenced_resources() except RuntimeError: # Catch "RuntimeError: operation for dictionary attempted on object of # type null" with old version PikePDF (observed with 1.17 and 1.19). # Blindly catch all RuntimeError is dangerous as this may catch # unwanted exception so we print it. print(traceback.format_exc()) def warn_dialog(func): """ Decorator which redirect warnings and error messages to a gtk MessageDialog """ class ShowWarning: def __init__(self): self.buffer = "" def __call__(self, message, category, filename, lineno, f=None, line=None): s = warnings.formatwarning(message, category, filename, lineno, line) if sys.stderr is not None: sys.stderr.write(s + '\n') self.buffer += str(message) + '\n' def wrapper(*args, **kwargs): export_msg = args[-1] backup_showwarning = warnings.showwarning warnings.showwarning = ShowWarning() try: func(*args, **kwargs) if len(warnings.showwarning.buffer) > 0: export_msg.put([warnings.showwarning.buffer, Gtk.MessageType.WARNING]) except Exception as e: traceback.print_exc() export_msg.put([e, Gtk.MessageType.ERROR]) finally: warnings.showwarning = backup_showwarning return wrapper def export_process(*args, **kwargs): """Export PDF in a separate process.""" warn_dialog(export)(*args, **kwargs) def _copy_n_transform(pdf_input, pdf_output, pages, quit_flag=None): # all pages must be copied to pdf_output BEFORE applying geometrical # transformation. See https://github.com/pikepdf/pikepdf/issues/271 copied_pages = {} mediaboxes = [] # Copy pages from the input PDF files to the output PDF file for row in pages: if quit_flag is not None and quit_flag.is_set(): return current_page = pdf_input[row.nfile - 1].pages[row.npage - 1] mediaboxes.append(_mediabox(current_page)) _append_page(current_page, copied_pages, pdf_output, row) # Layer pages are temporary added after the page they belong to for lprow in row.layerpages: layer_page = pdf_input[lprow.nfile - 1].pages[lprow.npage - 1] _append_page(layer_page, copied_pages, pdf_output, lprow) # Apply geometrical transformations in the output PDF file i = 0 for row in pages: if quit_flag is not None and quit_flag.is_set(): return pdf_output.pages[i] = _apply_geom_transform(pdf_output, pdf_output.pages[i], row) for lprow in row.layerpages: i += 1 pdf_output.pages[i] = _apply_geom_transform(pdf_output, pdf_output.pages[i], lprow) i += 1 # Add overlays and underlays for i, row in enumerate(pages): # The dest page coordinates and size before geometrical transformations dx1, dy1, dx2, dy2 = mediaboxes[i] dw, dh = dx2 - dx1, dy2 - dy1 dpage = pdf_output.pages[i] dangle0 = dpage.Rotate if '/Rotate' in dpage else 0 rotate_times = int(round(((dangle0) % 360) / 90) % 4) for lprow in row.layerpages: # Rotate the offsets so they are relative to dest page offset = lprow.rotate_array(lprow.offset, rotate_times) offs_left, offs_right, offs_top, offs_bottom = offset x1 = row.scale * (dx1 + dw * offs_left) y1 = row.scale * (dy1 + dh * offs_bottom) x2 = row.scale * (dx1 + dw * (1 - offs_right)) y2 = row.scale * (dy1 + dh * (1 - offs_top)) rect = pikepdf.Rectangle(x1, y1, x2, y2) layer_page = pdf_output.pages[i + 1] if lprow.laypos == 'OVERLAY': pdf_output.pages[i].add_overlay(layer_page, rect) else: pdf_output.pages[i].add_underlay(layer_page, rect) # Remove the temporary added page del pdf_output.pages[i + 1] def _append_page(current_page, copied_pages, pdf_output, row): """Add a page to the output pdf. A page that already exist is duplicated.""" new_page = copied_pages.get((row.nfile, row.npage)) if new_page is None: try: # for backward compatibility with pikepdf <= 3 new_page = pdf_output.copy_foreign(current_page) except NotImplementedError: # This is pikepdf >= 6 new_page = current_page # let pdf_output adopt new_page pdf_output.pages.append(new_page) new_page = pdf_output.pages[-1] copied_pages[(row.nfile, row.npage)] = new_page # Ensure annotations are copied rather than referenced # https://github.com/pdfarranger/pdfarranger/issues/437 if pikepdf.Name.Annots in current_page: pdf_temp = pikepdf.Pdf.new() pdf_temp.pages.append(current_page) indirect_annots = pdf_temp.make_indirect(pdf_temp.pages[0].Annots) new_page.Annots = pdf_output.copy_foreign(indirect_annots) def export_doc(pdf_input, pages, mdata, files_out, quit_flag): """Same as export() but with pikepdf.PDF objects instead of files""" pdf_output = pikepdf.Pdf.new() _copy_n_transform(pdf_input, pdf_output, pages, quit_flag) if quit_flag is not None and quit_flag.is_set(): return if isinstance(files_out[0], str): # Only needed when saving to file, not when printing mdata = metadata.merge_doc(mdata, pdf_input) if len(files_out) > 1: for n, page in enumerate(pdf_output.pages): if quit_flag is not None and quit_flag.is_set(): return outpdf = pikepdf.Pdf.new() _set_meta(mdata, pdf_input, outpdf) try: # needed to add this, probably related to pikepdf < 2.7.0 workaround page = outpdf.copy_foreign(page) except NotImplementedError: # This is pikepdf >= 6 pass # works without make_indirect as already applied to this page outpdf.pages.append(page) _remove_unreferenced_resources(outpdf) outpdf.save(files_out[n]) else: if isinstance(files_out[0], str): _set_meta(mdata, pdf_input, pdf_output) _remove_unreferenced_resources(pdf_output) pdf_output.save(files_out[0]) def export(files, pages, mdata, files_out, quit_flag, _export_msg): pdf_input = [ pikepdf.open(copyname, password=password) for copyname, password in files ] export_doc(pdf_input, pages, mdata, files_out, quit_flag) def num_pages(filepath): """Get number of pages for filepath.""" try: pdf = pikepdf.Pdf.open(filepath) except pikepdf._qpdf.PdfError: return None npages = len(pdf.pages) pdf.close() return npages def generate_booklet(pdfqueue, tmp_dir, pages): file, filename = make_tmp_file(tmp_dir) content_dict = pikepdf.Dictionary({}) file_indexes = set() for p in pages: file_indexes.add(p.nfile) for lp in p.layerpages: file_indexes.add(lp.nfile) source_files = {n-1: pikepdf.open(pdfqueue[n - 1].copyname) for n in file_indexes} _copy_n_transform(source_files, file, pages) to_remove = len(file.pages) npages = len(pages) for i in range(npages//2): even = i % 2 == 0 first_id = -i - 1 if even else i second_id = i if even else -i - 1 if first_id < 0: first_id += npages if second_id < 0: second_id += npages first = pages[first_id] second = pages[second_id] first_foreign = file.pages[first_id] second_foreign = file.pages[second_id] second_page_size = second.size_in_points() first_page_size = first.size_in_points() page_size = [max(second_page_size[0], first_page_size[0]) * 2, max(second_page_size[1], first_page_size[1])] content_dict[f'/Page{i*2}'] = pikepdf.Page(first_foreign).as_form_xobject() content_dict[f'/Page{i*2 + 1}'] = pikepdf.Page(second_foreign).as_form_xobject() # See PDF reference section 4.2.3 Transformation Matrices tx1 = -first_foreign.MediaBox[0] ty1 = -first_foreign.MediaBox[1] tx2 = first_page_size[0] - float(second_foreign.MediaBox[0]) ty2 = -second_foreign.MediaBox[1] content_txt = ( f"q 1 0 0 1 {tx1} {ty1} cm /Page{i*2} Do Q " f"q 1 0 0 1 {tx2} {ty2} cm /Page{i*2 + 1} Do Q " ) newpage = pikepdf.Dictionary( Type=pikepdf.Name.Page, MediaBox=[0, 0, *page_size], Resources=pikepdf.Dictionary(XObject=content_dict), Contents=pikepdf.Stream(file, content_txt.encode()) ) # workaround for pikepdf <= 2.6.0. See https://github.com/pikepdf/pikepdf/issues/174 if pikepdf.__version__ < '2.7.0': newpage = file.make_indirect(newpage) file.pages.append(newpage) for __ in range(to_remove): del file.pages[0] file.save(filename) return filename # Adapted from https://stackoverflow.com/questions/28325525/python-gtk-printoperation-print-a-pdf class PrintOperation(Gtk.PrintOperation): MESSAGE=_("Printing…") def __init__(self, app): super().__init__() self.app = app self.connect("begin-print", self.begin_print, None) self.connect("end-print", self.end_print, None) self.connect("draw-page", self.draw_page, None) self.connect("preview", self.preview, None) self.pdf_input = None self.message = self.MESSAGE def preview(self, operation, preview_op, print_ctx, parent, user_data): self.message = _("Rendering Preview…") def begin_print(self, operation, print_ctx, print_data): self.set_n_pages(len(self.app.model)) self.app.set_export_state(True, self.message) # Open pikepdf objects for all pages that has been modified nfiles = set() for row in self.app.model: if row[0].unmodified(): continue nfiles.add(row[0].nfile) for lp in row[0].layerpages: nfiles.add(lp.nfile) self.pdf_input = [None] * len(self.app.pdfqueue) for nfile in nfiles: pdf = self.app.pdfqueue[nfile - 1] self.pdf_input[nfile - 1] = pikepdf.open(pdf.copyname, password=pdf.password) def end_print(self, operation, print_ctx, print_data): self.app.set_export_state(False) self.message = self.MESSAGE def draw_page(self, operation, print_ctx, page_num, print_data): cairo_ctx = print_ctx.get_cairo_context() # Poppler context is always 72 dpi cairo_ctx.scale(print_ctx.get_dpi_x() / 72, print_ctx.get_dpi_y() / 72) if page_num >= len(self.app.model): return p = self.app.model[page_num][0] if p.unmodified(): pdfdoc = self.app.pdfqueue[p.nfile - 1] page = pdfdoc.document.get_page(p.npage - 1) with pdfdoc.render_lock: page.render_for_printing(cairo_ctx) else: buf = io.BytesIO() export_doc(self.pdf_input, [p], {}, [buf], None) page = Poppler.Document.new_from_data(buf.getvalue()).get_page(0) page.render_for_printing(cairo_ctx) def run(self): result = super().run(Gtk.PrintOperationAction.PRINT_DIALOG, self.app.window) if result == Gtk.PrintOperationResult.ERROR: dialog = Gtk.MessageDialog( self.app.window, 0, Gtk.MessageType.ERROR, Gtk.ButtonsType.CLOSE, self.get_error(), ) dialog.run() dialog.destroy() pdfarranger-1.10.1/pdfarranger/iconview.py000066400000000000000000000451331451252235000205620ustar00rootroot00000000000000# Copyright (C) 2008-2017 Konstantinos Poulios, 2018-2019 Jerome Robert # # pdfarranger 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, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from gi.repository import Gtk from gi.repository import Gdk from math import pi class CellRendererImage(Gtk.CellRenderer): def __init__(self): Gtk.CellRenderer.__init__(self) self.th1 = 2. # border thickness self.th2 = 3. # shadow thickness self.page = None def set_page(self, page): self.page = page def get_geometry(self): rotation = int(self.page.angle) % 360 rotation = round(rotation / 90) * 90 w0 = self.page.thumbnail.get_width() h0 = self.page.thumbnail.get_height() if rotation == 90 or rotation == 270: w1, h1 = h0, w0 else: w1, h1 = w0, h0 w2 = self.page.width_in_pixel() h2 = self.page.height_in_pixel() return w0, h0, w1, h1, w2, h2, rotation def do_render(self, window, _widget, _background_area, cell_area, _expose_area): if not self.page.thumbnail: return w0, h0, w1, h1, w2, h2, rotation = self.get_geometry() th = int(2 * self.th1 + self.th2) w = w2 + th h = h2 + th x = cell_area.x y = cell_area.y if cell_area and w > 0 and h > 0: x += self.get_property('xalign') * (cell_area.width - w) y += self.get_property('yalign') * (cell_area.height - h) window.translate(int(0.5 + x), int(0.5 + y)) # shadow window.set_source_rgb(0.5, 0.5, 0.5) window.rectangle(th, th, w2, h2) window.fill() # border window.set_source_rgb(0, 0, 0) window.rectangle(0, 0, w2 + 2 * self.th1, h2 + 2 * self.th1) window.fill() # image window.set_source_rgb(1, 1, 1) window.rectangle(self.th1, self.th1, w2, h2) window.fill_preserve() window.clip() window.translate(self.th1, self.th1) scale = self.page.resample * self.page.zoom window.scale(scale, scale) if rotation > 0: window.translate(w1 / 2, h1 / 2) window.rotate(rotation * pi / 180) window.translate(-w0 / 2, -h0 / 2) window.set_source_surface(self.page.thumbnail) window.paint() def do_get_size(self, _widget, cell_area=None): x = y = 0 th = int(2 * self.th1 + self.th2) w = self.page.width_in_pixel() + th h = self.page.height_in_pixel() + th if cell_area and w > 0 and h > 0: x = self.get_property('xalign') * ( cell_area.width - w - self.get_property('xpad')) y = self.get_property('yalign') * ( cell_area.height - h - self.get_property('ypad')) w += 2 * self.get_property('xpad') h += 2 * self.get_property('ypad') return int(x), int(y), w, h class IconviewCursor(object): """Move cursor, select pages and scroll with navigation keys.""" def __init__(self, app): self.app = app self.model = self.app.iconview.get_model() self.move_cursor = True self.event = None self.iconview = None self.sel_start_page = None self.cursor_page_nr = 0 self.cursor_page_nr_new = 0 self.cursor_is_visible = False def handler(self, iconview, event): """Do all steps involved in cursor moving.""" self.iconview = iconview self.event = event self.set_initial() self.set_selection_start_page() if self.move_cursor: self.move() self.select() self.scroll_iconview() def set_initial(self): """Cursor initial set.""" self.move_cursor = True selection = self.iconview.get_selected_items() if len(selection) == 0: self.cursor_is_visible = False if selection and not self.iconview.get_cursor()[1] in selection: selection.sort(key=lambda x: x.get_indices()[0]) self.iconview.set_cursor(selection[-1], None, False) if self.event.state & Gdk.ModifierType.SHIFT_MASK: self.sel_start_page = Gtk.TreePath.get_indices(selection[-1])[0] self.iconview.unselect_all() elif not self.iconview.get_cursor()[0]: if self.event.keyval == Gdk.KEY_End: self.cursor_page_nr_new = len(self.model) - 1 else: self.cursor_page_nr_new = 0 cursor_path_new = Gtk.TreePath.new_from_indices([self.cursor_page_nr_new]) self.iconview.set_cursor(cursor_path_new, None, False) self.move_cursor = False self.iconview.unselect_all() def set_selection_start_page(self): """Set selection start page when shift + navigation keys are used.""" if self.sel_start_page is None and self.event.state & Gdk.ModifierType.SHIFT_MASK: self.sel_start_page = Gtk.TreePath.get_indices(self.iconview.get_cursor()[1])[0] self.iconview.unselect_all() elif not self.event.state & Gdk.ModifierType.SHIFT_MASK: self.sel_start_page = None def move(self): """Move iconview cursor with navigation keys.""" cursor_path = self.iconview.get_cursor()[1] self.cursor_page_nr = Gtk.TreePath.get_indices(cursor_path)[0] cursor_y = self.iconview.get_cell_rect(cursor_path)[1].y page_size = self.app.sw.get_vadjustment().get_page_size() spacing = self.iconview.get_row_spacing() columns_nr = self.iconview.get_columns() if self.event.keyval == Gdk.KEY_Up: step = 0 if self.cursor_page_nr - columns_nr < 0 else columns_nr self.cursor_page_nr_new = self.cursor_page_nr - step elif self.event.keyval == Gdk.KEY_Down: step = 0 if self.cursor_page_nr + columns_nr > len(self.model) - 1 else columns_nr self.cursor_page_nr_new = self.cursor_page_nr + step elif self.event.keyval == Gdk.KEY_Left: self.cursor_page_nr_new = max(self.cursor_page_nr - 1, 0) elif self.event.keyval == Gdk.KEY_Right: self.cursor_page_nr_new = min(self.cursor_page_nr + 1, len(self.model) - 1) elif self.event.keyval == Gdk.KEY_Home: self.cursor_page_nr_new = 0 elif self.event.keyval == Gdk.KEY_End: self.cursor_page_nr_new = len(self.model) - 1 elif self.event.keyval in [Gdk.KEY_Page_Up, Gdk.KEY_KP_Page_Up]: for self.cursor_page_nr_new in range(self.cursor_page_nr, -1, -columns_nr): new_path = Gtk.TreePath.new_from_indices([self.cursor_page_nr_new]) new_y = self.iconview.get_cell_rect(new_path)[1].y if new_y < cursor_y - page_size - spacing: self.cursor_page_nr_new += columns_nr break elif self.event.keyval in [Gdk.KEY_Page_Down, Gdk.KEY_KP_Page_Down]: for self.cursor_page_nr_new in range(self.cursor_page_nr, len(self.model), columns_nr): new_path = Gtk.TreePath.new_from_indices([self.cursor_page_nr_new]) new_y = self.iconview.get_cell_rect(new_path)[1].y if new_y > cursor_y + page_size + spacing: self.cursor_page_nr_new -= columns_nr break self.iconview.unselect_path(cursor_path) if len(self.model) > 1 and not self.cursor_is_visible: step = 1 if self.iconview.get_item_column(cursor_path) == 0 else -1 self.iconview.emit('move-cursor', Gtk.MovementStep.VISUAL_POSITIONS, step) self.cursor_is_visible = True self.iconview.unselect_all() cursor_path_new = Gtk.TreePath.new_from_indices([self.cursor_page_nr_new]) sw_hpos = self.app.sw.get_hadjustment().get_value() self.iconview.set_cursor(cursor_path_new, None, False) self.app.sw.get_hadjustment().set_value(sw_hpos) def select(self): """Select iconview pages with shift + navigation keys.""" if self.event.state & Gdk.ModifierType.SHIFT_MASK: if self.cursor_page_nr_new > self.sel_start_page > self.cursor_page_nr: for page_nr in range(self.cursor_page_nr, self.sel_start_page): path = Gtk.TreePath.new_from_indices([page_nr]) self.iconview.unselect_path(path) elif self.cursor_page_nr_new < self.sel_start_page < self.cursor_page_nr: for page_nr in range(self.sel_start_page, self.cursor_page_nr): path = Gtk.TreePath.new_from_indices([page_nr]) self.iconview.unselect_path(path) elif self.cursor_page_nr_new == self.sel_start_page: self.iconview.unselect_all() step = -1 if self.cursor_page_nr_new < self.sel_start_page else 1 for page_nr in range(self.cursor_page_nr_new, self.cursor_page_nr + step, step): path = Gtk.TreePath.new_from_indices([page_nr]) self.iconview.unselect_path(path) for page_nr in range(self.sel_start_page, self.cursor_page_nr_new + step, step): path = Gtk.TreePath.new_from_indices([page_nr]) self.iconview.select_path(path) else: self.iconview.unselect_all() cursor_path_new = Gtk.TreePath.new_from_indices([self.cursor_page_nr_new]) self.iconview.select_path(cursor_path_new) def scroll_iconview(self): """Scroll in order to keep cursor visible in window.""" sw_vadj = self.app.sw.get_vadjustment() sw_vpos = sw_vadj.get_value() cursor_path_new = Gtk.TreePath.new_from_indices([self.cursor_page_nr_new]) cell_rect = self.iconview.get_cell_rect(cursor_path_new)[1] cell_height = cell_rect.height cell_y = self.iconview.convert_widget_to_bin_window_coords(cell_rect.x, cell_rect.y)[1] sw_height = self.app.sw.get_allocated_height() columns_nr = self.iconview.get_columns() up = self.cursor_page_nr_new < self.cursor_page_nr at_min = self.cursor_page_nr_new - columns_nr < 0 down = self.cursor_page_nr_new > self.cursor_page_nr at_max = self.cursor_page_nr_new + columns_nr > len(self.model) - 1 if up or at_min: sw_vpos = min(max(sw_vpos, cell_y + cell_height - sw_height), cell_y) elif down or at_max: sw_vpos = max(min(sw_vpos, cell_y), cell_y + cell_height - sw_height) sw_vadj.set_value(sw_vpos) class IconviewDragSelect: """ Drag-select when clicking between items and dragging mouse pointer. Click + drag-select selects the range from click location to drag location. Shift + click + drag-select adds more items to selection. Control + click + drag-select toggles selection. """ def __init__(self, app): self.app = app self.iconview = app.iconview self.model = app.iconview.get_model() self.range_start = 0 self.range_end = 0 self.click_location = None self.cursor_name_old = 'default' def click(self, event): """Store the click location.""" if len(self.model) == 0: self.click_location = None return self.click_location = self.get_location(event.x, event.y) if self.click_location: self.set_mouse_cursor('text') self.range_start = int(self.click_location + 0.5) self.range_end = self.range_start self.control_is_pressed = event.state & Gdk.ModifierType.CONTROL_MASK self.shift_is_pressed = event.state & Gdk.ModifierType.SHIFT_MASK if self.control_is_pressed or self.shift_is_pressed: self.selection_list = [] for row in self.model: self.selection_list.append(self.iconview.path_is_selected(row.path)) def motion(self, event=None, step=0): """Get drag location and select or deselect items.""" if not self.click_location: return False sw_vadj = self.app.sw.get_vadjustment() sw_vpos = sw_vadj.get_value() if event: self.event_x = event.x event_y = self.event_y = event.y + step self.sw_vpos = sw_vpos if not event.state & Gdk.ModifierType.CONTROL_MASK: self.control_is_pressed = False if not event.state & Gdk.ModifierType.SHIFT_MASK: self.shift_is_pressed = False else: event_y = self.event_y - self.sw_vpos + sw_vpos + step drag_location = self.get_location(self.event_x, event_y) if drag_location is None: return False selection_changed = self.select(drag_location) return selection_changed def select(self, drag_location): """Select or deselect items between click location and current mouse pointer location.""" range_start_old = self.range_start range_end_old = self.range_end if drag_location > self.click_location: self.range_start = int(self.click_location + 0.5) self.range_end = int(drag_location + 1) else: self.range_start = int(drag_location + 0.5) self.range_end = int(self.click_location + 1) if self.range_start == range_start_old and self.range_end == range_end_old: return False changed_range_start = min(self.range_start, range_start_old) changed_range_end = max(self.range_end, range_end_old) for page_nr in range(changed_range_start, changed_range_end): path = Gtk.TreePath.new_from_indices([page_nr]) if self.control_is_pressed: if page_nr in range(self.range_start, self.range_end): if self.selection_list[page_nr]: self.iconview.unselect_path(path) else: self.iconview.select_path(path) else: if self.selection_list[page_nr]: self.iconview.select_path(path) else: self.iconview.unselect_path(path) elif self.shift_is_pressed: if page_nr in range(self.range_start, self.range_end): self.iconview.select_path(path) elif not self.selection_list[page_nr]: self.iconview.unselect_path(path) else: if page_nr in range(self.range_start, self.range_end): self.iconview.select_path(path) else: self.iconview.unselect_path(path) return True def get_location(self, x, y): """ Get mouse pointer location. E.g. Location is 2.0 when pointer is on item 2. Location is 2.5 when pointer is between item 2 and 3. """ last = self.iconview.get_cell_rect(self.model[-1].path)[1] if last.width < 50: # Avoid seg fault if calling get_path_at_pos before iconview is ready return None last_x, last_y = self.iconview.convert_widget_to_bin_window_coords(last.x, last.y) x_step = last.width - 2 * self.iconview.get_item_padding() - 1 y_step = self.iconview.get_row_spacing() + 2 * self.iconview.get_item_padding() + 1 search_pos = [('XY', x, y), ('Right', x + x_step, y), ('Left', x - x_step, y), ('Below', x, y + y_step), ('Below', x + x_step, y + y_step), ('Below', x - x_step, y + y_step), ('Above', x, y - y_step), ('Above', x + x_step, y - y_step), ('Above', x - x_step, y - y_step), ('Zero', 0, 0)] ind = 0 for pos, x_s, y_s in search_pos: path = self.iconview.get_path_at_pos(x_s, y_s) if path: ind = Gtk.TreePath.get_indices(path)[0] break if pos == 'XY': location = ind elif pos == 'Right': location = ind - 0.5 elif pos == 'Left': location = ind + 0.5 elif pos == 'Below': location = ind - self.iconview.get_item_column(path) - 0.5 elif pos == 'Above': location = ind + self.iconview.get_columns() - self.iconview.get_item_column(path) - 0.5 elif (y > last_y + last.height) or (y > last_y and x > last_x + last.width): location = len(self.model) - 0.5 elif y < 0: location = -0.5 else: return None return min(location, len(self.model) - 0.5) def set_mouse_cursor(self, cursor_name): """Set the cursor type specified by cursor_name.""" if cursor_name == self.cursor_name_old: return cursor = Gdk.Cursor.new_from_name(Gdk.Display.get_default(), cursor_name) self.iconview.get_window().set_cursor(cursor) self.cursor_name_old = cursor_name def end(self): self.set_mouse_cursor('default') self.click_location = None class IconviewPanView: """Pan the view when pressing mouse wheel and moving mouse.""" def __init__(self, app): self.iconview = app.iconview self.sw_hadj = app.sw.get_hadjustment() self.sw_vadj = app.sw.get_vadjustment() self.cursor_name = 'default' def click(self, event): self.cursor_name = 'move' cursor = Gdk.Cursor.new_from_name(Gdk.Display.get_default(), self.cursor_name) self.iconview.get_window().set_cursor(cursor) self.click_x = event.x self.click_y = event.y def motion(self, event): if self.cursor_name == 'default': return self.sw_hadj.set_value(self.sw_hadj.get_value() + self.click_x - event.x) self.sw_vadj.set_value(self.sw_vadj.get_value() + self.click_y - event.y) def end(self): if self.cursor_name == 'default': return self.cursor_name = 'default' cursor = Gdk.Cursor.new_from_name(Gdk.Display.get_default(), self.cursor_name) self.iconview.get_window().set_cursor(cursor) pdfarranger-1.10.1/pdfarranger/metadata.py000066400000000000000000000212361451252235000205150ustar00rootroot00000000000000# Copyright (C) 2020 Jerome Robert # # pdfarranger 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, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. """ PDF meta data edition """ import pikepdf import gettext import re import json import traceback from datetime import datetime from dateutil import parser import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk from gi.repository import Pango _ = gettext.gettext # The producer property can be overridden by pikepdf PRODUCER = '{http://ns.adobe.com/pdf/1.3/}Producer' # Currently the only property which support lists as values. If you add more # please implement a generic mechanism. _CREATOR = '{http://purl.org/dc/elements/1.1/}creator' _CREATED = '{http://ns.adobe.com/xap/1.0/}CreateDate' _MODIFIED = '{http://ns.adobe.com/xap/1.0/}ModifyDate' # List of supported meta data with their user representation # see https://wwwimages2.adobe.com/content/dam/acom/en/devnet/xmp/pdfs/XMP%20SDK%20Release%20cc-2016-08/XMPSpecificationPart1.pdf # if you want to add more _LABELS = { '{http://purl.org/dc/elements/1.1/}title': _('Title'), '{http://purl.org/dc/elements/1.1/}description': _('Subject'), '{http://ns.adobe.com/pdf/1.3/}Keywords': _('Keywords'), PRODUCER: _('Producer'), _CREATOR: _('Creator'), '{http://ns.adobe.com/xap/1.0/}CreatorTool': _('Creator tool'), _CREATED: _('Created'), _MODIFIED: _('Modified'), } def _pikepdf_meta_is_valid(meta): """ Return true if m is a valid PikePDF meta data value. PikePDF pass meta data to re.sub which only accept str or byte-like object. """ if not isinstance(meta, list): meta = [meta] for s in meta: try: re.sub('', '', s) except TypeError: return False return True def load_from_docinfo(meta, doc): """ wrapper of pikepdf.models.PdfMetadata.load_from_docinfo with a workaround for https://github.com/pikepdf/pikepdf/issues/100 & 162 """ try: meta.load_from_docinfo(doc.docinfo) except (NotImplementedError, TypeError): # DocumentInfo cannot be loaded and will be lost. Not a that big issue. traceback.print_exc() def _safeiter(elements): it = iter(elements) while True: try: yield next(it) except StopIteration: break except ValueError: traceback.print_exc() def merge_doc(metadata, input_docs): """Same as merge but with pikepdf.PDF object instead of files""" r = metadata.copy() for doc in input_docs: with doc.open_metadata() as meta: load_from_docinfo(meta, doc) for k, v in _safeiter(meta.items()): if not _pikepdf_meta_is_valid(v): # workaround for https://github.com/pikepdf/pikepdf/issues/84 del meta[k] elif k not in metadata: r[k] = v return r def merge(metadata, input_files): """Merge current global metadata and each imported files meta data""" docs = [pikepdf.open(copyname, password=password) for copyname, password in input_files] return merge_doc(metadata, docs) def _metatostr(value, name): """ Convert a meta data value from list to string if it's not a string """ if isinstance(value, str): return value elif isinstance(value, list) and name == _CREATOR: if len(value) == 1: return _metatostr(value[0], name) else: return json.dumps(value) return '' def _strtometa(value, name): try: r = json.loads(value) if name == _CREATOR else value if isinstance(r, list): return None if len(r) == 0 else r else: # r is a dict which is not supported so we revert back # to a plain string return value except json.decoder.JSONDecodeError: return value class _EditedEventHandler(object): """ Callbacks to save the data entered into the "Edit properties" fields. For basic saving just the edited method would be needed. The rest is a workaround for Gtk interpreting a lost focus (including clicking "Apply") as a cancelled edit and therefore discarding the edit currently in progress. To avoid that, we need to save the text on each changed event to self.new_text and then save it to the liststore on canceled. We can not save it directly to the liststore since that stops editing after each keypress. """ def __init__(self, liststore): self.liststore = liststore self.path = None self.new_text = None def started(self, _renderer, editable, path): self.path = path editable.connect("changed", self.editable_changed) def editable_changed(self, editable): self.new_text = editable.get_text() @staticmethod def _parse_date(string, parent): try: date = parser.parse(string) return datetime.isoformat(date) # ISO-8601 formatted date except ValueError: if string: msg = _('Invalid date format. Input discarded.') d = Gtk.MessageDialog(parent=parent, flags=Gtk.DialogFlags.MODAL, type=Gtk.MessageType.ERROR, buttons=Gtk.ButtonsType.OK, message_format=msg) d.run() d.destroy() return '' def edited(self, _renderer, path, new_text, parent): date_labels = [_LABELS[l] for l in [_CREATED, _MODIFIED]] if self.liststore[path][0] in date_labels: new_text = self._parse_date(new_text, parent) self.liststore[path][1] = new_text def canceled(self, _renderer): if self.new_text is not None: self.liststore[self.path][1] = self.new_text def edit(metadata, pdffiles, parent): """ Edit the current meta data :param metadata: The dictionary of meta data to modify :param pdffiles: A list of PDF from witch to take the initial meta data :param parent: The parent window """ dialog = Gtk.Dialog(title=_('Edit properties'), parent=parent, flags=Gtk.DialogFlags.MODAL, buttons=("_Cancel", Gtk.ResponseType.CANCEL, "_OK", Gtk.ResponseType.OK)) ok_button = dialog.get_widget_for_response(response_id = Gtk.ResponseType.OK) ok_button.grab_focus() # Property, Value, XMP name (hidden) liststore = Gtk.ListStore(str, str, str) mergedmetadata = merge(metadata, pdffiles) for xlabel, label in _LABELS.items(): metastr = _metatostr(mergedmetadata.get(xlabel, ''), xlabel) liststore.append([label, metastr, xlabel]) treeview = Gtk.TreeView.new_with_model(liststore) for i, v in enumerate([(_("Property"), False), (_("Value")+" "*30, True)]): title, editable = v renderer = Gtk.CellRendererText() if editable: renderer.props.ellipsize = Pango.EllipsizeMode.END renderer.props.width_chars = 50 renderer.set_property("editable", True) handler = _EditedEventHandler(liststore) renderer.connect("editing-started", handler.started) renderer.connect("edited", handler.edited, parent) renderer.connect("editing-canceled", handler.canceled) column = Gtk.TreeViewColumn(title, renderer, text=i) treeview.append_column(column) treeview.props.margin = 12 treeview.set_enable_search(False) treeview.set_cursor(Gtk.TreePath(0), treeview.get_column(1), True) dialog.vbox.pack_start(treeview, True, True, 0) dialog.show_all() result = dialog.run() r = result == Gtk.ResponseType.OK dialog.destroy() if r: for row in liststore: # Capture invalid input when the emission of the edited signal is # bypassed by pressing OK while editing. if row[2] in [_CREATED, _MODIFIED]: row[1] = handler._parse_date(row[1], parent) metadata[row[2]] = _strtometa(row[1], row[2]) return r pdfarranger-1.10.1/pdfarranger/pageutils.py000066400000000000000000000557371451252235000207470ustar00rootroot00000000000000# Copyright (C) 2020 pdfarranger contributors # # pdfarranger 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, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from gi.repository import Gtk, Gdk import gettext import cairo import locale _ = gettext.gettext def scale(model, selection, factor): """Set the scale factor of a selection of pages.""" changed = False try: width, height = factor except TypeError: width, height = None, None for path in selection: it = model.get_iter(path) page = model.get_value(it, 0) if width is None: f = factor else: # TODO: allow to change aspect ratio f = max(width / page.size[0], height / page.size[1]) # Page size must be in [72, 14400] (PDF standard requirement) f = max(f, 72 / page.size[0], 72 / page.size[1]) f = min(f, 14400 / page.size[0], 14400 / page.size[1]) if page.scale != f: changed = True page.resample = page.resample * f / page.scale for lp in page.layerpages: lp.scale = lp.scale * f / page.scale page.scale = f model.set_value(it, 0, page) return changed class _LinkedSpinButton(Gtk.SpinButton): """ A spin button which can be bound to an other button """ def __init__(self, minval, maxval, step, page=None): Gtk.SpinButton.__init__(self) self.set_digits(20) self.set_width_chars(9) self.connect("output", self.__output) self.set_range(minval, maxval) self.set_increments(step, step if page is None else page) self.changing_from_brother = False def __output(self, _user_data): """ output signal handler to remove unneeded 0 """ s = locale.format_string("%.8g", self.get_adjustment().get_value()) self.get_buffer().set_text(s, len(s)) return True class _RadioStackSwitcher(Gtk.Box): """ Same as GtkStackSwitcher but with radio button (i.e different semantic) """ def __init__(self, margin=10): super().__init__() self.props.orientation = Gtk.Orientation.VERTICAL self.set_spacing(margin) self.props.margin = margin self.radiogroup = [] self.stack = Gtk.Stack() self.button_box = Gtk.Box() self.button_box.set_spacing(margin) self.add(self.button_box) self.add(self.stack) self.selected_child = None self.selected_name = None def add_named(self, child, name, title): radio = Gtk.RadioButton.new_with_label(None, title) if len(self.radiogroup) > 0: radio.join_group(self.radiogroup[-1]) self.radiogroup.append(radio) radio.set_hexpand(True) radio.set_halign(Gtk.Align.CENTER) radio.connect("toggled", self.__radio_handler, name) self.button_box.add(radio) self.stack.add_named(child, name) if self.selected_child is None: self.selected_child = child self.selected_name = name def __radio_handler(self, button, name): if button.props.active: self.stack.set_visible_child_name(name) self.selected_name = name self.selected_child = self.stack.get_child_by_name(name) class _RelativeScalingWidget(Gtk.Box): """ A form to specify the relative scaling factor """ def __init__(self, current_scale, margin=10): super().__init__() self.props.spacing = margin self.add(Gtk.Label(label=_("Scale factor"))) # Largest page size is 200 inch and smallest is 1 inch # so we can set a min and max self.entry = _LinkedSpinButton(100 / 200.0, 100 * 200.0, 1, 10) self.entry.set_activates_default(True) self.add(self.entry) self.add(Gtk.Label(label=_("%"))) self.entry.set_value(current_scale * 100) def get_value(self): return self.entry.get_value() / 100 class _ScalingWidget(Gtk.Box): """ A form to specify the page width or height """ def __init__(self, label, default, margin=10): super().__init__() self.props.spacing = margin self.add(Gtk.Label(label=label)) self.entry = _LinkedSpinButton(25.4, 5080, 1, 10) self.entry.set_activates_default(True) self.add(self.entry) self.add(Gtk.Label(label=_("mm"))) # A PDF unit is 1/72 inch self.entry.set_value(default * 25.4 / 72) def get_value(self): return self.entry.get_value() / 25.4 * 72 class _CropWidget(Gtk.Frame): sides = ('L', 'R', 'T', 'B') side_names = {'L': _('Left'), 'R': _('Right'), 'T': _('Top'), 'B': _('Bottom')} opposite_sides = {'L': 'R', 'R': 'L', 'T': 'B', 'B': 'T'} def __init__(self, model, selection, margin=12): super().__init__(label=_('Crop Margins')) grid = Gtk.Grid() grid.set_column_spacing(margin) grid.set_row_spacing(margin) grid.props.margin = margin self.add(grid) label = Gtk.Label( label=_( 'Cropping does not remove any content ' 'from the PDF file, it only hides it.' ) ) label.props.margin = margin label.set_line_wrap(True) label.set_max_width_chars(38) grid.attach(label, 0, 0, 3, 1) self.spin_list = [] units = 2 * [_('% of width')] + 2 * [_('% of height')] crop = [0.0, 0.0, 0.0, 0.0] if selection: pos = model.get_iter(selection[0]) crop = list(model.get_value(pos, 0).crop) for row, side in enumerate(_CropWidget.sides): label = Gtk.Label(label=_CropWidget.side_names[side]) label.set_alignment(0.0, 0.5) grid.attach(label, 0, row + 1, 1, 1) adj = Gtk.Adjustment( value=100.0 * crop.pop(0), lower=0.0, upper=90.0, step_increment=1.0, page_increment=5.0, page_size=0.0, ) spin = Gtk.SpinButton(adjustment=adj, climb_rate=0, digits=1) spin.set_activates_default(True) spin.connect('value-changed', self.__set_crop_value, self, side) self.spin_list.append(spin) grid.attach(spin, 1, row + 1, 1, 1) label = Gtk.Label(label=units.pop(0)) label.set_alignment(0.0, 0.5) grid.attach(label, 2, row + 1, 1, 1) @staticmethod def __set_crop_value(spinbutton, self, side): opp_side = self.opposite_sides[side] adj = self.spin_list[self.sides.index(opp_side)].get_adjustment() limit = 90.0 - spinbutton.get_value() adj.set_upper(limit) opp_spinner = self.spin_list[self.sides.index(opp_side)] opp_spinner.set_value(min(opp_spinner.get_value(), limit)) def get_crop(self): return [spin.get_value() / 100.0 for spin in self.spin_list] class BaseDialog(Gtk.Dialog): def __init__(self, title, parent): super().__init__( title=title, parent=parent, flags=Gtk.DialogFlags.MODAL, buttons=( _("_Cancel"), Gtk.ResponseType.CANCEL, _("_OK"), Gtk.ResponseType.OK, ), ) self.set_default_response(Gtk.ResponseType.OK) class Dialog(BaseDialog): """ A dialog box to define margins for page cropping and page size or scale factor """ def __init__(self, model, selection, window): super().__init__(title=_("Page format"), parent=window) self.set_resizable(False) page = model.get_value(model.get_iter(selection[-1]), 0) size = [page.scale * x for x in page.size] rel_widget = _RelativeScalingWidget(page.scale) width_widget = _ScalingWidget(_("Width"), size[0]) height_widget = _ScalingWidget(_("Height"), size[1]) self.scale_stack = _RadioStackSwitcher() self.scale_stack.add_named(rel_widget, "Relative", _("Relative")) self.scale_stack.add_named(width_widget, "Width", _("Width")) self.scale_stack.add_named(height_widget, "Height", _("Height")) pagesizeframe = Gtk.Frame(label=_("Page Size")) pagesizeframe.props.margin = 8 pagesizeframe.props.margin_bottom = 0 pagesizeframe.add(self.scale_stack) self.vbox.pack_start(pagesizeframe, True, True, 0) self.crop_widget = _CropWidget(model, selection) self.crop_widget.props.margin = 8 self.vbox.pack_start(self.crop_widget, False, False, 0) self.show_all() self.selection = selection def run_get(self): """ Open the dialog and return the crop value """ result = self.run() crop = None val = None if result == Gtk.ResponseType.OK: crop = [self.crop_widget.get_crop()] * len(self.selection) val = self.scale_stack.selected_child.get_value() if self.scale_stack.selected_name == "Width": val = val, 0 elif self.scale_stack.selected_name == "Height": val = 0, val # else val is a relative scale so we return it as is self.destroy() return crop, val def white_borders(model, selection, pdfqueue): crop = [] for path in selection: it = model.get_iter(path) p = model.get_value(it, 0) pdfdoc = pdfqueue[p.nfile - 1] page = pdfdoc.document.get_page(p.npage - 1) # Always render pages at 72 dpi whatever the zoom or scale of the page w, h = page.get_size() orig_crop = p.rotate_crop(p.crop, p.rotate_times(360 - p.angle)) first_col = int(w * orig_crop[0]) last_col = min(int(w), int(w * (1 - orig_crop[1]) + 1)) first_row = int(h * orig_crop[2]) last_row = min(int(h), int(h * (1 - orig_crop[3]) + 1)) w = int(w) h = int(h) thumbnail = cairo.ImageSurface(cairo.FORMAT_ARGB32, w, h) cr = cairo.Context(thumbnail) with pdfdoc.render_lock: page.render(cr) data = thumbnail.get_data().cast("i") whitecol = memoryview(b"\0" * h * 4).cast("i") whiterow = memoryview(b"\0" * w * 4).cast("i") crop_this_page = [0.0, 0.0, 0.0, 0.0] # Left for col in range(first_col, last_col): if data[col::w] != whitecol: crop_this_page[0] = col / w break # Right for col in range(last_col - 1, first_col - 1, -1): if data[col::w] != whitecol: crop_this_page[1] = (w - col) / w break # Top for row in range(first_row, last_row): if data[row * w : (row + 1) * w] != whiterow: crop_this_page[2] = (row) / h break # Bottom for row in range(last_row - 1, first_row - 1, -1): if data[row * w : (row + 1) * w] != whiterow: crop_this_page[3] = (h - row) / h break crop.append(p.rotate_crop(crop_this_page, p.rotate_times(p.angle))) return crop class BlankPageDialog(BaseDialog): def __init__(self, size, window): super().__init__(title=_("Insert Blank Page"), parent=window) self.set_resizable(False) self.width_widget = _ScalingWidget(_("Width"), size[0]) self.height_widget = _ScalingWidget(_("Height"), size[1]) self.vbox.pack_start(self.width_widget, True, True, 6) self.vbox.pack_start(self.height_widget, True, True, 6) self.width_widget.props.spacing = 6 self.height_widget.props.spacing = 6 self.show_all() def run_get(self): result = self.run() r = None if result == Gtk.ResponseType.OK: r = self.width_widget.get_value(), self.height_widget.get_value() self.destroy() return r class MergePagesDialog(BaseDialog): def __init__(self, window, size, equal): super().__init__(title=_("Merge Pages"), parent=window) self.size = size self.set_resizable(False) max_margin = int(((14400 - max(*size)) / 2) * 25.4 / 72) self.marg = Gtk.SpinButton.new_with_range(0, max_margin, 1) self.marg.set_activates_default(True) self.marg.connect('value-changed', self.on_sb_value_changed) self.cols = Gtk.SpinButton.new_with_range(1, 2, 1) self.cols.set_activates_default(True) self.cols.connect('value-changed', self.on_sb_value_changed) self.rows = Gtk.SpinButton.new_with_range(1, 1, 1) self.rows.set_activates_default(True) self.rows.connect('value-changed', self.on_sb_value_changed) marg_lbl1 = Gtk.Label(_("Margin"), halign=Gtk.Align.START) marg_lbl2 = Gtk.Label(_("mm"), halign=Gtk.Align.START) cols_lbl1 = Gtk.Label(_("Columns"), halign=Gtk.Align.START) rows_lbl1 = Gtk.Label(_("Rows"), halign=Gtk.Align.START) grid1 = Gtk.Grid(column_spacing=12, row_spacing=12, margin=12, halign=Gtk.Align.CENTER) grid1.attach(marg_lbl1, 0, 1, 1, 1) grid1.attach(self.marg, 1, 1, 1, 1) grid1.attach(marg_lbl2, 2, 1, 1, 1) grid1.attach(cols_lbl1, 0, 2, 1, 1) grid1.attach(self.cols, 1, 2, 1, 1) grid1.attach(rows_lbl1, 0, 3, 1, 1) grid1.attach(self.rows, 1, 3, 1, 1) self.vbox.pack_start(grid1, False, False, 8) self.hor = Gtk.RadioButton(label=_("Horizontal"), group=None) vrt = Gtk.RadioButton(label=_("Vertical"), group=self.hor) self.l_r = Gtk.RadioButton(label=_("Left to Right"), group=None) r_l = Gtk.RadioButton(label=_("Right to Left"), group=self.l_r) self.t_b = Gtk.RadioButton(label=_("Top to Bottom"), group=None) b_t = Gtk.RadioButton(label=_("Bottom to Top"), group=self.t_b) grid2 = Gtk.Grid(column_spacing=6, row_spacing=12, margin=12, halign=Gtk.Align.CENTER) grid2.attach(self.hor, 0, 1, 1, 1) grid2.attach(vrt, 1, 1, 1, 1) grid2.attach(self.l_r, 0, 2, 1, 1) grid2.attach(r_l, 1, 2, 1, 1) grid2.attach(self.t_b, 0, 3, 1, 1) grid2.attach(b_t, 1, 3, 1, 1) frame1 = Gtk.Frame(label=_("Page Order"), margin=8) frame1.add(grid2) self.vbox.pack_start(frame1, False, False, 0) t = "" if equal else _("Non-uniform page size - using max size") warn_lbl = Gtk.Label(t, margin=8, wrap=True, width_chars=36, max_width_chars=36) self.vbox.pack_start(warn_lbl, False, False, 0) self.size_lbl = Gtk.Label(halign=Gtk.Align.CENTER, margin_bottom=16) self.vbox.pack_start(self.size_lbl, False, False, 0) self.show_all() def size_with_margin(self): width = self.size[0] + 2 * self.marg.get_value() * 72 / 25.4 height = self.size[1] + 2 * self.marg.get_value() * 72 / 25.4 return width, height def on_sb_value_changed(self, _button): width, height = self.size_with_margin() self.cols.set_range(1, 14400 // width) self.rows.set_range(1, 14400 // height) cols = int(self.cols.get_value()) rows = int(self.rows.get_value()) width = str(round(cols * width * 25.4 / 72, 1)) height = str(round(rows * height * 25.4 / 72, 1)) t = _("Merged page size:") + " " + width + _("mm") + " \u00D7 " + height + _("mm") self.size_lbl.set_label(t) def run_get(self): self.cols.set_value(2) result = self.run() if result != Gtk.ResponseType.OK: self.destroy() return None cols = int(self.cols.get_value()) rows = int(self.rows.get_value()) range_cols = range(cols) if self.l_r.get_active() else range(cols)[::-1] range_rows = range(rows) if self.t_b.get_active() else range(rows)[::-1] if self.hor.get_active(): order = [(row, col) for row in range_rows for col in range_cols] else: order = [(row, col) for col in range_cols for row in range_rows] self.destroy() return cols, rows, order, self.size_with_margin() class PastePageLayerDialog(): def __init__(self, app, dpage, lpage, laypos): title = _("Overlay") if laypos == "OVERLAY" else _("Underlay") self.d = BaseDialog(title, app.window) self.app = app self.dpage = dpage self.lpage = lpage self.surface = None self.scale = 1 self.spin_scale_x = (self.dpage.width_in_points() - self.lpage.width_in_points()) / 100 self.spin_scale_y = (self.dpage.height_in_points() - self.lpage.height_in_points()) / 100 self.click_pos = 0, 0 self.spin_val = 0, 0 self.area = Gtk.DrawingArea() self.area.set_size_request(400, 400) self.area.set_events(self.area.get_events() | Gdk.EventMask.BUTTON_PRESS_MASK | Gdk.EventMask.POINTER_MOTION_MASK) self.area.connect('draw', self.on_draw) self.area.connect('configure-event', self.on_configure) self.area.connect('button-press-event', self.button_press_event) self.area.connect('motion-notify-event', self.motion_notify_event) frame = Gtk.Frame(shadow_type=Gtk.ShadowType.IN) frame.add(self.area) self.d.vbox.pack_start(frame, True, True, 0) t1 = _("Layout for the first page in selection") t2 = _("(same offset is applied to all pages)") label = Gtk.Label(t1 + '\n' + t2, valign=Gtk.Align.START, justify=Gtk.Justification.CENTER) self.d.vbox.pack_start(label, True, True, 0) self.spin_x = Gtk.SpinButton.new_with_range(0, 100, 1) self.spin_x.set_activates_default(True) self.spin_x.set_digits(1) self.spin_y = Gtk.SpinButton.new_with_range(0, 100, 1) self.spin_y.set_activates_default(True) self.spin_y.set_digits(1) self.spin_x.set_value(self.app.layer_pos[0]) self.spin_y.set_value(self.app.layer_pos[1]) self.spin_x.connect('value-changed', self.on_spinbutton_changed) self.spin_y.connect('value-changed', self.on_spinbutton_changed) xlabel1 = Gtk.Label(_("Horizontal offset"), halign=Gtk.Align.START) xlabel2 = Gtk.Label(_("%"), halign=Gtk.Align.START) ylabel1 = Gtk.Label(_("Vertical offset"), halign=Gtk.Align.START) ylabel2 = Gtk.Label(_("%"), halign=Gtk.Align.START) grid = Gtk.Grid(column_spacing=12, row_spacing=12, margin=12, halign=Gtk.Align.CENTER) grid.attach(xlabel1, 0, 1, 1, 1) grid.attach(self.spin_x, 1, 1, 1, 1) grid.attach(xlabel2, 2, 1, 1, 1) grid.attach(ylabel1, 0, 2, 1, 1) grid.attach(self.spin_y, 1, 2, 1, 1) grid.attach(ylabel2, 2, 2, 1, 1) self.d.vbox.pack_start(grid, False, False, 8) self.d.show_all() def on_configure(self, area, _event): self.init_surface() aw = area.get_allocated_width() ah = area.get_allocated_height() dwidth = self.dpage.width_in_points() dheight = self.dpage.height_in_points() self.scale = min((aw - 100) / dwidth, (ah - 100) / dheight) self.draw_page_boxes() def on_draw(self, _area, cairo_ctx): if self.surface is not None: cairo_ctx.set_source_surface(self.surface, 0, 0) cairo_ctx.paint() def on_spinbutton_changed(self, _event): self.init_surface() self.draw_page_boxes() def button_press_event(self, _area, event): if event.button == 1: self.click_pos = event.x, event.y self.spin_val = self.spin_x.get_value(), self.spin_y.get_value() def motion_notify_event(self, _area, event): if event.state & Gdk.ModifierType.BUTTON1_MASK: if self.scale * self.spin_scale_x != 0: add_x = (event.x - self.click_pos[0]) / (self.scale * self.spin_scale_x) self.spin_x.set_value(self.spin_val[0] + add_x) if self.scale * self.spin_scale_y != 0: add_y = (event.y - self.click_pos[1]) / (self.scale * self.spin_scale_y) self.spin_y.set_value(self.spin_val[1] + add_y) self.draw_page_boxes() def init_surface(self): aw = self.area.get_allocated_width() ah = self.area.get_allocated_height() self.surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, aw, ah) def draw_page_boxes(self): """Draw the page and the layer page (overlay/underlay).""" cairo_ctx = cairo.Context(self.surface) aw = self.area.get_allocated_width() ah = self.area.get_allocated_height() # Destination page rectangle dwf = self.dpage.width_in_points() * self.scale dhf = self.dpage.height_in_points() * self.scale dxf = (aw - dwf) / 2 dyf = (ah - dhf) / 2 dx = int(0.5 + dxf) dy = int(0.5 + dyf) dw = int(0.5 + dwf + dxf - dx) dh = int(0.5 + dhf + dyf - dy) # Layer page rectangle lwf = self.lpage.width_in_points() * self.scale lhf = self.lpage.height_in_points() * self.scale lxf = dxf + self.spin_x.get_value() * self.spin_scale_x * self.scale lyf = dyf + self.spin_y.get_value() * self.spin_scale_y * self.scale lx = int(0.5 + dxf + self.spin_x.get_value() * self.spin_scale_x * self.scale) ly = int(0.5 + dyf + self.spin_y.get_value() * self.spin_scale_y * self.scale) lw = int(0.5 + lwf + lxf - lx) lh = int(0.5 + lhf + lyf - ly) # Fill white paper cairo_ctx.set_source_rgb(1, 1, 1) cairo_ctx.rectangle(dx + 1, dy + 1, dw - 2, dh - 2) cairo_ctx.fill() # Draw layer page border cairo_ctx.set_source_rgb(0, 0, 0) cairo_ctx.rectangle(lx, ly, lw, lh) cairo_ctx.stroke() # Fill the layer page cairo_ctx.set_source_rgb(0.5, 0.5, 0.5) cairo_ctx.rectangle(lx + 1, ly + 1, lw - 2, lh - 2) cairo_ctx.fill() # Draw the page border cairo_ctx.set_source_rgb(0, 0, 0) cairo_ctx.rectangle(dx, dy, dw, dh) cairo_ctx.stroke() # Invalidiate region self.area.queue_draw_area(0, 0, aw, ah) def get_offset(self): """Get layer page x and y offset from top-left edge of the destination page. The offset is the fraction of space positioned at left and top of the pasted layer, where space is the differance in width and height between the layer and the page. """ result = self.d.run() r = None if result == Gtk.ResponseType.OK: self.app.layer_pos = self.spin_x.get_value(), self.spin_y.get_value() r = self.spin_x.get_value() / 100, self.spin_y.get_value() / 100 self.d.destroy() return r pdfarranger-1.10.1/pdfarranger/pdfarranger.py000066400000000000000000003334271451252235000212400ustar00rootroot00000000000000# Copyright (C) 2008-2017 Konstantinos Poulios, 2018-2019 Jerome Robert # # pdfarranger 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, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import os import ctypes if os.name == 'nt': try: ctypes.windll.kernel32.SetDefaultDllDirectories(0x1000) except AttributeError: # Windows too old KB2533623 pass import shutil # for file operations like whole directory deletion import sys # for processing of command line args import tempfile import signal import mimetypes import multiprocessing import traceback import locale # for multilanguage support import gettext import gc import subprocess import pikepdf import hashlib from urllib.request import url2pathname from functools import lru_cache from math import log multiprocessing.freeze_support() # Does nothing in Linux sharedir = os.path.join(sys.prefix, 'share') basedir = '.' if getattr(sys, 'frozen', False): basedir = os.path.dirname(sys.executable) sharedir = os.path.join(basedir, 'share') elif sys.argv[0]: execdir = os.path.dirname(os.path.realpath(sys.argv[0])) basedir = os.path.dirname(execdir) sharedir = os.path.join(basedir, 'share') if not os.path.exists(sharedir): sharedir = basedir localedir = os.path.join(sharedir, 'locale') if not os.path.exists(localedir): # Assume we are in development mode localedir = os.path.join(basedir, 'build', 'mo') try: locale.setlocale(locale.LC_ALL, '') except locale.Error: pass # Gtk already prints a warning DOMAIN = 'pdfarranger' ICON_ID = 'com.github.jeromerobert.' + DOMAIN if hasattr(locale, 'bindtextdomain'): # glibc locale.bindtextdomain(DOMAIN, localedir) # https://docs.gtk.org/glib/i18n.html locale.bind_textdomain_codeset(DOMAIN, 'UTF-8') else: # Windows or musl libintl = ctypes.cdll['libintl-8' if os.name == 'nt' else 'libintl.so.8'] libintl.bindtextdomain(DOMAIN.encode(), localedir.encode(sys.getfilesystemencoding())) libintl.bind_textdomain_codeset(DOMAIN.encode(), 'UTF-8'.encode()) del libintl APPNAME = 'PDF Arranger' VERSION = '1.10.1' WEBSITE = 'https://github.com/pdfarranger/pdfarranger' if os.name == 'nt': import darkdetect import keyboard # to get control key state when drag to other instance # Add support for dnd to other instance and insert file at drop location in Windows os.environ['GDK_WIN32_USE_EXPERIMENTAL_OLE2_DND'] = 'true' # Use client side decorations. Will also enable window moving with Win + left/right os.environ['GTK_CSD'] = '1' import gi # check that we don't need GObject.threads_init() gi.check_version('3.10.2') gi.require_version('Gtk', '3.0') from gi.repository import Gtk try: gi.require_version('Handy', '1') from gi.repository import Handy except ValueError: Handy = None if Gtk.check_version(3, 20, 0): raise Exception('You do not have the required version of GTK+ installed. ' + 'Installed GTK+ version is ' + '.'.join([str(Gtk.get_major_version()), str(Gtk.get_minor_version()), str(Gtk.get_micro_version())]) + '. Required GTK+ version is 3.20 or higher.') from gi.repository import Gdk from gi.repository import GObject # for using custom signals from gi.repository import Gio # for inquiring mime types information from gi.repository import GLib from gi.repository import Pango from .config import Config def _set_language_locale(): lang = Config(DOMAIN).language() if os.name == 'nt': if not lang: winlang = ctypes.windll.kernel32.GetUserDefaultUILanguage() lang = locale.windows_locale[winlang] os.environ['LANG'] = lang elif lang: if locale.getlocale(locale.LC_MESSAGES)[0] is None and lang != 'en': print('LC_MESSAGES = "C" or not valid. Translations may not work properly.') os.environ['LANGUAGE'] = lang _set_language_locale() gettext.bindtextdomain(DOMAIN, localedir) gettext.textdomain(DOMAIN) _ = gettext.gettext from . import undo from . import exporter from . import metadata from . import pageutils from . import splitter from .iconview import CellRendererImage, IconviewCursor, IconviewDragSelect, IconviewPanView from .core import img2pdf_supported_img, PageAdder, PDFDocError, PDFRenderer GObject.type_register(CellRendererImage) layer_support = exporter.layer_support() def _install_workaround_bug29(): """ Install a workaround for https://gitlab.gnome.org/GNOME/pygobject/issues/29 """ try: gi.check_version('3.29.2') except ValueError: def func(self, entries): # simplified version of https://gitlab.gnome.org/GNOME/pygobject/commit/d0b219c for d in entries: param_type = None if len(d) < 3 else GLib.VariantType.new(d[2]) action = Gio.SimpleAction(name=d[0], parameter_type=param_type) action.connect("activate", d[1], None) self.add_action(action) Gtk.ApplicationWindow.add_action_entries = func _install_workaround_bug29() def malloc_trim(): """Release free memory from the heap.""" if os.name == 'nt': return mtrim = malloc_trim_available() if mtrim: mtrim() @lru_cache() def malloc_trim_available(): try: ctypes.CDLL('libc.so.6').malloc_trim(0) except (FileNotFoundError, AttributeError, OSError): print('malloc_trim not available. Application may not release memory properly.') return None def mtrim(): ctypes.CDLL('libc.so.6').malloc_trim(0) return mtrim def get_file_path_from_uri(uri): """Extracts the path from an uri""" uri = uri[5:] # remove 'file:' path = url2pathname(uri) # escape special chars path = path.strip('\r\n\x00\x2F') # remove \r\n and NULL and \ if os.name == 'posix': path = '/' + path return path class PdfArranger(Gtk.Application): # Drag and drop ID for pages coming from the same pdfarranger instance MODEL_ROW_INTERN = 1001 # Drag and drop ID for pages coming from an other pdfarranger instance MODEL_ROW_EXTERN = 1002 # Drag and drop ID for pages coming from a non-pdfarranger application TEXT_URI_LIST = 1003 TARGETS_IV = [Gtk.TargetEntry.new('MODEL_ROW_INTERN', Gtk.TargetFlags.SAME_WIDGET, MODEL_ROW_INTERN), Gtk.TargetEntry.new('MODEL_ROW_EXTERN', Gtk.TargetFlags.OTHER_APP, MODEL_ROW_EXTERN)] TARGETS_SW = [Gtk.TargetEntry.new('text/uri-list', 0, TEXT_URI_LIST), Gtk.TargetEntry.new('MODEL_ROW_EXTERN', Gtk.TargetFlags.OTHER_APP, MODEL_ROW_EXTERN)] def __init__(self, *args, **kwargs): super().__init__(*args, application_id="com.github.jeromerobert.pdfarranger", flags=Gio.ApplicationFlags.NON_UNIQUE | Gio.ApplicationFlags.HANDLES_COMMAND_LINE, **kwargs) # Create the temporary directory self.tmp_dir = tempfile.mkdtemp(DOMAIN) os.chmod(self.tmp_dir, 0o700) # Defining instance attributes # The None values will be set later in do_activate self.config = Config(DOMAIN) self.uiXML = None self.window = None self.sw = None self.model = None self.undomanager = None self.iconview = None self.cellthmb = None self.status_bar = None self.popup = None self.is_unsaved = False self.zoom_level = None self.zoom_level_old = 0 self.zoom_level_limits = [-10, 80] self.zoom_scale = None self.zoom_fit_page = False self.render_id = None self.id_scroll_to_sel = None self.target_is_intern = True self.export_directory = os.path.expanduser('~') self.import_directory = None self.nfile = 0 self.iv_auto_scroll_timer = None self.pdfqueue = [] self.metadata = {} self.pressed_button = None self.click_path = None self.scroll_path = None self.rendering_thread = None self.export_process = None self.post_action = None self.save_file = None self.export_file = None self.drag_path = None self.drag_pos = Gtk.IconViewDropPosition.DROP_RIGHT self.window_width_old = 0 self.set_iv_visible_id = None self.vadj_percent = None self.end_rubberbanding = False self.disable_quit = False multiprocessing.set_start_method('spawn') self.quit_flag = multiprocessing.Event() self.layer_pos = 50, 50 # Clipboard for cut copy paste self.clipboard = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD) self.add_arguments() def add_arguments(self): self.set_option_context_summary(_( "PDF Arranger is a small python-gtk application, which helps the " "user to merge or split pdf documents and rotate, crop and rearrange " "their pages using an interactive and intuitive graphical interface. " "It is a frontend for pikepdf." )) self.add_main_option( "version", ord("v"), GLib.OptionFlags.NONE, GLib.OptionArg.NONE, _("Print the version of PDF Arranger and exit"), None, ) self.add_main_option( GLib.OPTION_REMAINING, 0, GLib.OptionFlags.NONE, GLib.OptionArg.STRING_ARRAY, _("File(s) to open"), "[FILES]", ) @staticmethod def __resource_path(path): """ Return the path of a resource file """ # TODO: May be we could use Application.set_resource_base_path and # get_menu_by_id in place of that # Trying different possible locations f = os.path.join(basedir, 'share', DOMAIN, path) if not os.path.exists(f): f = os.path.join(basedir, 'data', path) if not os.path.exists(f): f = '/usr/share/{}/{}'.format(DOMAIN, path) if not os.path.exists(f): f = '/usr/local/share/{}/{}'.format(DOMAIN, path) return f def set_color_scheme(self): if Handy: try: scheme = Handy.ColorScheme.PREFER_LIGHT if os.name == 'nt' and darkdetect.isDark(): scheme = Handy.ColorScheme.PREFER_DARK theme = self.config.theme() if theme == 'dark': scheme = Handy.ColorScheme.FORCE_DARK elif theme == 'light': scheme = Handy.ColorScheme.FORCE_LIGHT Handy.StyleManager.get_default().set_color_scheme(scheme) except AttributeError: # This libhandy is too old. 1.5.90 needed ? pass def __create_main_window(self): """Create the Gtk.ApplicationWindow or Handy.ApplicationWindow""" b = Gtk.Builder() b.set_translation_domain(DOMAIN) with open(self.__resource_path(DOMAIN + ".ui")) as ff: s = ff.read() if Handy: Handy.init() s = s.replace("GtkHeaderBar", "HdyHeaderBar") b.add_from_string(s) b.connect_signals(self) self.uiXML = b self.window = self.uiXML.get_object("main_window") if Handy: self.set_color_scheme() # Add an intermediate vertical box box = Gtk.Box() box.props.orientation = Gtk.Orientation.VERTICAL hd = self.uiXML.get_object("header_bar") mb = self.uiXML.get_object("main_box") self.window.remove(hd) self.window.remove(mb) # Replace the Gtk.ApplicationWindow by the Handy one self.window = Handy.ApplicationWindow() box.add(hd) mb.props.expand = True box.add(mb) self.window.add(box) self.window.set_default_icon_name(ICON_ID) return b def __create_menus(self): b = Gtk.Builder() b.set_translation_domain(DOMAIN) b.add_from_file(self.__resource_path("menu.ui")) b.connect_signals(self) self.config.set_actions(b) self.popup = Gtk.Menu.new_from_model(b.get_object("popup_menu")) self.popup.attach_to_widget(self.window, None) main_menu = self.uiXML.get_object("main_menu_button") main_menu.set_menu_model(b.get_object("main_menu")) def __create_actions(self): # Both Handy.ApplicationWindow and Gtk.Application are Gio.ActionMap. Some action are window # related some other are application related. As pdfarrager is a single window app does not # matter that much. self.actions = [ ('rotate', self.rotate_page_action, 'i'), ('delete', self.on_action_delete), ('duplicate', self.duplicate), ('page-format', self.page_format_dialog), ('crop-white-borders', self.crop_white_borders), ('export-selection', self.choose_export_selection_pdf_name, 'i'), ('export-all', self.on_action_export_all), ('reverse-order', self.reverse_order), ('save', self.on_action_save), ('save-as', self.on_action_save_as), ('new', self.on_action_new), ('open', self.on_action_open), ('import', self.on_action_import), ('zoom-in', self.on_action_zoom_in), ('zoom-out', self.on_action_zoom_out), ('zoom-fit', self.on_action_zoom_fit), ('fullscreen', self.on_action_fullscreen), ('close', self.on_action_close), ('quit', self.on_quit), ('undo', self.undomanager.undo), ('redo', self.undomanager.redo), ('split', self.split_pages), ('merge', self.merge_pages), ('metadata', self.edit_metadata), ('cut', self.on_action_cut), ('copy', self.on_action_copy), ('paste', self.on_action_paste, 'i'), ('select', self.on_action_select, 'i'), ('select-same-file', self.on_action_select, 'i'), ('select-same-format', self.on_action_select, 'i'), ('about', self.about_dialog), ("insert-blank-page", self.insert_blank_page), ("generate-booklet", self.generate_booklet), ("preferences", self.on_action_preferences), ("print", self.on_action_print), ] self.window.add_action_entries(self.actions) self.main_menu = self.uiXML.get_object("main_menu_button") self.window.add_action(Gio.PropertyAction.new("main-menu", self.main_menu, "active")) for a, k in self.config.get_accels(): self.set_accels_for_action("win." + a, [k] if isinstance(k, str) else k) # Disable actions self.iv_selection_changed_event() self.window_focus_in_out_event() self.undomanager.set_actions(self.window.lookup_action('undo'), self.window.lookup_action('redo')) def insert_blank_page(self, _action, _option, _unknown): size = (21 / 2.54 * 72, 29.7 / 2.54 * 72) # A4 by default selection = self.iconview.get_selected_items() selection.sort() model = self.iconview.get_model() if len(selection) > 0: size = model[selection[-1]][0].size_in_points() page_size = pageutils.BlankPageDialog(size, self.window).run_get() if page_size is not None: adder = PageAdder(self) if len(selection) > 0: adder.move(Gtk.TreeRowReference.new(model, selection[-1]), False) adder.addpages(exporter.create_blank_page(self.tmp_dir, page_size)) adder.commit(select_added=False, add_to_undomanager=True) def generate_booklet(self, _action, _option, _unknown): self.undomanager.commit("generate booklet") model = self.iconview.get_model() selection = self.iconview.get_selected_items() selection.sort(key=lambda x: x.get_indices()[0]) ref_list = [Gtk.TreeRowReference.new(model, path) for path in selection] pages = [model.get_value(model.get_iter(ref.get_path()), 0) for ref in ref_list] # Need uniform page size. p1w, p1h = pages[0].size_in_points() for page in pages[1:]: pw, ph = page.size_in_points() if abs(p1w-pw) > 1e-2 or abs(p1h-ph) > 1e-2: msg = _('All pages must have the same size.') self.error_message_dialog(msg) return # We need a multiple of 4 blank_page_count = 0 if len(pages) % 4 == 0 else 4 - len(pages) % 4 if blank_page_count > 0: file = exporter.create_blank_page(self.tmp_dir, pages[0].size_in_points()) adder = PageAdder(self) for __ in range(blank_page_count): adder.addpages(file) pages += adder.pages adder = PageAdder(self) booklet = exporter.generate_booklet(self.pdfqueue, self.tmp_dir, pages) adder.move(Gtk.TreeRowReference.new(self.model, selection[0]), True) adder.addpages(booklet) adder.commit(select_added=False, add_to_undomanager=False) self.clear_selected(add_to_undomanager=False) self.silent_render() def on_action_preferences(self, _action, _option, _unknown): handy_available = True if Handy else False self.config.preferences_dialog(self.window, localedir, handy_available) self.set_color_scheme() def on_action_print(self, _action, _option, _unknown): exporter.PrintOperation(self).run() @staticmethod def __create_filters(file_type_list): filter_list = [] f_supported = Gtk.FileFilter() f_supported.set_name(_('All supported files')) filter_list.append(f_supported) if 'pdf' in file_type_list: f_pdf = Gtk.FileFilter() f_pdf.set_name(_('PDF files')) for f in [f_pdf, f_supported]: f.add_pattern('*.pdf') if os.name != 'nt': f.add_mime_type('application/pdf') filter_list.append(f_pdf) if 'all' in file_type_list: f = Gtk.FileFilter() f.set_name(_('All files')) f.add_pattern('*') filter_list.append(f) if 'img2pdf' in file_type_list: f_img = Gtk.FileFilter() f_img.set_name(_('Supported image files')) for f in [f_img, f_supported]: for mime in img2pdf_supported_img: if os.name != 'nt': f.add_mime_type(mime) for extension in mimetypes.guess_all_extensions(mime): f.add_pattern('*' + extension) filter_list.append(f_img) return filter_list def set_title(self, title): if Handy: self.uiXML.get_object('header_bar').set_title(title) else: self.window.set_title(title) def do_activate(self): """ https://lazka.github.io/pgi-docs/Gio-2.0/classes/Application.html#Gio.Application.do_activate """ # TODO: huge method that should be split iconsdir = os.path.join(sharedir, 'icons') if not os.path.exists(iconsdir): iconsdir = os.path.join(sharedir, 'data', 'icons') Gtk.IconTheme.get_default().append_search_path(iconsdir) self.__create_main_window() self.set_title(APPNAME) self.window.set_border_width(0) self.window.set_application(self) if self.config.maximized(): self.window.maximize() self.window.set_default_size(*self.config.window_size()) self.window.move(*self.config.position()) self.window.connect('delete_event', self.on_quit) self.window.connect('focus_in_event', self.window_focus_in_out_event) self.window.connect('focus_out_event', self.window_focus_in_out_event) self.window.connect('configure_event', self.window_configure_event) if hasattr(GLib, "unix_signal_add"): GLib.unix_signal_add(GLib.PRIORITY_DEFAULT, signal.SIGINT, self.close_application) # Create a scrolled window to hold the thumbnails-container self.sw = self.uiXML.get_object('scrolledwindow') self.sw.drag_dest_set(Gtk.DestDefaults.HIGHLIGHT | Gtk.DestDefaults.DROP, self.TARGETS_SW, Gdk.DragAction.COPY) self.sw.connect('drag_data_received', self.sw_dnd_received_data) self.sw.connect('button_press_event', self.sw_button_press_event) self.sw.connect('scroll_event', self.sw_scroll_event) # Create ListStore model and IconView self.model = Gtk.ListStore(GObject.TYPE_PYOBJECT, str) self.undomanager = undo.Manager(self) self.zoom_set(self.config.zoom_level()) self.iconview = Gtk.IconView(self.model) self.iconview.clear() self.iconview.set_item_width(-1) self.cellthmb = CellRendererImage() self.cellthmb.set_padding(3, 3) self.cellthmb.set_alignment(0.5, 0.5) self.iconview.pack_start(self.cellthmb, False) self.iconview.set_cell_data_func(self.cellthmb, self.set_cellrenderer_data, None) self.iconview.set_text_column(1) cell_text_renderer = self.iconview.get_cells()[1] cell_text_renderer.props.ellipsize = Pango.EllipsizeMode.MIDDLE self.iconview.set_selection_mode(Gtk.SelectionMode.MULTIPLE) self.iconview.enable_model_drag_source(Gdk.ModifierType.BUTTON1_MASK, self.TARGETS_IV, Gdk.DragAction.COPY | Gdk.DragAction.MOVE) self.iconview.enable_model_drag_dest(self.TARGETS_IV, Gdk.DragAction.COPY | Gdk.DragAction.MOVE) self.iconview.connect('drag_begin', self.iv_drag_begin) self.iconview.connect('drag_data_get', self.iv_dnd_get_data) self.iconview.connect('drag_data_received', self.iv_dnd_received_data) self.iconview.connect('drag_data_delete', self.iv_dnd_data_delete) self.iconview.connect('drag_motion', self.iv_dnd_motion) self.iconview.connect('drag_leave', self.iv_dnd_leave_end) self.iconview.connect('drag_end', self.iv_dnd_leave_end) self.iconview.connect('button_press_event', self.iv_button_press_event) self.iconview.connect('motion_notify_event', self.iv_motion) self.iconview.connect('button_release_event', self.iv_button_release_event) self.iconview.connect('style_updated', self.set_text_renderer_cell_height) self.id_selection_changed_event = self.iconview.connect('selection_changed', self.iv_selection_changed_event) self.iconview.connect('key_press_event', self.iv_key_press_event) self.iconview.connect('size_allocate', self.iv_size_allocate) self.sw.add(self.iconview) # Status bar to the left self.status_bar = self.uiXML.get_object('statusbar') # Status bar to the right self.status_bar2 = self.uiXML.get_object('statusbar2') # Vertical scrollbar vscrollbar = self.sw.get_vscrollbar() vscrollbar.connect('value_changed', self.vscrollbar_value_changed) vscrollbar.props.adjustment.step_increment = 75 self.window.show_all() # Change iconview color background style_context_sw = self.sw.get_style_context() color_selected = self.iconview.get_style_context() \ .get_background_color(Gtk.StateFlags.SELECTED) color_prelight = color_selected.copy() color_prelight.alpha = 0.3 for state in (Gtk.StateFlags.NORMAL, Gtk.StateFlags.ACTIVE): self.iconview.override_background_color( state, style_context_sw.get_background_color(state)) self.iconview.override_background_color(Gtk.StateFlags.SELECTED, color_selected) self.iconview.override_background_color(Gtk.StateFlags.PRELIGHT, color_prelight) # Set cursor look and hide overshoot gradient style_provider = Gtk.CssProvider() css_data = """ iconview { outline-color: alpha(currentColor, 0.8); outline-style: dashed; outline-offset: -2px; outline-width: 2px; -gtk-outline-radius: 2px; } scrolledwindow overshoot { background: none; } """ style_provider.load_from_data(bytes(css_data.encode())) Gtk.StyleContext.add_provider_for_screen( Gdk.Screen.get_default(), style_provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION) GObject.type_register(PDFRenderer) GObject.signal_new('update_thumbnail', PDFRenderer, GObject.SignalFlags.RUN_FIRST, None, [GObject.TYPE_PYOBJECT, GObject.TYPE_PYOBJECT, GObject.TYPE_PYOBJECT, GObject.TYPE_PYOBJECT, GObject.TYPE_BOOLEAN]) self.set_unsaved(False) self.__create_actions() self.__create_menus() self.iv_cursor = IconviewCursor(self) self.iv_drag_select = IconviewDragSelect(self) self.iv_pan_view = IconviewPanView(self) def do_command_line(self, command_line): options = command_line.get_options_dict() # Print PDF Arranger version and exit if options.contains("version"): print(APPNAME + "-" + VERSION) print("pikepdf-" + pikepdf.__version__) print("libqpdf-" + pikepdf.__libqpdf_version__) return 0 self.activate() if options.lookup_value(GLib.OPTION_REMAINING): files = [Gio.File.new_for_commandline_arg(i) for i in options.lookup_value(GLib.OPTION_REMAINING)] GObject.idle_add(self.add_files, files) return 0 def add_files(self, files): """Add files passed as command line arguments.""" a = PageAdder(self) for f in files: try: a.addpages(f.get_path()) except FileNotFoundError as e: print(e, file=sys.stderr) self.error_message_dialog(e) a.commit(select_added=False, add_to_undomanager=True) @staticmethod def set_text_renderer_cell_height(iconview): """Update text renderer cell height on style update. Having a fixed height will improve speed. Cell height is: "number of rows" * "text height" + 2 * padding At start cell will have the height of 1 row + paddings. """ cell_text_renderer = iconview.get_cells()[1] cell_text_renderer.set_fixed_size(-1, -1) paddy = cell_text_renderer.get_padding()[1] natural_height = cell_text_renderer.get_preferred_height(iconview)[1] text = cell_text_renderer.props.text height = 2 * (natural_height - paddy) if text is None else natural_height cell_text_renderer.set_fixed_size(-1, height) @staticmethod def set_cellrenderer_data(_column, cell, model, it, _data=None): cell.set_page(model.get_value(it, 0)) def render(self): self.render_id = None if not self.sw.is_sensitive(): return alive = self.quit_rendering() if alive: self.silent_render() return self.visible_range = self.get_visible_range2() columns_nr = self.iconview.get_columns() self.rendering_thread = PDFRenderer(self.model, self.pdfqueue, self.visible_range , columns_nr) self.rendering_thread.connect('update_thumbnail', self.update_thumbnail) self.rendering_thread.start() ctxt_id = self.status_bar2.get_context_id("rendering") self.status_bar2.push(ctxt_id, _('Rendering…')) def quit_rendering(self): """Quit rendering.""" if self.rendering_thread is None: return False self.rendering_thread.quit = True # If thread is busy with page.render(cr) it might take some time for thread to quit. # Therefore set a timeout here so app continues to stay responsive. self.rendering_thread.join(timeout=0.15) return self.rendering_thread.is_alive() def silent_render(self): """Render when silent i.e. when no call for last 149ms. Improves app responsiveness by not calling render too frequently. """ if self.render_id: GObject.source_remove(self.render_id) self.render_id = GObject.timeout_add(149, self.render) def render_lock(self): """Acquire/release a lock (before any add/delete/reorder).""" class __RenderLock: def __init__(self, app): self.app = app def _th(self): return self.app.rendering_thread def __enter__(self): if self._th(): self._th().model_lock.acquire() def __exit__(self, _exc_type, _exc_value, _traceback): if self._th() and self._th().model_lock.locked(): self._th().model_lock.release() return __RenderLock(self) def vscrollbar_value_changed(self, _vscrollbar): """Render when vertical scrollbar value has changed.""" self.silent_render() def window_configure_event(self, _window, event): """Handle window size and position changes.""" if self.window_width_old not in [0, event.width] and len(self.model) > 0: if self.set_iv_visible_id: GObject.source_remove(self.set_iv_visible_id) self.set_iv_visible_id = GObject.timeout_add(500, self.set_iconview_visible) self.iconview.set_visible(False) self.window_width_old = event.width if len(self.model) > 1: # Don't trigger extra render after first page is inserted self.silent_render() def set_iconview_visible(self): self.set_iv_visible_id = None if len(self.iconview.get_selected_items()) == 0: self.vadj_percent_handler(store=True) self.update_iconview_geometry() self.scroll_to_selection() self.sw.set_visible(False) self.sw.set_visible(True) GObject.idle_add(self.iconview.set_visible, True) self.iconview.grab_focus() self.silent_render() def set_save_file(self, file): if file != self.save_file: self.save_file = file self.set_unsaved(True) def set_unsaved(self, flag): self.is_unsaved = flag GObject.idle_add(self.retitle) def retitle(self): if self.save_file: title = self.save_file else: title = _('untitled') if self.is_unsaved: title += '*' all_files = set(os.path.splitext(doc.basename)[0] for doc in self.pdfqueue) all_files.discard('') if len(all_files) > 0: title += ' [' + ', '.join(sorted(all_files)) + ']' title += ' – ' + APPNAME self.set_title(title) return False def update_thumbnail(self, _obj, ref, thumbnail, zoom, scale, is_preview): """Update thumbnail emitted from rendering thread.""" if ref is None: # Rendering ended ctxt_id = self.status_bar2.get_context_id("rendering") self.status_bar2.remove_all(ctxt_id) malloc_trim() return path = ref.get_path() if path is None: # Page no longer exist return if (self.visible_range[0] <= path.get_indices()[0] <= self.visible_range[1] and zoom != self.zoom_scale): # Thumbnail is in the visible range but is not rendered for current zoom level self.silent_render() return page = self.model[path][0] if page.scale != scale: # Page scale was changed while page was rendered -> trash & rerender self.silent_render() return page.thumbnail = thumbnail page.resample = 1 / zoom if is_preview: page.preview = thumbnail # Let iconview refresh the thumbnail (only) by selecting it with GObject.signal_handler_block(self.iconview, self.id_selection_changed_event): if self.iconview.path_is_selected(path): self.iconview.unselect_path(path) self.iconview.select_path(path) else: self.iconview.select_path(path) self.iconview.unselect_path(path) ac = self.iconview.get_accessible().ref_accessible_child(path.get_indices()[0]) ac.set_description(page.description()) def get_visible_range2(self): """Get range of items visible in window. A item is considered visible if more than 50% of item is visible. """ vr = self.iconview.get_visible_range() if vr is None: return -1, -1 first_ind = vr[0].get_indices()[0] last_ind = vr[1].get_indices()[0] first_cell = self.iconview.get_cell_rect(vr[0])[1] last_cell = self.iconview.get_cell_rect(vr[1])[1] sw_height = self.sw.get_allocated_height() if first_cell.y + first_cell.height * 0.5 < 0: columns_nr = self.iconview.get_columns() first_ind = min(first_ind + columns_nr, len(self.model) - 1) if last_cell.y + last_cell.height * 0.5 > sw_height: last_item_col = self.iconview.get_item_column(vr[1]) last_ind = max(last_ind - last_item_col - 1, 0) return min(first_ind, last_ind), max(first_ind, last_ind) def hide_horizontal_scrollbar(self): """Hide horizontal scrollbar when not needed.""" sw_hadj = self.sw.get_hadjustment() hscrollbar = self.sw.get_hscrollbar() if sw_hadj.get_upper() <= self.sw.get_allocated_width(): hscrollbar.hide() else: hscrollbar.show() def update_iconview_geometry(self): """Set iconview cell size, margins, number of columns and spacing.""" if len(self.model) > 0: item_width = max(row[0].width_in_pixel() for row in self.model) item_padding = self.iconview.get_item_padding() cellthmb_xpad, cellthmb_ypad = self.cellthmb.get_padding() border_and_shadow = 7 # 2*th1+th2 set in iconview.py # cell width min limit 50 is set in gtkiconview.c cell_width = max(item_width + 2 * cellthmb_xpad + border_and_shadow, 50) cell_height = -1 if self.zoom_fit_page: item_height = max(row[0].height_in_pixel() for row in self.model) cell_height = item_height + 2 * cellthmb_ypad + border_and_shadow self.cellthmb.set_fixed_size(cell_width, cell_height) padded_cell_width = cell_width + 2 * item_padding min_col_spacing = 5 min_margin = 11 iw_width = self.sw.get_allocation().width # 2 * min_margin + col_num * padded_cell_width # + min_col_spacing * (col_num+1) = iw_width col_num = (iw_width - 2 * min_margin - min_col_spacing) //\ (padded_cell_width + min_col_spacing) spacing = (iw_width - col_num * padded_cell_width - 2 * min_margin) // (col_num + 1) margin = (iw_width - col_num * (padded_cell_width + spacing) + spacing) // 2 if col_num == 0: col_num = 1 margin = 6 self.iconview.set_columns(col_num) self.iconview.set_column_spacing(spacing) self.iconview.set_margin(margin) def vadj_percent_handler(self, store=False, restore=False): """Store and restore adjustment percentual value.""" sw_vadj = self.sw.get_vadjustment() lower_limit = sw_vadj.get_lower() upper_limit = sw_vadj.get_upper() page_size = sw_vadj.get_page_size() sw_vpos = sw_vadj.get_value() vadj_range = upper_limit - lower_limit - page_size if store and self.vadj_percent is None and vadj_range > 0: self.vadj_percent = (sw_vpos - lower_limit) / vadj_range if restore and self.vadj_percent is not None: sw_vadj.set_value(self.vadj_percent * vadj_range + lower_limit) self.vadj_percent = None def iv_size_allocate(self, _iconview, _allocation): self.hide_horizontal_scrollbar() self.set_adjustment_limits() if self.vadj_percent is not None: self.vadj_percent_handler(restore=True) if self.scroll_path: GObject.idle_add(self.scroll_to_path2, self.scroll_path) self.scroll_path = None def set_adjustment_limits(self): hscrollbar = self.sw.get_hscrollbar() vscrollbar = self.sw.get_vscrollbar() if len(self.model) == 0: # Hide scrollbars https://gitlab.gnome.org/GNOME/gtk/-/issues/4370 ? hscrollbar.set_range(0, 0) vscrollbar.set_range(0, 0) else: # Remove margins at top and bottom of iconview lower_limit = self.iconview.get_margin() - 6 upper_limit = vscrollbar.props.adjustment.get_upper() - lower_limit vscrollbar.set_range(lower_limit, upper_limit) def confirm_dialog(self, msg, action): """A dialog for confirmation of an action.""" d = Gtk.MessageDialog(self.window, 0, Gtk.MessageType.WARNING, Gtk.ButtonsType.NONE, msg) d.add_buttons(action, 1, _('_Cancel'), 2) response = d.run() d.destroy() return response == 1 def save_changes_dialog(self, msg): """A dialog which ask if changes should be saved.""" d = Gtk.MessageDialog(self.window, 0, Gtk.MessageType.WARNING, Gtk.ButtonsType.NONE, msg) d.format_secondary_markup(_("Your changes will be lost if you don’t save them.")) d.add_buttons(_('Do_n’t Save'), 1, _('_Cancel'), 2, _('_Save'), 3) response = d.run() d.destroy() return response def on_action_close(self, _action, _param, _unknown): """Close all files and restore initial state.""" if self.is_unsaved: if len(self.model) == 0: msg = _('Discard changes and close?') confirm = self.confirm_dialog(msg, action=_('_Close')) if not confirm: return else: if self.save_file: msg = _('Save changes to “{}” before closing?') msg = msg.format(os.path.basename(self.save_file)) else: msg = _('Save changes before closing?') response = self.save_changes_dialog(msg) if response == 3: self.post_action = 'CLEAR_DATA' self.save_or_choose() return elif response != 1: return self.clear_data() def clear_data(self): self.iconview.unselect_all() with self.render_lock(): self.model.clear() self.pdfqueue = [] self.metadata = {} self.undomanager.clear() self.set_save_file(None) self.export_file = None self.set_unsaved(False) self.update_statusbar() malloc_trim() def on_quit(self, _action, _param=None, _unknown=None): if self.disable_quit: return Gdk.EVENT_STOP elif self.is_unsaved: if len(self.model) == 0: msg = _('Discard changes and quit?') confirm = self.confirm_dialog(msg, action=_('_Quit')) if not confirm: return Gdk.EVENT_STOP else: if self.save_file: msg = _('Save changes to “{}” before quitting?') msg = msg.format(os.path.basename(self.save_file)) else: msg = _('Save changes before quitting?') response = self.save_changes_dialog(msg) if response == 3: self.post_action = 'CLOSE_APPLICATION' self.save_or_choose() return Gdk.EVENT_STOP elif response != 1: return Gdk.EVENT_STOP self.close_application() return Gdk.EVENT_STOP def close_application(self, _widget=None, _event=None, _data=None): """Termination""" self.quit_flag.set() if self.rendering_thread: self.rendering_thread.quit = True self.rendering_thread.join() self.rendering_thread.pdfqueue = [] if self.export_process: self.export_process.join(timeout=2) if self.export_process.is_alive(): self.export_process.terminate() self.export_process.join() # Prevent gtk errors when closing with everything selected self.iconview.unselect_all() self.iconview.get_model().clear() # Release Poppler.Document instances to unlock all temporary files self.pdfqueue = [] gc.collect() self.config.set_window_size(self.window.get_size()) self.config.set_maximized(self.window.is_maximized()) self.config.set_zoom_level(self.zoom_level) self.config.set_position(self.window.get_position()) self.config.save() if os.path.isdir(self.tmp_dir): shutil.rmtree(self.tmp_dir) self.quit() @staticmethod def get_cnt_filename(f, need_cnt=False): """Get a filename where the value at end is incremented by 1.""" shortname, ext = os.path.splitext(f) if ext.lower() != ".pdf": ext = ".pdf" cnt = "" for char in reversed(shortname): if char.isdigit(): cnt = char + cnt else: break if cnt != "": name_part = shortname[:-len(cnt)] cnt_part = str(int(cnt) + 1).zfill(len(cnt)) f = name_part + cnt_part + ext elif need_cnt: f = shortname + "-002" + ext return f def choose_export_pdf_name(self, exportmode): """Handles choosing a name for exporting """ title = _('Save As…') if exportmode == 'ALL_TO_SINGLE' else _('Export…') chooser = Gtk.FileChooserNative.new(title=title, parent=self.window, action=Gtk.FileChooserAction.SAVE, accept_label=_("_Save"), cancel_label=_("_Cancel")) chooser.set_do_overwrite_confirmation(True) if len(self.pdfqueue) > 0: f = self.save_file or self.pdfqueue[0].filename f_dir, basename = os.path.split(f) tempdir = f_dir.startswith(tempfile.gettempdir()) and f_dir.endswith(DOMAIN) if exportmode == 'ALL_TO_SINGLE': if f.endswith(".pdf") and not tempdir: chooser.set_filename(f) # Set name to existing file else: shortname, ext = os.path.splitext(basename) if self.export_file is None and tempdir: shortname = "" f = self.export_file or shortname + "-000" + ext f = self.get_cnt_filename(f) chooser.set_current_name(f) # Set name to new file chooser.set_current_folder(self.export_directory) filter_list = self.__create_filters(['pdf', 'all']) for f in filter_list[1:]: chooser.add_filter(f) response = chooser.run() file_out = chooser.get_filename() chooser.destroy() if response == Gtk.ResponseType.ACCEPT: root, ext = os.path.splitext(file_out) if ext.lower() != '.pdf': ext = '.pdf' file_out = file_out + ext files_out = [file_out] if exportmode in ['ALL_TO_MULTIPLE', 'SELECTED_TO_MULTIPLE']: s = self.iconview.get_selected_items() len_files = len(self.model) if exportmode == 'ALL_TO_MULTIPLE' else len(s) for i in range(1, len_files): files_out.append(self.get_cnt_filename(files_out[-1], need_cnt=True)) if os.path.exists(files_out[i]): msg = (_('A file named "%s" already exists. Do you want to replace it?') % os.path.split(files_out[i])[1]) replace = self.confirm_dialog(msg, _("Replace")) if not replace: return self.save(exportmode, files_out) else: self.post_action = None def open_dialog(self, title): chooser = Gtk.FileChooserNative.new(title=title, parent=self.window, action=Gtk.FileChooserAction.OPEN, accept_label=_("_Open"), cancel_label=_("_Cancel")) if self.import_directory is not None: chooser.set_current_folder(self.import_directory) chooser.set_select_multiple(True) file_type_list = ['all', 'pdf'] if len(img2pdf_supported_img) > 0: file_type_list = ['all', 'img2pdf', 'pdf'] filter_list = self.__create_filters(file_type_list) for f in filter_list: chooser.add_filter(f) return chooser.run(), chooser def on_action_new(self, _action=None, _param=None, _unknown=None, filenames=None): """Start a new instance.""" filenames = filenames or [] if os.name == 'nt': args = [str(sys.executable)] for filename in filenames: args.append(filename) if sys.executable.find('python3.exe') != -1: args.insert(1, '-mpdfarranger') subprocess.Popen(args) else: display = Gdk.Display.get_default() launch_context = display.get_app_launch_context() desktop_file = "%s.desktop"%(self.get_application_id()) try: app_info = Gio.DesktopAppInfo.new(desktop_file) launch_files = [] for filename in filenames: launch_file = Gio.File.new_for_path(filename) launch_files.append(launch_file) app_info.launch(launch_files, launch_context) except TypeError: args = [str(sys.executable), '-mpdfarranger'] for filename in filenames: args.append(filename) subprocess.Popen(args) def on_action_open(self, _action, _param, _unknown): """Open new file(s).""" response, chooser = self.open_dialog(_('Open…')) if response == Gtk.ResponseType.ACCEPT: if len(self.pdfqueue) > 0 or len(self.metadata) > 0: self.on_action_new(filenames=chooser.get_filenames()) else: adder = PageAdder(self) for filename in chooser.get_filenames(): adder.addpages(filename) adder.commit(select_added=False, add_to_undomanager=True) chooser.destroy() def on_action_save(self, _action, _param, _unknown): self.save_or_choose() def save_or_choose(self): """Saves to the previously exported file or shows the export dialog if there was none.""" savemode = 'ALL_TO_SINGLE' if self.save_file: self.save(savemode, [self.save_file]) else: self.choose_export_pdf_name(savemode) def on_action_save_as(self, _action, _param, _unknown): self.choose_export_pdf_name('ALL_TO_SINGLE') def save(self, exportmode, files_out): """Saves to the specified file.""" if exportmode in ['SELECTED_TO_SINGLE', 'SELECTED_TO_MULTIPLE']: selection = reversed(self.iconview.get_selected_items()) pages = [self.model[row][0].duplicate(incl_thumbnail=False) for row in selection] else: pages = [row[0].duplicate(incl_thumbnail=False) for row in self.model] if exportmode == 'ALL_TO_SINGLE': self.set_save_file(files_out[0]) else: self.export_file = os.path.split(files_out[-1])[1] self.export_directory = os.path.split(files_out[0])[0] if self.config.content_loss_warning(): try: res, enabled = exporter.check_content(self.window, self.pdfqueue) except Exception as e: traceback.print_exc() self.error_message_dialog(e) return self.config.set_content_loss_warning(enabled) if res == Gtk.ResponseType.CANCEL: return # Abort files = [(pdf.copyname, pdf.password) for pdf in self.pdfqueue] export_msg = multiprocessing.Queue() a = files, pages, self.metadata, files_out, self.quit_flag, export_msg self.export_process = multiprocessing.Process(target=exporter.export_process, args=a) self.export_process.start() GObject.timeout_add(300, self.export_finished, exportmode, export_msg) self.set_export_state(True) def save_warning_dialog(self, msg): d = Gtk.MessageDialog( type=Gtk.MessageType.WARNING, parent=self.window, text=_("Saving produced some warnings"), secondary_text=_("Despite the warnings the document(s) should have no visible issues."), buttons=Gtk.ButtonsType.OK ) sw = Gtk.ScrolledWindow(margin=6) label = Gtk.Label(msg, wrap=True, margin=6, xalign=0.0, selectable=True) sw.add(label) d.vbox.pack_start(sw, False, False, 0) cb = Gtk.CheckButton(_("Don't show warnings when saving again."), margin=6, can_focus=False) d.vbox.pack_start(cb, False, False, 0) d.show_all() sw.set_min_content_height(min(150, label.get_allocated_height())) cb.set_can_focus(True) d.run() self.config.set_show_save_warnings(not cb.get_active()) d.destroy() def export_finished(self, exportmode, export_msg): """Check if export finished. Show any messages. Run any post action.""" if self.export_process.is_alive(): return True # continue polling self.set_export_state(False) msg_type = None if not export_msg.empty(): msg, msg_type = export_msg.get() if exportmode == 'ALL_TO_SINGLE' and msg_type != Gtk.MessageType.ERROR: self.set_unsaved(False) if msg_type == Gtk.MessageType.ERROR: self.error_message_dialog(msg) elif msg_type == Gtk.MessageType.WARNING and self.config.show_save_warnings(): self.save_warning_dialog(msg) if not self.is_unsaved: if self.post_action == 'CLEAR_DATA': self.clear_data() elif self.post_action == 'CLOSE_APPLICATION': self.close_application() self.post_action = None return False # cancel timer def set_export_state(self, enable, message=_("Saving…")): """Enable/disable app export state. When enabled app is moveable, resizable and closeable but does not respond to other input. """ if self.quit_flag.is_set(): return self.sw.set_sensitive(not enable) self.main_menu.set_sensitive(not enable) self.disable_quit = enable for a in self.actions: self.window.lookup_action(a[0]).set_enabled(not enable) ctxt_id = self.status_bar2.get_context_id("saving") if enable: self.status_bar2.push(ctxt_id, message) cursor = Gdk.Cursor.new_from_name(Gdk.Display.get_default(), 'wait') self.quit_rendering() else: self.status_bar2.remove_all(ctxt_id) cursor = Gdk.Cursor.new_from_name(Gdk.Display.get_default(), 'default') self.window_focus_in_out_event() self.iv_selection_changed_event() self.silent_render() self.iconview.grab_focus() self.iconview.get_window().set_cursor(cursor) def choose_export_selection_pdf_name(self, _action, mode, _unknown): exportmodes = {0: 'ALL_TO_SINGLE', 1: 'ALL_TO_MULTIPLE', 2: 'SELECTED_TO_SINGLE', 3: 'SELECTED_TO_MULTIPLE'} exportmode = exportmodes[mode.get_int32()] self.choose_export_pdf_name(exportmode) def on_action_export_all(self, _action, _param, _unknown): self.choose_export_pdf_name('ALL_TO_MULTIPLE') def on_action_import(self, _action, _param, _unknown): """Import doc""" response, chooser = self.open_dialog(_('Import…')) if response == Gtk.ResponseType.ACCEPT: adder = PageAdder(self) for filename in chooser.get_filenames(): adder.addpages(filename) adder.commit(select_added=False, add_to_undomanager=True) chooser.destroy() def clear_selected(self, add_to_undomanager=True): """Removes the selected elements in the IconView""" if add_to_undomanager: self.undomanager.commit("Delete") model = self.iconview.get_model() selection = self.iconview.get_selected_items() selection.sort(reverse=True) self.set_unsaved(True) with GObject.signal_handler_block(self.iconview, self.id_selection_changed_event): with self.render_lock(): for path in selection: model.remove(model.get_iter(path)) path = selection[-1] self.iconview.select_path(path) if not self.iconview.path_is_selected(path): if len(model) > 0: # select the last row row = model[-1] path = row.path self.iconview.select_path(path) self.scroll_path = path self.update_iconview_geometry() self.iv_selection_changed_event() self.iconview.grab_focus() self.silent_render() self.update_max_zoom_level() malloc_trim() def scroll_to_path2(self, path): """scroll_to_path() with modifications. * Don't scroll to a oversized page that already is filling window * Scroll only vertically """ cell = self.iconview.get_cell_rect(path)[1] if cell.y <= 0 and cell.y + cell.height >= self.sw.get_allocated_height(): return sw_hadj = self.sw.get_hadjustment() sw_hpos = sw_hadj.get_value() self.iconview.scroll_to_path(path, False, 0, 0) sw_hadj.set_value(sw_hpos) def copy_pages(self, add_hash=True): """Collect data from selected pages""" model = self.iconview.get_model() selection = self.iconview.get_selected_items() selection.sort(key=lambda x: x.get_indices()[0]) data = [] for path in selection: it = model.get_iter(path) data.append(model.get_value(it, 0).serialize()) if data: data = '\n;\n'.join(data) if add_hash: h = hashlib.sha256(data.encode('utf-8')).hexdigest() data = h + '\n' + data return data def paste_pages(self, data, before, ref_to, select_added): """Paste pages to iconview""" pageadder = PageAdder(self) if ref_to: pageadder.move(ref_to, before) if not before and ref_to: data.reverse() for d in data: pageadder.addpages(*d) return pageadder.commit(select_added, add_to_undomanager=True) def paste_files(self, filepaths, before, ref_to): """Paste files to iconview.""" pageadder = PageAdder(self) for filepath in filepaths: pageadder.move(ref_to, before) pageadder.addpages(filepath) pageadder.commit(select_added=False, add_to_undomanager=True) def paste_pages_interleave(self, data, before, ref_to): """Paste pages or files interleved to iconview.""" pageadder = PageAdder(self) model = self.iconview.get_model() scroll = len(model) > 0 iter_to = None iref = ref_to.get_path().get_indices()[0] if ref_to else 0 self.undomanager.commit("Paste") self.set_unsaved(True) for d in data: pageadder.addpages(*d) pageadder.move(ref_to, before) pageadder.commit(select_added=False, add_to_undomanager=False) if ref_to: path = ref_to.get_path() iter_to = model.get_iter(path) iter_to = model.iter_next(iter_to) if not before: iter_to = model.iter_next(iter_to) if iter_to: path = model.get_path(iter_to) ref_to = Gtk.TreeRowReference.new(model, path) else: ref_to = None if scroll: iscroll = iref if before else iref + 1 scroll_path = Gtk.TreePath.new_from_indices([iscroll]) self.iconview.scroll_to_path(scroll_path, False, 0, 0) def on_action_delete(self, _action, _parameter, _unknown): """Removes the selected elements in the IconView""" self.clear_selected() def on_action_cut(self, _action, _param, _unknown): """Cut selected pages to clipboard.""" data = self.copy_pages() self.clipboard.set_text('pdfarranger-clipboard\n' + data, -1) self.clear_selected() self.window.lookup_action("paste").set_enabled(True) def on_action_copy(self, _action, _param, _unknown): """Copy selected pages to clipboard.""" data = self.copy_pages() self.clipboard.set_text('pdfarranger-clipboard\n' + data, -1) self.window.lookup_action("paste").set_enabled(True) def on_action_paste(self, _action, mode, _unknown): """Paste pages, file paths or an image from clipboard.""" data, data_is_filepaths = self.read_from_clipboard() if not data: return pastemodes = {0: 'AFTER', 1: 'BEFORE', 2: 'ODD', 3: 'EVEN', 4: 'OVERLAY', 5: 'UNDERLAY'} pastemode = pastemodes[mode.get_int32()] ref_to, before = self.set_paste_location(pastemode, data_is_filepaths) if pastemode in ['AFTER', 'BEFORE']: if data_is_filepaths: self.paste_files(data, before, ref_to) else: self.paste_pages(data, before, ref_to, select_added=False) elif pastemode in ['ODD', 'EVEN']: if data_is_filepaths: # Generate data to send to paste_pages_interleave filepaths = [] try: for filepath in data: filemime = mimetypes.guess_type(filepath)[0] if not filemime: raise PDFDocError(filepath + ':\n' + _('Unknown file format')) if filemime == 'application/pdf': num_pages = exporter.num_pages(filepath) if num_pages is None: raise PDFDocError(filepath + ':\n' + _('PDF document is damaged')) for page in range(1, num_pages + 1): filepaths.append((filepath, page)) elif filemime.split('/')[0] == 'image': filepaths.append((filepath, 1)) else: raise PDFDocError(filepath + ':\n' + _('File is neither pdf nor image')) except PDFDocError as e: print(e.message, file=sys.stderr) self.error_message_dialog(e.message) return data = filepaths self.paste_pages_interleave(data, before, ref_to) self.update_iconview_geometry() GObject.idle_add(self.retitle) self.iv_selection_changed_event() self.update_max_zoom_level() self.silent_render() elif pastemode in ['OVERLAY', 'UNDERLAY'] and not data_is_filepaths: selection = self.iconview.get_selected_items() self.paste_as_layer(data, selection, laypos=pastemode) def paste_as_layer(self, data, destination, laypos, offset_xy=None): page_stack = [] pageadder = PageAdder(self) for filename, npage, _basename, angle, scale, crop, layerdata in data: d = [[filename, npage, angle, scale, laypos, crop, [0] * 4]] + layerdata page_stack.append(pageadder.get_layerpages(d)) if page_stack[-1] is None: return if not self.is_paste_layer_available(destination): return dpage = self.model[destination[-1]][0] lpage = page_stack[0][0] if offset_xy is None: offset_xy = pageutils.PastePageLayerDialog(self, dpage, lpage, laypos).get_offset() if offset_xy is None: return self.undomanager.commit("Add Layer") self.set_unsaved(True) off_x, off_y = offset_xy # Fraction of the page size differance at left & top for num, row in enumerate(reversed(destination)): dpage = self.model[row][0] layerpage_stack = page_stack[num % len(page_stack)] # Add the "main" pasted page lp0 = layerpage_stack[0].duplicate() dwidth, dheight = dpage.size[0] * dpage.scale, dpage.size[1] * dpage.scale scalex = (dpage.width_in_points() - lp0.width_in_points()) / dwidth scaley = (dpage.height_in_points() - lp0.height_in_points()) / dheight lp0.offset[0] = dpage.crop[0] + off_x * scalex lp0.offset[1] = 1 - lp0.offset[0] - lp0.width_in_points() / dwidth lp0.offset[2] = dpage.crop[2] + off_y * scaley lp0.offset[3] = 1 - lp0.offset[2] - lp0.height_in_points() / dheight dpage.layerpages.append(lp0) # Add layers from the pasted page nfirst = len(dpage.layerpages) - 1 scalex = (lp0.size[0] * lp0.scale) / (dpage.size[0] * dpage.scale) scaley = (lp0.size[1] * lp0.scale) / (dpage.size[1] * dpage.scale) sm1 = [scalex, scalex, scaley, scaley] for lp in layerpage_stack[1:]: lp = lp.duplicate() scalex = (lp0.size[0] * lp0.scale) / (lp.size[0] * lp.scale) scaley = (lp0.size[1] * lp0.scale) / (lp.size[1] * lp.scale) sm2 = [scalex, scalex, scaley, scaley] for i in range(4): # left, right, top, bottom # Crop layer area outside of the old parent mediabox outside = max(0, lp0.crop[i] - lp.offset[i]) lp.crop[i] += outside * sm2[i] lp.offset[i] += outside # Recalculate the offset relative to the new destination page lp.offset[i] = lp0.offset[i] + (lp.offset[i] - lp0.crop[i]) * sm1[i] if lp.crop[0] + lp.crop[1] > 1 or lp.crop[2] + lp.crop[3] > 1: # The layer is outside of the visible area continue # Mark as OVERLAY or UNDERLAY and add the layer at right place in stack if lp.laypos != laypos: lp.laypos = laypos dpage.layerpages.insert(nfirst, lp) else: dpage.layerpages.append(lp) dpage.resample = -1 self.silent_render() def is_paste_layer_available(self, selection): if len(selection) == 0: return False if not layer_support: msg = _("Pikepdf >= 3 is needed for overlay/underlay/merge support.") self.error_message_dialog(msg) return layer_support def read_from_clipboard(self): """Read and pre-process data from clipboard. If an image is found it is stored as a temporary png file. If id "pdfarranger-clipboard" is found pages is expected to be in clipboard, else file paths. """ if len(img2pdf_supported_img) > 0 and self.clipboard.wait_is_image_available(): data_is_filepaths = True image = self.clipboard.wait_for_image() if image is None: data = '' else: fd, filename = tempfile.mkstemp(suffix=".png", dir=self.tmp_dir) os.close(fd) image.savev(filename, "png", [], []) data = [filename] else: data = self.clipboard.wait_for_text() if not data: data = '' data_is_filepaths = False if data.startswith('pdfarranger-clipboard\n'): data = data.replace('pdfarranger-clipboard\n', '', 1) try: copy_hash = data[:data.index('\n')] except ValueError: copy_hash = None else: data = data.replace(copy_hash + '\n', '', 1) paste_hash = hashlib.sha256(data.encode('utf-8')).hexdigest() if copy_hash is not None and copy_hash == paste_hash: data = self.deserialize(data.split('\n;\n')) else: message = _("Pasted data not valid. Aborting paste.") self.error_message_dialog(message) data = [] else: data_is_filepaths = True if os.name == 'posix' and data.startswith('x-special/nautilus-clipboard\ncopy'): data = data.replace('x-special/nautilus-clipboard\ncopy', '', 1) rows = data.split('\n') rows = filter(None, rows) data = [] for row in rows: if os.name == 'posix' and row.startswith('file:///'): # Dolphin, Nautilus row = get_file_path_from_uri(row) elif os.name == 'nt' and row.startswith('"') and row.endswith('"'): row = row[1:-1] if os.path.isfile(row): data.append(row) else: data = [] break return data, data_is_filepaths @staticmethod def deserialize(data): """Deserialize data from copy & paste or drag & drop operation.""" d = [] while data: tmp = data.pop(0).split('\n') filename = tmp[0] npage = int(tmp[1]) if len(tmp) < 3: # Only when paste files interleaved d.append((filename, npage)) else: basename = tmp[2] angle = int(tmp[3]) scale = float(tmp[4]) crop = [float(side) for side in tmp[5:9]] layerdata = [] i = 9 while i < len(tmp): # If page has overlay/underlay lfilename = tmp[i] lnpage = int(tmp[i + 1]) langle = int(tmp[i + 2]) lscale = float(tmp[i + 3]) laypos = tmp[i + 4] lcrop = [float(side) for side in tmp[i + 5:i + 9]] loffset = [float(offs) for offs in tmp[i + 9:i + 13]] layerdata.append([lfilename, lnpage, langle, lscale, laypos, lcrop, loffset]) i += 13 d.append((filename, npage, basename, angle, scale, crop, layerdata)) return d def set_paste_location(self, pastemode, data_is_filepaths): """Sets reference where pages should be pasted and if before or after that.""" model = self.iconview.get_model() selection = self.iconview.get_selected_items() selection.sort(key=lambda x: x.get_indices()[0]) if len(model) == 0: before = True ref_to = None elif pastemode == 'AFTER': last_row = model[-1] if len(selection) == 0 or selection[-1] == last_row.path: before = False ref_to = None elif data_is_filepaths: before = True path = selection[-1] iter_next = model.iter_next(model.get_iter(path)) path_next = model.get_path(iter_next) ref_to = Gtk.TreeRowReference.new(model, path_next) else: before = False ref_to = Gtk.TreeRowReference.new(model, selection[-1]) else: if pastemode == 'EVEN': before = False else: # BEFORE or ODD before = True if len(selection) == 0: ref_to = Gtk.TreeRowReference.new(model, Gtk.TreePath(0)) else: ref_to = Gtk.TreeRowReference.new(model, selection[0]) return ref_to, before def on_action_select(self, _action, option, _unknown): """Selects items according to selected option.""" selectoptions = {0: 'ALL', 1: 'DESELECT', 2: 'ODD', 3: 'EVEN', 4: 'SAME_FILE', 5: 'SAME_FORMAT', 6:'INVERT'} selectoption = selectoptions[option.get_int32()] model = self.iconview.get_model() with GObject.signal_handler_block(self.iconview, self.id_selection_changed_event): if selectoption == 'ALL': self.iconview.select_all() elif selectoption == 'DESELECT': self.iconview.unselect_all() elif selectoption == 'ODD': for page_number, row in enumerate(model, start=1): if page_number % 2: self.iconview.select_path(row.path) else: self.iconview.unselect_path(row.path) elif selectoption == 'EVEN': for page_number, row in enumerate(model, start=1): if page_number % 2: self.iconview.unselect_path(row.path) else: self.iconview.select_path(row.path) elif selectoption == 'SAME_FILE': selection = self.iconview.get_selected_items() copynames = set(model[row][0].copyname for row in selection) for page_number, row in enumerate(model): if model[page_number][0].copyname in copynames: self.iconview.select_path(row.path) elif selectoption == 'SAME_FORMAT': selection = self.iconview.get_selected_items() formats = set(model[row][0].size_in_points() for row in selection) # Chop digits to detect same page format on rotated cropped pages formats = [(round(w, 8), round(h, 8)) for (w, h) in formats] for row in model: page = model[row.path][0] w, h = page.size_in_points() if (round(w, 8), round(h, 8)) in formats: self.iconview.select_path(row.path) elif selectoption == 'INVERT': for row in model: if self.iconview.path_is_selected(row.path): self.iconview.unselect_path(row.path) else: self.iconview.select_path(row.path) self.iv_selection_changed_event() @staticmethod def iv_drag_begin(iconview, context): """Sets custom drag icon.""" selected_count = len(iconview.get_selected_items()) stock_icon = "gtk-dnd-multiple" if selected_count > 1 else "gtk-dnd" iconview.stop_emission('drag_begin') Gtk.drag_set_icon_name(context, stock_icon, 16, 16) def iv_dnd_get_data(self, _iconview, _context, selection_data, _target_id, _etime): """Handles requests for data by drag and drop in iconview""" target = str(selection_data.get_target()) if target == 'MODEL_ROW_INTERN': self.target_is_intern = True selection = self.iconview.get_selected_items() selection.sort(key=lambda x: x.get_indices()[0]) data = [] for path in selection: data.append(str(path[0])) if data: data = '\n;\n'.join(data) elif target == 'MODEL_ROW_EXTERN': self.target_is_intern = False data = self.copy_pages(add_hash=False) else: return selection_data.set(selection_data.get_target(), 8, data.encode()) def iv_dnd_received_data(self, iconview, context, _x, _y, selection_data, _target_id, etime): """Handles received data by drag and drop in iconview""" model = iconview.get_model() data = selection_data.get_data() if not data: return data = data.decode().split('\n;\n') if self.drag_path and len(model) > 0: ref_to = Gtk.TreeRowReference.new(model, self.drag_path) else: ref_to = None before = self.drag_pos == Gtk.IconViewDropPosition.DROP_LEFT target = selection_data.get_target().name() if target == 'MODEL_ROW_INTERN': move = context.get_selected_action() & Gdk.DragAction.MOVE self.undomanager.commit("Move" if move else "Copy") self.set_unsaved(True) data.sort(key=int, reverse=not before) ref_from_list = [Gtk.TreeRowReference.new(model, Gtk.TreePath(p)) for p in data] iter_to = self.model.get_iter(ref_to.get_path()) with self.render_lock(): for ref_from in ref_from_list: iterator = model.get_iter(ref_from.get_path()) page = model.get_value(iterator, 0).duplicate() if before: it = model.insert_before(iter_to, [page, page.description()]) else: it = model.insert_after(iter_to, [page, page.description()]) path = model.get_path(it) iconview.select_path(path) if move: for ref_from in ref_from_list: model.remove(model.get_iter(ref_from.get_path())) GObject.idle_add(self.render) elif target == 'MODEL_ROW_EXTERN': data = self.deserialize(data) changed = self.paste_pages(data, before, ref_to, select_added=True) if changed and context.get_selected_action() & Gdk.DragAction.MOVE: context.finish(True, True, etime) def iv_dnd_data_delete(self, _widget, _context): """Delete pages from a pdfarranger instance after they have been moved to another instance.""" if self.target_is_intern and os.name == 'nt': # Workaround for windows # On Windows this method is in some situations triggered even for drag & drop # within the same pdfarranger instance return selection = self.iconview.get_selected_items() self.undomanager.commit("Move") self.set_unsaved(True) model = self.iconview.get_model() ref_del_list = [Gtk.TreeRowReference.new(model, path) for path in selection] with self.render_lock(): for ref_del in ref_del_list: path = ref_del.get_path() model.remove(model.get_iter(path)) self.update_iconview_geometry() GObject.idle_add(self.render) malloc_trim() def iv_dnd_motion(self, iconview, context, x, y, etime): """Handles drag motion: autoscroll, select move or copy, select drag cursor location.""" # Block dnd when a modal dialog is open for w in self.window.list_toplevels(): if w.get_modal(): iconview.stop_emission('drag_motion') return Gdk.EVENT_PROPAGATE x, y = iconview.convert_widget_to_bin_window_coords(x, y) # Auto-scroll when drag up/down self.iv_autoscroll(x, y, autoscroll_area=40) # Select move or copy dragAction drag_move_posix = os.name == 'posix' and context.get_actions() & Gdk.DragAction.MOVE drag_move_nt = os.name == 'nt' and not keyboard.is_pressed('control') if drag_move_posix or drag_move_nt: Gdk.drag_status(context, Gdk.DragAction.MOVE, etime) else: Gdk.drag_status(context, Gdk.DragAction.COPY, etime) # By default 5 drag & drop positions are possible: into, left, right, above and below. # We override default behaviour and only allow drag & drop to left or right. # When drag location is a valid drop location True is returned. model = iconview.get_model() if len(model) == 0: return Gdk.EVENT_STOP cell_width, _cell_height = self.cellthmb.get_fixed_size() row_distance = iconview.get_row_spacing() + 2 * iconview.get_item_padding() column_distance = iconview.get_column_spacing() + 2 * iconview.get_item_padding() search_positions = [('XY', x, y), ('Right', x + column_distance / 2, y), ('Left', x - column_distance / 2, y), ('Below', x, y + row_distance / 2), ('Above', x, y - row_distance / 2), ('Left-Above', x - column_distance, y - row_distance), ('Right-Far', x + cell_width, y), ('Left-Far', x - cell_width, y), ('Right-Below-Far', x + cell_width, y + row_distance), ('Left-Below-Far', x - cell_width, y + row_distance), ('Below-Far', x, y + row_distance)] for search_pos, x_s, y_s in search_positions: path = iconview.get_path_at_pos(x_s, y_s) if path: break if search_pos in ['XY', 'Right', 'Left', 'Below', 'Above']: self.drag_path = path if path == iconview.get_path_at_pos(x_s + cell_width * 0.6, y_s): self.drag_pos = Gtk.IconViewDropPosition.DROP_LEFT elif path == iconview.get_path_at_pos(x_s - cell_width * 0.6, y_s): self.drag_pos = Gtk.IconViewDropPosition.DROP_RIGHT elif search_pos == 'Left-Above' and iconview.get_drag_dest_item()[0]: return Gdk.EVENT_STOP elif not path or (path == model[-1].path and x_s < x): self.drag_path = model[-1].path self.drag_pos = Gtk.IconViewDropPosition.DROP_RIGHT else: iconview.stop_emission('drag_motion') return Gdk.EVENT_PROPAGATE iconview.set_drag_dest_item(self.drag_path, self.drag_pos) return Gdk.EVENT_STOP def iv_autoscroll(self, x, y, autoscroll_area): """Iconview auto-scrolling.""" sw_vadj = self.sw.get_vadjustment() if y < sw_vadj.get_value() + autoscroll_area: if not self.iv_auto_scroll_timer: self.iv_auto_scroll_timer = GObject.timeout_add(150, self.iv_auto_scroll, 'UP') elif y > sw_vadj.get_page_size() + sw_vadj.get_value() - autoscroll_area: if not self.iv_auto_scroll_timer: self.iv_auto_scroll_timer = GObject.timeout_add(150, self.iv_auto_scroll, 'DOWN') elif self.iv_auto_scroll_timer: GObject.source_remove(self.iv_auto_scroll_timer) self.iv_auto_scroll_timer = None def iv_dnd_leave_end(self, _widget, _context, _ignored=None): """Ends the auto-scroll during DND""" if self.iv_auto_scroll_timer: GObject.source_remove(self.iv_auto_scroll_timer) self.iv_auto_scroll_timer = None def iv_auto_scroll(self, direction): """Timeout routine for auto-scroll""" sw_vadj = self.sw.get_vadjustment() step = sw_vadj.get_step_increment() step = -step if direction == "UP" else step with GObject.signal_handler_block(self.iconview, self.id_selection_changed_event): sw_vadj.set_value(sw_vadj.get_value() + step) if not self.click_path: changed = self.iv_drag_select.motion(step=step) if changed: self.iv_selection_changed_event() return True # call me again def iv_motion(self, iconview, event): """Manages mouse movement on the iconview.""" # Pan the view when pressing mouse wheel and moving mouse if event.state & Gdk.ModifierType.BUTTON2_MASK: self.iv_pan_view.motion(event) # Detect drag and drop events if self.pressed_button: if iconview.drag_check_threshold(self.pressed_button.x, self.pressed_button.y, event.x, event.y): iconview.drag_begin_with_coordinates(Gtk.TargetList.new(self.TARGETS_IV), Gdk.DragAction.COPY | Gdk.DragAction.MOVE, self.pressed_button.button, event, -1, -1) self.pressed_button = None # Drag-select when clicking between items and dragging mouse if event.state & Gdk.ModifierType.BUTTON1_MASK and self.iv_drag_select.click_location: self.iv_autoscroll(event.x, event.y, autoscroll_area=4) if not self.click_path: with GObject.signal_handler_block(iconview, self.id_selection_changed_event): changed = self.iv_drag_select.motion(event) if changed: self.iv_selection_changed_event() def iv_button_release_event(self, iconview, event): """Manages mouse releases on the iconview""" if self.end_rubberbanding: self.end_rubberbanding = False return self.iv_drag_select.end() self.iv_pan_view.end() if self.pressed_button: # Button was pressed and released on a previously selected item # without causing a drag and drop. path = iconview.get_path_at_pos(event.x, event.y) if not path: return if event.state & Gdk.ModifierType.CONTROL_MASK: # Deselect the clicked item. iconview.unselect_path(path) else: # Deselect everything except the clicked item. iconview.unselect_all() iconview.select_path(path) self.pressed_button = None # Stop drag-select autoscrolling when button is released if self.iv_auto_scroll_timer: GObject.source_remove(self.iv_auto_scroll_timer) self.iv_auto_scroll_timer = None def iv_button_press_event(self, iconview, event): """Manages mouse clicks on the iconview""" # Switch between zoom_fit and zoom_set on double-click if event.button == 1 and event.type == Gdk.EventType._2BUTTON_PRESS and self.click_path: self.pressed_button = None self.on_action_zoom_fit() return Gdk.EVENT_STOP # Change to 'move' cursor when pressing mouse wheel if event.button == 2: self.iv_pan_view.click(event) click_path_old = self.click_path self.click_path = iconview.get_path_at_pos(event.x, event.y) # On shift-click, select all items from cursor up to the shift-clicked item. # On shift-ctrl-click, toggle selection for single items. # IconView's built-in multiple-selection mode performs rubber-band # (rectangular) selection, which is not what we want. We override # it by handling the shift-click here. if event.button == 1 and self.click_path and event.state & Gdk.ModifierType.SHIFT_MASK: cursor_path = iconview.get_cursor()[1] if event.state & Gdk.ModifierType.CONTROL_MASK: if iconview.path_is_selected(self.click_path): iconview.unselect_path(self.click_path) else: iconview.select_path(self.click_path) elif cursor_path: i_cursor = cursor_path[0] i_click = self.click_path[0] i_click_old = click_path_old[0] if click_path_old else i_click range_start = min(i_cursor, i_click, i_click_old) range_end = max(i_cursor, i_click, i_click_old) with GObject.signal_handler_block(iconview, self.id_selection_changed_event): for i in range(range_start, range_end + 1): path = Gtk.TreePath.new_from_indices([i]) if min(i_cursor, i_click) <= i <= max(i_cursor, i_click): iconview.select_path(path) else: iconview.unselect_path(path) self.iv_selection_changed_event() return Gdk.EVENT_STOP # Forget where cursor was when shift was pressed if event.button == 1 and not event.state & Gdk.ModifierType.SHIFT_MASK: self.iv_cursor.sel_start_page = None # Do not deselect when clicking an already selected item for drag and drop if event.button == 1: selection = iconview.get_selected_items() if self.click_path and self.click_path in selection: self.pressed_button = event if iconview.get_cursor()[1] != self.click_path: self.iconview.set_cursor(self.click_path, None, False) return Gdk.EVENT_STOP # prevent propagation i.e. (de-)selection # Display right click menu if event.button == 3 and not self.iv_auto_scroll_timer: self.iv_drag_select.end() self.iv_pan_view.end() if self.click_path: selection = iconview.get_selected_items() if self.click_path not in selection: iconview.unselect_all() iconview.select_path(self.click_path) else: iconview.unselect_all() iconview.grab_focus() self.popup.popup(None, None, None, None, event.button, event.time) return Gdk.EVENT_STOP # Go into drag-select mode if clicked between items if not self.click_path: if event.button == 1: self.iv_drag_select.click(event) if event.state & Gdk.ModifierType.SHIFT_MASK: return Gdk.EVENT_STOP # Don't deselect all # Let iconview hide cursor. Then stop rubberbanding with the release event self.end_rubberbanding = True release_event = event.copy() release_event.type = Gdk.EventType.BUTTON_RELEASE release_event.put() return Gdk.EVENT_PROPAGATE def iv_key_press_event(self, iconview, event): """Manages keyboard press events on the iconview.""" if event.state & Gdk.ModifierType.BUTTON1_MASK: return Gdk.EVENT_STOP if event.keyval in [Gdk.KEY_Up, Gdk.KEY_Down, Gdk.KEY_Left, Gdk.KEY_Right, Gdk.KEY_Home, Gdk.KEY_End, Gdk.KEY_Page_Up, Gdk.KEY_Page_Down, Gdk.KEY_KP_Page_Up, Gdk.KEY_KP_Page_Down]: # Move cursor, select pages and scroll with navigation keys with GObject.signal_handler_block(iconview, self.id_selection_changed_event): self.iv_cursor.handler(iconview, event) self.iv_selection_changed_event(None, move_cursor_event=True) return Gdk.EVENT_STOP return Gdk.EVENT_PROPAGATE def iv_selection_changed_event(self, _iconview=None, move_cursor_event=False): selection = self.iconview.get_selected_items() ne = len(selection) > 0 for a, e in [ ("reverse-order", self.reverse_order_available(selection)), ("delete", ne), ("duplicate", ne), ("page-format", ne), ("rotate", ne), ("export-selection", ne), ("cut", ne), ("copy", ne), ("split", ne), ("merge", ne), ("select-same-file", ne), ("select-same-format", ne), ("crop-white-borders", ne), ("generate-booklet", ne), ]: self.window.lookup_action(a).set_enabled(e) self.update_statusbar() if selection and not move_cursor_event: self.iv_cursor.cursor_is_visible = False def window_focus_in_out_event(self, _widget=None, _event=None): """Keyboard focus enter or leave window.""" # Enable or disable paste actions based on clipboard content text = self.clipboard.wait_is_text_available() image = len(img2pdf_supported_img) > 0 and self.clipboard.wait_is_image_available() if self.window.lookup_action("paste"): # Prevent error when closing with Alt+F4 if self.sw.is_sensitive(): self.window.lookup_action("paste").set_enabled(text or image) def sw_dnd_received_data(self, _scrolledwindow, _context, _x, _y, selection_data, target_id, _etime): """Handles received data by drag and drop in scrolledwindow""" if target_id == self.TEXT_URI_LIST: pageadder = PageAdder(self) model = self.iconview.get_model() ref_to = None before = True if len(model) > 0: last_row = model[-1] if self.drag_pos == Gtk.IconViewDropPosition.DROP_LEFT: ref_to = Gtk.TreeRowReference.new(model, self.drag_path) elif self.drag_path != last_row.path: iter_next = model.iter_next(model.get_iter(self.drag_path)) path_next = model.get_path(iter_next) ref_to = Gtk.TreeRowReference.new(model, path_next) pageadder.move(ref_to, before) for uri in selection_data.get_uris(): filename = get_file_path_from_uri(uri) pageadder.addpages(filename) pageadder.commit(select_added=False, add_to_undomanager=True) self.iv_selection_changed_event() def sw_button_press_event(self, _scrolledwindow, event): """Unselects all items in iconview on mouse click in scrolledwindow""" # TODO most likely unreachable code if event.button == 1: self.iconview.unselect_all() def sw_scroll_event(self, _scrolledwindow, event): """Manages mouse scroll events in scrolledwindow""" if event.state & Gdk.ModifierType.SHIFT_MASK: # Scroll horizontally return Gdk.EVENT_PROPAGATE if event.direction == Gdk.ScrollDirection.SMOOTH: dy = event.get_scroll_deltas()[2] if dy < 0: direction = 'UP' elif dy > 0: direction = 'DOWN' else: return Gdk.EVENT_PROPAGATE elif event.direction == Gdk.ScrollDirection.UP: direction = 'UP' elif event.direction == Gdk.ScrollDirection.DOWN: direction = 'DOWN' else: return Gdk.EVENT_PROPAGATE if event.state & Gdk.ModifierType.CONTROL_MASK: # Zoom zoom_delta = 1 if direction == 'UP' else -1 self.zoom_set(self.zoom_level + zoom_delta) else: #Scroll. Also drag-select if mouse button is pressed sw_vadj = self.sw.get_vadjustment() step = sw_vadj.get_step_increment() step = -step if direction == 'UP' else step with GObject.signal_handler_block(self.iconview, self.id_selection_changed_event): sw_vadj.set_value(sw_vadj.get_value() + step) if event.state & Gdk.ModifierType.BUTTON1_MASK: changed = self.iv_drag_select.motion(event, step=step) if changed: self.iv_selection_changed_event() return Gdk.EVENT_STOP def enable_zoom_buttons(self, out_enable, in_enable): if self.window.lookup_action("zoom-out"): self.window.lookup_action("zoom-out").set_enabled(out_enable) self.window.lookup_action("zoom-in").set_enabled(in_enable) def update_max_zoom_level(self): """Update upper zoom level limit so thumbnails are max 6000000 pixels.""" if len(self.model) == 0: return max_pixels = 6000000 # 6000000 pixels * 4 byte/pixel -> 23Mb max_page_size = max(p.width_in_points() * p.height_in_points() for p, _ in self.model) max_zoom_scale = (max_pixels / max_page_size) ** .5 self.zoom_level_limits[1] = min(int(log(max_zoom_scale / .2) / log(1.1)), 80) self.zoom_set(self.zoom_level) def zoom_set(self, level): """Sets the zoom level""" lower, upper = self.zoom_level_limits level = min(max(level, lower), upper) self.enable_zoom_buttons(level != lower, level != upper) if self.zoom_level == level: return self.vadj_percent_handler(store=True) self.zoom_level = level self.zoom_scale = 0.2 * (1.1 ** level) if self.id_scroll_to_sel: GObject.source_remove(self.id_scroll_to_sel) self.zoom_fit_page = False self.quit_rendering() # For performance reasons for row in self.model: row[0].zoom = self.zoom_scale if len(self.model) > 0: self.update_iconview_geometry() self.model[0][0] = self.model[0][0] # Let iconview refresh itself self.id_scroll_to_sel = GObject.timeout_add(400, self.scroll_to_selection) self.silent_render() def zoom_fit(self, path): """Zoom and scroll to path.""" item_padding = self.iconview.get_item_padding() cell_image_renderer, cell_text_renderer = self.iconview.get_cells() image_padding = cell_image_renderer.get_padding() text_rect = self.iconview.get_cell_rect(path, cell_text_renderer)[1] text_rect_height = text_rect.height # cell_text_renderer padding is included here border_and_shadow = 7 # 2*th1+th2 set in iconview.py cell_extraX = 2 * (item_padding + image_padding[0]) + border_and_shadow cell_extraY = 2 * (item_padding + image_padding[1]) + text_rect_height + border_and_shadow sw_width = self.sw.get_allocated_width() sw_height = self.sw.get_allocated_height() page_width = max(p.width_in_points() for p, _ in self.model) page_height = max(p.height_in_points() for p, _ in self.model) margins = 12 # leave 6 pixel at left and 6 pixel at right zoom_scaleX_new = max(1, (sw_width - cell_extraX - margins)) / page_width zoom_scaleY_new = max(1, (sw_height - cell_extraY)) / page_height zoom_scale = min(zoom_scaleY_new, zoom_scaleX_new) lower, upper = self.zoom_level_limits self.zoom_level = min(max(int(log(zoom_scale / .2) / log(1.1)), lower), upper) if self.zoom_level in [lower, upper]: zoom_scale = 0.2 * (1.1 ** self.zoom_level) self.zoom_scale = zoom_scale self.enable_zoom_buttons(self.zoom_level != lower, self.zoom_level != upper) for page, _ in self.model: page.zoom = self.zoom_scale self.model[0][0] = self.model[0][0] self.update_iconview_geometry() self.iconview.scroll_to_path(path, True, 0.5, 0.5) def on_action_zoom_in(self, _action, _param, _unknown): self.zoom_set(self.zoom_level + 5) def on_action_zoom_out(self, _action, _param, _unknown): self.zoom_set(self.zoom_level - 5) def on_action_zoom_fit(self, _action=None, _param=None, _unknown=None): """Switch between zoom_fit and zoom_set.""" if len(self.model) == 0: return if self.zoom_fit_page: self.zoom_set(self.zoom_level_old) else: selection = self.iconview.get_selected_items() if len(selection) > 0: path = selection[-1] else: path = Gtk.TreePath.new_from_indices([self.get_visible_range2()[0]]) self.iconview.select_path(path) self.iconview.set_cursor(path, None, False) self.zoom_level_old = self.zoom_level self.zoom_fit_page = True self.zoom_fit(path) def on_action_fullscreen(self, _action, _param, _unknown): """Toggle fullscreen mode.""" header_bar = self.uiXML.get_object('header_bar') if header_bar.get_visible(): self.window.fullscreen() header_bar.hide() else: self.window.unfullscreen() header_bar.show() def scroll_to_selection(self): """Scroll iconview so that selection is in center of window.""" self.id_scroll_to_sel = None selection = self.iconview.get_selected_items() if len(selection) > 0: path = selection[len(selection) // 2] self.iconview.scroll_to_path(path, True, 0.5, 0.5) def rotate_page_action(self, _action, angle, _unknown): """Rotates the selected page in the IconView""" self.undomanager.commit("Rotate") angle = angle.get_int32() selection = self.iconview.get_selected_items() if self.rotate_page(selection, angle): self.set_unsaved(True) self.update_statusbar() def rotate_page(self, selection, angle): model = self.iconview.get_model() rotated = False page_width_old = max(p.width_in_points() for p, _ in self.model) page_height_old = max(p.height_in_points() for p, _ in self.model) for path in selection: treeiter = model.get_iter(path) p = model.get_value(treeiter, 0) if p.rotate(angle): rotated = True model.set_value(treeiter, 0, p) self.update_iconview_geometry() page_width_new = max(p.width_in_points() for p, _ in self.model) page_height_new = max(p.height_in_points() for p, _ in self.model) if page_width_old != page_width_new or page_height_old != page_height_new: self.scroll_to_selection() return rotated def split_pages(self, _action, _parameter, _unknown): """ Split selected pages """ diag = splitter.Dialog(self.window) leftcrops, topcrops = diag.run_get() if leftcrops is None or topcrops is None: return model = self.iconview.get_model() self.set_unsaved(True) self.undomanager.commit("Split") # selection is a list of 1-tuples, not in order selection = self.iconview.get_selected_items() selection.sort(key=lambda x: x.get_indices()[0]) ref_list = [Gtk.TreeRowReference.new(model, path) for path in selection] with self.render_lock(): for ref in ref_list: iterator = model.get_iter(ref.get_path()) page = model.get_value(iterator, 0) page.resample = -1 newpages = page.split(leftcrops, topcrops) for p in newpages: p.resample = -1 model.insert_after(iterator, [p, p.description()]) model.set_value(iterator, 0, page) self.update_iconview_geometry() self.iv_selection_changed_event() self.update_max_zoom_level() GObject.idle_add(self.render) def get_size_info(self, selection): sizes = [self.model[row][0].size_in_points() for row in reversed(selection)] max_width = max(s[0] for s in sizes) min_width = min(s[0] for s in sizes) max_height = max(s[1] for s in sizes) min_height = min(s[1] for s in sizes) equal = max_width == min_width and max_height == min_height return sizes, (max_width, max_height), equal def merge_pages(self, _action, _parameter, _unknown): """Merge selected pages.""" selection = self.iconview.get_selected_items() if not self.is_paste_layer_available(selection): return data = self.copy_pages(add_hash=False) data = self.deserialize(data.split('\n;\n')) sizes, max_size, equal = self.get_size_info(selection) r = pageutils.MergePagesDialog(self.window, max_size, equal).run_get() if r is None: return cols, rows, add_order, size = r self.undomanager.commit("Merge") self.set_unsaved(True) self.clear_selected() self.iconview.unselect_all() ndpage = selection[-1].get_indices()[0] before = ndpage < len(self.model) ref = Gtk.TreeRowReference.new(self.model, selection[-1]) if before else None wdpage, hdpage = size[0] * cols, size[1] * rows ndpages = -(len(data) // -(cols * rows)) file = exporter.create_blank_page(self.tmp_dir, (wdpage, hdpage), ndpages) adder = PageAdder(self) adder.move(ref, before) adder.addpages(file) with GObject.signal_handler_block(self.iconview, self.id_selection_changed_event): adder.commit(select_added=True, add_to_undomanager=False) nlpage = 0 while ndpage < len(self.model) and nlpage < len(data): for row, col in add_order: wlpage, hlpage = sizes[nlpage] wdiff, hdiff = wdpage - wlpage, hdpage - hlpage off_x = off_y = 0.5 if wdiff != 0: off_x = (col * wdpage / cols + 0.5 * wdpage / cols - wlpage / 2) / wdiff if hdiff != 0: off_y = (row * hdpage / rows + 0.5 * hdpage / rows - hlpage / 2) / hdiff dest = self.model[ndpage].path self.paste_as_layer([data[nlpage]], dest, 'OVERLAY', (off_x, off_y)) nlpage += 1 if nlpage > len(data) - 1: break ndpage += 1 self.update_iconview_geometry() self.iv_selection_changed_event() self.update_max_zoom_level() def edit_metadata(self, _action, _parameter, _unknown): files = [(pdf.copyname, pdf.password) for pdf in self.pdfqueue] if metadata.edit(self.metadata, files, self.window): self.set_unsaved(True) def page_format_dialog(self, _action, _parameter, _unknown): """Opens a dialog box to define margins for page cropping and page size""" selection = self.iconview.get_selected_items() diag = pageutils.Dialog(self.iconview.get_model(), selection, self.window) crop, newscale = diag.run_get() with self.render_lock(): if crop is not None or newscale is not None: self.undomanager.commit("Format") updatestatus = False if crop is not None: if self.crop(selection, crop): updatestatus = True if newscale is not None: if pageutils.scale(self.model, selection, newscale): updatestatus = True if updatestatus: self.set_unsaved(True) self.update_statusbar() self.update_iconview_geometry() self.update_max_zoom_level() GObject.idle_add(self.render) def crop_white_borders(self, _action, _parameter, _unknown): selection = self.iconview.get_selected_items() crop = pageutils.white_borders(self.iconview.get_model(), selection, self.pdfqueue) self.undomanager.commit("Crop white Borders") if self.crop(selection, crop): self.set_unsaved(True) self.update_statusbar() self.update_max_zoom_level() GObject.idle_add(self.render) def crop(self, selection, newcrop): changed = False model = self.iconview.get_model() for id_sel, path in enumerate(selection): pos = model.get_iter(path) page = model.get_value(pos, 0) if page.crop != list(newcrop[id_sel]): page.crop = list(newcrop[id_sel]) page.resample = -1 changed = True model.set_value(pos, 0, page) self.update_iconview_geometry() return changed def duplicate(self, _action, _parameter, _unknown): """Duplicates the selected elements""" self.set_unsaved(True) self.undomanager.commit("Duplicate") model = self.iconview.get_model() # selection is a list of 1-tuples, not in order selection = self.iconview.get_selected_items() selection.sort(key=lambda x: x.get_indices()[0]) ref_list = [Gtk.TreeRowReference.new(model, path) for path in selection] with self.render_lock(): for ref in ref_list: iterator = model.get_iter(ref.get_path()) page = model.get_value(iterator, 0).duplicate() model.insert_after(iterator, [page, page.description()]) self.iv_selection_changed_event() GObject.idle_add(self.render) @staticmethod def reverse_order_available(selection): """Determine whether the selection is suitable for the reverse-order command: the selection must be a multiple and contiguous range of pages. """ if len(selection) < 2: return False # selection is a list of 1-tuples, not in order indices = sorted([i[0] for i in selection]) first = indices[0] last = indices[-1] contiguous = (len(indices) == last - first + 1) return contiguous def reverse_order(self, _action, _parameter, _unknown): """Reverses the selected elements in the IconView""" model = self.iconview.get_model() selection = self.iconview.get_selected_items() # selection is a list of 1-tuples, not in order indices = sorted([i[0] for i in selection]) first = indices[0] last = indices[-1] self.set_unsaved(True) indices.reverse() new_order = list(range(first)) + indices + list(range(last + 1, len(model))) self.undomanager.commit("Reorder") with self.render_lock(): model.reorder(new_order) GObject.idle_add(self.render) def about_dialog(self, _action, _parameter, _unknown): about_dialog = Gtk.AboutDialog() about_dialog.set_transient_for(self.window) about_dialog.set_modal(True) about_dialog.set_name(APPNAME) about_dialog.set_program_name(APPNAME) about_dialog.set_version(VERSION) pike = pikepdf.__version__ qpdf = pikepdf.__libqpdf_version__ gtkv = "{}.{}.{}".format( Gtk.get_major_version(), Gtk.get_minor_version(), Gtk.get_micro_version() ) pyv = "{}.{}.{}".format( sys.version_info.major, sys.version_info.minor, sys.version_info.micro ) about_dialog.set_comments( "".join( ( _("%s is a tool for rearranging and modifying PDF files.") % APPNAME, "\n \n", _("It uses libqpdf %s, pikepdf %s, GTK %s and Python %s.") % (qpdf, pike, gtkv, pyv), ) ) ) about_dialog.set_authors(['Konstantinos Poulios']) about_dialog.add_credit_section(_('Maintainers and contributors'), [ 'https://github.com/pdfarranger/pdfarranger/graphs/contributors']) about_dialog.set_website(WEBSITE) about_dialog.set_website_label(WEBSITE) about_dialog.set_logo_icon_name(ICON_ID) about_dialog.set_license(_('GNU General Public License (GPL) Version 3.')) about_dialog.connect('response', lambda w, *args: w.destroy()) about_dialog.connect('delete_event', lambda w, *args: w.destroy()) about_dialog.show_all() def update_statusbar(self): selection = self.iconview.get_selected_items() selected_pages = sorted([p.get_indices()[0] + 1 for p in selection]) # Compact the representation of the selected page range jumps = [[l, r] for l, r in zip(selected_pages, selected_pages[1:]) if l + 1 < r] ranges = list(selected_pages[0:1] + sum(jumps, []) + selected_pages[-1:]) display = [] for lo, hi in zip(ranges[::2], ranges[1::2]): range_str = '{}-{}'.format(lo,hi) if lo < hi else '{}'.format(lo) display.append(range_str) ctxt_id = self.status_bar.get_context_id("selected_pages") num_pages = len(self.model) msg = _("Selected pages: ") + ", ".join(display) + " / " + str(num_pages) if len(selection) == 1: model = self.iconview.get_model() pagesize = model[selection[0]][0].size_in_points() pagesize = [x * 25.4 / 72 for x in pagesize] msg += " | "+_("Page Size:")+ " {:.1f}mm \u00D7 {:.1f}mm".format(*pagesize) self.status_bar.push(ctxt_id, msg) for a in ["save", "save-as", "select", "export-all", "zoom-fit", "print"]: self.window.lookup_action(a).set_enabled(num_pages > 0) def error_message_dialog(self, msg): error_msg_dlg = Gtk.MessageDialog(flags=Gtk.DialogFlags.MODAL, type=Gtk.MessageType.ERROR, parent=self.window, message_format=str(msg), buttons=Gtk.ButtonsType.OK) response = error_msg_dlg.run() if response == Gtk.ResponseType.OK: error_msg_dlg.destroy() def main(): PdfArranger().run(sys.argv) pdfarranger-1.10.1/pdfarranger/splitter.py000066400000000000000000000215551451252235000206070ustar00rootroot00000000000000# Copyright (C) 2020 pdfarranger contributors # # pdfarranger 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, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from gi.repository import Gtk import gettext _ = gettext.gettext class Dialog(Gtk.Dialog): """ A dialog box to split pages into a grid of pages""" def __init__(self, window): super().__init__( title=_("Split Pages"), parent=window, flags=Gtk.DialogFlags.MODAL, buttons=( "_Cancel", Gtk.ResponseType.CANCEL, "_OK", Gtk.ResponseType.OK, ), ) buttonbox = self.get_action_area() buttons = buttonbox.get_children() self.set_focus(buttons[1]) self.set_resizable(False) self.split_count = {'vertical' : 2, 'horizontal' : 1} self.even_splits = {'vertical' : True, 'horizontal' : True} self.vmodel = Gtk.ListStore(int, int) self.hmodel = Gtk.ListStore(int, int) self.model = {'vertical' : self.vmodel, 'horizontal' : self.hmodel} self.vspin = Gtk.SpinButton() self.hspin = Gtk.SpinButton() self.spinbuttons = {'vertical' : self.vspin, 'horizontal' : self.hspin} self.vcheck = Gtk.CheckButton() self.hcheck = Gtk.CheckButton() self.checkbuttons = {'vertical' : self.vcheck, 'horizontal' : self.hcheck} hbox = Gtk.HBox() self.vbox.pack_start(hbox, True, True, 0) for direction in ['vertical', 'horizontal']: frame = self._build_frame(direction) hbox.pack_start(frame, True, True, 0) self.show_all() def _build_frame(self, direction): frame_txt = {'vertical' : _("Columns"), 'horizontal' : _("Rows")} label_txt = {'vertical' : _("Vertical Splits"), 'horizontal' : _("Horizontal Splits")} checkbutton_txt = {'vertical' : _("Equal column width"), 'horizontal' : _("Equal row height")} frame = Gtk.Frame(label=frame_txt[direction]) frame.props.margin = 8 frame.props.margin_bottom = 0 grid = Gtk.Grid() frame.add(grid) label = Gtk.Label(label_txt[direction]) label.set_alignment(0.0, 0.5) label.props.margin = 8 label.props.margin_bottom = 6 grid.attach(label, 0, 0, width=1, height=1) adjustment = Gtk.Adjustment(value=self.split_count[direction], lower=1, upper=10, step_incr=1) self.spinbuttons[direction].set_adjustment(adjustment) self.spinbuttons[direction].connect("value-changed", self._update_split, direction) grid.attach(self.spinbuttons[direction], 1, 0, width=1, height=1) self.checkbuttons[direction].set_label(checkbutton_txt[direction]) self.checkbuttons[direction].set_active(True) self.checkbuttons[direction].connect("toggled", self._even_split_toggled, direction) grid.attach(self.checkbuttons[direction], 0, 1, width=2, height=1) treeview = self._build_model(direction) grid.attach(treeview, 0, 2, width=2, height=1) return frame def _build_model(self, direction): label1 = {'vertical' : _("#Col"), 'horizontal' : _("#Row")} label2 = {'vertical' : _("Width in %"), 'horizontal' : _("Height in %")} split_count = self.split_count[direction] for s in range(1, split_count + 1): self.model[direction].append([s, 100 // split_count]) treeview = Gtk.TreeView(model=self.model[direction]) cr = Gtk.CellRendererText() heading = Gtk.TreeViewColumn(label1[direction], cr, text=0) treeview.append_column(heading) cr = Gtk.CellRendererSpin() cr.connect("edited", self._edited, direction) cr.set_property("editable", True) adjustment = Gtk.Adjustment(value=100, lower=0, upper=100, step_increment=1) cr.set_property("adjustment", adjustment) heading = Gtk.TreeViewColumn(label2[direction], cr, text=1) treeview.append_column(heading) return treeview def _edited(self, widget, path, value, direction): # Avoid that a user bypasses the limits of the spin buttons # via keyboard input and pressing enter. value = min(max(0, int(value)), 100) if self.model[direction][path][1] == int(value): return if self.checkbuttons[direction].get_active(): # Populate all entries with the new value # The sum may exceed 100, allowing for overlap. crop_sum = len(self.model[direction]) * value if crop_sum >= 100: for i in range(len(self.model[direction])): self.model[direction][i][1] = value else: # Unevenly sized tiles. Fix the sum to match 100, # adjusting entries from bottom to top. self.model[direction][path][1] = value crop_sum = 0 for i in range(len(self.model[direction])): crop_sum += self.model[direction][i][1] delta = 100 - crop_sum cur_idx = int(path) for i in reversed(range(len(self.model[direction]))): if i != cur_idx: sign = delta/abs(delta) s = sign * min(abs(delta), self.model[direction][i][1]) self.model[direction][i][1] += s delta -= s if delta == 0: break def _update_split(self, _event, direction): self.split_count[direction] = self.spinbuttons[direction].get_value_as_int() if self.even_splits[direction]: self.model[direction].clear() # Partition evenly count = self.split_count[direction] frac = 100 // count partition = [frac] * (count - 1) partition.append(100 - (count - 1) * frac) for i, frac in enumerate(partition, start = 1): self.model[direction].append([i, frac]) else: delta = self.split_count[direction] - len(self.model[direction]) if delta > 0: # Add delta zero rows idx = len(self.model[direction]) + 1 for i in range(delta): self.model[direction].append([idx + i, 0]) if delta < 0: # Delete the last delta entries and ensure that the sum is 100 s = 0 for i in range(abs(delta)): s += self.model[direction][-1][1] del self.model[direction][-1] self.model[direction][-1][1] += s def _even_split_toggled(self, button, direction): self.even_splits[direction] = button.get_active() self._update_split(None, direction) def _crops(self, direction): # Convert the tile sizes into a list of tuples (start, end) such that # tile size = end - start. num_splits = len(self.model[direction]) crops = [(0, 0.01 * self.model[direction][0][1])] * num_splits crop_sum = 0.01 * self.model[direction][0][1] for i in range(1, num_splits): size = 0.01 * self.model[direction][i][1] crop_sum += size crops[i] = (crops[i-1][1], crops[i-1][1] + size) # Remove zero-sized tiles crops = [t for t in crops if t[0] < t[1]] overlap = crop_sum - 1.0 # nonnegative if overlap == 0.0: return crops # We have multiple splits and crop_sum > 1.0 # 35,35,35 => [0,35],[32.5,67.5],[65,100]; overlap = 5 # 60,60 => [0,60],[40,100]; overlap = 20 # In general: # [start=last-overlap/(num_splits-1),end=start+size] overlap_per_tile = overlap / (num_splits - 1) # Overlap is only defined when all tiles have the same size. size = 0.01 * self.model[direction][0][1] crops[0] = (0, size) for i in range(1, num_splits - 1): start = crops[i-1][1] - overlap_per_tile end = start + size crops[i] = (start, end) crops[-1] = (1.0 - size, 1.0) return crops def run_get(self): result = self.run() vcrops = None hcrops = None if result == Gtk.ResponseType.OK: vcrops = self._crops('vertical') hcrops = self._crops('horizontal') self.destroy() return vcrops, hcrops pdfarranger-1.10.1/pdfarranger/undo.py000066400000000000000000000070471451252235000177060ustar00rootroot00000000000000# Copyright (C) 2018-2019 Jerome Robert # # pdfarranger 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, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. """ undo/redo implemented with the memento design pattern. The memento pattern is simpler than the command pattern. Here the memory cost of memento is affordable because we only store snapshots of the GtkListStore object, not of the whole PDF files. """ class Manager(object): """ Stack of GtkListStore models (Memento design pattern) """ def __init__(self, app): self.app = app self.model = app.model self.states = [] #: label of the previous undoable action self.label = None #: id of the current state self.current = 0 self.undoaction = None self.redoaction = None def clear(self): self.states = [] self.label = None self.current = 0 def commit(self, label): """ Must be called *BEFORE* each undoable actions :param label: label of the action """ self.states = self.states[:self.current] self.states.append(([row[0].duplicate(False) for row in self.model], self.label,)) self.current += 1 self.label = label self.__refresh() def undo(self, _action, _param, _unused): if self.current == len(self.states): self.states.append(([row[0].duplicate(False) for row in self.model], self.label,)) state, self.label = self.states[self.current - 1] self.__set_state(state) self.current -= 1 self.app.set_unsaved(True) self.__refresh() def redo(self, _action, _param, _unused): state, self.label = self.states[self.current + 1] self.__set_state(state) self.current += 1 self.app.set_unsaved(True) self.__refresh() def set_actions(self, undo, redo): self.undoaction = undo self.redoaction = redo self.__refresh() def __set_state(self, state): self.app.quit_rendering() self.app.iconview.unselect_all() with self.app.render_lock(): self.model.clear() for page in state: # Do not reset the zoom level page.zoom = self.app.zoom_scale page.resample = -1 self.model.append([page, page.description()]) self.app.update_iconview_geometry() self.app.update_max_zoom_level() self.app.retitle() self.app.update_statusbar() self.app.silent_render() def __refresh(self): if self.undoaction: self.undoaction.set_enabled(self.current >= 1) if self.redoaction: self.redoaction.set_enabled(self.current + 1 < len(self.states)) # TODO: This is where to update the undo/redo menu items label to # show which action is going to be undone/redone. Because GtkImageMenuItem # will leads to many changes in translations this is currently postponed. pdfarranger-1.10.1/po/000077500000000000000000000000001451252235000145025ustar00rootroot00000000000000pdfarranger-1.10.1/po/POTFILES.in000066400000000000000000000001551451252235000162600ustar00rootroot00000000000000pdfarranger/pdfarranger.py pdfarranger/metadata.py pdfarranger/pageutils.py data/pdfarranger.ui data/menu.ui pdfarranger-1.10.1/po/ca.po000066400000000000000000000411521451252235000154300ustar00rootroot00000000000000# PDF Arranger - Catalan translation. # Copyright (C) 2021 # This file is distributed under the same license as the pdfarranger package. # Ícar Nin Solana , 2021. # msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-04-29 22:45+0200\n" "PO-Revision-Date: 2022-10-03 23:44+0200\n" "Last-Translator: Ícar N. S. \n" "Language-Team: \n" "Language: ca\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.1.1\n" #: pdfarranger/splitter.py:87 msgid "#Col" msgstr "#Col" #: pdfarranger/splitter.py:87 msgid "#Row" msgstr "#Fila" #: pdfarranger/pageutils.py:122 pdfarranger/pageutils.py:477 #: pdfarranger/pageutils.py:479 msgid "%" msgstr "%" #: pdfarranger/pageutils.py:170 #, python-format msgid "% of height" msgstr "% de l'alçada" #: pdfarranger/pageutils.py:170 #, python-format msgid "% of width" msgstr "% de l'amplada" #: pdfarranger/pdfarranger.py:2548 #, python-format msgid "%s is a tool for rearranging and modifying PDF files." msgstr "El %s és una eina per arranjar i modificar fitxers PDF." #: pdfarranger/config.py:232 msgid "(Libhandy missing)" msgstr "" #: pdfarranger/config.py:224 msgid "(Requires restart)" msgstr "" #: pdfarranger/pageutils.py:461 msgid "(same offset is applied to all pages)" msgstr "" #: pdfarranger/pdfarranger.py:1130 #, python-format msgid "A file named \"%s\" already exists. Do you want to replace it?" msgstr "" #: data/menu.ui:189 data/menu.ui:332 msgid "All From _Same File" msgstr "Tots del mateix fitxer" #: pdfarranger/pdfarranger.py:507 msgid "All files" msgstr "Tots els fitxers" #: pdfarranger/pdfarranger.py:462 msgid "All pages must have the same size." msgstr "Totes les pàgines han de tenir la mateixa mida." #: pdfarranger/pdfarranger.py:495 msgid "All supported files" msgstr "Tots els fitxers admesos" #: pdfarranger/pageutils.py:149 msgid "Bottom" msgstr "Inferior" #: pdfarranger/pageutils.py:380 msgid "Bottom to Top" msgstr "" #: pdfarranger/core.py:386 msgid "Clipboard image" msgstr "Imatge del porta-retalls" #: pdfarranger/pageutils.py:363 pdfarranger/splitter.py:60 msgid "Columns" msgstr "Columnes" #: pdfarranger/metadata.py:48 msgid "Created" msgstr "Creat" #: pdfarranger/metadata.py:46 msgid "Creator" msgstr "Creador" #: pdfarranger/metadata.py:47 msgid "Creator tool" msgstr "Eina creadora" #: pdfarranger/pageutils.py:153 msgid "Crop Margins" msgstr "Retalla els marges" #: data/menu.ui:104 data/menu.ui:365 msgid "Crop White Borders" msgstr "Escapça les vores blanques" #: pdfarranger/pageutils.py:161 msgid "" "Cropping does not remove any content from the PDF file, it only hides it." msgstr "Escapçar no elimina cap contingut del fitxer PDF, només l'oculta." #: data/menu.ui:128 data/menu.ui:264 msgid "Cu_t" msgstr "Retalla" #: pdfarranger/pdfarranger.py:1250 msgid "Despite the warnings the document(s) should have no visible issues." msgstr "Tot i els avisos, el document no hauria de tenir problemes visibles." #: pdfarranger/pdfarranger.py:979 msgid "Discard changes and close?" msgstr "Vol descartar els canvis i tancar?" #: pdfarranger/pdfarranger.py:1016 msgid "Discard changes and quit?" msgstr "Vol descartar els canvis i sortir?" #: pdfarranger/exporter.py:194 msgid "Do not show this dialog again." msgstr "No tornis a mostrar aquest diàleg." #: pdfarranger/pdfarranger.py:970 msgid "Do_n’t Save" msgstr "No desar" #: pdfarranger/pdfarranger.py:1257 msgid "Don't show warnings when saving again." msgstr "No mostris més avisos al desar." #: data/menu.ui:112 data/menu.ui:369 msgid "Dupl_icate" msgstr "Duplica" #: data/menu.ui:52 data/menu.ui:395 msgid "E_xport" msgstr "Exporta" #: data/menu.ui:55 data/menu.ui:398 msgid "E_xport Selection to a Single File…" msgstr "Exporta la selecció a un sol fitxer…" #: data/menu.ui:228 msgid "Edit _Properties" msgstr "Edita les propietats" #: pdfarranger/metadata.py:198 msgid "Edit properties" msgstr "Edita les propietats" #: pdfarranger/splitter.py:62 msgid "Equal column width" msgstr "Amplada igual de la columna" #: pdfarranger/splitter.py:62 msgid "Equal row height" msgstr "Alçada igual de la fila" #: data/menu.ui:60 data/menu.ui:403 msgid "Export Selection to _Individual Files…" msgstr "Exporta la selecció a fitxers individuals…" #: data/menu.ui:65 data/menu.ui:408 msgid "Export _All Pages to Individual Files…" msgstr "Exporta totes les pàgines a fitxers individuals…" #: pdfarranger/pdfarranger.py:1088 msgid "Export…" msgstr "Exporta…" #: pdfarranger/core.py:388 pdfarranger/pdfarranger.py:1504 msgid "File is neither pdf nor image" msgstr "El fitxer no és ni pdf ni imatge" #: pdfarranger/pdfarranger.py:301 msgid "File(s) to open" msgstr "Fitxer(s) a obrir" #: pdfarranger/config.py:237 msgid "For more options see:" msgstr "" #: pdfarranger/exporter.py:192 msgid "Forms and outlines are lost on saving." msgstr "Els formularis i els contorns es perden en desar." #: data/menu.ui:221 msgid "Full_screen" msgstr "_Pantalla completa" #: pdfarranger/pdfarranger.py:2562 msgid "GNU General Public License (GPL) Version 3." msgstr "Llicència Pública General GNU (GPL) Versió 3." #: data/menu.ui:160 data/menu.ui:389 msgid "Generate Booklet" msgstr "Genera un fullet" #: pdfarranger/pageutils.py:236 pdfarranger/pageutils.py:240 #: pdfarranger/pageutils.py:328 msgid "Height" msgstr "Alçada" #: pdfarranger/splitter.py:88 msgid "Height in %" msgstr "Alçada en %" #: pdfarranger/pageutils.py:375 msgid "Horizontal" msgstr "" #: pdfarranger/splitter.py:61 msgid "Horizontal Splits" msgstr "Divisions horitzontals" #: pdfarranger/pageutils.py:476 msgid "Horizontal offset" msgstr "" #: pdfarranger/core.py:377 msgid "Image files are only supported with img2pdf" msgstr "Els fitxers d'imatge només són compatibles amb img2pdf" #: pdfarranger/core.py:383 msgid "Image format is not supported by img2pdf" msgstr "El format de la imatge no està admès per img2pdf" #: data/pdfarranger.ui:58 msgid "Import" msgstr "Importa" #: pdfarranger/pdfarranger.py:1327 msgid "Import…" msgstr "Importa…" #: data/menu.ui:156 data/menu.ui:385 msgid "Insert Blan_k Page…" msgstr "Insereix una pàgina en blanc…" #: pdfarranger/pageutils.py:325 msgid "Insert Blank Page" msgstr "Insereix una pàgina en blanc" #: pdfarranger/metadata.py:169 msgid "Invalid date format. Input discarded." msgstr "Format de data no vàlid. S'ha descartat l'entrada." #: pdfarranger/pdfarranger.py:2551 #, python-format msgid "It uses libqpdf %s, pikepdf %s, GTK %s and Python %s." msgstr "Usa libqpdf %s, pikepdf %s, GTK %s i Python %s." #: pdfarranger/metadata.py:44 msgid "Keywords" msgstr "Paraules clau" #: pdfarranger/config.py:222 msgid "Language" msgstr "" #: pdfarranger/pageutils.py:460 msgid "Layout for the first page in selection" msgstr "" #: pdfarranger/pageutils.py:149 msgid "Left" msgstr "Esquerra" #: pdfarranger/pageutils.py:377 msgid "Left to Right" msgstr "" #: data/pdfarranger.ui:122 msgid "Main Menu" msgstr "Menú principal" #: pdfarranger/pdfarranger.py:2557 msgid "Maintainers and contributors" msgstr "Mantenidors i contribuïdors" #: pdfarranger/pageutils.py:361 msgid "Margin" msgstr "" #: pdfarranger/pageutils.py:347 msgid "Merge Pages" msgstr "" #: pdfarranger/pageutils.py:412 msgid "Merged page size:" msgstr "" #: pdfarranger/metadata.py:49 msgid "Modified" msgstr "Modificat" #: pdfarranger/pageutils.py:392 msgid "Non-uniform page size - using max size" msgstr "" #: data/pdfarranger.ui:37 msgid "Open" msgstr "Obre" #: pdfarranger/pdfarranger.py:1186 msgid "Open…" msgstr "Obre…" #: pdfarranger/pageutils.py:436 msgid "Overlay" msgstr "" #: pdfarranger/pdfarranger.py:282 msgid "" "PDF Arranger is a small python-gtk application, which helps the user to " "merge or split pdf documents and rotate, crop and rearrange their pages " "using an interactive and intuitive graphical interface. It is a frontend for " "pikepdf." msgstr "" "L'Arranjador de PDFs és una petita aplicació feta amb Python i GTK que ajuda " "l'usuari a fusionar o dividir documents PDF i girar, escapçar i reordenar " "les pàgines d'aquests mitjançant una interfície gràfica intuïtiva. És el " "frontal pel programari Pikepdf." #: pdfarranger/pdfarranger.py:1498 msgid "PDF document is damaged" msgstr "El document PDF està malmès" #: pdfarranger/pdfarranger.py:499 msgid "PDF files" msgstr "Fitxers PDF" #: pdfarranger/pageutils.py:388 msgid "Page Order" msgstr "" #: pdfarranger/pageutils.py:241 msgid "Page Size" msgstr "Mida de la pàgina" #: pdfarranger/pdfarranger.py:2585 msgid "Page Size:" msgstr "Mida de la pàgina:" #: pdfarranger/pageutils.py:230 msgid "Page format" msgstr "Format de la pàgina" #: pdfarranger/core.py:285 msgid "Password" msgstr "Contrasenya" #: pdfarranger/core.py:263 msgid "Password required" msgstr "Contrasenya requerida" #: data/menu.ui:277 msgid "Past_e Special" msgstr "Enganxament especial" #: data/menu.ui:295 msgid "Paste As O_verlay…" msgstr "" #: data/menu.ui:151 data/menu.ui:290 msgid "Paste As _Even Pages" msgstr "Enganxa com a pàgines parelles" #: data/menu.ui:146 data/menu.ui:285 msgid "Paste As _Odd Pages" msgstr "Enganxa com a pàgines senars" #: data/menu.ui:300 msgid "Paste As _Underlay…" msgstr "" #: data/menu.ui:136 data/menu.ui:272 msgid "Paste _After" msgstr "Enganxa després" #: data/menu.ui:141 data/menu.ui:280 msgid "Paste _Before" msgstr "Enganxa abans" #: pdfarranger/pdfarranger.py:1627 msgid "Pasted data not valid. Aborting paste." msgstr "Les dades enganxades no són vàlides. S'està avortant l'operació." #: pdfarranger/pdfarranger.py:1589 msgid "Pikepdf >= 3 is needed for overlay/underlay/merge support." msgstr "" #: data/menu.ui:234 msgid "Pre_ferences" msgstr "" #: pdfarranger/config.py:212 msgid "Preferences" msgstr "" #: pdfarranger/pdfarranger.py:293 msgid "Print the version of PDF Arranger and exit" msgstr "Imprimeix la versió de l'Arranjador de PDFs i surt" #: pdfarranger/exporter.py:457 msgid "Printing…" msgstr "Imprimint…" #: pdfarranger/metadata.py:45 msgid "Producer" msgstr "Productor" #: pdfarranger/metadata.py:212 msgid "Property" msgstr "Propietat" #: data/menu.ui:116 data/menu.ui:373 msgid "Re_verse Order" msgstr "Ordre invers" #: pdfarranger/pageutils.py:238 msgid "Relative" msgstr "Relatiu" #: pdfarranger/exporter.py:469 msgid "Rendering Preview…" msgstr "Renderitzant la previsualització…" #: pdfarranger/pdfarranger.py:732 msgid "Rendering…" msgstr "Renderitzant…" #: pdfarranger/pdfarranger.py:1132 msgid "Replace" msgstr "" #: pdfarranger/pageutils.py:149 msgid "Right" msgstr "Dreta" #: pdfarranger/pageutils.py:378 msgid "Right to Left" msgstr "" #: data/pdfarranger.ui:203 msgid "Rotate Left" msgstr "Gira a l'esquerra" #: data/pdfarranger.ui:227 msgid "Rotate Right" msgstr "Gira a la dreta" #: data/menu.ui:90 data/menu.ui:351 msgid "Rotate _Left" msgstr "Gira a l'esquerra" #: pdfarranger/pageutils.py:364 pdfarranger/splitter.py:60 msgid "Rows" msgstr "Files" #: data/menu.ui:194 data/menu.ui:337 msgid "Same Page _Format" msgstr "El mateix format de pàgina" #: data/pdfarranger.ui:78 msgid "Save" msgstr "Desa" #: data/pdfarranger.ui:97 msgid "Save As" msgstr "Desa com a" #: pdfarranger/pdfarranger.py:1088 msgid "Save As…" msgstr "Anomena i desa…" #: data/menu.ui:47 msgid "Save _As…" msgstr "Anomena i desa…" #: pdfarranger/pdfarranger.py:988 msgid "Save changes before closing?" msgstr "Voleu desar els canvis abans de tancar?" #: pdfarranger/pdfarranger.py:1025 msgid "Save changes before quitting?" msgstr "Voleu desar els canvis abans de tancar?" #: pdfarranger/pdfarranger.py:985 msgid "Save changes to “{}” before closing?" msgstr "Voleu desar els canvis a “{}” abans de tancar?" #: pdfarranger/pdfarranger.py:1022 msgid "Save changes to “{}” before quitting?" msgstr "Voleu desar els canvis a “{}” abans de tancar?" #: pdfarranger/pdfarranger.py:1249 msgid "Saving produced some warnings" msgstr "L'acció de desar ha produït algun avís" #: pdfarranger/pdfarranger.py:1288 msgid "Saving…" msgstr "Desant…" #: pdfarranger/pageutils.py:116 msgid "Scale factor" msgstr "Factor d'escala" #: data/menu.ui:169 data/menu.ui:312 msgid "Select _All" msgstr "Selecciona-ho tot" #: data/menu.ui:184 data/menu.ui:327 msgid "Select _Even Pages" msgstr "Selecciona les pàgines parelles" #: data/menu.ui:179 data/menu.ui:322 msgid "Select _Odd Pages" msgstr "Selecciona les pàgines senars" #: pdfarranger/pdfarranger.py:2580 msgid "Selected pages: " msgstr "Pàgines seleccionades: " #: pdfarranger/splitter.py:26 msgid "Split Pages" msgstr "Divideix les pàgines" #: pdfarranger/metadata.py:43 msgid "Subject" msgstr "Assumpte" #: pdfarranger/pdfarranger.py:512 msgid "Supported image files" msgstr "Fitxers d'imatge compatibles" #: pdfarranger/config.py:248 pdfarranger/config.py:256 msgid "System setting" msgstr "" #: pdfarranger/core.py:275 msgid "" "The document “{}” is locked and requires a password before it can be opened." msgstr "" "El document “{}” està bloquejat i requereix una contrasenya abans que es " "pugui obrir." #: pdfarranger/core.py:274 msgid "The password will be remembered until you close PDF Arranger." msgstr "La contrasenya es recordarà fins que tanqueu el PDF Arranger." #: pdfarranger/config.py:230 msgid "Theme" msgstr "" #: pdfarranger/metadata.py:42 msgid "Title" msgstr "Títol" #: pdfarranger/pageutils.py:149 msgid "Top" msgstr "Superior" #: pdfarranger/pageutils.py:379 msgid "Top to Bottom" msgstr "" #: pdfarranger/pageutils.py:436 msgid "Underlay" msgstr "" #: pdfarranger/core.py:361 pdfarranger/pdfarranger.py:1494 msgid "Unknown file format" msgstr "Format de fitxer desconegut" #: pdfarranger/metadata.py:212 msgid "Value" msgstr "Valor" #: pdfarranger/pageutils.py:376 msgid "Vertical" msgstr "" #: pdfarranger/splitter.py:61 msgid "Vertical Splits" msgstr "Divisions verticals" #: pdfarranger/pageutils.py:478 msgid "Vertical offset" msgstr "" #: pdfarranger/exporter.py:187 msgid "Warning" msgstr "Avís" #: pdfarranger/pageutils.py:235 pdfarranger/pageutils.py:239 #: pdfarranger/pageutils.py:327 msgid "Width" msgstr "Amplada" #: pdfarranger/splitter.py:88 msgid "Width in %" msgstr "Amplada en %" #: pdfarranger/pdfarranger.py:969 msgid "Your changes will be lost if you don’t save them." msgstr "Els teus canvis es perdran si no els guardes." #: data/pdfarranger.ui:144 msgid "Zoom In" msgstr "Amplia" #: data/pdfarranger.ui:167 msgid "Zoom Out" msgstr "Allunya" #: data/menu.ui:217 msgid "Zoom _Fit" msgstr "_Ajusta" #: data/menu.ui:209 msgid "Zoom _In" msgstr "A_mplia" #: data/menu.ui:213 msgid "Zoom _Out" msgstr "A_llunya" #: data/menu.ui:240 msgid "_About" msgstr "Quant a" #: pdfarranger/config.py:216 pdfarranger/pageutils.py:219 #: pdfarranger/pdfarranger.py:961 pdfarranger/pdfarranger.py:970 #: pdfarranger/pdfarranger.py:1094 pdfarranger/pdfarranger.py:1144 msgid "_Cancel" msgstr "Cancel·la" #: pdfarranger/pdfarranger.py:980 data/menu.ui:246 msgid "_Close" msgstr "_Tanca" #: data/menu.ui:132 data/menu.ui:268 msgid "_Copy" msgstr "Copia" #: data/menu.ui:108 data/menu.ui:260 msgid "_Delete" msgstr "Suprimeix" #: data/menu.ui:174 data/menu.ui:317 msgid "_Deselect All" msgstr "Desselecciona-ho tot" #: data/menu.ui:87 msgid "_Edit" msgstr "Edita" #: data/menu.ui:30 msgid "_Import" msgstr "Importa" #: data/menu.ui:199 data/menu.ui:342 msgid "_Invert Selection" msgstr "Inverteix la selecció" #: data/menu.ui:124 data/menu.ui:381 msgid "_Merge Pages…" msgstr "" #: data/menu.ui:36 msgid "_New Window" msgstr "Finestra nova" #: pdfarranger/config.py:217 pdfarranger/pageutils.py:220 msgid "_OK" msgstr "" #: pdfarranger/pdfarranger.py:1143 data/menu.ui:24 msgid "_Open" msgstr "_Obre" #: data/menu.ui:100 data/menu.ui:361 msgid "_Page Format…" msgstr "Format de la pàgina…" #: data/menu.ui:71 msgid "_Print…" msgstr "_Imprimeix…" #: pdfarranger/pdfarranger.py:1017 data/menu.ui:252 msgid "_Quit" msgstr "Surt" #: data/menu.ui:82 msgid "_Redo" msgstr "Refés" #: data/menu.ui:95 data/menu.ui:356 msgid "_Rotate Right" msgstr "Gira a la dreta" #: pdfarranger/pdfarranger.py:970 pdfarranger/pdfarranger.py:1093 #: data/menu.ui:42 msgid "_Save" msgstr "Desa" #: data/menu.ui:166 data/menu.ui:309 msgid "_Select" msgstr "Selecciona" #: data/menu.ui:120 data/menu.ui:377 msgid "_Split Pages…" msgstr "Divideix les pàgines…" #: data/menu.ui:78 msgid "_Undo" msgstr "Desfés" #: data/menu.ui:206 msgid "_View" msgstr "_Visualitza" #: pdfarranger/pageutils.py:139 pdfarranger/pageutils.py:362 #: pdfarranger/pageutils.py:412 msgid "mm" msgstr "mm" #: pdfarranger/core.py:89 msgid "page" msgstr "pàgina" #: pdfarranger/pdfarranger.py:811 msgid "untitled" msgstr "sense títol" pdfarranger-1.10.1/po/ca@valencia.po000066400000000000000000000406521451252235000172370ustar00rootroot00000000000000# PDF Arranger - Catalan@Valencian translation. # Copyright (C) Pilar Embid Giner , 2014. # This file is distributed under the same license as the pdfarranger package. msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-04-29 22:45+0200\n" "PO-Revision-Date: 2022-08-13 11:15+0200\n" "Last-Translator: Juanma1980 \n" "Language-Team: LliureX\n" "Language: ca@valencia\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.0\n" #: pdfarranger/splitter.py:87 msgid "#Col" msgstr "#Col" #: pdfarranger/splitter.py:87 msgid "#Row" msgstr "#Fila" #: pdfarranger/pageutils.py:122 pdfarranger/pageutils.py:477 #: pdfarranger/pageutils.py:479 msgid "%" msgstr "%" #: pdfarranger/pageutils.py:170 #, python-format msgid "% of height" msgstr "% de l'alçada" #: pdfarranger/pageutils.py:170 #, python-format msgid "% of width" msgstr "% de l'amplada" #: pdfarranger/pdfarranger.py:2548 #, python-format msgid "%s is a tool for rearranging and modifying PDF files." msgstr "%s es una ferramenta per a modificar i re-arranjar fitxers PDF" #: pdfarranger/config.py:232 msgid "(Libhandy missing)" msgstr "" #: pdfarranger/config.py:224 msgid "(Requires restart)" msgstr "" #: pdfarranger/pageutils.py:461 msgid "(same offset is applied to all pages)" msgstr "" #: pdfarranger/pdfarranger.py:1130 #, python-format msgid "A file named \"%s\" already exists. Do you want to replace it?" msgstr "" #: data/menu.ui:189 data/menu.ui:332 msgid "All From _Same File" msgstr "Tots del mateix fitxer" #: pdfarranger/pdfarranger.py:507 msgid "All files" msgstr "Tots els fitxers" #: pdfarranger/pdfarranger.py:462 msgid "All pages must have the same size." msgstr "Totes les pàgines han de tindre la mateixa mida." #: pdfarranger/pdfarranger.py:495 msgid "All supported files" msgstr "Tots els fitxers admesos" #: pdfarranger/pageutils.py:149 msgid "Bottom" msgstr "Inferior" #: pdfarranger/pageutils.py:380 msgid "Bottom to Top" msgstr "" #: pdfarranger/core.py:386 msgid "Clipboard image" msgstr "Imatge del porta-retalls" #: pdfarranger/pageutils.py:363 pdfarranger/splitter.py:60 msgid "Columns" msgstr "Columnes" #: pdfarranger/metadata.py:48 msgid "Created" msgstr "Creat" #: pdfarranger/metadata.py:46 msgid "Creator" msgstr "Creador" #: pdfarranger/metadata.py:47 msgid "Creator tool" msgstr "Eina creadora" #: pdfarranger/pageutils.py:153 msgid "Crop Margins" msgstr "Retalla els margens" #: data/menu.ui:104 data/menu.ui:365 msgid "Crop White Borders" msgstr "Escapça les vores blanques" #: pdfarranger/pageutils.py:161 msgid "" "Cropping does not remove any content from the PDF file, it only hides it." msgstr "Escapçar no elimina cap contingut del fitxer PDF, només l'oculta." #: data/menu.ui:128 data/menu.ui:264 msgid "Cu_t" msgstr "Re_talla" #: pdfarranger/pdfarranger.py:1250 msgid "Despite the warnings the document(s) should have no visible issues." msgstr "A banda dels avisos el(s) document(s) no semblen tindre cap problema." #: pdfarranger/pdfarranger.py:979 msgid "Discard changes and close?" msgstr "Descartar els canvis i tancar?" #: pdfarranger/pdfarranger.py:1016 msgid "Discard changes and quit?" msgstr "Descartar canvis i eixir?" #: pdfarranger/exporter.py:194 msgid "Do not show this dialog again." msgstr "No tornes a mostrar aquest diàleg." #: pdfarranger/pdfarranger.py:970 msgid "Do_n’t Save" msgstr "No alçar" #: pdfarranger/pdfarranger.py:1257 msgid "Don't show warnings when saving again." msgstr "" #: data/menu.ui:112 data/menu.ui:369 msgid "Dupl_icate" msgstr "_Duplica" #: data/menu.ui:52 data/menu.ui:395 msgid "E_xport" msgstr "E_xporta" #: data/menu.ui:55 data/menu.ui:398 msgid "E_xport Selection to a Single File…" msgstr "E_xporta la selecció a un sol fitxer…" #: data/menu.ui:228 msgid "Edit _Properties" msgstr "Edita les propietats" #: pdfarranger/metadata.py:198 msgid "Edit properties" msgstr "Edita les propietats" #: pdfarranger/splitter.py:62 msgid "Equal column width" msgstr "Amplada igual de la columna" #: pdfarranger/splitter.py:62 msgid "Equal row height" msgstr "Alçada igual de la fila" #: data/menu.ui:60 data/menu.ui:403 msgid "Export Selection to _Individual Files…" msgstr "Exporta la selecció a fitxers _individuals…" #: data/menu.ui:65 data/menu.ui:408 msgid "Export _All Pages to Individual Files…" msgstr "Exporta _totes les pàgines a fitxers individuals…" #: pdfarranger/pdfarranger.py:1088 msgid "Export…" msgstr "Exporta…" #: pdfarranger/core.py:388 pdfarranger/pdfarranger.py:1504 msgid "File is neither pdf nor image" msgstr "El fitxer no és ni pdf ni imatge" #: pdfarranger/pdfarranger.py:301 msgid "File(s) to open" msgstr "Fitxer(s) a obrir" #: pdfarranger/config.py:237 msgid "For more options see:" msgstr "" #: pdfarranger/exporter.py:192 msgid "Forms and outlines are lost on saving." msgstr "Els formularis i els contorns es perden en alçar." #: data/menu.ui:221 msgid "Full_screen" msgstr "Pantalla sencera" #: pdfarranger/pdfarranger.py:2562 msgid "GNU General Public License (GPL) Version 3." msgstr "Llicència Pública General GNU (GPL) Versió 3." #: data/menu.ui:160 data/menu.ui:389 msgid "Generate Booklet" msgstr "Genera un fullet" #: pdfarranger/pageutils.py:236 pdfarranger/pageutils.py:240 #: pdfarranger/pageutils.py:328 msgid "Height" msgstr "Alçada" #: pdfarranger/splitter.py:88 msgid "Height in %" msgstr "Alçada en %" #: pdfarranger/pageutils.py:375 msgid "Horizontal" msgstr "" #: pdfarranger/splitter.py:61 msgid "Horizontal Splits" msgstr "Divisions horitzontals" #: pdfarranger/pageutils.py:476 msgid "Horizontal offset" msgstr "" #: pdfarranger/core.py:377 msgid "Image files are only supported with img2pdf" msgstr "Els fitxers d'imatge només són compatibles amb img2pdf" #: pdfarranger/core.py:383 msgid "Image format is not supported by img2pdf" msgstr "El format de la imatge no està admès per img2pdf" #: data/pdfarranger.ui:58 msgid "Import" msgstr "" #: pdfarranger/pdfarranger.py:1327 msgid "Import…" msgstr "Importa…" #: data/menu.ui:156 data/menu.ui:385 msgid "Insert Blan_k Page…" msgstr "Insereix una pàgina en blanc…" #: pdfarranger/pageutils.py:325 msgid "Insert Blank Page" msgstr "Insereix una pàgina en blanc" #: pdfarranger/metadata.py:169 msgid "Invalid date format. Input discarded." msgstr "Format de data no vàlid. S'ha descartat l'entrada." #: pdfarranger/pdfarranger.py:2551 #, python-format msgid "It uses libqpdf %s, pikepdf %s, GTK %s and Python %s." msgstr "Utilitza libqpdf %s, pikepdf %s, GTK %s and Python %s." #: pdfarranger/metadata.py:44 msgid "Keywords" msgstr "Paraules clau" #: pdfarranger/config.py:222 msgid "Language" msgstr "" #: pdfarranger/pageutils.py:460 msgid "Layout for the first page in selection" msgstr "" #: pdfarranger/pageutils.py:149 msgid "Left" msgstr "Esquerra" #: pdfarranger/pageutils.py:377 msgid "Left to Right" msgstr "" #: data/pdfarranger.ui:122 msgid "Main Menu" msgstr "Menú principal" #: pdfarranger/pdfarranger.py:2557 msgid "Maintainers and contributors" msgstr "Mantenidors i contribuïdors" #: pdfarranger/pageutils.py:361 msgid "Margin" msgstr "" #: pdfarranger/pageutils.py:347 msgid "Merge Pages" msgstr "" #: pdfarranger/pageutils.py:412 msgid "Merged page size:" msgstr "" #: pdfarranger/metadata.py:49 msgid "Modified" msgstr "Modificat" #: pdfarranger/pageutils.py:392 msgid "Non-uniform page size - using max size" msgstr "" #: data/pdfarranger.ui:37 msgid "Open" msgstr "Obrir" #: pdfarranger/pdfarranger.py:1186 msgid "Open…" msgstr "Obrir" #: pdfarranger/pageutils.py:436 msgid "Overlay" msgstr "" #: pdfarranger/pdfarranger.py:282 msgid "" "PDF Arranger is a small python-gtk application, which helps the user to " "merge or split pdf documents and rotate, crop and rearrange their pages " "using an interactive and intuitive graphical interface. It is a frontend for " "pikepdf." msgstr "" "PFD Arranger (Arranjador de PDFs) és una aplicació sentzilla feta amb Python " "i GTK que ajuda al usuari a fusionar o dividir documents PDF i girar, " "escapçar o reordenar les pàgines d'aquests mitjançant una interfície gràfica " "intuïtiva. És el frontal pel programari Pikepdf." #: pdfarranger/pdfarranger.py:1498 msgid "PDF document is damaged" msgstr "El document PDF es troba danyat" #: pdfarranger/pdfarranger.py:499 msgid "PDF files" msgstr "Fitxers PDF" #: pdfarranger/pageutils.py:388 msgid "Page Order" msgstr "" #: pdfarranger/pageutils.py:241 msgid "Page Size" msgstr "Mida de la pàgina" #: pdfarranger/pdfarranger.py:2585 msgid "Page Size:" msgstr "Mida de la pàgina:" #: pdfarranger/pageutils.py:230 msgid "Page format" msgstr "Format de la pàgina" #: pdfarranger/core.py:285 msgid "Password" msgstr "Contrasenya" #: pdfarranger/core.py:263 msgid "Password required" msgstr "Contrasenya requerida" #: data/menu.ui:277 msgid "Past_e Special" msgstr "Enganxament especial" #: data/menu.ui:295 msgid "Paste As O_verlay…" msgstr "" #: data/menu.ui:151 data/menu.ui:290 msgid "Paste As _Even Pages" msgstr "Enganxa com a pàgines pars" #: data/menu.ui:146 data/menu.ui:285 msgid "Paste As _Odd Pages" msgstr "Enganxa com a pàgines impars" #: data/menu.ui:300 msgid "Paste As _Underlay…" msgstr "" #: data/menu.ui:136 data/menu.ui:272 msgid "Paste _After" msgstr "Enganxa _després" #: data/menu.ui:141 data/menu.ui:280 msgid "Paste _Before" msgstr "Enganxa _abans" #: pdfarranger/pdfarranger.py:1627 msgid "Pasted data not valid. Aborting paste." msgstr "Les dades enganxades no són vàlides. S'està avortant l'operació." #: pdfarranger/pdfarranger.py:1589 msgid "Pikepdf >= 3 is needed for overlay/underlay/merge support." msgstr "" #: data/menu.ui:234 msgid "Pre_ferences" msgstr "" #: pdfarranger/config.py:212 msgid "Preferences" msgstr "" #: pdfarranger/pdfarranger.py:293 msgid "Print the version of PDF Arranger and exit" msgstr "Imprimeix la versió de l'Arranjador de PDFs i ix" #: pdfarranger/exporter.py:457 msgid "Printing…" msgstr "" #: pdfarranger/metadata.py:45 msgid "Producer" msgstr "Productor" #: pdfarranger/metadata.py:212 msgid "Property" msgstr "Propietat" #: data/menu.ui:116 data/menu.ui:373 msgid "Re_verse Order" msgstr "_Ordre invers" #: pdfarranger/pageutils.py:238 msgid "Relative" msgstr "Relatiu" #: pdfarranger/exporter.py:469 msgid "Rendering Preview…" msgstr "" #: pdfarranger/pdfarranger.py:732 msgid "Rendering…" msgstr "Renderitzant…" #: pdfarranger/pdfarranger.py:1132 msgid "Replace" msgstr "" #: pdfarranger/pageutils.py:149 msgid "Right" msgstr "Dreta" #: pdfarranger/pageutils.py:378 msgid "Right to Left" msgstr "" #: data/pdfarranger.ui:203 msgid "Rotate Left" msgstr "Gira a l'esquerra" #: data/pdfarranger.ui:227 msgid "Rotate Right" msgstr "Gira a la dreta" #: data/menu.ui:90 data/menu.ui:351 msgid "Rotate _Left" msgstr "Gira a _l'esquerra" #: pdfarranger/pageutils.py:364 pdfarranger/splitter.py:60 msgid "Rows" msgstr "Files" #: data/menu.ui:194 data/menu.ui:337 msgid "Same Page _Format" msgstr "El mateix format de pàgina" #: data/pdfarranger.ui:78 msgid "Save" msgstr "Alça" #: data/pdfarranger.ui:97 msgid "Save As" msgstr "Alça com a" #: pdfarranger/pdfarranger.py:1088 msgid "Save As…" msgstr "" #: data/menu.ui:47 msgid "Save _As…" msgstr "_Anomena i alça…" #: pdfarranger/pdfarranger.py:988 msgid "Save changes before closing?" msgstr "Voleu alçar els canvis abans de tancar?" #: pdfarranger/pdfarranger.py:1025 msgid "Save changes before quitting?" msgstr "" #: pdfarranger/pdfarranger.py:985 msgid "Save changes to “{}” before closing?" msgstr "Voleu alçar els canvis a “{}” abans de tancar?" #: pdfarranger/pdfarranger.py:1022 msgid "Save changes to “{}” before quitting?" msgstr "" #: pdfarranger/pdfarranger.py:1249 msgid "Saving produced some warnings" msgstr "S'han produït avisos al alçar" #: pdfarranger/pdfarranger.py:1288 msgid "Saving…" msgstr "Alçant..." #: pdfarranger/pageutils.py:116 msgid "Scale factor" msgstr "Factor d'escala" #: data/menu.ui:169 data/menu.ui:312 msgid "Select _All" msgstr "Selecciona-ho tot" #: data/menu.ui:184 data/menu.ui:327 msgid "Select _Even Pages" msgstr "Selecciona les pàgines pars" #: data/menu.ui:179 data/menu.ui:322 msgid "Select _Odd Pages" msgstr "Selecciona les pàgines impars" #: pdfarranger/pdfarranger.py:2580 msgid "Selected pages: " msgstr "Pàgines seleccionades: " #: pdfarranger/splitter.py:26 msgid "Split Pages" msgstr "Divideix les pàgines" #: pdfarranger/metadata.py:43 msgid "Subject" msgstr "Assumpte" #: pdfarranger/pdfarranger.py:512 msgid "Supported image files" msgstr "Fitxers d'imatge compatibles" #: pdfarranger/config.py:248 pdfarranger/config.py:256 msgid "System setting" msgstr "" #: pdfarranger/core.py:275 msgid "" "The document “{}” is locked and requires a password before it can be opened." msgstr "" "El document “{}” es troba blocat i cal una contrasenya abans que es puga " "obrir." #: pdfarranger/core.py:274 msgid "The password will be remembered until you close PDF Arranger." msgstr "La contrasenya es recordarà fins que es tanque el PDF Arranger." #: pdfarranger/config.py:230 msgid "Theme" msgstr "" #: pdfarranger/metadata.py:42 msgid "Title" msgstr "Títol" #: pdfarranger/pageutils.py:149 msgid "Top" msgstr "Superior" #: pdfarranger/pageutils.py:379 msgid "Top to Bottom" msgstr "" #: pdfarranger/pageutils.py:436 msgid "Underlay" msgstr "" #: pdfarranger/core.py:361 pdfarranger/pdfarranger.py:1494 msgid "Unknown file format" msgstr "Format de fitxer desconegut" #: pdfarranger/metadata.py:212 msgid "Value" msgstr "Valor" #: pdfarranger/pageutils.py:376 msgid "Vertical" msgstr "" #: pdfarranger/splitter.py:61 msgid "Vertical Splits" msgstr "Divisions verticals" #: pdfarranger/pageutils.py:478 msgid "Vertical offset" msgstr "" #: pdfarranger/exporter.py:187 msgid "Warning" msgstr "Avís" #: pdfarranger/pageutils.py:235 pdfarranger/pageutils.py:239 #: pdfarranger/pageutils.py:327 msgid "Width" msgstr "Amplada" #: pdfarranger/splitter.py:88 msgid "Width in %" msgstr "Amplada en %" #: pdfarranger/pdfarranger.py:969 msgid "Your changes will be lost if you don’t save them." msgstr "Els teus canvis es perdran si no els alces." #: data/pdfarranger.ui:144 msgid "Zoom In" msgstr "Amplia" #: data/pdfarranger.ui:167 msgid "Zoom Out" msgstr "Allunya" #: data/menu.ui:217 msgid "Zoom _Fit" msgstr "" #: data/menu.ui:209 msgid "Zoom _In" msgstr "Ampl_ia" #: data/menu.ui:213 msgid "Zoom _Out" msgstr "Allunya" #: data/menu.ui:240 msgid "_About" msgstr "Quant a" #: pdfarranger/config.py:216 pdfarranger/pageutils.py:219 #: pdfarranger/pdfarranger.py:961 pdfarranger/pdfarranger.py:970 #: pdfarranger/pdfarranger.py:1094 pdfarranger/pdfarranger.py:1144 msgid "_Cancel" msgstr "Cancel·la" #: pdfarranger/pdfarranger.py:980 data/menu.ui:246 msgid "_Close" msgstr "Tancar" #: data/menu.ui:132 data/menu.ui:268 msgid "_Copy" msgstr "_Copia" #: data/menu.ui:108 data/menu.ui:260 msgid "_Delete" msgstr "_Suprimeix" #: data/menu.ui:174 data/menu.ui:317 msgid "_Deselect All" msgstr "Desselecciona-ho tot" #: data/menu.ui:87 msgid "_Edit" msgstr "_Edita" #: data/menu.ui:30 msgid "_Import" msgstr "_Importa" #: data/menu.ui:199 data/menu.ui:342 msgid "_Invert Selection" msgstr "Inverteix la selecció" #: data/menu.ui:124 data/menu.ui:381 msgid "_Merge Pages…" msgstr "" #: data/menu.ui:36 msgid "_New Window" msgstr "_Finestra nova" #: pdfarranger/config.py:217 pdfarranger/pageutils.py:220 msgid "_OK" msgstr "" #: pdfarranger/pdfarranger.py:1143 data/menu.ui:24 msgid "_Open" msgstr "_Obrir" #: data/menu.ui:100 data/menu.ui:361 msgid "_Page Format…" msgstr "Format de la _pàgina…" #: data/menu.ui:71 msgid "_Print…" msgstr "" #: pdfarranger/pdfarranger.py:1017 data/menu.ui:252 msgid "_Quit" msgstr "_Ix" #: data/menu.ui:82 msgid "_Redo" msgstr "_Refés" #: data/menu.ui:95 data/menu.ui:356 msgid "_Rotate Right" msgstr "Gira a la d_reta" #: pdfarranger/pdfarranger.py:970 pdfarranger/pdfarranger.py:1093 #: data/menu.ui:42 msgid "_Save" msgstr "Alça" #: data/menu.ui:166 data/menu.ui:309 msgid "_Select" msgstr "Selecciona" #: data/menu.ui:120 data/menu.ui:377 msgid "_Split Pages…" msgstr "_Divideix les pàgines…" #: data/menu.ui:78 msgid "_Undo" msgstr "Desfés" #: data/menu.ui:206 msgid "_View" msgstr "_Vista" #: pdfarranger/pageutils.py:139 pdfarranger/pageutils.py:362 #: pdfarranger/pageutils.py:412 msgid "mm" msgstr "mm" #: pdfarranger/core.py:89 msgid "page" msgstr "pàgina" #: pdfarranger/pdfarranger.py:811 msgid "untitled" msgstr "sense títol" pdfarranger-1.10.1/po/cs.po000066400000000000000000000423041451252235000154520ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: pdfarranger\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-04-29 22:45+0200\n" "PO-Revision-Date: 2023-07-10 15:37+0000\n" "Last-Translator: PavelZ\n" "Language-Team: Czech (Czech Republic)\n" "Language: cs-CZ\n" "Plural-Forms: nplurals=3; plural=( n == 1 ) ? 0 : ( n >= 2 && n <= 4 ) ? 1 : " "2;\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "\n" "X-Loco-Source-Locale: cs_CZ\n" "X-Loco-Parser: loco_parse_po\n" "X-Generator: Loco https://localise.biz/" #: pdfarranger/splitter.py:87 msgid "#Col" msgstr "#Sloupec" #: pdfarranger/splitter.py:87 msgid "#Row" msgstr "#Řádek" #: pdfarranger/pageutils.py:122 pdfarranger/pageutils.py:477 #: pdfarranger/pageutils.py:479 msgid "%" msgstr "%" #: pdfarranger/pageutils.py:170 msgid "% of height" msgstr "% výšky" #: pdfarranger/pageutils.py:170 msgid "% of width" msgstr "% šířky" #: pdfarranger/pdfarranger.py:2548 #, python-format msgid "%s is a tool for rearranging and modifying PDF files." msgstr "%s je nástroj na přeskupování a úpravy PDF dokumentů." #: pdfarranger/config.py:232 msgid "(Libhandy missing)" msgstr "(chybějící Libhandy)" #: pdfarranger/config.py:224 msgid "(Requires restart)" msgstr "(vyžadován restart)" #: pdfarranger/pageutils.py:461 msgid "(same offset is applied to all pages)" msgstr "(použití stejného posunu u všech stránek)" #: pdfarranger/pdfarranger.py:1130 #, python-format msgid "A file named \"%s\" already exists. Do you want to replace it?" msgstr "Soubor s názvem \"%s\" již existuje. Chcete ho nahradit?" #: data/menu.ui:189 data/menu.ui:332 msgid "All From _Same File" msgstr "Vše ze _stejného souboru" #: pdfarranger/pdfarranger.py:507 msgid "All files" msgstr "Všechny soubory" #: pdfarranger/pdfarranger.py:462 msgid "All pages must have the same size." msgstr "Všechny stránky musí mít stejný rozměr" #: pdfarranger/pdfarranger.py:495 msgid "All supported files" msgstr "Všechny podporované soubory" #: pdfarranger/pageutils.py:149 msgid "Bottom" msgstr "Dolní" #: pdfarranger/pageutils.py:380 msgid "Bottom to Top" msgstr "Zespodu nahoru" #: pdfarranger/core.py:386 msgid "Clipboard image" msgstr "Obrázek ve schránce" #: pdfarranger/pageutils.py:363 pdfarranger/splitter.py:60 msgid "Columns" msgstr "Sloupce" #: pdfarranger/metadata.py:48 msgid "Created" msgstr "Vytvořeno" #: pdfarranger/metadata.py:46 msgid "Creator" msgstr "Autor" #: pdfarranger/metadata.py:47 msgid "Creator tool" msgstr "Vytvořeno nástrojem" #: pdfarranger/pageutils.py:153 msgid "Crop Margins" msgstr "Oříznout okraje" #: data/menu.ui:104 data/menu.ui:365 msgid "Crop White Borders" msgstr "Oříznout bílé okra_je" #: pdfarranger/pageutils.py:161 msgid "" "Cropping does not remove any content from the PDF file, it only hides it." msgstr "Oříznutí neodstraní žádný obsah z PDF dokumentu, pouze jej skryje." #: data/menu.ui:128 data/menu.ui:264 msgid "Cu_t" msgstr "_Vyjmout" #: pdfarranger/pdfarranger.py:1250 msgid "Despite the warnings the document(s) should have no visible issues." msgstr "Navzdory varováním by dokument neměl mít viditelné problémy." #: pdfarranger/pdfarranger.py:979 msgid "Discard changes and close?" msgstr "Zahodit změny a zavřít?" #: pdfarranger/pdfarranger.py:1016 msgid "Discard changes and quit?" msgstr "Zahodit změny a ukončit?" #: pdfarranger/exporter.py:194 msgid "Do not show this dialog again." msgstr "Tento dialog znovu nezobrazovat." #: pdfarranger/pdfarranger.py:970 msgid "Do_n’t Save" msgstr "_Neukládat" #: pdfarranger/pdfarranger.py:1257 msgid "Don't show warnings when saving again." msgstr "Varování při ukládání znovu nezobrazovat." #: data/menu.ui:112 data/menu.ui:369 msgid "Dupl_icate" msgstr "_Duplikovat" #: data/menu.ui:52 data/menu.ui:395 msgid "E_xport" msgstr "E_xportovat" #: data/menu.ui:55 data/menu.ui:398 msgid "E_xport Selection to a Single File…" msgstr "E_xportovat výběr do jediného souboru…" #: data/menu.ui:228 msgid "Edit _Properties" msgstr "Upravit _vlastnosti" #: pdfarranger/metadata.py:198 msgid "Edit properties" msgstr "Upravit vlastnosti" #: pdfarranger/splitter.py:62 msgid "Equal column width" msgstr "Stejná šířka sloupců" #: pdfarranger/splitter.py:62 msgid "Equal row height" msgstr "Stejná výška řádků" #: data/menu.ui:60 data/menu.ui:403 msgid "Export Selection to _Individual Files…" msgstr "Exportovat výběr do _samostatných souborů…" #: data/menu.ui:65 data/menu.ui:408 msgid "Export _All Pages to Individual Files…" msgstr "Exportovat _všechny stránky do samostatných souborů…" #: pdfarranger/pdfarranger.py:1088 msgid "Export…" msgstr "Export…" #: pdfarranger/core.py:388 pdfarranger/pdfarranger.py:1504 msgid "File is neither pdf nor image" msgstr "Soubor není ani PDF dokument ani obrázek" #: pdfarranger/pdfarranger.py:301 msgid "File(s) to open" msgstr "Soubor(y) k otevření" #: pdfarranger/config.py:237 msgid "For more options see:" msgstr "Pro další možnosti viz" #: pdfarranger/exporter.py:192 msgid "Forms and outlines are lost on saving." msgstr "Při ukládání se ztratí formuláře a obrysy." #: data/menu.ui:221 msgid "Full_screen" msgstr "_Celá obrazovka" #: pdfarranger/pdfarranger.py:2562 msgid "GNU General Public License (GPL) Version 3." msgstr "GNU General Public License (GPL) verze 3." #: data/menu.ui:160 data/menu.ui:389 msgid "Generate Booklet" msgstr "Vytvořit brožuru" #: pdfarranger/pageutils.py:236 pdfarranger/pageutils.py:240 #: pdfarranger/pageutils.py:328 msgid "Height" msgstr "Výška" #: pdfarranger/splitter.py:88 msgid "Height in %" msgstr "Výška v %" #: pdfarranger/pageutils.py:375 msgid "Horizontal" msgstr "Vodorovně" #: pdfarranger/splitter.py:61 msgid "Horizontal Splits" msgstr "Vodorovné rozdělení" #: pdfarranger/pageutils.py:476 msgid "Horizontal offset" msgstr "Vodorovný posun" #: pdfarranger/core.py:377 msgid "Image files are only supported with img2pdf" msgstr "Soubory s obrázky jsou podporovány pouze s programem img2pdf" #: pdfarranger/core.py:383 msgid "Image format is not supported by img2pdf" msgstr "Formát obrázku není podporován programem img2pdf" #: data/pdfarranger.ui:58 msgid "Import" msgstr "Importovat" #: pdfarranger/pdfarranger.py:1327 msgid "Import…" msgstr "Import…" #: data/menu.ui:156 data/menu.ui:385 msgid "Insert Blan_k Page…" msgstr "Vložit prázdn_ou stránku…" #: pdfarranger/pageutils.py:325 msgid "Insert Blank Page" msgstr "Vložit prázdnou stránku" #: pdfarranger/metadata.py:169 msgid "Invalid date format. Input discarded." msgstr "Neplatný formát data. Vstup byl zahozen." #: pdfarranger/pdfarranger.py:2551 #, python-format msgid "It uses libqpdf %s, pikepdf %s, GTK %s and Python %s." msgstr "Používá libqpdf %s, pikepdf %s, GTK %s and Python %s." #: pdfarranger/metadata.py:44 msgid "Keywords" msgstr "Klíčová slova" #: pdfarranger/config.py:222 msgid "Language" msgstr "Jazyk" #: pdfarranger/pageutils.py:460 msgid "Layout for the first page in selection" msgstr "Rozložení pro první stránku ve výběru" #: pdfarranger/pageutils.py:149 msgid "Left" msgstr "Levý" #: pdfarranger/pageutils.py:377 msgid "Left to Right" msgstr "Zleva do prava" #: data/pdfarranger.ui:122 msgid "Main Menu" msgstr "Hlavní nabídka" #: pdfarranger/pdfarranger.py:2557 msgid "Maintainers and contributors" msgstr "Správci a přispěvatelé" #: pdfarranger/pageutils.py:361 msgid "Margin" msgstr "Okraj" #: pdfarranger/pageutils.py:347 msgid "Merge Pages" msgstr "Sloučit stránky" #: pdfarranger/pageutils.py:412 msgid "Merged page size:" msgstr "Velikost sloučené stránky:" #: pdfarranger/metadata.py:49 msgid "Modified" msgstr "Změněno" #: pdfarranger/pageutils.py:392 msgid "Non-uniform page size - using max size" msgstr "Nejednotná velikost stránky – pomocí maximální velikosti" #: data/pdfarranger.ui:37 msgid "Open" msgstr "Otevřít" #: pdfarranger/pdfarranger.py:1186 msgid "Open…" msgstr "Otevřít…" #: pdfarranger/pageutils.py:436 msgid "Overlay" msgstr "Překrytí" #: pdfarranger/pdfarranger.py:282 msgid "" "PDF Arranger is a small python-gtk application, which helps the user to " "merge or split pdf documents and rotate, crop and rearrange their pages " "using an interactive and intuitive graphical interface. It is a frontend for " "pikepdf." msgstr "" "PDF Arranger je malá pyhon-gtk aplikace, která pomáhá uživatelům slučovat " "nebo rozdělovat PDF dokumenty a otáčet, ořezávat nebo přeskupovat jejich " "stránky za použití interaktivního a intuitivního uživatelského rozhraní. " "Jedná se o frontend pro knihovnu pikepdf." #: pdfarranger/pdfarranger.py:1498 msgid "PDF document is damaged" msgstr "PDF dokument je poškozený" #: pdfarranger/pdfarranger.py:499 msgid "PDF files" msgstr "Soubory PDF" #: pdfarranger/pageutils.py:388 msgid "Page Order" msgstr "Pořadí stránek" #: pdfarranger/pageutils.py:241 msgid "Page Size" msgstr "Velikost stránky" #: pdfarranger/pdfarranger.py:2585 msgid "Page Size:" msgstr "Velikost stránky:" #: pdfarranger/pageutils.py:230 msgid "Page format" msgstr "Formát stránky" #: pdfarranger/core.py:285 msgid "Password" msgstr "Heslo" #: pdfarranger/core.py:263 msgid "Password required" msgstr "Je vyžadováno heslo" #: data/menu.ui:277 msgid "Past_e Special" msgstr "Vložit _jinak" #: data/menu.ui:295 msgid "Paste As O_verlay…" msgstr "Vložit jako překr_ytí…" #: data/menu.ui:151 data/menu.ui:290 msgid "Paste As _Even Pages" msgstr "Vložit jako s_udé stránky" #: data/menu.ui:146 data/menu.ui:285 msgid "Paste As _Odd Pages" msgstr "Vložit jako l_iché stránky" #: data/menu.ui:300 msgid "Paste As _Underlay…" msgstr "Vložit jako podkr_eslení…" #: data/menu.ui:136 data/menu.ui:272 msgid "Paste _After" msgstr "Vložit z_a" #: data/menu.ui:141 data/menu.ui:280 msgid "Paste _Before" msgstr "Vložit př_ed" #: pdfarranger/pdfarranger.py:1627 msgid "Pasted data not valid. Aborting paste." msgstr "Vkládaná data jsou neplatná. Vkládání bylo přerušeno." #: pdfarranger/pdfarranger.py:1589 msgid "Pikepdf >= 3 is needed for overlay/underlay/merge support." msgstr "Pro podporu překrytí/podkreslení/sloučení je vyžadován Pikepdf >= 3." #: data/menu.ui:234 msgid "Pre_ferences" msgstr "Předvolb_y" #: pdfarranger/config.py:212 msgid "Preferences" msgstr "Předvolby" #: pdfarranger/pdfarranger.py:293 msgid "Print the version of PDF Arranger and exit" msgstr "Vypsat verzi programu PDF Arranger a skončit" #: pdfarranger/exporter.py:457 msgid "Printing…" msgstr "Tisk…" #: pdfarranger/metadata.py:45 msgid "Producer" msgstr "Producent" #: pdfarranger/metadata.py:212 msgid "Property" msgstr "Vlastnost" #: data/menu.ui:116 data/menu.ui:373 msgid "Re_verse Order" msgstr "O_brácené pořadí" #: pdfarranger/pageutils.py:238 msgid "Relative" msgstr "Relativní" #: pdfarranger/exporter.py:469 msgid "Rendering Preview…" msgstr "Vykreslování náhledu…" #: pdfarranger/pdfarranger.py:732 msgid "Rendering…" msgstr "Vykreslování…" #: pdfarranger/pdfarranger.py:1132 msgid "Replace" msgstr "Nahradit" #: pdfarranger/pageutils.py:149 msgid "Right" msgstr "Pravý" #: pdfarranger/pageutils.py:378 msgid "Right to Left" msgstr "Zprava doleva" #: data/pdfarranger.ui:203 msgid "Rotate Left" msgstr "Otočit doleva" #: data/pdfarranger.ui:227 msgid "Rotate Right" msgstr "Otočit doprava" #: data/menu.ui:90 data/menu.ui:351 msgid "Rotate _Left" msgstr "Otočit do_leva" #: pdfarranger/pageutils.py:364 pdfarranger/splitter.py:60 msgid "Rows" msgstr "Řádky" #: data/menu.ui:194 data/menu.ui:337 msgid "Same Page _Format" msgstr "Stejný _formát stránky" #: data/pdfarranger.ui:78 msgid "Save" msgstr "Uložit" #: data/pdfarranger.ui:97 msgid "Save As" msgstr "Uložit jako" #: pdfarranger/pdfarranger.py:1088 msgid "Save As…" msgstr "Uložit jako…" #: data/menu.ui:47 msgid "Save _As…" msgstr "Uložit _jako" #: pdfarranger/pdfarranger.py:988 msgid "Save changes before closing?" msgstr "Uložit změny před zavřením?" #: pdfarranger/pdfarranger.py:1025 msgid "Save changes before quitting?" msgstr "Uložit změny před ukončením?" #: pdfarranger/pdfarranger.py:985 msgid "Save changes to “{}” before closing?" msgstr "Uložit změny do “{}” před zavřením?" #: pdfarranger/pdfarranger.py:1022 msgid "Save changes to “{}” before quitting?" msgstr "Uložit změny do “{}” před ukončením?" #: pdfarranger/pdfarranger.py:1249 msgid "Saving produced some warnings" msgstr "Ukládání vyvolalo nějaká varování" #: pdfarranger/pdfarranger.py:1288 msgid "Saving…" msgstr "Ukládání…" #: pdfarranger/pageutils.py:116 msgid "Scale factor" msgstr "Měřítko" #: data/menu.ui:169 data/menu.ui:312 msgid "Select _All" msgstr "Vybrat v_še" #: data/menu.ui:184 data/menu.ui:327 msgid "Select _Even Pages" msgstr "Vybrat sud_é stránky" #: data/menu.ui:179 data/menu.ui:322 msgid "Select _Odd Pages" msgstr "Vybrat lic_hé stránky" #: pdfarranger/pdfarranger.py:2580 msgid "Selected pages: " msgstr "Vybrané stránky: " #: pdfarranger/splitter.py:26 msgid "Split Pages" msgstr "Rozdělit stránky" #: pdfarranger/metadata.py:43 msgid "Subject" msgstr "Předmět" #: pdfarranger/pdfarranger.py:512 msgid "Supported image files" msgstr "Podporované soubory s obrázky" #: pdfarranger/config.py:248 pdfarranger/config.py:256 msgid "System setting" msgstr "Systémová nastavení" #: pdfarranger/core.py:275 msgid "" "The document “{}” is locked and requires a password before it can be opened." msgstr "Dokument “{}” je uzamčen a je vyžadováno heslo pro jeho otevření." #: pdfarranger/core.py:274 msgid "The password will be remembered until you close PDF Arranger." msgstr "Heslo bude zapamatováno, dokud neukončíte program PDF Arranger." #: pdfarranger/config.py:230 msgid "Theme" msgstr "Téma" #: pdfarranger/metadata.py:42 msgid "Title" msgstr "Název" #: pdfarranger/pageutils.py:149 msgid "Top" msgstr "Horní" #: pdfarranger/pageutils.py:379 msgid "Top to Bottom" msgstr "Shora dolů" #: pdfarranger/pageutils.py:436 msgid "Underlay" msgstr "Podkreslení" #: pdfarranger/core.py:361 pdfarranger/pdfarranger.py:1494 msgid "Unknown file format" msgstr "Neznámý formát souboru" #: pdfarranger/metadata.py:212 msgid "Value" msgstr "Hodnota" #: pdfarranger/pageutils.py:376 msgid "Vertical" msgstr "Svisle" #: pdfarranger/splitter.py:61 msgid "Vertical Splits" msgstr "Svislé rozdělení" #: pdfarranger/pageutils.py:478 msgid "Vertical offset" msgstr "Svislý posun" #: pdfarranger/exporter.py:187 msgid "Warning" msgstr "Varování" #: pdfarranger/pageutils.py:235 pdfarranger/pageutils.py:239 #: pdfarranger/pageutils.py:327 msgid "Width" msgstr "Šířka" #: pdfarranger/splitter.py:88 msgid "Width in %" msgstr "Šířka v %" #: pdfarranger/pdfarranger.py:969 msgid "Your changes will be lost if you don’t save them." msgstr "Provedené změny budou ztraceny, pokud je neuložíte." #: data/pdfarranger.ui:144 msgid "Zoom In" msgstr "Přiblížit" #: data/pdfarranger.ui:167 msgid "Zoom Out" msgstr "Oddálit" #: data/menu.ui:217 msgid "Zoom _Fit" msgstr "Přizpůsobit _velikost" #: data/menu.ui:209 msgid "Zoom _In" msgstr "Při_blížit" #: data/menu.ui:213 msgid "Zoom _Out" msgstr "O_ddálit" #: data/menu.ui:240 msgid "_About" msgstr "_O programu" #: pdfarranger/config.py:216 pdfarranger/pageutils.py:219 #: pdfarranger/pdfarranger.py:961 pdfarranger/pdfarranger.py:970 #: pdfarranger/pdfarranger.py:1094 pdfarranger/pdfarranger.py:1144 msgid "_Cancel" msgstr "_Zrušit" #: pdfarranger/pdfarranger.py:980 data/menu.ui:246 msgid "_Close" msgstr "Za_vřít" #: data/menu.ui:132 data/menu.ui:268 msgid "_Copy" msgstr "_Kopírovat" #: data/menu.ui:108 data/menu.ui:260 msgid "_Delete" msgstr "_Smazat" #: data/menu.ui:174 data/menu.ui:317 msgid "_Deselect All" msgstr "Zr_ušit výběr" #: data/menu.ui:87 msgid "_Edit" msgstr "Up_ravit" #: data/menu.ui:30 msgid "_Import" msgstr "_Importovat" #: data/menu.ui:199 data/menu.ui:342 msgid "_Invert Selection" msgstr "P_řevrátit výběr" #: data/menu.ui:124 data/menu.ui:381 msgid "_Merge Pages…" msgstr "S_loučit stránky…" #: data/menu.ui:36 msgid "_New Window" msgstr "_Nové okno" #: pdfarranger/config.py:217 pdfarranger/pageutils.py:220 msgid "_OK" msgstr "_OK" #: pdfarranger/pdfarranger.py:1143 data/menu.ui:24 msgid "_Open" msgstr "_Otevřít" #: data/menu.ui:100 data/menu.ui:361 msgid "_Page Format…" msgstr "_Formát stránky…" #: data/menu.ui:71 msgid "_Print…" msgstr "Vy_tisknout…" #: pdfarranger/pdfarranger.py:1017 data/menu.ui:252 msgid "_Quit" msgstr "U_končit" #: data/menu.ui:82 msgid "_Redo" msgstr "Z_novu" #: data/menu.ui:95 data/menu.ui:356 msgid "_Rotate Right" msgstr "Otočit do_prava" #: pdfarranger/pdfarranger.py:970 pdfarranger/pdfarranger.py:1093 #: data/menu.ui:42 msgid "_Save" msgstr "_Uložit" #: data/menu.ui:166 data/menu.ui:309 msgid "_Select" msgstr "Vybra_t" #: data/menu.ui:120 data/menu.ui:377 msgid "_Split Pages…" msgstr "_Rozdělit stránky…" #: data/menu.ui:78 msgid "_Undo" msgstr "_Zpět" #: data/menu.ui:206 msgid "_View" msgstr "_Zobrazit" #: pdfarranger/pageutils.py:139 pdfarranger/pageutils.py:362 #: pdfarranger/pageutils.py:412 msgid "mm" msgstr "mm" #: pdfarranger/core.py:89 msgid "page" msgstr "stránka" #: pdfarranger/pdfarranger.py:811 msgid "untitled" msgstr "nepojmenovaný" pdfarranger-1.10.1/po/da.po000066400000000000000000000404301451252235000154270ustar00rootroot00000000000000# Danish translation for pdfarranger. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the pdfarranger package. # Translators: # Lrss, 2022 msgid "" msgstr "" "Project-Id-Version: pdfarranger\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-04-29 22:45+0200\n" "PO-Revision-Date: 2022-08-28 13:47+0200\n" "Last-Translator: Lrss \n" "Language-Team: Danish\n" "Language: da\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.1.1\n" #: pdfarranger/splitter.py:87 msgid "#Col" msgstr "#Kolonne" #: pdfarranger/splitter.py:87 msgid "#Row" msgstr "#Række" #: pdfarranger/pageutils.py:122 pdfarranger/pageutils.py:477 #: pdfarranger/pageutils.py:479 msgid "%" msgstr "%" #: pdfarranger/pageutils.py:170 #, python-format msgid "% of height" msgstr "% af højde" #: pdfarranger/pageutils.py:170 #, python-format msgid "% of width" msgstr "% af bredde" #: pdfarranger/pdfarranger.py:2548 #, python-format msgid "%s is a tool for rearranging and modifying PDF files." msgstr "%s er et værktøj til at omarrangere og modificere PDF filer." #: pdfarranger/config.py:232 msgid "(Libhandy missing)" msgstr "" #: pdfarranger/config.py:224 msgid "(Requires restart)" msgstr "" #: pdfarranger/pageutils.py:461 msgid "(same offset is applied to all pages)" msgstr "" #: pdfarranger/pdfarranger.py:1130 #, python-format msgid "A file named \"%s\" already exists. Do you want to replace it?" msgstr "" #: data/menu.ui:189 data/menu.ui:332 msgid "All From _Same File" msgstr "Alle fra _Samme Fil" #: pdfarranger/pdfarranger.py:507 msgid "All files" msgstr "Alle filer" #: pdfarranger/pdfarranger.py:462 msgid "All pages must have the same size." msgstr "Alle sider skal have samme størrelse." #: pdfarranger/pdfarranger.py:495 msgid "All supported files" msgstr "Alle understøttede filer" #: pdfarranger/pageutils.py:149 msgid "Bottom" msgstr "Bund" #: pdfarranger/pageutils.py:380 msgid "Bottom to Top" msgstr "" #: pdfarranger/core.py:386 msgid "Clipboard image" msgstr "Udklipsholder billede" #: pdfarranger/pageutils.py:363 pdfarranger/splitter.py:60 msgid "Columns" msgstr "Kolonner" #: pdfarranger/metadata.py:48 msgid "Created" msgstr "Oprettet" #: pdfarranger/metadata.py:46 msgid "Creator" msgstr "Forfatter" #: pdfarranger/metadata.py:47 msgid "Creator tool" msgstr "Program" #: pdfarranger/pageutils.py:153 msgid "Crop Margins" msgstr "Beskær margener" #: data/menu.ui:104 data/menu.ui:365 msgid "Crop White Borders" msgstr "_Beskær Hvide Margener" #: pdfarranger/pageutils.py:161 msgid "" "Cropping does not remove any content from the PDF file, it only hides it." msgstr "Indhold fjernes ikke fra PDF'en ved beskæring, det bliver kun skjult." #: data/menu.ui:128 data/menu.ui:264 msgid "Cu_t" msgstr "_Klip" #: pdfarranger/pdfarranger.py:1250 msgid "Despite the warnings the document(s) should have no visible issues." msgstr "" "På trods af advarslerne burde dokumentet/dokumenterne ikke have nogen " "synlige problemer." #: pdfarranger/pdfarranger.py:979 msgid "Discard changes and close?" msgstr "Kassér ændringerne og luk vinduet?" #: pdfarranger/pdfarranger.py:1016 msgid "Discard changes and quit?" msgstr "Kassér ændringer og afslut programmet?" #: pdfarranger/exporter.py:194 msgid "Do not show this dialog again." msgstr "Vis ikke denne besked igen." #: pdfarranger/pdfarranger.py:970 msgid "Do_n’t Save" msgstr "Gem _ikke" #: pdfarranger/pdfarranger.py:1257 msgid "Don't show warnings when saving again." msgstr "Undlad at vise advarsler når der gemmes." #: data/menu.ui:112 data/menu.ui:369 msgid "Dupl_icate" msgstr "Dupl_iker" #: data/menu.ui:52 data/menu.ui:395 msgid "E_xport" msgstr "Eks_porter" #: data/menu.ui:55 data/menu.ui:398 msgid "E_xport Selection to a Single File…" msgstr "E_ksportér Markering til en Enkel Fil…" #: data/menu.ui:228 msgid "Edit _Properties" msgstr "Rediger _Egenskaber" #: pdfarranger/metadata.py:198 msgid "Edit properties" msgstr "Dokumentegenskaber" #: pdfarranger/splitter.py:62 msgid "Equal column width" msgstr "Ens Kolonnebredde" #: pdfarranger/splitter.py:62 msgid "Equal row height" msgstr "Ens Rækkehøjde" #: data/menu.ui:60 data/menu.ui:403 msgid "Export Selection to _Individual Files…" msgstr "Eksportér Markering til _Individuelle Filer…" #: data/menu.ui:65 data/menu.ui:408 msgid "Export _All Pages to Individual Files…" msgstr "Eksportér _Alle sider til Individuelle Filer…" #: pdfarranger/pdfarranger.py:1088 msgid "Export…" msgstr "Eksport…" #: pdfarranger/core.py:388 pdfarranger/pdfarranger.py:1504 msgid "File is neither pdf nor image" msgstr "Filen er hverken PDF eller billede" #: pdfarranger/pdfarranger.py:301 msgid "File(s) to open" msgstr "Fil(er) at åbne" #: pdfarranger/config.py:237 msgid "For more options see:" msgstr "" #: pdfarranger/exporter.py:192 msgid "Forms and outlines are lost on saving." msgstr "Formularer og bogmærker går tabt, når du gemmer." #: data/menu.ui:221 msgid "Full_screen" msgstr "Fuld_skærm" #: pdfarranger/pdfarranger.py:2562 msgid "GNU General Public License (GPL) Version 3." msgstr "GNU General Public License (GPL) Version 3." #: data/menu.ui:160 data/menu.ui:389 msgid "Generate Booklet" msgstr "Generer Hæfte" #: pdfarranger/pageutils.py:236 pdfarranger/pageutils.py:240 #: pdfarranger/pageutils.py:328 msgid "Height" msgstr "Højde" #: pdfarranger/splitter.py:88 msgid "Height in %" msgstr "Højde i %" #: pdfarranger/pageutils.py:375 msgid "Horizontal" msgstr "" #: pdfarranger/splitter.py:61 msgid "Horizontal Splits" msgstr "Horisontale opdelinger" #: pdfarranger/pageutils.py:476 msgid "Horizontal offset" msgstr "" #: pdfarranger/core.py:377 msgid "Image files are only supported with img2pdf" msgstr "Billedfiler virker kun med Img2pdf" #: pdfarranger/core.py:383 msgid "Image format is not supported by img2pdf" msgstr "Billedformatet understøttes ikke af img2pdf" #: data/pdfarranger.ui:58 msgid "Import" msgstr "Importér" #: pdfarranger/pdfarranger.py:1327 msgid "Import…" msgstr "Import…" #: data/menu.ui:156 data/menu.ui:385 msgid "Insert Blan_k Page…" msgstr "Indsæt _Tom Side…" #: pdfarranger/pageutils.py:325 msgid "Insert Blank Page" msgstr "Indsæt Tom Side" #: pdfarranger/metadata.py:169 msgid "Invalid date format. Input discarded." msgstr "Ugyldigt datoformat." #: pdfarranger/pdfarranger.py:2551 #, python-format msgid "It uses libqpdf %s, pikepdf %s, GTK %s and Python %s." msgstr "Programmet anvender %s, pikepdf %s, GTK %s og Python %s." #: pdfarranger/metadata.py:44 msgid "Keywords" msgstr "Nøgleord" #: pdfarranger/config.py:222 msgid "Language" msgstr "" #: pdfarranger/pageutils.py:460 msgid "Layout for the first page in selection" msgstr "" #: pdfarranger/pageutils.py:149 msgid "Left" msgstr "Venstre" #: pdfarranger/pageutils.py:377 msgid "Left to Right" msgstr "" #: data/pdfarranger.ui:122 msgid "Main Menu" msgstr "Hovedmenu" #: pdfarranger/pdfarranger.py:2557 msgid "Maintainers and contributors" msgstr "Administratorer og bidragydere" #: pdfarranger/pageutils.py:361 msgid "Margin" msgstr "" #: pdfarranger/pageutils.py:347 msgid "Merge Pages" msgstr "" #: pdfarranger/pageutils.py:412 msgid "Merged page size:" msgstr "" #: pdfarranger/metadata.py:49 msgid "Modified" msgstr "Ændret" #: pdfarranger/pageutils.py:392 msgid "Non-uniform page size - using max size" msgstr "" #: data/pdfarranger.ui:37 msgid "Open" msgstr "Åben" #: pdfarranger/pdfarranger.py:1186 msgid "Open…" msgstr "Åben…" #: pdfarranger/pageutils.py:436 msgid "Overlay" msgstr "" #: pdfarranger/pdfarranger.py:282 msgid "" "PDF Arranger is a small python-gtk application, which helps the user to " "merge or split pdf documents and rotate, crop and rearrange their pages " "using an interactive and intuitive graphical interface. It is a frontend for " "pikepdf." msgstr "" "PDF Arranger er et lille python-gtk program, som hjælper brugeren med at " "flette eller opdele pdf-dokumenter og rotere, beskære og omarrangere deres " "sider ved hjælp af en interaktiv og intuitiv grafisk grænseflade. Det er en " "frontend til pikepdf." #: pdfarranger/pdfarranger.py:1498 msgid "PDF document is damaged" msgstr "PDF dokumentet er beskadiget" #: pdfarranger/pdfarranger.py:499 msgid "PDF files" msgstr "PDF filer" #: pdfarranger/pageutils.py:388 msgid "Page Order" msgstr "" #: pdfarranger/pageutils.py:241 msgid "Page Size" msgstr "Sidestørrelse" #: pdfarranger/pdfarranger.py:2585 msgid "Page Size:" msgstr "Sidestørrelse:" #: pdfarranger/pageutils.py:230 msgid "Page format" msgstr "Sideformat" #: pdfarranger/core.py:285 msgid "Password" msgstr "Adgangskode" #: pdfarranger/core.py:263 msgid "Password required" msgstr "Adgangskode påkrævet" #: data/menu.ui:277 msgid "Past_e Special" msgstr "Indsæt _Special" #: data/menu.ui:295 msgid "Paste As O_verlay…" msgstr "" #: data/menu.ui:151 data/menu.ui:290 msgid "Paste As _Even Pages" msgstr "Indsæt som _Lige Sider" #: data/menu.ui:146 data/menu.ui:285 msgid "Paste As _Odd Pages" msgstr "Indsæt som _Ulige Sider" #: data/menu.ui:300 msgid "Paste As _Underlay…" msgstr "" #: data/menu.ui:136 data/menu.ui:272 msgid "Paste _After" msgstr "Indsæt _efter" #: data/menu.ui:141 data/menu.ui:280 msgid "Paste _Before" msgstr "Indsæt _før" #: pdfarranger/pdfarranger.py:1627 msgid "Pasted data not valid. Aborting paste." msgstr "Indsatte data er ugyldige. Indsættelse afbrydes." #: pdfarranger/pdfarranger.py:1589 msgid "Pikepdf >= 3 is needed for overlay/underlay/merge support." msgstr "" #: data/menu.ui:234 msgid "Pre_ferences" msgstr "" #: pdfarranger/config.py:212 msgid "Preferences" msgstr "" #: pdfarranger/pdfarranger.py:293 msgid "Print the version of PDF Arranger and exit" msgstr "Print versionen af PDF Arranger og afslut" #: pdfarranger/exporter.py:457 msgid "Printing…" msgstr "Udskriver…" #: pdfarranger/metadata.py:45 msgid "Producer" msgstr "Producent" #: pdfarranger/metadata.py:212 msgid "Property" msgstr "Egenskab" #: data/menu.ui:116 data/menu.ui:373 msgid "Re_verse Order" msgstr "Omvend rækkefølgen" #: pdfarranger/pageutils.py:238 msgid "Relative" msgstr "Relativ" #: pdfarranger/exporter.py:469 msgid "Rendering Preview…" msgstr "Konstruerer forhåndsvisning…" #: pdfarranger/pdfarranger.py:732 msgid "Rendering…" msgstr "Renderer…" #: pdfarranger/pdfarranger.py:1132 msgid "Replace" msgstr "" #: pdfarranger/pageutils.py:149 msgid "Right" msgstr "Højre" #: pdfarranger/pageutils.py:378 msgid "Right to Left" msgstr "" #: data/pdfarranger.ui:203 msgid "Rotate Left" msgstr "Rotér til Venstre" #: data/pdfarranger.ui:227 msgid "Rotate Right" msgstr "Rotér til Højre" #: data/menu.ui:90 data/menu.ui:351 msgid "Rotate _Left" msgstr "Rotér til _Venstre" #: pdfarranger/pageutils.py:364 pdfarranger/splitter.py:60 msgid "Rows" msgstr "Rækker" #: data/menu.ui:194 data/menu.ui:337 msgid "Same Page _Format" msgstr "Alle med samme Side_format" #: data/pdfarranger.ui:78 msgid "Save" msgstr "Gem" #: data/pdfarranger.ui:97 msgid "Save As" msgstr "Gem som" #: pdfarranger/pdfarranger.py:1088 msgid "Save As…" msgstr "Gem som…" #: data/menu.ui:47 msgid "Save _As…" msgstr "Gem s_om…" #: pdfarranger/pdfarranger.py:988 msgid "Save changes before closing?" msgstr "Gem ændringer inden lukning?" #: pdfarranger/pdfarranger.py:1025 msgid "Save changes before quitting?" msgstr "Gem ændringer inden lukning?" #: pdfarranger/pdfarranger.py:985 msgid "Save changes to “{}” before closing?" msgstr "Gem ændringer i “{}” inden lukning?" #: pdfarranger/pdfarranger.py:1022 msgid "Save changes to “{}” before quitting?" msgstr "Gem ændringer i “{}” inden lukning?" #: pdfarranger/pdfarranger.py:1249 msgid "Saving produced some warnings" msgstr "Gemprocessen gav nogle advarsler" #: pdfarranger/pdfarranger.py:1288 msgid "Saving…" msgstr "Gemmer…" #: pdfarranger/pageutils.py:116 msgid "Scale factor" msgstr "Skaleringsfaktor" #: data/menu.ui:169 data/menu.ui:312 msgid "Select _All" msgstr "Vælg _Alle" #: data/menu.ui:184 data/menu.ui:327 msgid "Select _Even Pages" msgstr "Vælg _Lige Sider" #: data/menu.ui:179 data/menu.ui:322 msgid "Select _Odd Pages" msgstr "Vælg _Ulige Sider" #: pdfarranger/pdfarranger.py:2580 msgid "Selected pages: " msgstr "Valgte sider: " #: pdfarranger/splitter.py:26 msgid "Split Pages" msgstr "Del sider" #: pdfarranger/metadata.py:43 msgid "Subject" msgstr "Emne" #: pdfarranger/pdfarranger.py:512 msgid "Supported image files" msgstr "Understøttede billedfiler" #: pdfarranger/config.py:248 pdfarranger/config.py:256 msgid "System setting" msgstr "" #: pdfarranger/core.py:275 msgid "" "The document “{}” is locked and requires a password before it can be opened." msgstr "Dokumentet “{}” er låst og kræver adgangskode for at kunne åbnes." #: pdfarranger/core.py:274 msgid "The password will be remembered until you close PDF Arranger." msgstr "Adgangskode huskes indtil du lukker PDF Arranger." #: pdfarranger/config.py:230 msgid "Theme" msgstr "" #: pdfarranger/metadata.py:42 msgid "Title" msgstr "Titel" #: pdfarranger/pageutils.py:149 msgid "Top" msgstr "Top" #: pdfarranger/pageutils.py:379 msgid "Top to Bottom" msgstr "" #: pdfarranger/pageutils.py:436 msgid "Underlay" msgstr "" #: pdfarranger/core.py:361 pdfarranger/pdfarranger.py:1494 msgid "Unknown file format" msgstr "Ukendt filformat" #: pdfarranger/metadata.py:212 msgid "Value" msgstr "Indhold" #: pdfarranger/pageutils.py:376 msgid "Vertical" msgstr "" #: pdfarranger/splitter.py:61 msgid "Vertical Splits" msgstr "Lodrette opdelinger" #: pdfarranger/pageutils.py:478 msgid "Vertical offset" msgstr "" #: pdfarranger/exporter.py:187 msgid "Warning" msgstr "Advarsel" #: pdfarranger/pageutils.py:235 pdfarranger/pageutils.py:239 #: pdfarranger/pageutils.py:327 msgid "Width" msgstr "Bredde" #: pdfarranger/splitter.py:88 msgid "Width in %" msgstr "Bredde i %" #: pdfarranger/pdfarranger.py:969 msgid "Your changes will be lost if you don’t save them." msgstr "Dine ændringer vil gå tabt, hvis du ikke gemmer dem." #: data/pdfarranger.ui:144 msgid "Zoom In" msgstr "Zoom ind" #: data/pdfarranger.ui:167 msgid "Zoom Out" msgstr "Zoom ud" #: data/menu.ui:217 msgid "Zoom _Fit" msgstr "_Tilpas Zoom" #: data/menu.ui:209 msgid "Zoom _In" msgstr "Zoom _Ind" #: data/menu.ui:213 msgid "Zoom _Out" msgstr "Zoom _Ud" #: data/menu.ui:240 msgid "_About" msgstr "_Om PDF Arranger" #: pdfarranger/config.py:216 pdfarranger/pageutils.py:219 #: pdfarranger/pdfarranger.py:961 pdfarranger/pdfarranger.py:970 #: pdfarranger/pdfarranger.py:1094 pdfarranger/pdfarranger.py:1144 msgid "_Cancel" msgstr "_Annullér" #: pdfarranger/pdfarranger.py:980 data/menu.ui:246 msgid "_Close" msgstr "_Luk Vindue" #: data/menu.ui:132 data/menu.ui:268 msgid "_Copy" msgstr "K_opiér" #: data/menu.ui:108 data/menu.ui:260 msgid "_Delete" msgstr "_Slet" #: data/menu.ui:174 data/menu.ui:317 msgid "_Deselect All" msgstr "Fra_vælg Alle" #: data/menu.ui:87 msgid "_Edit" msgstr "_Redigér" #: data/menu.ui:30 msgid "_Import" msgstr "_Import" #: data/menu.ui:199 data/menu.ui:342 msgid "_Invert Selection" msgstr "_Invertér Markeringen" #: data/menu.ui:124 data/menu.ui:381 msgid "_Merge Pages…" msgstr "" #: data/menu.ui:36 msgid "_New Window" msgstr "_Nyt Vindue" #: pdfarranger/config.py:217 pdfarranger/pageutils.py:220 msgid "_OK" msgstr "" #: pdfarranger/pdfarranger.py:1143 data/menu.ui:24 msgid "_Open" msgstr "_Åben" #: data/menu.ui:100 data/menu.ui:361 msgid "_Page Format…" msgstr "_Sideformat…" #: data/menu.ui:71 msgid "_Print…" msgstr "_Udskriv…" #: pdfarranger/pdfarranger.py:1017 data/menu.ui:252 msgid "_Quit" msgstr "Afslut Program" #: data/menu.ui:82 msgid "_Redo" msgstr "_Gentag" #: data/menu.ui:95 data/menu.ui:356 msgid "_Rotate Right" msgstr "Rotér til _Højre" #: pdfarranger/pdfarranger.py:970 pdfarranger/pdfarranger.py:1093 #: data/menu.ui:42 msgid "_Save" msgstr "_Gem" #: data/menu.ui:166 data/menu.ui:309 msgid "_Select" msgstr "_Makering" #: data/menu.ui:120 data/menu.ui:377 msgid "_Split Pages…" msgstr "Op_del Siderne…" #: data/menu.ui:78 msgid "_Undo" msgstr "_Fortryd" #: data/menu.ui:206 msgid "_View" msgstr "_Visning" #: pdfarranger/pageutils.py:139 pdfarranger/pageutils.py:362 #: pdfarranger/pageutils.py:412 msgid "mm" msgstr "mm" #: pdfarranger/core.py:89 msgid "page" msgstr "side" #: pdfarranger/pdfarranger.py:811 msgid "untitled" msgstr "unavngivet" pdfarranger-1.10.1/po/de.po000066400000000000000000000432111451252235000154330ustar00rootroot00000000000000# German translation for pdfarranger. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the pdfarranger package. # Translators: # Konstantinos Poulios, 2008-2017 # David Auer, 2023 # Milo Ivir , 2020, 2021 # Dr. Tobias Quathamer , 2021 # David Kyburz, 2022, 2023. msgid "" msgstr "" "Project-Id-Version: pdfarranger\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-04-29 22:45+0200\n" "PO-Revision-Date: 2023-04-04 01:43+0200\n" "Last-Translator: David Auer\n" "Language-Team: \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 2.3\n" #: pdfarranger/splitter.py:87 msgid "#Col" msgstr "Spalte" #: pdfarranger/splitter.py:87 msgid "#Row" msgstr "Zeile" #: pdfarranger/pageutils.py:122 pdfarranger/pageutils.py:477 #: pdfarranger/pageutils.py:479 msgid "%" msgstr "%" #: pdfarranger/pageutils.py:170 #, python-format msgid "% of height" msgstr "% der Höhe" #: pdfarranger/pageutils.py:170 #, python-format msgid "% of width" msgstr "% der Breite" #: pdfarranger/pdfarranger.py:2548 #, python-format msgid "%s is a tool for rearranging and modifying PDF files." msgstr "%s ist ein Werkzeug zum Neuordnen und Ändern von PDF-Dateien." #: pdfarranger/config.py:232 msgid "(Libhandy missing)" msgstr "(Libhandy fehlt)" #: pdfarranger/config.py:224 msgid "(Requires restart)" msgstr "(Erfordert Neustart)" #: pdfarranger/pageutils.py:461 msgid "(same offset is applied to all pages)" msgstr "(die gleiche Verschiebung wird auf alle Seiten angewendet)" #: pdfarranger/pdfarranger.py:1130 #, python-format msgid "A file named \"%s\" already exists. Do you want to replace it?" msgstr "" "Eine Datei mit dem Namen »%s« existiert bereits. Möchten Sie diese ersetzen?" #: data/menu.ui:189 data/menu.ui:332 msgid "All From _Same File" msgstr "Alle der _gleichen Datei" #: pdfarranger/pdfarranger.py:507 msgid "All files" msgstr "Alle Dateien" #: pdfarranger/pdfarranger.py:462 msgid "All pages must have the same size." msgstr "Alle Seiten müssen die gleiche Größe haben." #: pdfarranger/pdfarranger.py:495 msgid "All supported files" msgstr "Alle unterstützten Dateien" #: pdfarranger/pageutils.py:149 msgid "Bottom" msgstr "Unten" #: pdfarranger/pageutils.py:380 msgid "Bottom to Top" msgstr "Unten nach Oben" #: pdfarranger/core.py:386 msgid "Clipboard image" msgstr "Zwischenablage-Bild" #: pdfarranger/pageutils.py:363 pdfarranger/splitter.py:60 msgid "Columns" msgstr "Spalten" #: pdfarranger/metadata.py:48 msgid "Created" msgstr "Erstellt" #: pdfarranger/metadata.py:46 msgid "Creator" msgstr "Ersteller" #: pdfarranger/metadata.py:47 msgid "Creator tool" msgstr "Erstellungswerkzeug" #: pdfarranger/pageutils.py:153 msgid "Crop Margins" msgstr "Seitenränder abschneiden" #: data/menu.ui:104 data/menu.ui:365 msgid "Crop White Borders" msgstr "Weiße Ränder abschneiden" #: pdfarranger/pageutils.py:161 msgid "" "Cropping does not remove any content from the PDF file, it only hides it." msgstr "" "Abschneiden entfernt keinen Inhalt der PDF-Datei, es blendet ihn nur aus." #: data/menu.ui:128 data/menu.ui:264 msgid "Cu_t" msgstr "_Ausschneiden" #: pdfarranger/pdfarranger.py:1250 msgid "Despite the warnings the document(s) should have no visible issues." msgstr "" "Trotz der Warnungen sollte(n) das/die Dokument(e) keine sichtbaren Probleme " "aufweisen." #: pdfarranger/pdfarranger.py:979 msgid "Discard changes and close?" msgstr "Änderungen verwerfen und schließen?" #: pdfarranger/pdfarranger.py:1016 msgid "Discard changes and quit?" msgstr "Änderungen verwerfen und beenden?" #: pdfarranger/exporter.py:194 msgid "Do not show this dialog again." msgstr "Diesen Dialog nicht mehr anzeigen." #: pdfarranger/pdfarranger.py:970 msgid "Do_n’t Save" msgstr "_Nicht speichern" #: pdfarranger/pdfarranger.py:1257 msgid "Don't show warnings when saving again." msgstr "Beim erneuten Speichern keine Warnungen anzeigen." #: data/menu.ui:112 data/menu.ui:369 msgid "Dupl_icate" msgstr "_Duplizieren" #: data/menu.ui:52 data/menu.ui:395 msgid "E_xport" msgstr "E_xportieren" #: data/menu.ui:55 data/menu.ui:398 msgid "E_xport Selection to a Single File…" msgstr "Auswahl in eine Datei e_xportieren …" #: data/menu.ui:228 msgid "Edit _Properties" msgstr "Eige_nschaften ändern" #: pdfarranger/metadata.py:198 msgid "Edit properties" msgstr "Eigenschaften ändern" #: pdfarranger/splitter.py:62 msgid "Equal column width" msgstr "Gleiche Spaltenbreite" #: pdfarranger/splitter.py:62 msgid "Equal row height" msgstr "Gleiche Zeilenhöhe" #: data/menu.ui:60 data/menu.ui:403 msgid "Export Selection to _Individual Files…" msgstr "Auswahl in E_inzeldateien exportieren …" #: data/menu.ui:65 data/menu.ui:408 msgid "Export _All Pages to Individual Files…" msgstr "_Alle Seiten in Einzeldateien exportieren …" #: pdfarranger/pdfarranger.py:1088 msgid "Export…" msgstr "Exportieren …" #: pdfarranger/core.py:388 pdfarranger/pdfarranger.py:1504 msgid "File is neither pdf nor image" msgstr "Datei ist weder ein PDF noch ein Bild" #: pdfarranger/pdfarranger.py:301 msgid "File(s) to open" msgstr "Zu öffnende Datei(en)" #: pdfarranger/config.py:237 msgid "For more options see:" msgstr "Weitere Optionen in der Konfigurationsdatei:" #: pdfarranger/exporter.py:192 msgid "Forms and outlines are lost on saving." msgstr "Formulare und Inhaltsverzeichnisse gehen beim Speichern verloren." #: data/menu.ui:221 msgid "Full_screen" msgstr "Voll_bild" #: pdfarranger/pdfarranger.py:2562 msgid "GNU General Public License (GPL) Version 3." msgstr "GNU General Public License (GPL) Version 3." #: data/menu.ui:160 data/menu.ui:389 msgid "Generate Booklet" msgstr "Broschüre erstellen" #: pdfarranger/pageutils.py:236 pdfarranger/pageutils.py:240 #: pdfarranger/pageutils.py:328 msgid "Height" msgstr "Höhe" #: pdfarranger/splitter.py:88 msgid "Height in %" msgstr "Höhe in %" #: pdfarranger/pageutils.py:375 msgid "Horizontal" msgstr "Horizontal" #: pdfarranger/splitter.py:61 msgid "Horizontal Splits" msgstr "Waagerechte Teilungen" #: pdfarranger/pageutils.py:476 msgid "Horizontal offset" msgstr "Horizontale Verschiebung" #: pdfarranger/core.py:377 msgid "Image files are only supported with img2pdf" msgstr "Bilddateien werden nur mit img2pdf unterstützt" #: pdfarranger/core.py:383 msgid "Image format is not supported by img2pdf" msgstr "Bildformat wird von img2pdf nicht unterstützt" #: data/pdfarranger.ui:58 msgid "Import" msgstr "Importieren" #: pdfarranger/pdfarranger.py:1327 msgid "Import…" msgstr "Importieren …" #: data/menu.ui:156 data/menu.ui:385 msgid "Insert Blan_k Page…" msgstr "_Leere Seite einfügen…" #: pdfarranger/pageutils.py:325 msgid "Insert Blank Page" msgstr "Leere Seite einfügen" #: pdfarranger/metadata.py:169 msgid "Invalid date format. Input discarded." msgstr "Ungültiges Datumsformat. Eingabe verworfen." #: pdfarranger/pdfarranger.py:2551 #, python-format msgid "It uses libqpdf %s, pikepdf %s, GTK %s and Python %s." msgstr "Es verwendet libqpdf %s, pikepdf %s, GTK %s and Python %s." #: pdfarranger/metadata.py:44 msgid "Keywords" msgstr "Schlagworte" #: pdfarranger/config.py:222 msgid "Language" msgstr "Sprache" #: pdfarranger/pageutils.py:460 msgid "Layout for the first page in selection" msgstr "Layout der ersten ausgewählten Seite" #: pdfarranger/pageutils.py:149 msgid "Left" msgstr "Links" #: pdfarranger/pageutils.py:377 msgid "Left to Right" msgstr "Links nach Rechts" #: data/pdfarranger.ui:122 msgid "Main Menu" msgstr "Hauptmenü" #: pdfarranger/pdfarranger.py:2557 msgid "Maintainers and contributors" msgstr "Hauptentwickler und Mitwirkende" #: pdfarranger/pageutils.py:361 msgid "Margin" msgstr "Seitenrand" #: pdfarranger/pageutils.py:347 msgid "Merge Pages" msgstr "Seiten zusammenfügen" #: pdfarranger/pageutils.py:412 msgid "Merged page size:" msgstr "Größe der zusammengefügten Seiten:" #: pdfarranger/metadata.py:49 msgid "Modified" msgstr "Geändert" #: pdfarranger/pageutils.py:392 msgid "Non-uniform page size - using max size" msgstr "Uneinheitliche Seitengröße - die größte Seite ist maßgeblich" #: data/pdfarranger.ui:37 msgid "Open" msgstr "Öffnen" #: pdfarranger/pdfarranger.py:1186 msgid "Open…" msgstr "Öffnen …" #: pdfarranger/pageutils.py:436 msgid "Overlay" msgstr "Overlay" #: pdfarranger/pdfarranger.py:282 msgid "" "PDF Arranger is a small python-gtk application, which helps the user to " "merge or split pdf documents and rotate, crop and rearrange their pages " "using an interactive and intuitive graphical interface. It is a frontend for " "pikepdf." msgstr "" "PDF Arranger ist eine kleine Python-GTK-Anwendung, die dem Benutzer hilft, " "PDF-Dokumente zusammenzuführen oder aufzuteilen und ihre Seiten mit Hilfe " "einer interaktiven und intuitiven grafischen Oberfläche zu drehen, " "zuzuschneiden und neu anzuordnen. Es ist ein Frontend für Pikepdf." #: pdfarranger/pdfarranger.py:1498 msgid "PDF document is damaged" msgstr "PDF-Dokument ist beschädigt" #: pdfarranger/pdfarranger.py:499 msgid "PDF files" msgstr "PDF-Dateien" #: pdfarranger/pageutils.py:388 msgid "Page Order" msgstr "Sortierung" #: pdfarranger/pageutils.py:241 msgid "Page Size" msgstr "Seitengröße" #: pdfarranger/pdfarranger.py:2585 msgid "Page Size:" msgstr "Seitengröße:" #: pdfarranger/pageutils.py:230 msgid "Page format" msgstr "Seitenformat" #: pdfarranger/core.py:285 msgid "Password" msgstr "Passwort" #: pdfarranger/core.py:263 msgid "Password required" msgstr "Passwort wird benötigt" #: data/menu.ui:277 msgid "Past_e Special" msgstr "Spezielles Ein_fügen" #: data/menu.ui:295 msgid "Paste As O_verlay…" msgstr "Als _Overlay einfügen …" #: data/menu.ui:151 data/menu.ui:290 msgid "Paste As _Even Pages" msgstr "Als _gerade Seiten einfügen" #: data/menu.ui:146 data/menu.ui:285 msgid "Paste As _Odd Pages" msgstr "Als _ungerade Seiten einfügen" #: data/menu.ui:300 msgid "Paste As _Underlay…" msgstr "Als _Hintergrund einfügen …" #: data/menu.ui:136 data/menu.ui:272 msgid "Paste _After" msgstr "Einfügen _nach" #: data/menu.ui:141 data/menu.ui:280 msgid "Paste _Before" msgstr "Einfügen _vor" #: pdfarranger/pdfarranger.py:1627 msgid "Pasted data not valid. Aborting paste." msgstr "Eingefügte Daten sind ungültig. Einfügen wird abgebrochen." #: pdfarranger/pdfarranger.py:1589 msgid "Pikepdf >= 3 is needed for overlay/underlay/merge support." msgstr "Für die Funktionen Overlay, Hintergrund und Zusammenfügen wird Pikepdf ab Version 3 benötigt." #: data/menu.ui:234 msgid "Pre_ferences" msgstr "_Einstellungen" #: pdfarranger/config.py:212 msgid "Preferences" msgstr "Einstellungen" #: pdfarranger/pdfarranger.py:293 msgid "Print the version of PDF Arranger and exit" msgstr "PDF Arranger Version anzeigen und beenden" #: pdfarranger/exporter.py:457 msgid "Printing…" msgstr "Drucken …" #: pdfarranger/metadata.py:45 msgid "Producer" msgstr "Hersteller" #: pdfarranger/metadata.py:212 msgid "Property" msgstr "Eigenschaft" #: data/menu.ui:116 data/menu.ui:373 msgid "Re_verse Order" msgstr "Rei_henfolge umkehren" #: pdfarranger/pageutils.py:238 msgid "Relative" msgstr "Relativ" #: pdfarranger/exporter.py:469 msgid "Rendering Preview…" msgstr "Vorschau erstellen …" #: pdfarranger/pdfarranger.py:732 msgid "Rendering…" msgstr "Vorschau erstellen …" #: pdfarranger/pdfarranger.py:1132 msgid "Replace" msgstr "Ersetzen" #: pdfarranger/pageutils.py:149 msgid "Right" msgstr "Rechts" #: pdfarranger/pageutils.py:378 msgid "Right to Left" msgstr "Rechts nach Links" #: data/pdfarranger.ui:203 msgid "Rotate Left" msgstr "Nach links drehen" #: data/pdfarranger.ui:227 msgid "Rotate Right" msgstr "Nach rechts drehen" #: data/menu.ui:90 data/menu.ui:351 msgid "Rotate _Left" msgstr "Nach _links drehen" #: pdfarranger/pageutils.py:364 pdfarranger/splitter.py:60 msgid "Rows" msgstr "Zeilen" #: data/menu.ui:194 data/menu.ui:337 msgid "Same Page _Format" msgstr "Gleiches Seiten_format" #: data/pdfarranger.ui:78 msgid "Save" msgstr "Speichern" #: data/pdfarranger.ui:97 msgid "Save As" msgstr "Speichern unter" #: pdfarranger/pdfarranger.py:1088 msgid "Save As…" msgstr "Speichern unter …" #: data/menu.ui:47 msgid "Save _As…" msgstr "Speichern _unter …" #: pdfarranger/pdfarranger.py:988 msgid "Save changes before closing?" msgstr "Änderungen vor dem Schließen speichern?" #: pdfarranger/pdfarranger.py:1025 msgid "Save changes before quitting?" msgstr "Änderungen vor dem Beenden speichern?" #: pdfarranger/pdfarranger.py:985 msgid "Save changes to “{}” before closing?" msgstr "Änderungen an »{}« vor dem Schließen speichern?" #: pdfarranger/pdfarranger.py:1022 msgid "Save changes to “{}” before quitting?" msgstr "Änderungen an »{}« vor dem Beenden speichern?" #: pdfarranger/pdfarranger.py:1249 msgid "Saving produced some warnings" msgstr "Speichern führte zu einigen Warnungen" #: pdfarranger/pdfarranger.py:1288 msgid "Saving…" msgstr "Speichern …" #: pdfarranger/pageutils.py:116 msgid "Scale factor" msgstr "Vergrößerung" #: data/menu.ui:169 data/menu.ui:312 msgid "Select _All" msgstr "_Alles auswählen" #: data/menu.ui:184 data/menu.ui:327 msgid "Select _Even Pages" msgstr "_Gerade Seiten auswählen" #: data/menu.ui:179 data/menu.ui:322 msgid "Select _Odd Pages" msgstr "_Ungerade Seiten auswählen" #: pdfarranger/pdfarranger.py:2580 msgid "Selected pages: " msgstr "Ausgewählte Seiten: " #: pdfarranger/splitter.py:26 msgid "Split Pages" msgstr "Seiten teilen" #: pdfarranger/metadata.py:43 msgid "Subject" msgstr "Thema" #: pdfarranger/pdfarranger.py:512 msgid "Supported image files" msgstr "Unterstützte Bilddateien" #: pdfarranger/config.py:248 pdfarranger/config.py:256 msgid "System setting" msgstr "Systemeinstellung" #: pdfarranger/core.py:275 msgid "" "The document “{}” is locked and requires a password before it can be opened." msgstr "" "Das Dokument »{}« ist gesperrt und ein Passwort wird benötigt, um es zu " "öffnen." #: pdfarranger/core.py:274 msgid "The password will be remembered until you close PDF Arranger." msgstr "Das Passwort wird gespeichert, bis PDF Arranger geschlossen wird." #: pdfarranger/config.py:230 msgid "Theme" msgstr "Erscheinungsbild" #: pdfarranger/metadata.py:42 msgid "Title" msgstr "Titel" #: pdfarranger/pageutils.py:149 msgid "Top" msgstr "Oben" #: pdfarranger/pageutils.py:379 msgid "Top to Bottom" msgstr "Oben nach Unten" #: pdfarranger/pageutils.py:436 msgid "Underlay" msgstr "Hintergrund" #: pdfarranger/core.py:361 pdfarranger/pdfarranger.py:1494 msgid "Unknown file format" msgstr "Unbekanntes Dateiformat" #: pdfarranger/metadata.py:212 msgid "Value" msgstr "Wert" #: pdfarranger/pageutils.py:376 msgid "Vertical" msgstr "Vertikal" #: pdfarranger/splitter.py:61 msgid "Vertical Splits" msgstr "Senkrechte Teilungen" #: pdfarranger/pageutils.py:478 msgid "Vertical offset" msgstr "Vertikale Verschiebung" #: pdfarranger/exporter.py:187 msgid "Warning" msgstr "Warnung" #: pdfarranger/pageutils.py:235 pdfarranger/pageutils.py:239 #: pdfarranger/pageutils.py:327 msgid "Width" msgstr "Breite" #: pdfarranger/splitter.py:88 msgid "Width in %" msgstr "Breite in %" #: pdfarranger/pdfarranger.py:969 msgid "Your changes will be lost if you don’t save them." msgstr "Änderungen gehen verloren, wenn sie nicht gespeichert werden." #: data/pdfarranger.ui:144 msgid "Zoom In" msgstr "Vergrößern" #: data/pdfarranger.ui:167 msgid "Zoom Out" msgstr "Verkleinern" #: data/menu.ui:217 msgid "Zoom _Fit" msgstr "Zoom _einpassen" #: data/menu.ui:209 msgid "Zoom _In" msgstr "Ver_größern" #: data/menu.ui:213 msgid "Zoom _Out" msgstr "Ver_kleinern" #: data/menu.ui:240 msgid "_About" msgstr "Über _PDF Arranger" #: pdfarranger/config.py:216 pdfarranger/pageutils.py:219 #: pdfarranger/pdfarranger.py:961 pdfarranger/pdfarranger.py:970 #: pdfarranger/pdfarranger.py:1094 pdfarranger/pdfarranger.py:1144 msgid "_Cancel" msgstr "_Abbrechen" #: pdfarranger/pdfarranger.py:980 data/menu.ui:246 msgid "_Close" msgstr "_Schließen" #: data/menu.ui:132 data/menu.ui:268 msgid "_Copy" msgstr "_Kopieren" #: data/menu.ui:108 data/menu.ui:260 msgid "_Delete" msgstr "_Entfernen" #: data/menu.ui:174 data/menu.ui:317 msgid "_Deselect All" msgstr "Auswahl au_fheben" #: data/menu.ui:87 msgid "_Edit" msgstr "_Bearbeiten" #: data/menu.ui:30 msgid "_Import" msgstr "_Importieren" #: data/menu.ui:199 data/menu.ui:342 msgid "_Invert Selection" msgstr "Auswahl _umkehren" #: data/menu.ui:124 data/menu.ui:381 msgid "_Merge Pages…" msgstr "Seiten _zusammenfügen…" #: data/menu.ui:36 msgid "_New Window" msgstr "_Neues Fenster" #: pdfarranger/config.py:217 pdfarranger/pageutils.py:220 msgid "_OK" msgstr "_Ok" #: pdfarranger/pdfarranger.py:1143 data/menu.ui:24 msgid "_Open" msgstr "_Öffnen" #: data/menu.ui:100 data/menu.ui:361 msgid "_Page Format…" msgstr "Seiten_format…" #: data/menu.ui:71 msgid "_Print…" msgstr "_Drucken …" #: pdfarranger/pdfarranger.py:1017 data/menu.ui:252 msgid "_Quit" msgstr "Been_den" #: data/menu.ui:82 msgid "_Redo" msgstr "_Wiederholen" #: data/menu.ui:95 data/menu.ui:356 msgid "_Rotate Right" msgstr "Nach _rechts drehen" #: pdfarranger/pdfarranger.py:970 pdfarranger/pdfarranger.py:1093 #: data/menu.ui:42 msgid "_Save" msgstr "_Speichern" #: data/menu.ui:166 data/menu.ui:309 msgid "_Select" msgstr "Aus_wählen" #: data/menu.ui:120 data/menu.ui:377 msgid "_Split Pages…" msgstr "_Seiten teilen…" #: data/menu.ui:78 msgid "_Undo" msgstr "_Rückgängig" #: data/menu.ui:206 msgid "_View" msgstr "_Ansicht" #: pdfarranger/pageutils.py:139 pdfarranger/pageutils.py:362 #: pdfarranger/pageutils.py:412 msgid "mm" msgstr "mm" #: pdfarranger/core.py:89 msgid "page" msgstr "Seite" #: pdfarranger/pdfarranger.py:811 msgid "untitled" msgstr "unbenannt" pdfarranger-1.10.1/po/el.po000066400000000000000000000517661451252235000154610ustar00rootroot00000000000000# PDF Arranger translation files. # # This file is part of PDF Arranger which is released under the GNU General # Public License version 3 or later. # See file COPYING or go to for full license details. # # Translators: # Konstantinos Poulios, 2008-2017 # Manussos Pulinakis, 2022 # msgid "" msgstr "" "Project-Id-Version: PDF Arranger 1.9.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-06-12 09:56+0300\n" "PO-Revision-Date: 2023-06-12 10:30+0300\n" "Last-Translator: Manussos Pulinakis <38626261+manussos@users.noreply.github.com>\n" "Language-Team: \n" "Language: el\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.0.1\n" #: pdfarranger/splitter.py:87 msgid "#Col" msgstr "#Στήλη" #: pdfarranger/splitter.py:87 msgid "#Row" msgstr "#Σειρά" #: pdfarranger/pageutils.py:122 pdfarranger/pageutils.py:477 #: pdfarranger/pageutils.py:479 msgid "%" msgstr "%" #: pdfarranger/pageutils.py:170 #, python-format msgid "% of height" msgstr "% του ύψους" #: pdfarranger/pageutils.py:170 #, python-format msgid "% of width" msgstr "% του πλάτους" #: pdfarranger/pdfarranger.py:2549 #, python-format msgid "%s is a tool for rearranging and modifying PDF files." msgstr "Το %s είναι ένα εργαλείο για αναδιάταξη και τροποποίηση αρχείων PDF." #: pdfarranger/config.py:233 msgid "(Libhandy missing)" msgstr "(Η Libhandy απουσιάζει)" #: pdfarranger/config.py:225 msgid "(Requires restart)" msgstr "(Απαιτεί επανεκίνηση)" #: pdfarranger/pageutils.py:461 msgid "(same offset is applied to all pages)" msgstr "(εφαρμόζεται η ίδια μετατόπιση σε όλες τις σελίδες)" #: pdfarranger/pdfarranger.py:1130 #, python-format msgid "A file named \"%s\" already exists. Do you want to replace it?" msgstr "Ένα αρχείο με το όνομα \"%s\" υπάρχει ήδη. Θέλετε να το αντικαταστήσετε;" #: data/menu.ui:202 data/menu.ui:345 msgid "All From _Same File" msgstr "Όλε_ς από το ίδιο αρχείο" #: pdfarranger/pdfarranger.py:507 msgid "All files" msgstr "Όλα τα αρχεία" #: pdfarranger/pdfarranger.py:462 msgid "All pages must have the same size." msgstr "Οι σελίδες θα πρέπει να έχουν όλες το ίδιο μέγεθος." #: pdfarranger/pdfarranger.py:495 msgid "All supported files" msgstr "Όλα τα υποστηριζόμενα αρχεία" #: pdfarranger/pageutils.py:149 msgid "Bottom" msgstr "Κάτω" #: pdfarranger/pageutils.py:380 msgid "Bottom to Top" msgstr "Από κάτω προς τα πάνω" #: pdfarranger/core.py:386 msgid "Clipboard image" msgstr "Εικόνα πρόχειρου" #: pdfarranger/pageutils.py:363 pdfarranger/splitter.py:60 msgid "Columns" msgstr "Στήλες" #: pdfarranger/metadata.py:49 msgid "Created" msgstr "Δημιουργήθηκε" #: pdfarranger/metadata.py:47 msgid "Creator" msgstr "Δημιουργός" #: pdfarranger/metadata.py:48 msgid "Creator tool" msgstr "Εργαλείο δημιουργίας" #: pdfarranger/pageutils.py:153 msgid "Crop Margins" msgstr "Περικοπή περιθωρίων" #: data/menu.ui:149 data/menu.ui:378 msgid "Crop White Borders" msgstr "Περικοπή λευκών περιθωρίων" #: pdfarranger/pageutils.py:161 msgid "" "Cropping does not remove any content from the PDF file, it only hides it." msgstr "" "Η περικοπή δεν αφαιρεί περιεχόμενο από το αρχείο PDF, το αποκρύπτει μόνο." #: data/menu.ui:94 data/menu.ui:277 msgid "Cu_t" msgstr "Απο_κοπή" #: pdfarranger/pdfarranger.py:1250 msgid "Despite the warnings the document(s) should have no visible issues." msgstr "" "Παρά τις προειδοποιήσεις, το έγγραφο δεν πρέπει να έχει εμφανή προβλήματα." #: pdfarranger/pdfarranger.py:979 msgid "Discard changes and close?" msgstr "Απόρριψη αλλαγών και κλείσιμο;" #: pdfarranger/pdfarranger.py:1016 msgid "Discard changes and quit?" msgstr "Απόρριψη αλλαγών και έξοδος;" #: pdfarranger/exporter.py:194 msgid "Do not show this dialog again." msgstr "Να μην ξαναεμφανιστεί αυτό το παράθυρο διαλόγου." #: pdfarranger/pdfarranger.py:970 msgid "Do_n’t Save" msgstr "_Χωρίς αποθήκευση" #: pdfarranger/pdfarranger.py:1257 msgid "Don't show warnings when saving again." msgstr "Να μην εμφανίζονται ειδοποιήσεις κατά την αποθήκευση." #: data/menu.ui:153 data/menu.ui:382 msgid "Dupl_icate" msgstr "Δ_ιπλασιασμός" #: data/menu.ui:52 data/menu.ui:408 msgid "E_xport" msgstr "Ε_ξαγωγή" #: data/menu.ui:55 data/menu.ui:411 msgid "E_xport Selection to a Single File…" msgstr "Ε_ξαγωγή επιλογής σε μονό αρχείο…" #: data/menu.ui:241 msgid "Edit _Properties" msgstr "Επεξεργασία _ιδιοτήτων" #: pdfarranger/metadata.py:199 msgid "Edit properties" msgstr "Επεξεργασία ιδιοτήτων" #: pdfarranger/splitter.py:62 msgid "Equal column width" msgstr "Ίσο πλάτος στηλών" #: pdfarranger/splitter.py:62 msgid "Equal row height" msgstr "Ίσο ύψος σειρών" #: data/menu.ui:60 data/menu.ui:416 msgid "Export Selection to _Individual Files…" msgstr "Εξαγωγή επιλογής σε ξεχωρ_ιστά αρχεία…" #: data/menu.ui:65 data/menu.ui:421 msgid "Export _All Pages to Individual Files…" msgstr "Εξαγωγή _όλων των σελίδων σε ξεχωριστά αρχεία…" #: pdfarranger/pdfarranger.py:1088 msgid "Export…" msgstr "Εξαγωγή…" #: pdfarranger/core.py:388 pdfarranger/pdfarranger.py:1504 msgid "File is neither pdf nor image" msgstr "Το αρχείο δεν είναι ούτε pdf ούτε εικόνα" #: pdfarranger/pdfarranger.py:301 msgid "File(s) to open" msgstr "Αρχείο/α για άνοιγμα" #: pdfarranger/config.py:238 msgid "For more options see:" msgstr "Για περισσότερες επιλογές δείτε:" #: pdfarranger/exporter.py:192 msgid "Forms and outlines are lost on saving." msgstr "Τυγχόν φόρμες και περιθώρια χάνονται κατά την αποθήκευση." #: data/menu.ui:234 msgid "Full_screen" msgstr "Π_λήρης οθόνη" #: pdfarranger/pdfarranger.py:2563 msgid "GNU General Public License (GPL) Version 3." msgstr "Γενική Άδεια Δημόσιας Χρήσης GNU (GPL) Έκδοση 3η." #: data/menu.ui:173 data/menu.ui:402 msgid "Generate Booklet" msgstr "Δημιουργία ένθετου" #: pdfarranger/pageutils.py:236 pdfarranger/pageutils.py:240 #: pdfarranger/pageutils.py:328 msgid "Height" msgstr "Ύψος" #: pdfarranger/splitter.py:88 msgid "Height in %" msgstr "Ύψος σε %" #: pdfarranger/pageutils.py:375 msgid "Horizontal" msgstr "Οριζόντια" #: pdfarranger/splitter.py:61 msgid "Horizontal Splits" msgstr "Οριζόντιοι διαχωρισμοί" #: pdfarranger/pageutils.py:476 msgid "Horizontal offset" msgstr "Οριζόντια μετατόπιση" #: pdfarranger/core.py:377 msgid "Image files are only supported with img2pdf" msgstr "Τα αρχεία εικόνας υποστηρίζονται μόνο μέσω img2pdf" #: pdfarranger/core.py:383 msgid "Image format is not supported by img2pdf" msgstr "Η διαμόρφωση του αρχείου εικόνας δεν υποστηρίζεται από το img2pdf" #: data/pdfarranger.ui:58 msgid "Import" msgstr "Εισαγωγή" #: pdfarranger/pdfarranger.py:1327 msgid "Import…" msgstr "Εισαγωγή…" #: data/menu.ui:169 data/menu.ui:398 msgid "Insert Blan_k Page…" msgstr "Εισαγωγή _κενής σελίδας…" #: pdfarranger/pageutils.py:325 msgid "Insert Blank Page" msgstr "Εισαγωγή κενής σελίδας" #: pdfarranger/metadata.py:170 msgid "Invalid date format. Input discarded." msgstr "Εσφαλμένη μορφή ημερομηνίας. Η ενέργεια απορρίφθηκε." #: pdfarranger/pdfarranger.py:2552 #, python-format msgid "It uses libqpdf %s, pikepdf %s, GTK %s and Python %s." msgstr "Χρησιμοποιεί τα libqpdf %s, pikepdf %s, GTK %s και Python %s." #: pdfarranger/metadata.py:45 msgid "Keywords" msgstr "Λέξεις κλειδιά" #: pdfarranger/config.py:223 msgid "Language" msgstr "Γλώσσα" #: pdfarranger/pageutils.py:460 msgid "Layout for the first page in selection" msgstr "Διάταξη πρώτης σελίδας στην επιλογή" #: pdfarranger/pageutils.py:149 msgid "Left" msgstr "Αριστερά" #: pdfarranger/pageutils.py:377 msgid "Left to Right" msgstr "Αριστερά προς δεξιά" #: data/pdfarranger.ui:122 msgid "Main Menu" msgstr "Κεντρικό μενού" #: pdfarranger/pdfarranger.py:2558 msgid "Maintainers and contributors" msgstr "Συντηρητές και συνεισφέροντες" #: pdfarranger/pageutils.py:361 msgid "Margin" msgstr "Περιθώριο" #: pdfarranger/pageutils.py:347 msgid "Merge Pages" msgstr "Συγχώνευση σελίδων" #: pdfarranger/pageutils.py:412 msgid "Merged page size:" msgstr "Μέγεθος συγχωνευμένης σελίδας:" #: pdfarranger/metadata.py:50 msgid "Modified" msgstr "Τροποποιήθηκε" #: pdfarranger/pageutils.py:392 msgid "Non-uniform page size - using max size" msgstr "Μη ομοιόμορφο μέγεθος σελίδας - χρήση μέγιστου μεγέθους" #: data/pdfarranger.ui:37 msgid "Open" msgstr "Άνοιγμα" #: pdfarranger/pdfarranger.py:1186 msgid "Open…" msgstr "Άνοιγμα…" #: pdfarranger/pageutils.py:436 msgid "Overlay" msgstr "Επικάλυψη" #: pdfarranger/pdfarranger.py:282 msgid "" "PDF Arranger is a small python-gtk application, which helps the user to " "merge or split pdf documents and rotate, crop and rearrange their pages " "using an interactive and intuitive graphical interface. It is a frontend for " "pikepdf." msgstr "" "Το PDF Arranger είναι μια μικρή εφαρμογή, που βοηθά τον χρήστη να " "συγχωνεύσει ή να διαχωρίσει αρχεία τύπου PDF καθώς και να περιστρέψει, " "περικόψει και αναδιατάξει τις σελίδες τους χρησιμοποιώντας ένα διαδραστικό " "και διαισθητικό γραφικό περιβάλλον. Είναι δηλαδή ένα γραφικό περιβάλλον για " "το pikepdf." #: pdfarranger/pdfarranger.py:1498 msgid "PDF document is damaged" msgstr "Το έγγραφο PDF είναι κατεστραμένο" #: pdfarranger/pdfarranger.py:499 msgid "PDF files" msgstr "Αρχεία PDF" #: pdfarranger/pageutils.py:388 msgid "Page Order" msgstr "Σειρά σελίδων" #: pdfarranger/pageutils.py:241 msgid "Page Size" msgstr "Μέγεθος σελίδας" #: pdfarranger/pdfarranger.py:2586 msgid "Page Size:" msgstr "Μέγεθος σελίδας:" #: pdfarranger/pageutils.py:230 msgid "Page format" msgstr "Μορφοποίηση σελίδας" #: pdfarranger/core.py:285 msgid "Password" msgstr "Κωδικός" #: pdfarranger/core.py:263 msgid "Password required" msgstr "Απαιτείται κωδικός" #: data/menu.ui:107 data/menu.ui:290 msgid "Past_e Special" msgstr "_Επικόλληση συγκεκριμένα" #: data/menu.ui:124 data/menu.ui:308 msgid "Paste As O_verlay…" msgstr "Επικόλληση ως υπε_ρκάλυψη" #: data/menu.ui:119 data/menu.ui:303 msgid "Paste As _Even Pages" msgstr "Επικόλληση ως _ζυγές σελίδες" #: data/menu.ui:114 data/menu.ui:298 msgid "Paste As _Odd Pages" msgstr "Επικόλληση ως μ_ονές σελίδες" #: data/menu.ui:129 data/menu.ui:313 msgid "Paste As _Underlay…" msgstr "Επικόλληση ως _υπόστρωμα…" #: data/menu.ui:102 data/menu.ui:285 msgid "Paste _After" msgstr "Ε_πικόλληση μετά" #: data/menu.ui:109 data/menu.ui:293 msgid "Paste _Before" msgstr "Επικόλληση _πριν" #: pdfarranger/pdfarranger.py:1627 msgid "Pasted data not valid. Aborting paste." msgstr "Δεδομένα επικόλλησης μη έγκυρα. Η επικόλληση ακυρώθηκε." #: pdfarranger/pdfarranger.py:1589 msgid "Pikepdf >= 3 is needed for overlay/underlay/merge support." msgstr "Απαιτείται το Pikepdf >= 3 για την υποστήριξη υπερκάλυψης/υποστρώματος/συγχώνευσης." #: data/menu.ui:247 msgid "Pre_ferences" msgstr "Προ_τιμήσεις" #: pdfarranger/config.py:213 msgid "Preferences" msgstr "Προτιμήσεις" #: pdfarranger/pdfarranger.py:293 msgid "Print the version of PDF Arranger and exit" msgstr "Εμφάνιση της έκδοσης του PDF Arranger και έξοδος" #: pdfarranger/exporter.py:461 msgid "Printing…" msgstr "Εκτύπωση…" #: pdfarranger/metadata.py:46 msgid "Producer" msgstr "Παραγωγός" #: pdfarranger/metadata.py:213 msgid "Property" msgstr "Ιδιότητα" #: data/menu.ui:157 data/menu.ui:386 msgid "Re_verse Order" msgstr "Αναστρο_φή σειράς" #: pdfarranger/pageutils.py:238 msgid "Relative" msgstr "Αναλογία" #: pdfarranger/exporter.py:473 msgid "Rendering Preview…" msgstr "Προεπισκόπηση…" #: pdfarranger/pdfarranger.py:732 msgid "Rendering…" msgstr "Σχεδίαση…" #: pdfarranger/pdfarranger.py:1132 msgid "Replace" msgstr "Αντικατάσταση" #: pdfarranger/pageutils.py:149 msgid "Right" msgstr "Δεξιά" #: pdfarranger/pageutils.py:378 msgid "Right to Left" msgstr "Δεξιά προς αριστερά" #: data/pdfarranger.ui:203 msgid "Rotate Left" msgstr "Περιστροφή αριστερά" #: data/pdfarranger.ui:227 msgid "Rotate Right" msgstr "Περιστροφή δεξιά" #: data/menu.ui:135 data/menu.ui:364 msgid "Rotate _Left" msgstr "Περιστροφή _αριστερά" #: pdfarranger/pageutils.py:364 pdfarranger/splitter.py:60 msgid "Rows" msgstr "Σειρές" #: data/menu.ui:207 data/menu.ui:350 msgid "Same Page _Format" msgstr "Ίδιας μορ_φοποίησης σελίδας" #: data/pdfarranger.ui:78 msgid "Save" msgstr "Αποθήκευση" #: data/pdfarranger.ui:97 msgid "Save As" msgstr "Αποθήκευση ως" #: pdfarranger/pdfarranger.py:1088 msgid "Save As…" msgstr "Αποθήκευση ως…" #: data/menu.ui:47 msgid "Save _As…" msgstr "_Αποθήκευση ως…" #: pdfarranger/pdfarranger.py:988 msgid "Save changes before closing?" msgstr "Να αποθηκευτούν οι αλλαγές πριν το κλείσιμο;" #: pdfarranger/pdfarranger.py:1025 msgid "Save changes before quitting?" msgstr "Να αποθηκευτούν οι αλλαγές πριν την έξοδο;" #: pdfarranger/pdfarranger.py:985 msgid "Save changes to “{}” before closing?" msgstr "Να αποθηκευτούν οι αλλαγές στο “{}” πριν το κλείσιμο;" #: pdfarranger/pdfarranger.py:1022 msgid "Save changes to “{}” before quitting?" msgstr "Να αποθηκευτούν οι αλλαγές στο “{}” πριν την έξοδο;" #: pdfarranger/pdfarranger.py:1249 msgid "Saving produced some warnings" msgstr "Η αποθήκευση παρήγαγε ορισμένες προειδοποιήσεις" #: pdfarranger/pdfarranger.py:1288 msgid "Saving…" msgstr "Γίνεται αποθήκευση…" #: pdfarranger/pageutils.py:116 msgid "Scale factor" msgstr "Συντελεστής κλίμακας" #: data/menu.ui:182 data/menu.ui:325 msgid "Select _All" msgstr "Επιλογή ό_λων" #: data/menu.ui:197 data/menu.ui:340 msgid "Select _Even Pages" msgstr "_Επιλογή ζυγών σελίδων" #: data/menu.ui:192 data/menu.ui:335 msgid "Select _Odd Pages" msgstr "Επιλογή μ_ονών σελίδων" #: pdfarranger/pdfarranger.py:2581 msgid "Selected pages: " msgstr "Επιλεγμένες σελίδες: " #: pdfarranger/splitter.py:26 msgid "Split Pages" msgstr "Διαχωρισμός σελίδων" #: pdfarranger/metadata.py:44 msgid "Subject" msgstr "Θέμα" #: pdfarranger/pdfarranger.py:512 msgid "Supported image files" msgstr "Υποστηριζόμενα αρχεία εικόνας" #: pdfarranger/config.py:249 pdfarranger/config.py:257 msgid "System setting" msgstr "Ρύθμιση συστήματος" #: pdfarranger/core.py:275 msgid "" "The document “{}” is locked and requires a password before it can be opened." msgstr "" "Το έγγραφο “{}” είναι κλειδωμένο και απαιτείται κωδικός για το άνοιγμά του." #: pdfarranger/core.py:274 msgid "The password will be remembered until you close PDF Arranger." msgstr "" "Ο κωδικός θα παραμείνει αποθηκευμένος μέχρι να κλείσετε το PDF Arranger." #: pdfarranger/config.py:231 msgid "Theme" msgstr "Θέμα" #: pdfarranger/metadata.py:43 msgid "Title" msgstr "Τίτλος" #: pdfarranger/pageutils.py:149 msgid "Top" msgstr "Πάνω" #: pdfarranger/pageutils.py:379 msgid "Top to Bottom" msgstr "Από πάνω προς τα κάτω" #: pdfarranger/pageutils.py:436 msgid "Underlay" msgstr "Υπόστρωμα" #: pdfarranger/core.py:361 pdfarranger/pdfarranger.py:1494 msgid "Unknown file format" msgstr "Άγνωστη μορφή αρχείου" #: pdfarranger/metadata.py:213 msgid "Value" msgstr "Τιμή" #: pdfarranger/pageutils.py:376 msgid "Vertical" msgstr "Κάθετα" #: pdfarranger/splitter.py:61 msgid "Vertical Splits" msgstr "Κάθετοι διαχωρισμοί" #: pdfarranger/pageutils.py:478 msgid "Vertical offset" msgstr "Κατακόρυφη μετατόπιση" #: pdfarranger/exporter.py:187 msgid "Warning" msgstr "Προειδοποίηση" #: pdfarranger/pageutils.py:235 pdfarranger/pageutils.py:239 #: pdfarranger/pageutils.py:327 msgid "Width" msgstr "Πλάτος" #: pdfarranger/splitter.py:88 msgid "Width in %" msgstr "Πλάτος σε %" #: pdfarranger/pdfarranger.py:969 msgid "Your changes will be lost if you don’t save them." msgstr "Οι αλλαγές θα χαθούν αν δεν αποθηκεύσετε." #: data/pdfarranger.ui:144 msgid "Zoom In" msgstr "Μεγέθυνση" #: data/pdfarranger.ui:167 msgid "Zoom Out" msgstr "Σμίκρυνση" #: data/menu.ui:230 msgid "Zoom _Fit" msgstr "Προσαρμο_γή" #: data/menu.ui:222 msgid "Zoom _In" msgstr "_Μεγέθυνση" #: data/menu.ui:226 msgid "Zoom _Out" msgstr "_Σμίκρυνση" #: data/menu.ui:253 msgid "_About" msgstr "Σ_χετικά" #: pdfarranger/config.py:217 pdfarranger/pageutils.py:219 #: pdfarranger/pdfarranger.py:961 pdfarranger/pdfarranger.py:970 #: pdfarranger/pdfarranger.py:1094 pdfarranger/pdfarranger.py:1144 msgid "_Cancel" msgstr "_Ακύρωση" #: pdfarranger/pdfarranger.py:980 data/menu.ui:259 msgid "_Close" msgstr "_Κλείσιμο" #: data/menu.ui:98 data/menu.ui:281 msgid "_Copy" msgstr "Αντι_γραφή" #: data/menu.ui:90 data/menu.ui:273 msgid "_Delete" msgstr "_Διαγραφή" #: data/menu.ui:187 data/menu.ui:330 msgid "_Deselect All" msgstr "_Αποεπιλογή όλων" #: data/menu.ui:87 msgid "_Edit" msgstr "_Επεξεργασία" #: data/menu.ui:30 msgid "_Import" msgstr "Ε_ισαγωγή" #: data/menu.ui:212 data/menu.ui:355 msgid "_Invert Selection" msgstr "Αντ_ιστροφή επιλογής" #: data/menu.ui:165 data/menu.ui:394 msgid "_Merge Pages…" msgstr "Συγ_χώνευση σελίδων…" #: data/menu.ui:36 msgid "_New Window" msgstr "_Νέο παράθυρο" #: pdfarranger/config.py:218 pdfarranger/pageutils.py:220 msgid "_OK" msgstr "" #: pdfarranger/pdfarranger.py:1143 data/menu.ui:24 msgid "_Open" msgstr "Άν_οιγμα" #: data/menu.ui:145 data/menu.ui:374 msgid "_Page Format…" msgstr "_Μορφοποίηση σελίδας…" #: data/menu.ui:71 msgid "_Print…" msgstr "Εκτύ_πωση…" #: pdfarranger/pdfarranger.py:1017 data/menu.ui:265 msgid "_Quit" msgstr "Έξ_οδος" #: data/menu.ui:82 msgid "_Redo" msgstr "Επανάλη_ψη" #: data/menu.ui:140 data/menu.ui:369 msgid "_Rotate Right" msgstr "Πε_ριστροφή δεξιά" #: pdfarranger/pdfarranger.py:970 pdfarranger/pdfarranger.py:1093 #: data/menu.ui:42 msgid "_Save" msgstr "Αποθήκευ_ση" #: data/menu.ui:179 data/menu.ui:322 msgid "_Select" msgstr "Επιλο_γή" #: data/menu.ui:161 data/menu.ui:390 msgid "_Split Pages…" msgstr "Διαχωρισμός _σελίδων…" #: data/menu.ui:78 msgid "_Undo" msgstr "Αναί_ρεση" #: data/menu.ui:219 msgid "_View" msgstr "Προ_βολή" #: pdfarranger/pageutils.py:139 pdfarranger/pageutils.py:362 #: pdfarranger/pageutils.py:412 msgid "mm" msgstr "χιλ" #: pdfarranger/core.py:89 msgid "page" msgstr "σελίδα" #: pdfarranger/pdfarranger.py:811 msgid "untitled" msgstr "χωρίς τίτλο" pdfarranger-1.10.1/po/es.po000066400000000000000000000437031451252235000154600ustar00rootroot00000000000000# Spanish translation for pdfarranger. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the pdfarranger package. # This file is an extended version of the PDF-Shuffler translation file # released under the GNU General Public License version 3 or later. # See file COPYING or go to for full license details. # Original translators: # Konstantinos Poulios, 2008-2017 # Rafael Jesús García Perdigón, 2012 # Óscar Fernández Díaz , 2023. # msgid "" msgstr "" "Project-Id-Version: pdfarranger\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-06-06 23:57+0200\n" "PO-Revision-Date: 2023-06-07 00:09+0200\n" "Last-Translator: Óscar Fernández Díaz \n" "Language-Team: Spanish; Castilian < >\n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" "X-Generator: Gtranslator 42.0\n" #: pdfarranger/splitter.py:87 msgid "#Col" msgstr "Columna" #: pdfarranger/splitter.py:87 msgid "#Row" msgstr "Fila" #: pdfarranger/pageutils.py:122 pdfarranger/pageutils.py:477 #: pdfarranger/pageutils.py:479 msgid "%" msgstr "%" #: pdfarranger/pageutils.py:170 #, python-format msgid "% of height" msgstr "% de la altura" #: pdfarranger/pageutils.py:170 #, python-format msgid "% of width" msgstr "% de la anchura" #: pdfarranger/pdfarranger.py:2549 #, python-format msgid "%s is a tool for rearranging and modifying PDF files." msgstr "%s es una herramienta para reordenar y modificar archivos PDF." #: pdfarranger/config.py:233 msgid "(Libhandy missing)" msgstr "(Falta Libhandy)" #: pdfarranger/config.py:225 msgid "(Requires restart)" msgstr "(Requiere reiniciar)" #: pdfarranger/pageutils.py:461 msgid "(same offset is applied to all pages)" msgstr "(se aplica el mismo desplazamiento a todas las páginas)" #: pdfarranger/pdfarranger.py:1130 #, python-format msgid "A file named \"%s\" already exists. Do you want to replace it?" msgstr "Ya existe un archivo llamado \"%s\". ¿Desea reemplazarlo?" #: data/menu.ui:202 data/menu.ui:345 msgid "All From _Same File" msgstr "Todas las páginas del _mismo archivo" #: pdfarranger/pdfarranger.py:507 msgid "All files" msgstr "Todos los archivos" #: pdfarranger/pdfarranger.py:462 msgid "All pages must have the same size." msgstr "Todas las páginas deben tener el mismo tamaño." #: pdfarranger/pdfarranger.py:495 msgid "All supported files" msgstr "Formatos de imagen compatibles" #: pdfarranger/pageutils.py:149 msgid "Bottom" msgstr "Inferior" #: pdfarranger/pageutils.py:380 msgid "Bottom to Top" msgstr "De abajo a arriba" #: pdfarranger/core.py:386 msgid "Clipboard image" msgstr "Imagen del portapapeles" #: pdfarranger/pageutils.py:363 pdfarranger/splitter.py:60 msgid "Columns" msgstr "Columnas" #: pdfarranger/metadata.py:49 msgid "Created" msgstr "Creado" #: pdfarranger/metadata.py:47 msgid "Creator" msgstr "Creador" #: pdfarranger/metadata.py:48 msgid "Creator tool" msgstr "Herramienta de creador" #: pdfarranger/pageutils.py:153 msgid "Crop Margins" msgstr "Recortar los márgenes" #: data/menu.ui:149 data/menu.ui:378 msgid "Crop White Borders" msgstr "Quitar el borde blanco" #: pdfarranger/pageutils.py:161 msgid "" "Cropping does not remove any content from the PDF file, it only hides it." msgstr "Recortar no elimina ningún contenido del archivo PDF, solo lo oculta." #: data/menu.ui:94 data/menu.ui:277 msgid "Cu_t" msgstr "_Cortar" #: pdfarranger/pdfarranger.py:1250 msgid "Despite the warnings the document(s) should have no visible issues." msgstr "" "A pesar de las advertencias, el/los documento/s no deberían tener problemas " "visibles." #: pdfarranger/pdfarranger.py:979 msgid "Discard changes and close?" msgstr "¿Descartar los cambios y cerrar?" #: pdfarranger/pdfarranger.py:1016 msgid "Discard changes and quit?" msgstr "¿Descartar los cambios y salir?" #: pdfarranger/exporter.py:194 msgid "Do not show this dialog again." msgstr "No mostrar este diálogo de nuevo." #: pdfarranger/pdfarranger.py:970 msgid "Do_n’t Save" msgstr "_No guardar" #: pdfarranger/pdfarranger.py:1257 msgid "Don't show warnings when saving again." msgstr "No mostrar advertencias al guardar de nuevo." #: data/menu.ui:153 data/menu.ui:382 msgid "Dupl_icate" msgstr "Dupl_icar" #: data/menu.ui:52 data/menu.ui:408 msgid "E_xport" msgstr "E_xportar" #: data/menu.ui:55 data/menu.ui:411 msgid "E_xport Selection to a Single File…" msgstr "E_xportar las páginas seleccionadas a un solo archivo …" #: data/menu.ui:241 msgid "Edit _Properties" msgstr "Editar las _propiedades" #: pdfarranger/metadata.py:199 msgid "Edit properties" msgstr "Editar las propiedades" #: pdfarranger/splitter.py:62 msgid "Equal column width" msgstr "Columnas con proporciones iguales" #: pdfarranger/splitter.py:62 msgid "Equal row height" msgstr "Filas con proporciones iguales" #: data/menu.ui:60 data/menu.ui:416 msgid "Export Selection to _Individual Files…" msgstr "Exportar las páginas seleccionadas a archivos _individuales…" #: data/menu.ui:65 data/menu.ui:421 msgid "Export _All Pages to Individual Files…" msgstr "Exportar _todas las páginas a archivos individuales…" #: pdfarranger/pdfarranger.py:1088 msgid "Export…" msgstr "Exportar…" #: pdfarranger/core.py:388 pdfarranger/pdfarranger.py:1504 msgid "File is neither pdf nor image" msgstr "El archivo es ni pdf ni imagen" #: pdfarranger/pdfarranger.py:301 msgid "File(s) to open" msgstr "Archivo(s) a abrir" #: pdfarranger/config.py:238 msgid "For more options see:" msgstr "Para más opciones, consulte:" #: pdfarranger/exporter.py:192 msgid "Forms and outlines are lost on saving." msgstr "Los formularios interactivos y los marcadores se pierden al guardar." #: data/menu.ui:234 msgid "Full_screen" msgstr "Pantalla com_pleta" #: pdfarranger/pdfarranger.py:2563 msgid "GNU General Public License (GPL) Version 3." msgstr "GNU General Public License (GPL) Version 3." #: data/menu.ui:173 data/menu.ui:402 msgid "Generate Booklet" msgstr "Generar folleto" #: pdfarranger/pageutils.py:236 pdfarranger/pageutils.py:240 #: pdfarranger/pageutils.py:328 msgid "Height" msgstr "Altura" #: pdfarranger/splitter.py:88 msgid "Height in %" msgstr "Altura en %" #: pdfarranger/pageutils.py:375 msgid "Horizontal" msgstr "Horizontal" #: pdfarranger/splitter.py:61 msgid "Horizontal Splits" msgstr "Número de filas" #: pdfarranger/pageutils.py:476 msgid "Horizontal offset" msgstr "Desplazamiento horizontal" #: pdfarranger/core.py:377 msgid "Image files are only supported with img2pdf" msgstr "Los archivos de imagen sólo están disponibles con img2pdf" #: pdfarranger/core.py:383 msgid "Image format is not supported by img2pdf" msgstr "El formato de imagen no es compatible con img2pdf" #: data/pdfarranger.ui:58 msgid "Import" msgstr "Importar" #: pdfarranger/pdfarranger.py:1327 msgid "Import…" msgstr "Importar…" #: data/menu.ui:169 data/menu.ui:398 msgid "Insert Blan_k Page…" msgstr "Insertar una página en _blanco…" #: pdfarranger/pageutils.py:325 msgid "Insert Blank Page" msgstr "Insertar una página en blanco" #: pdfarranger/metadata.py:170 msgid "Invalid date format. Input discarded." msgstr "Formato de fecha no válido. Descartar cambios." #: pdfarranger/pdfarranger.py:2552 #, python-format msgid "It uses libqpdf %s, pikepdf %s, GTK %s and Python %s." msgstr "Usa libqpdf %s, pikepdf %s, GTK %s y Python %s." #: pdfarranger/metadata.py:45 msgid "Keywords" msgstr "Palabras claves" #: pdfarranger/config.py:223 msgid "Language" msgstr "Idioma" #: pdfarranger/pageutils.py:460 msgid "Layout for the first page in selection" msgstr "Disposición de la primera página en la selección" #: pdfarranger/pageutils.py:149 msgid "Left" msgstr "Izquierdo" #: pdfarranger/pageutils.py:377 msgid "Left to Right" msgstr "De izquierda a derecha" #: data/pdfarranger.ui:122 msgid "Main Menu" msgstr "Menú Principal" #: pdfarranger/pdfarranger.py:2558 msgid "Maintainers and contributors" msgstr "Mantenedores y contribuyentes" #: pdfarranger/pageutils.py:361 msgid "Margin" msgstr "Margen" #: pdfarranger/pageutils.py:347 msgid "Merge Pages" msgstr "Fusionar páginas" #: pdfarranger/pageutils.py:412 msgid "Merged page size:" msgstr "Tamaño de la página fusionada:" #: pdfarranger/metadata.py:50 msgid "Modified" msgstr "Modificado" #: pdfarranger/pageutils.py:392 msgid "Non-uniform page size - using max size" msgstr "Tamaño de página no uniforme: uso del tamaño máximo" #: data/pdfarranger.ui:37 msgid "Open" msgstr "Abrir" #: pdfarranger/pdfarranger.py:1186 msgid "Open…" msgstr "Abrir…" #: pdfarranger/pageutils.py:436 msgid "Overlay" msgstr "Superponer" #: pdfarranger/pdfarranger.py:282 msgid "" "PDF Arranger is a small python-gtk application, which helps the user to " "merge or split pdf documents and rotate, crop and rearrange their pages " "using an interactive and intuitive graphical interface. It is a frontend for " "pikepdf." msgstr "" "PDF Arranger es una pequeña aplicación python-gtk, que ayuda al usuario a " "fusionar o dividir documentos pdf y a rotar, recortar y reorganizar sus " "páginas usando una interfaz gráfica interactiva e intuitiva. Es una interfaz " "para pikepdf." #: pdfarranger/pdfarranger.py:1498 msgid "PDF document is damaged" msgstr "El archivo PDF está dañado" #: pdfarranger/pdfarranger.py:499 msgid "PDF files" msgstr "Archivos PDF" #: pdfarranger/pageutils.py:388 msgid "Page Order" msgstr "Orden de páginas" #: pdfarranger/pageutils.py:241 msgid "Page Size" msgstr "Formato de papel" #: pdfarranger/pdfarranger.py:2586 msgid "Page Size:" msgstr "Tamaño de la página:" #: pdfarranger/pageutils.py:230 msgid "Page format" msgstr "Formato de página" #: pdfarranger/core.py:285 msgid "Password" msgstr "Contraseña" #: pdfarranger/core.py:263 msgid "Password required" msgstr "Se requiere contraseña" #: data/menu.ui:107 data/menu.ui:290 msgid "Past_e Special" msgstr "Pegado _especial" #: data/menu.ui:124 data/menu.ui:308 msgid "Paste As O_verlay…" msgstr "Pegar como superposi_ción…" #: data/menu.ui:119 data/menu.ui:303 msgid "Paste As _Even Pages" msgstr "Copiar como páginas _pares" #: data/menu.ui:114 data/menu.ui:298 msgid "Paste As _Odd Pages" msgstr "Pegar como páginas _impares" #: data/menu.ui:129 data/menu.ui:313 msgid "Paste As _Underlay…" msgstr "Pegar como _subyacente…" #: data/menu.ui:102 data/menu.ui:285 msgid "Paste _After" msgstr "Pegar detrás" #: data/menu.ui:109 data/menu.ui:293 msgid "Paste _Before" msgstr "Pegar delante" #: pdfarranger/pdfarranger.py:1627 msgid "Pasted data not valid. Aborting paste." msgstr "Los datos pegados no son válidos. Cancelar el pegado." #: pdfarranger/pdfarranger.py:1589 msgid "Pikepdf >= 3 is needed for overlay/underlay/merge support." msgstr "" "Se necesita Pikepdf >= 3 para el soporte de superposición/subyacente/fusión." #: data/menu.ui:247 msgid "Pre_ferences" msgstr "Pre_ferencias" #: pdfarranger/config.py:213 msgid "Preferences" msgstr "Preferencias" #: pdfarranger/pdfarranger.py:293 msgid "Print the version of PDF Arranger and exit" msgstr "Imprimir la versión de PDF Arranger y salir" #: pdfarranger/exporter.py:457 msgid "Printing…" msgstr "Imprimiendo…" #: pdfarranger/metadata.py:46 msgid "Producer" msgstr "Productor" #: pdfarranger/metadata.py:213 msgid "Property" msgstr "Propiedad" #: data/menu.ui:157 data/menu.ui:386 msgid "Re_verse Order" msgstr "In_vertir el orden" #: pdfarranger/pageutils.py:238 msgid "Relative" msgstr "Relativo" #: pdfarranger/exporter.py:469 msgid "Rendering Preview…" msgstr "Renderizando vista previa…" #: pdfarranger/pdfarranger.py:732 msgid "Rendering…" msgstr "Renderizando…" #: pdfarranger/pdfarranger.py:1132 msgid "Replace" msgstr "Reemplazar" #: pdfarranger/pageutils.py:149 msgid "Right" msgstr "Derecho" #: pdfarranger/pageutils.py:378 msgid "Right to Left" msgstr "De derecha a izquierda" #: data/pdfarranger.ui:203 msgid "Rotate Left" msgstr "Rotar a la izquierda" #: data/pdfarranger.ui:227 msgid "Rotate Right" msgstr "Rotar a la derecha" #: data/menu.ui:135 data/menu.ui:364 msgid "Rotate _Left" msgstr "Rotar a la _izquierda" #: pdfarranger/pageutils.py:364 pdfarranger/splitter.py:60 msgid "Rows" msgstr "Filas" #: data/menu.ui:207 data/menu.ui:350 msgid "Same Page _Format" msgstr "El mismo _formato de página" #: data/pdfarranger.ui:78 msgid "Save" msgstr "Guardar" #: data/pdfarranger.ui:97 msgid "Save As" msgstr "Guardar como" #: pdfarranger/pdfarranger.py:1088 msgid "Save As…" msgstr "Guardar como…" #: data/menu.ui:47 msgid "Save _As…" msgstr "Guardar _como…" #: pdfarranger/pdfarranger.py:988 msgid "Save changes before closing?" msgstr "¿Desea guardar los cambios efectuados antes de cerrar pdfarranger?" #: pdfarranger/pdfarranger.py:1025 msgid "Save changes before quitting?" msgstr "¿Desea guardar los cambios efectuados antes de salir?" #: pdfarranger/pdfarranger.py:985 msgid "Save changes to “{}” before closing?" msgstr "¿Desea guardar los cambios efectuados en “{}” antes de cerrarlo?" #: pdfarranger/pdfarranger.py:1022 msgid "Save changes to “{}” before quitting?" msgstr "¿Desea guardar los cambios efectuados en “{}” antes de salir?" #: pdfarranger/pdfarranger.py:1249 msgid "Saving produced some warnings" msgstr "Guardar ha generado algunas advertencias" #: pdfarranger/pdfarranger.py:1288 msgid "Saving…" msgstr "Guardando…" #: pdfarranger/pageutils.py:116 msgid "Scale factor" msgstr "Factor de escala" #: data/menu.ui:182 data/menu.ui:325 msgid "Select _All" msgstr "Selectionar _todo" #: data/menu.ui:197 data/menu.ui:340 msgid "Select _Even Pages" msgstr "Seleccionar las páginas _pares" #: data/menu.ui:192 data/menu.ui:335 msgid "Select _Odd Pages" msgstr "Seleccionar las páginas _impares" #: pdfarranger/pdfarranger.py:2581 msgid "Selected pages: " msgstr "Páginas seleccionadas: " #: pdfarranger/splitter.py:26 msgid "Split Pages" msgstr "Dividir las páginas" #: pdfarranger/metadata.py:44 msgid "Subject" msgstr "Tema" #: pdfarranger/pdfarranger.py:512 msgid "Supported image files" msgstr "Formatos de imagen compatibles" #: pdfarranger/config.py:249 pdfarranger/config.py:257 msgid "System setting" msgstr "Configuración del sistema" #: pdfarranger/core.py:275 msgid "" "The document “{}” is locked and requires a password before it can be opened." msgstr "El documento “{}” requiere una contraseña para abrirlo." #: pdfarranger/core.py:274 msgid "The password will be remembered until you close PDF Arranger." msgstr "La contraseña se guarda hasta que cierre PDF Arranger." #: pdfarranger/config.py:231 msgid "Theme" msgstr "Tema" #: pdfarranger/metadata.py:43 msgid "Title" msgstr "Título" #: pdfarranger/pageutils.py:149 msgid "Top" msgstr "Superior" #: pdfarranger/pageutils.py:379 msgid "Top to Bottom" msgstr "De arriba a abajo" #: pdfarranger/pageutils.py:436 msgid "Underlay" msgstr "Subyacer" #: pdfarranger/core.py:361 pdfarranger/pdfarranger.py:1494 msgid "Unknown file format" msgstr "El formato del archivo es desconocido" #: pdfarranger/metadata.py:213 msgid "Value" msgstr "Valor" #: pdfarranger/pageutils.py:376 msgid "Vertical" msgstr "Vertical" #: pdfarranger/splitter.py:61 msgid "Vertical Splits" msgstr "Número de columnas" #: pdfarranger/pageutils.py:478 msgid "Vertical offset" msgstr "Desplazamiento vertical" #: pdfarranger/exporter.py:187 msgid "Warning" msgstr "Aviso" #: pdfarranger/pageutils.py:235 pdfarranger/pageutils.py:239 #: pdfarranger/pageutils.py:327 msgid "Width" msgstr "Anchura" #: pdfarranger/splitter.py:88 msgid "Width in %" msgstr "Anchura en %" #: pdfarranger/pdfarranger.py:969 msgid "Your changes will be lost if you don’t save them." msgstr "Se perderán sus cambios si no los guarda." #: data/pdfarranger.ui:144 msgid "Zoom In" msgstr "Acercar" #: data/pdfarranger.ui:167 msgid "Zoom Out" msgstr "Alejar" #: data/menu.ui:230 msgid "Zoom _Fit" msgstr "A_justar" #: data/menu.ui:222 msgid "Zoom _In" msgstr "A_cercar" #: data/menu.ui:226 msgid "Zoom _Out" msgstr "A_lejar" #: data/menu.ui:253 msgid "_About" msgstr "A_cerca" #: pdfarranger/config.py:217 pdfarranger/pageutils.py:219 #: pdfarranger/pdfarranger.py:961 pdfarranger/pdfarranger.py:970 #: pdfarranger/pdfarranger.py:1094 pdfarranger/pdfarranger.py:1144 msgid "_Cancel" msgstr "_Cancelar" #: pdfarranger/pdfarranger.py:980 data/menu.ui:259 msgid "_Close" msgstr "_Cerrar" #: data/menu.ui:98 data/menu.ui:281 msgid "_Copy" msgstr "Copi_ar" #: data/menu.ui:90 data/menu.ui:273 msgid "_Delete" msgstr "E_liminar" #: data/menu.ui:187 data/menu.ui:330 msgid "_Deselect All" msgstr "_Deseleccionar todo" #: data/menu.ui:87 msgid "_Edit" msgstr "_Editar" #: data/menu.ui:30 msgid "_Import" msgstr "_Importar" #: data/menu.ui:212 data/menu.ui:355 msgid "_Invert Selection" msgstr "_Invertir selección" #: data/menu.ui:165 data/menu.ui:394 msgid "_Merge Pages…" msgstr "_Fusionar páginas…" #: data/menu.ui:36 msgid "_New Window" msgstr "_Ventana nueva" #: pdfarranger/config.py:218 pdfarranger/pageutils.py:220 msgid "_OK" msgstr "_Vale" #: pdfarranger/pdfarranger.py:1143 data/menu.ui:24 msgid "_Open" msgstr "_Abrir" #: data/menu.ui:145 data/menu.ui:374 msgid "_Page Format…" msgstr "Formato de página…" #: data/menu.ui:71 msgid "_Print…" msgstr "_Imprimir…" #: pdfarranger/pdfarranger.py:1017 data/menu.ui:265 msgid "_Quit" msgstr "_Salir" #: data/menu.ui:82 msgid "_Redo" msgstr "_Rehacer" #: data/menu.ui:140 data/menu.ui:369 msgid "_Rotate Right" msgstr "Rotar a la _derecha" #: pdfarranger/pdfarranger.py:970 pdfarranger/pdfarranger.py:1093 #: data/menu.ui:42 msgid "_Save" msgstr "_Guardar" #: data/menu.ui:179 data/menu.ui:322 msgid "_Select" msgstr "_Seleccionar" #: data/menu.ui:161 data/menu.ui:390 msgid "_Split Pages…" msgstr "_Dividir las páginas…" #: data/menu.ui:78 msgid "_Undo" msgstr "Des_hacer" #: data/menu.ui:219 msgid "_View" msgstr "_Ver" #: pdfarranger/pageutils.py:139 pdfarranger/pageutils.py:362 #: pdfarranger/pageutils.py:412 msgid "mm" msgstr "mm" #: pdfarranger/core.py:89 msgid "page" msgstr "página" #: pdfarranger/pdfarranger.py:811 msgid "untitled" msgstr "sin título" pdfarranger-1.10.1/po/eu.po000066400000000000000000000414001451252235000154520ustar00rootroot00000000000000# Basque translation for pdfarranger. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the pdfarranger package. # This file is an extended version of the PDF-Shuffler translation file # released under the GNU General Public License version 3 or later. # See file COPYING or go to for full license details. # Original translators: # Alexander Gabilondo Urkijo, 2023 # msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-04-29 22:45+0200\n" "PO-Revision-Date: 2023-01-19 20:27+0100\n" "Last-Translator: alexgabi\n" "Language-Team: Basque\n" "Language: eu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.0.1\n" #: pdfarranger/splitter.py:87 msgid "#Col" msgstr "#Zut" #: pdfarranger/splitter.py:87 msgid "#Row" msgstr "#Err" #: pdfarranger/pageutils.py:122 pdfarranger/pageutils.py:477 #: pdfarranger/pageutils.py:479 msgid "%" msgstr "%" #: pdfarranger/pageutils.py:170 #, python-format msgid "% of height" msgstr "altueraren %a" #: pdfarranger/pageutils.py:170 #, python-format msgid "% of width" msgstr "zabaleraren %a" #: pdfarranger/pdfarranger.py:2548 #, python-format msgid "%s is a tool for rearranging and modifying PDF files." msgstr "%s PDF fitxategiak berrantolatzeko eta aldatzeko tresna bat da." #: pdfarranger/config.py:232 msgid "(Libhandy missing)" msgstr "" #: pdfarranger/config.py:224 msgid "(Requires restart)" msgstr "" #: pdfarranger/pageutils.py:461 msgid "(same offset is applied to all pages)" msgstr "" #: pdfarranger/pdfarranger.py:1130 #, python-format msgid "A file named \"%s\" already exists. Do you want to replace it?" msgstr "" #: data/menu.ui:189 data/menu.ui:332 msgid "All From _Same File" msgstr "Fitxategi bereko _guztiak" #: pdfarranger/pdfarranger.py:507 msgid "All files" msgstr "Fitxategi guztiak" #: pdfarranger/pdfarranger.py:462 msgid "All pages must have the same size." msgstr "Orrialde guztiek tamaina berdina izan behar dute." #: pdfarranger/pdfarranger.py:495 msgid "All supported files" msgstr "Onartutako irudi formatuak" #: pdfarranger/pageutils.py:149 msgid "Bottom" msgstr "Behean" #: pdfarranger/pageutils.py:380 msgid "Bottom to Top" msgstr "" #: pdfarranger/core.py:386 msgid "Clipboard image" msgstr "Arbeleko irudia" #: pdfarranger/pageutils.py:363 pdfarranger/splitter.py:60 msgid "Columns" msgstr "Zutabeak" #: pdfarranger/metadata.py:48 msgid "Created" msgstr "Sortua" #: pdfarranger/metadata.py:46 msgid "Creator" msgstr "Sortzailea" #: pdfarranger/metadata.py:47 msgid "Creator tool" msgstr "Sortzaile tresna" #: pdfarranger/pageutils.py:153 msgid "Crop Margins" msgstr "Moztu marginak" #: data/menu.ui:104 data/menu.ui:365 msgid "Crop White Borders" msgstr "Moztu ertz zuriak" #: pdfarranger/pageutils.py:161 msgid "" "Cropping does not remove any content from the PDF file, it only hides it." msgstr "" "Mozketak ez du PDF fitxategitik edukirik kentzen, ezkutatzen du soilik." #: data/menu.ui:128 data/menu.ui:264 msgid "Cu_t" msgstr "_Moztu" #: pdfarranger/pdfarranger.py:1250 msgid "Despite the warnings the document(s) should have no visible issues." msgstr "Abisuak izan arren dokumentuek ez lukete arazorik izan behar." #: pdfarranger/pdfarranger.py:979 msgid "Discard changes and close?" msgstr "Aldaketak baztertu eta itxi?" #: pdfarranger/pdfarranger.py:1016 msgid "Discard changes and quit?" msgstr "Aldaketak baztertu eta irten?" #: pdfarranger/exporter.py:194 msgid "Do not show this dialog again." msgstr "Ez erakutsi elkarrizketa hau berriro." #: pdfarranger/pdfarranger.py:970 msgid "Do_n’t Save" msgstr "E_z gorde" #: pdfarranger/pdfarranger.py:1257 msgid "Don't show warnings when saving again." msgstr "Ez erakutsi abisurik berriro gordetzean." #: data/menu.ui:112 data/menu.ui:369 msgid "Dupl_icate" msgstr "B_ikoiztu" #: data/menu.ui:52 data/menu.ui:395 msgid "E_xport" msgstr "E_sportatu" #: data/menu.ui:55 data/menu.ui:398 msgid "E_xport Selection to a Single File…" msgstr "E_sportatu aukeraketa fitxategi bakar batera…" #: data/menu.ui:228 msgid "Edit _Properties" msgstr "Editatu _propietateak" #: pdfarranger/metadata.py:198 msgid "Edit properties" msgstr "Editatu propietateak" #: pdfarranger/splitter.py:62 msgid "Equal column width" msgstr "Zutabeen zabalera berdina" #: pdfarranger/splitter.py:62 msgid "Equal row height" msgstr "Errenkaden altuera berdina" #: data/menu.ui:60 data/menu.ui:403 msgid "Export Selection to _Individual Files…" msgstr "Esportatu hautapena _banakako fitxategietara…" #: data/menu.ui:65 data/menu.ui:408 msgid "Export _All Pages to Individual Files…" msgstr "Esportatu _orri guztiak fitxategi indibidualetara…" #: pdfarranger/pdfarranger.py:1088 msgid "Export…" msgstr "Esportatu…" #: pdfarranger/core.py:388 pdfarranger/pdfarranger.py:1504 msgid "File is neither pdf nor image" msgstr "Fitxategia ez da ez pdf ez irudia" #: pdfarranger/pdfarranger.py:301 msgid "File(s) to open" msgstr "Ireki beharreko fitxategia(k)" #: pdfarranger/config.py:237 msgid "For more options see:" msgstr "" #: pdfarranger/exporter.py:192 msgid "Forms and outlines are lost on saving." msgstr "Inprimakiak eta eskemak gordetzean galtzen dira." #: data/menu.ui:221 msgid "Full_screen" msgstr "Pantaila o_soa" #: pdfarranger/pdfarranger.py:2562 msgid "GNU General Public License (GPL) Version 3." msgstr "GNU General Public License (GPL) 3. bertsioa." #: data/menu.ui:160 data/menu.ui:389 msgid "Generate Booklet" msgstr "Sortu liburuxka" #: pdfarranger/pageutils.py:236 pdfarranger/pageutils.py:240 #: pdfarranger/pageutils.py:328 msgid "Height" msgstr "Altuera" #: pdfarranger/splitter.py:88 msgid "Height in %" msgstr "Altuera %-tan" #: pdfarranger/pageutils.py:375 msgid "Horizontal" msgstr "" #: pdfarranger/splitter.py:61 msgid "Horizontal Splits" msgstr "Zati horizontalak" #: pdfarranger/pageutils.py:476 msgid "Horizontal offset" msgstr "" #: pdfarranger/core.py:377 msgid "Image files are only supported with img2pdf" msgstr "Irudi-fitxategiak img2pdf-rekin soilik onartzen dira" #: pdfarranger/core.py:383 msgid "Image format is not supported by img2pdf" msgstr "Irudi formatua ez du onartzen img2pdf-ek" #: data/pdfarranger.ui:58 msgid "Import" msgstr "Inportatu" #: pdfarranger/pdfarranger.py:1327 msgid "Import…" msgstr "Inportatu…" #: data/menu.ui:156 data/menu.ui:385 msgid "Insert Blan_k Page…" msgstr "Txertatu orri _zuria…" #: pdfarranger/pageutils.py:325 msgid "Insert Blank Page" msgstr "Txertatu orri zuria" #: pdfarranger/metadata.py:169 msgid "Invalid date format. Input discarded." msgstr "Data-formatu baliogabea. Sarrera baztertu da." #: pdfarranger/pdfarranger.py:2551 #, python-format msgid "It uses libqpdf %s, pikepdf %s, GTK %s and Python %s." msgstr "Erabiltzen du libqpdf %s, pikepdf %s, GTK %s eta Python %s." #: pdfarranger/metadata.py:44 msgid "Keywords" msgstr "Gako-hitzak" #: pdfarranger/config.py:222 msgid "Language" msgstr "" #: pdfarranger/pageutils.py:460 msgid "Layout for the first page in selection" msgstr "" #: pdfarranger/pageutils.py:149 msgid "Left" msgstr "Ezkerra" #: pdfarranger/pageutils.py:377 msgid "Left to Right" msgstr "" #: data/pdfarranger.ui:122 msgid "Main Menu" msgstr "Menu nagusia" #: pdfarranger/pdfarranger.py:2557 msgid "Maintainers and contributors" msgstr "Laguntzaileak eta babesleak" #: pdfarranger/pageutils.py:361 msgid "Margin" msgstr "" #: pdfarranger/pageutils.py:347 msgid "Merge Pages" msgstr "" #: pdfarranger/pageutils.py:412 msgid "Merged page size:" msgstr "" #: pdfarranger/metadata.py:49 msgid "Modified" msgstr "Aldatua" #: pdfarranger/pageutils.py:392 msgid "Non-uniform page size - using max size" msgstr "" #: data/pdfarranger.ui:37 msgid "Open" msgstr "Ireki" #: pdfarranger/pdfarranger.py:1186 msgid "Open…" msgstr "Ireki…" #: pdfarranger/pageutils.py:436 msgid "Overlay" msgstr "" #: pdfarranger/pdfarranger.py:282 msgid "" "PDF Arranger is a small python-gtk application, which helps the user to " "merge or split pdf documents and rotate, crop and rearrange their pages " "using an interactive and intuitive graphical interface. It is a frontend for " "pikepdf." msgstr "" "PDF Arranger python-gtk aplikazio txiki bat da, erabiltzaileari pdf " "dokumentuak batu edo zatitzen eta orriak biratu, moztu eta berrantolatzen " "laguntzen diona interfaze grafiko interaktibo eta intuitibo bat erabiliz. " "Pikepdf-rako interfaze bat da." #: pdfarranger/pdfarranger.py:1498 msgid "PDF document is damaged" msgstr "PDF dokumentua hondatuta dago" #: pdfarranger/pdfarranger.py:499 msgid "PDF files" msgstr "PDF fitxategiak" #: pdfarranger/pageutils.py:388 msgid "Page Order" msgstr "" #: pdfarranger/pageutils.py:241 msgid "Page Size" msgstr "Orriaren tamaina" #: pdfarranger/pdfarranger.py:2585 msgid "Page Size:" msgstr "Orriaren tamaina:" #: pdfarranger/pageutils.py:230 msgid "Page format" msgstr "Orriaren formatua" #: pdfarranger/core.py:285 msgid "Password" msgstr "Pasahitza" #: pdfarranger/core.py:263 msgid "Password required" msgstr "Pasahitza beharrezkoa da" #: data/menu.ui:277 msgid "Past_e Special" msgstr "Itsatsi berezia" #: data/menu.ui:295 msgid "Paste As O_verlay…" msgstr "" #: data/menu.ui:151 data/menu.ui:290 msgid "Paste As _Even Pages" msgstr "Itsatsi orrialde bikoitia gisa" #: data/menu.ui:146 data/menu.ui:285 msgid "Paste As _Odd Pages" msgstr "Itsatsi orrialde bakoitia gisa" #: data/menu.ui:300 msgid "Paste As _Underlay…" msgstr "" #: data/menu.ui:136 data/menu.ui:272 msgid "Paste _After" msgstr "Itsatsi _ondoren" #: data/menu.ui:141 data/menu.ui:280 msgid "Paste _Before" msgstr "Itsatsi aurrean" #: pdfarranger/pdfarranger.py:1627 msgid "Pasted data not valid. Aborting paste." msgstr "Itsatsitako datuak baliogabeak dira. Utzi itsastea." #: pdfarranger/pdfarranger.py:1589 msgid "Pikepdf >= 3 is needed for overlay/underlay/merge support." msgstr "" #: data/menu.ui:234 msgid "Pre_ferences" msgstr "" #: pdfarranger/config.py:212 msgid "Preferences" msgstr "" #: pdfarranger/pdfarranger.py:293 msgid "Print the version of PDF Arranger and exit" msgstr "Inprimatu PDF Arranger-en bertsioa eta irten" #: pdfarranger/exporter.py:457 msgid "Printing…" msgstr "Inprimatzen…" #: pdfarranger/metadata.py:45 msgid "Producer" msgstr "Ekoizlea" #: pdfarranger/metadata.py:212 msgid "Property" msgstr "Jabetza" #: data/menu.ui:116 data/menu.ui:373 msgid "Re_verse Order" msgstr "Al_derantzizkatu ordena" #: pdfarranger/pageutils.py:238 msgid "Relative" msgstr "Erlatiboa" #: pdfarranger/exporter.py:469 msgid "Rendering Preview…" msgstr "Aurrebista errendatzen…" #: pdfarranger/pdfarranger.py:732 msgid "Rendering…" msgstr "Errendatzen…" #: pdfarranger/pdfarranger.py:1132 msgid "Replace" msgstr "" #: pdfarranger/pageutils.py:149 msgid "Right" msgstr "Eskuina" #: pdfarranger/pageutils.py:378 msgid "Right to Left" msgstr "" #: data/pdfarranger.ui:203 msgid "Rotate Left" msgstr "Biratu ezkerrera" #: data/pdfarranger.ui:227 msgid "Rotate Right" msgstr "Biratu eskuinera" #: data/menu.ui:90 data/menu.ui:351 msgid "Rotate _Left" msgstr "Biratu e_zkerrera" #: pdfarranger/pageutils.py:364 pdfarranger/splitter.py:60 msgid "Rows" msgstr "Errenkadak" #: data/menu.ui:194 data/menu.ui:337 msgid "Same Page _Format" msgstr "Orrialdeko _formatu bera" #: data/pdfarranger.ui:78 msgid "Save" msgstr "Gorde" #: data/pdfarranger.ui:97 msgid "Save As" msgstr "Gorde honela" #: pdfarranger/pdfarranger.py:1088 msgid "Save As…" msgstr "Gorde honela…" #: data/menu.ui:47 msgid "Save _As…" msgstr "Gorde _honela…" #: pdfarranger/pdfarranger.py:988 msgid "Save changes before closing?" msgstr "Aldaketak itxi aurretik gorde nahi dituzu?" #: pdfarranger/pdfarranger.py:1025 msgid "Save changes before quitting?" msgstr "Aldaketak irten aurretik gorde nahi dituzu?" #: pdfarranger/pdfarranger.py:985 msgid "Save changes to “{}” before closing?" msgstr "Aldaketak “{}”-n gorde nahi dituzu itxi aurretik?" #: pdfarranger/pdfarranger.py:1022 msgid "Save changes to “{}” before quitting?" msgstr "Aldaketak “{}”-n gorde nahi dituzu irten aurretik?" #: pdfarranger/pdfarranger.py:1249 msgid "Saving produced some warnings" msgstr "Gordetzeak abisu batzuk sortu ditu" #: pdfarranger/pdfarranger.py:1288 msgid "Saving…" msgstr "Gordetzen…" #: pdfarranger/pageutils.py:116 msgid "Scale factor" msgstr "Eskala-faktorea" #: data/menu.ui:169 data/menu.ui:312 msgid "Select _All" msgstr "Hautatu _guztiak" #: data/menu.ui:184 data/menu.ui:327 msgid "Select _Even Pages" msgstr "Hautatu orrialde b_ikoitiak" #: data/menu.ui:179 data/menu.ui:322 msgid "Select _Odd Pages" msgstr "Hautatu orrialde b_akoitiak" #: pdfarranger/pdfarranger.py:2580 msgid "Selected pages: " msgstr "Hautatutako orrialdeak: " #: pdfarranger/splitter.py:26 msgid "Split Pages" msgstr "Zatitu orrialdeak" #: pdfarranger/metadata.py:43 msgid "Subject" msgstr "Gaia" #: pdfarranger/pdfarranger.py:512 msgid "Supported image files" msgstr "Onartutako irudi-fitxategiak" #: pdfarranger/config.py:248 pdfarranger/config.py:256 msgid "System setting" msgstr "" #: pdfarranger/core.py:275 msgid "" "The document “{}” is locked and requires a password before it can be opened." msgstr "El documento “{}” requiere una contraseña para abrirlo." #: pdfarranger/core.py:274 msgid "The password will be remembered until you close PDF Arranger." msgstr "Pasahitza gogoratuko da PDF Arranger itxi arte." #: pdfarranger/config.py:230 msgid "Theme" msgstr "" #: pdfarranger/metadata.py:42 msgid "Title" msgstr "Izenburua" #: pdfarranger/pageutils.py:149 msgid "Top" msgstr "Goian" #: pdfarranger/pageutils.py:379 msgid "Top to Bottom" msgstr "" #: pdfarranger/pageutils.py:436 msgid "Underlay" msgstr "" #: pdfarranger/core.py:361 pdfarranger/pdfarranger.py:1494 msgid "Unknown file format" msgstr "Fitxategi formatu ezezaguna" #: pdfarranger/metadata.py:212 msgid "Value" msgstr "Balioa" #: pdfarranger/pageutils.py:376 msgid "Vertical" msgstr "" #: pdfarranger/splitter.py:61 msgid "Vertical Splits" msgstr "Zati bertikalak" #: pdfarranger/pageutils.py:478 msgid "Vertical offset" msgstr "" #: pdfarranger/exporter.py:187 msgid "Warning" msgstr "Abisua" #: pdfarranger/pageutils.py:235 pdfarranger/pageutils.py:239 #: pdfarranger/pageutils.py:327 msgid "Width" msgstr "Zabalera" #: pdfarranger/splitter.py:88 msgid "Width in %" msgstr "Zabalera %-tan" #: pdfarranger/pdfarranger.py:969 msgid "Your changes will be lost if you don’t save them." msgstr "Zure aldaketak galduko dira gordetzen ez badituzu." #: data/pdfarranger.ui:144 msgid "Zoom In" msgstr "Handiagotu" #: data/pdfarranger.ui:167 msgid "Zoom Out" msgstr "Txikiagotu" #: data/menu.ui:217 msgid "Zoom _Fit" msgstr "_Doitu" #: data/menu.ui:209 msgid "Zoom _In" msgstr "_Handiagotu" #: data/menu.ui:213 msgid "Zoom _Out" msgstr "_Txikiagotu" #: data/menu.ui:240 msgid "_About" msgstr "_Honi buruz" #: pdfarranger/config.py:216 pdfarranger/pageutils.py:219 #: pdfarranger/pdfarranger.py:961 pdfarranger/pdfarranger.py:970 #: pdfarranger/pdfarranger.py:1094 pdfarranger/pdfarranger.py:1144 msgid "_Cancel" msgstr "_Utzi" #: pdfarranger/pdfarranger.py:980 data/menu.ui:246 msgid "_Close" msgstr "_Itxi" #: data/menu.ui:132 data/menu.ui:268 msgid "_Copy" msgstr "_Kopiatu" #: data/menu.ui:108 data/menu.ui:260 msgid "_Delete" msgstr "_Ezabatu" #: data/menu.ui:174 data/menu.ui:317 msgid "_Deselect All" msgstr "_Desautatu guztiak" #: data/menu.ui:87 msgid "_Edit" msgstr "_Editatu" #: data/menu.ui:30 msgid "_Import" msgstr "_Inportatu" #: data/menu.ui:199 data/menu.ui:342 msgid "_Invert Selection" msgstr "_Alderantzikatu hautapena" #: data/menu.ui:124 data/menu.ui:381 msgid "_Merge Pages…" msgstr "" #: data/menu.ui:36 msgid "_New Window" msgstr "_Leiho berria" #: pdfarranger/config.py:217 pdfarranger/pageutils.py:220 msgid "_OK" msgstr "" #: pdfarranger/pdfarranger.py:1143 data/menu.ui:24 msgid "_Open" msgstr "_Ireki" #: data/menu.ui:100 data/menu.ui:361 msgid "_Page Format…" msgstr "Orriaren _formatua…" #: data/menu.ui:71 msgid "_Print…" msgstr "_Inprimatu…" #: pdfarranger/pdfarranger.py:1017 data/menu.ui:252 msgid "_Quit" msgstr "_Irten" #: data/menu.ui:82 msgid "_Redo" msgstr "_Berregin" #: data/menu.ui:95 data/menu.ui:356 msgid "_Rotate Right" msgstr "Biratu e_skuinera" #: pdfarranger/pdfarranger.py:970 pdfarranger/pdfarranger.py:1093 #: data/menu.ui:42 msgid "_Save" msgstr "_Gorde" #: data/menu.ui:166 data/menu.ui:309 msgid "_Select" msgstr "_Hautatu" #: data/menu.ui:120 data/menu.ui:377 msgid "_Split Pages…" msgstr "_Zatitu orrialdeak…" #: data/menu.ui:78 msgid "_Undo" msgstr "_Desegin" #: data/menu.ui:206 msgid "_View" msgstr "_Ikusi" #: pdfarranger/pageutils.py:139 pdfarranger/pageutils.py:362 #: pdfarranger/pageutils.py:412 msgid "mm" msgstr "mm" #: pdfarranger/core.py:89 msgid "page" msgstr "orrialde" #: pdfarranger/pdfarranger.py:811 msgid "untitled" msgstr "izenbururik gabe" pdfarranger-1.10.1/po/fi.po000066400000000000000000000415711451252235000154500ustar00rootroot00000000000000# Finnish translation for pdfarranger. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the pdfarranger package. # Translators: # kbengs, 2020 msgid "" msgstr "" "Project-Id-Version: pdfarranger\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-04-29 22:45+0200\n" "PO-Revision-Date: 2023-06-16 05:49+0300\n" "Last-Translator: \n" "Language-Team: Finnish\n" "Language: fi\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.0.1\n" #: pdfarranger/splitter.py:87 msgid "#Col" msgstr "#Sarake" #: pdfarranger/splitter.py:87 msgid "#Row" msgstr "#Rivi" #: pdfarranger/pageutils.py:122 pdfarranger/pageutils.py:477 #: pdfarranger/pageutils.py:479 msgid "%" msgstr "%" #: pdfarranger/pageutils.py:170 #, python-format msgid "% of height" msgstr "% korkeudesta" #: pdfarranger/pageutils.py:170 #, python-format msgid "% of width" msgstr "% leveydestä" #: pdfarranger/pdfarranger.py:2548 #, python-format msgid "%s is a tool for rearranging and modifying PDF files." msgstr "%s on työkalu PDF-tiedostojen järjestämiseen ja muokkaamiseen." #: pdfarranger/config.py:232 msgid "(Libhandy missing)" msgstr "(Libhandy puuttuu)" #: pdfarranger/config.py:224 msgid "(Requires restart)" msgstr "(Vaatii uudelleenkäynnistyksen)" #: pdfarranger/pageutils.py:461 msgid "(same offset is applied to all pages)" msgstr "(kaikki sivut käyttää sama siirtymä)" #: pdfarranger/pdfarranger.py:1130 #, python-format msgid "A file named \"%s\" already exists. Do you want to replace it?" msgstr "Tiedosto nimellä \"%s\" on jo olemassa. Haluatko korvata sen?" #: data/menu.ui:189 data/menu.ui:332 msgid "All From _Same File" msgstr "Kaikki samasta _tiedostosta" #: pdfarranger/pdfarranger.py:507 msgid "All files" msgstr "Kaikki tiedostot" #: pdfarranger/pdfarranger.py:462 msgid "All pages must have the same size." msgstr "Kaikki sivut on oltava samankokoiset." #: pdfarranger/pdfarranger.py:495 msgid "All supported files" msgstr "Kaikki tuetut tiedostot" #: pdfarranger/pageutils.py:149 msgid "Bottom" msgstr "Alla" #: pdfarranger/pageutils.py:380 msgid "Bottom to Top" msgstr "Alhaalta ylöspäin" #: pdfarranger/core.py:386 msgid "Clipboard image" msgstr "Leikepöytä kuva" #: pdfarranger/pageutils.py:363 pdfarranger/splitter.py:60 msgid "Columns" msgstr "Sarakkeita" #: pdfarranger/metadata.py:48 msgid "Created" msgstr "Luotu" #: pdfarranger/metadata.py:46 msgid "Creator" msgstr "Tekijä" #: pdfarranger/metadata.py:47 msgid "Creator tool" msgstr "Sovellus" #: pdfarranger/pageutils.py:153 msgid "Crop Margins" msgstr "Rajaa marginaalit" #: data/menu.ui:104 data/menu.ui:365 msgid "Crop White Borders" msgstr "Rajaa valkoiset reunat" #: pdfarranger/pageutils.py:161 msgid "" "Cropping does not remove any content from the PDF file, it only hides it." msgstr "Rajaus ei poista sisältöä PDF-tiedostosta, vaan vain piilottaa sen." #: data/menu.ui:128 data/menu.ui:264 msgid "Cu_t" msgstr "_Leikkaa" #: pdfarranger/pdfarranger.py:1250 msgid "Despite the warnings the document(s) should have no visible issues." msgstr "" "Varoituksista huolimatta tiedostoissa ei pitäisi olla näkyviä ongelmia." #: pdfarranger/pdfarranger.py:979 msgid "Discard changes and close?" msgstr "Hylkää muutokset ja sulje tiedosto?" #: pdfarranger/pdfarranger.py:1016 msgid "Discard changes and quit?" msgstr "Hylkää muutokset ja sulje ohjelma?" #: pdfarranger/exporter.py:194 msgid "Do not show this dialog again." msgstr "Älä näytä tätä viestiä enää." #: pdfarranger/pdfarranger.py:970 msgid "Do_n’t Save" msgstr "_Älä tallenna" #: pdfarranger/pdfarranger.py:1257 msgid "Don't show warnings when saving again." msgstr "Älä näytä varoituksia tallennettaessa." #: data/menu.ui:112 data/menu.ui:369 msgid "Dupl_icate" msgstr "Monis_ta" #: data/menu.ui:52 data/menu.ui:395 msgid "E_xport" msgstr "Vi_e" #: data/menu.ui:55 data/menu.ui:398 msgid "E_xport Selection to a Single File…" msgstr "Vi_e valitut sivut yhteen tiedostoon…" #: data/menu.ui:228 msgid "Edit _Properties" msgstr "Muokkaa ominaisuuks_ia" #: pdfarranger/metadata.py:198 msgid "Edit properties" msgstr "Muokkaa ominaisuuksia" #: pdfarranger/splitter.py:62 msgid "Equal column width" msgstr "Sama sarakeleveys" #: pdfarranger/splitter.py:62 msgid "Equal row height" msgstr "Sama rivikorkeus" #: data/menu.ui:60 data/menu.ui:403 msgid "Export Selection to _Individual Files…" msgstr "Vie valitut sivut _omiin tiedostoihin…" #: data/menu.ui:65 data/menu.ui:408 msgid "Export _All Pages to Individual Files…" msgstr "Vie kaikki sivut omiin _tiedostoihin…" #: pdfarranger/pdfarranger.py:1088 msgid "Export…" msgstr "Vie…" #: pdfarranger/core.py:388 pdfarranger/pdfarranger.py:1504 msgid "File is neither pdf nor image" msgstr "Tiedosto ei ole pdf eikä kuva" #: pdfarranger/pdfarranger.py:301 msgid "File(s) to open" msgstr "Tiedostoja avattavaksi" #: pdfarranger/config.py:237 msgid "For more options see:" msgstr "Käytetty asetustiedosto:" #: pdfarranger/exporter.py:192 msgid "Forms and outlines are lost on saving." msgstr "Lomakkeet ja kirjanmerkit menetetään tallennettaessa." #: data/menu.ui:221 msgid "Full_screen" msgstr "Koko _näyttö" #: pdfarranger/pdfarranger.py:2562 msgid "GNU General Public License (GPL) Version 3." msgstr "GNU General Public License (GPL) Version 3." #: data/menu.ui:160 data/menu.ui:389 msgid "Generate Booklet" msgstr "Luo kirjanen" #: pdfarranger/pageutils.py:236 pdfarranger/pageutils.py:240 #: pdfarranger/pageutils.py:328 msgid "Height" msgstr "Korkeus" #: pdfarranger/splitter.py:88 msgid "Height in %" msgstr "Korkeus %" #: pdfarranger/pageutils.py:375 msgid "Horizontal" msgstr "Vaakasuora" #: pdfarranger/splitter.py:61 msgid "Horizontal Splits" msgstr "Vaakasuora jako" #: pdfarranger/pageutils.py:476 msgid "Horizontal offset" msgstr "Vaakasuuntainen siirtymä" #: pdfarranger/core.py:377 msgid "Image files are only supported with img2pdf" msgstr "Kuvatiedostoja tuetaan voin jos img2pdf on asennettu" #: pdfarranger/core.py:383 msgid "Image format is not supported by img2pdf" msgstr "Img2pdf ei tue kuvamuotoa" #: data/pdfarranger.ui:58 msgid "Import" msgstr "Tuo" #: pdfarranger/pdfarranger.py:1327 msgid "Import…" msgstr "Tuo…" #: data/menu.ui:156 data/menu.ui:385 msgid "Insert Blan_k Page…" msgstr "L_isää tyhjä sivu…" #: pdfarranger/pageutils.py:325 msgid "Insert Blank Page" msgstr "Lisää tyhjä sivu" #: pdfarranger/metadata.py:169 msgid "Invalid date format. Input discarded." msgstr "Päivämäärämuoto on virheellinen." #: pdfarranger/pdfarranger.py:2551 #, python-format msgid "It uses libqpdf %s, pikepdf %s, GTK %s and Python %s." msgstr "libqpdf %s, pikepdf %s, GTK %s ja Python %s." #: pdfarranger/metadata.py:44 msgid "Keywords" msgstr "Avainsanat" #: pdfarranger/config.py:222 msgid "Language" msgstr "Kieli" #: pdfarranger/pageutils.py:460 msgid "Layout for the first page in selection" msgstr "Valinnan ensimmäisen sivun asettelu" #: pdfarranger/pageutils.py:149 msgid "Left" msgstr "Vasen" #: pdfarranger/pageutils.py:377 msgid "Left to Right" msgstr "Vasemmalta oikealle" #: data/pdfarranger.ui:122 msgid "Main Menu" msgstr "Päävalikko" #: pdfarranger/pdfarranger.py:2557 msgid "Maintainers and contributors" msgstr "Ylläpitäjät ja avustajat" #: pdfarranger/pageutils.py:361 msgid "Margin" msgstr "Marginaali" #: pdfarranger/pageutils.py:347 msgid "Merge Pages" msgstr "Yhdistä sivuja" #: pdfarranger/pageutils.py:412 msgid "Merged page size:" msgstr "Yhdistetyn sivun koko:" #: pdfarranger/metadata.py:49 msgid "Modified" msgstr "Muokattu" #: pdfarranger/pageutils.py:392 msgid "Non-uniform page size - using max size" msgstr "Vaihteleva sivukoko - enimmäiskoko käytetään" #: data/pdfarranger.ui:37 msgid "Open" msgstr "Avaa" #: pdfarranger/pdfarranger.py:1186 msgid "Open…" msgstr "Avaa…" #: pdfarranger/pageutils.py:436 msgid "Overlay" msgstr "Liitä ylle" #: pdfarranger/pdfarranger.py:282 msgid "" "PDF Arranger is a small python-gtk application, which helps the user to " "merge or split pdf documents and rotate, crop and rearrange their pages " "using an interactive and intuitive graphical interface. It is a frontend for " "pikepdf." msgstr "" "PDF Arranger on pieni python-gtk ohjelma mikä auttaa käyttäjää yhdistämään " "ja järjestämään PDF-tiedostoja. Ohjelma käyttää pikepdf taustalla." #: pdfarranger/pdfarranger.py:1498 msgid "PDF document is damaged" msgstr "PDF tiedosto on vioittunut" #: pdfarranger/pdfarranger.py:499 msgid "PDF files" msgstr "PDF tiedostot" #: pdfarranger/pageutils.py:388 msgid "Page Order" msgstr "Sivujärjestys" #: pdfarranger/pageutils.py:241 msgid "Page Size" msgstr "Sivun koko" #: pdfarranger/pdfarranger.py:2585 msgid "Page Size:" msgstr "Sivun koko:" #: pdfarranger/pageutils.py:230 msgid "Page format" msgstr "Sivun muoto" #: pdfarranger/core.py:285 msgid "Password" msgstr "Salasana" #: pdfarranger/core.py:263 msgid "Password required" msgstr "Salasana tarvitaan" #: data/menu.ui:277 msgid "Past_e Special" msgstr "Liitä määräte_n" #: data/menu.ui:295 msgid "Paste As O_verlay…" msgstr "Liitä _ylle…" #: data/menu.ui:151 data/menu.ui:290 msgid "Paste As _Even Pages" msgstr "Liitä pa_rillisina sivuina" #: data/menu.ui:146 data/menu.ui:285 msgid "Paste As _Odd Pages" msgstr "Liitä paritto_mina sivuina" #: data/menu.ui:300 msgid "Paste As _Underlay…" msgstr "Liitä _alle…" #: data/menu.ui:136 data/menu.ui:272 msgid "Paste _After" msgstr "Liitä j_älkeen" #: data/menu.ui:141 data/menu.ui:280 msgid "Paste _Before" msgstr "Liitä _ennen" #: pdfarranger/pdfarranger.py:1627 msgid "Pasted data not valid. Aborting paste." msgstr "Liitetty data ei hyväksytty." #: pdfarranger/pdfarranger.py:1589 msgid "Pikepdf >= 3 is needed for overlay/underlay/merge support." msgstr "Liitä ylle/liitä alle/yhdistä vaatii Pikepdf >= 3" #: data/menu.ui:234 msgid "Pre_ferences" msgstr "Asetukse_t" #: pdfarranger/config.py:212 msgid "Preferences" msgstr "Asetukset" #: pdfarranger/pdfarranger.py:293 msgid "Print the version of PDF Arranger and exit" msgstr "Tulosta PDF Arranger versio ja sulje" #: pdfarranger/exporter.py:457 msgid "Printing…" msgstr "Tulostaa…" #: pdfarranger/metadata.py:45 msgid "Producer" msgstr "PDF-tuottaja" #: pdfarranger/metadata.py:212 msgid "Property" msgstr "Ominaisuus" #: data/menu.ui:116 data/menu.ui:373 msgid "Re_verse Order" msgstr "_Käännä järjestys" #: pdfarranger/pageutils.py:238 msgid "Relative" msgstr "Suhteellinen" #: pdfarranger/exporter.py:469 msgid "Rendering Preview…" msgstr "Renderöi esikatselua…" #: pdfarranger/pdfarranger.py:732 msgid "Rendering…" msgstr "Renderöi…" #: pdfarranger/pdfarranger.py:1132 msgid "Replace" msgstr "Korvaa" #: pdfarranger/pageutils.py:149 msgid "Right" msgstr "Oikea" #: pdfarranger/pageutils.py:378 msgid "Right to Left" msgstr "Oikealta vasemmalle" #: data/pdfarranger.ui:203 msgid "Rotate Left" msgstr "Käännä vasemmalle" #: data/pdfarranger.ui:227 msgid "Rotate Right" msgstr "Käännä oikealle" #: data/menu.ui:90 data/menu.ui:351 msgid "Rotate _Left" msgstr "Käännä v_asemmalle" #: pdfarranger/pageutils.py:364 pdfarranger/splitter.py:60 msgid "Rows" msgstr "Rivejä" #: data/menu.ui:194 data/menu.ui:337 msgid "Same Page _Format" msgstr "Sama s_ivunmuoto" #: data/pdfarranger.ui:78 msgid "Save" msgstr "Tallenna" #: data/pdfarranger.ui:97 msgid "Save As" msgstr "Tallenna nimellä" #: pdfarranger/pdfarranger.py:1088 msgid "Save As…" msgstr "Tallenna nimellä…" #: data/menu.ui:47 msgid "Save _As…" msgstr "Tallenna _nimellä…" #: pdfarranger/pdfarranger.py:988 msgid "Save changes before closing?" msgstr "Tallenna muutokset ennen tiedoston sulkemista?" #: pdfarranger/pdfarranger.py:1025 msgid "Save changes before quitting?" msgstr "Tallenna muutokset ennen ohjelman sulkemista?" #: pdfarranger/pdfarranger.py:985 msgid "Save changes to “{}” before closing?" msgstr "Tallenna muutokset “{}” ennen sulkemista?" #: pdfarranger/pdfarranger.py:1022 msgid "Save changes to “{}” before quitting?" msgstr "Tallenna muutokset “{}” ennen sulkemista?" #: pdfarranger/pdfarranger.py:1249 msgid "Saving produced some warnings" msgstr "Tallentamisprosessi tuotti varoituksia" #: pdfarranger/pdfarranger.py:1288 msgid "Saving…" msgstr "Tallentaa…" #: pdfarranger/pageutils.py:116 msgid "Scale factor" msgstr "Skaalauskerroin" #: data/menu.ui:169 data/menu.ui:312 msgid "Select _All" msgstr "_Valitse kaikki" #: data/menu.ui:184 data/menu.ui:327 msgid "Select _Even Pages" msgstr "Valitse parilli_set sivut" #: data/menu.ui:179 data/menu.ui:322 msgid "Select _Odd Pages" msgstr "Valitse paritto_mat sivut" #: pdfarranger/pdfarranger.py:2580 msgid "Selected pages: " msgstr "Valitut sivut: " #: pdfarranger/splitter.py:26 msgid "Split Pages" msgstr "Jaa sivu" #: pdfarranger/metadata.py:43 msgid "Subject" msgstr "Aihe" #: pdfarranger/pdfarranger.py:512 msgid "Supported image files" msgstr "Tuetut kuvatiedostot" #: pdfarranger/config.py:248 pdfarranger/config.py:256 msgid "System setting" msgstr "Järjestelmäasetus" #: pdfarranger/core.py:275 msgid "" "The document “{}” is locked and requires a password before it can be opened." msgstr "" "Tiedosto “{}” on lukittu ja vaatii salasanan ennen kuin se voidaan avata." #: pdfarranger/core.py:274 msgid "The password will be remembered until you close PDF Arranger." msgstr "Salasana pysyy muistissa kunnes ohjelma suljetaan." #: pdfarranger/config.py:230 msgid "Theme" msgstr "Teema" #: pdfarranger/metadata.py:42 msgid "Title" msgstr "Otsikko" #: pdfarranger/pageutils.py:149 msgid "Top" msgstr "Yllä" #: pdfarranger/pageutils.py:379 msgid "Top to Bottom" msgstr "Ylhäältä alaspäin" #: pdfarranger/pageutils.py:436 msgid "Underlay" msgstr "Liitä alle" #: pdfarranger/core.py:361 pdfarranger/pdfarranger.py:1494 msgid "Unknown file format" msgstr "Tuntematon tiedostomuoto" #: pdfarranger/metadata.py:212 msgid "Value" msgstr "Arvo" #: pdfarranger/pageutils.py:376 msgid "Vertical" msgstr "Pystysuora" #: pdfarranger/splitter.py:61 msgid "Vertical Splits" msgstr "Pystysuora jako" #: pdfarranger/pageutils.py:478 msgid "Vertical offset" msgstr "Pystysuuntainen siirtymä" #: pdfarranger/exporter.py:187 msgid "Warning" msgstr "Varoitus" #: pdfarranger/pageutils.py:235 pdfarranger/pageutils.py:239 #: pdfarranger/pageutils.py:327 msgid "Width" msgstr "Leveys" #: pdfarranger/splitter.py:88 msgid "Width in %" msgstr "Leveys %" #: pdfarranger/pdfarranger.py:969 msgid "Your changes will be lost if you don’t save them." msgstr "Muutokset menetetään jos et tallenna niitä." #: data/pdfarranger.ui:144 msgid "Zoom In" msgstr "Lähennä" #: data/pdfarranger.ui:167 msgid "Zoom Out" msgstr "Loitonna" #: data/menu.ui:217 msgid "Zoom _Fit" msgstr "Koko _ikkuna" #: data/menu.ui:209 msgid "Zoom _In" msgstr "L_ähennä" #: data/menu.ui:213 msgid "Zoom _Out" msgstr "L_oitonna" #: data/menu.ui:240 msgid "_About" msgstr "Tietoja - PD_F Arranger" #: pdfarranger/config.py:216 pdfarranger/pageutils.py:219 #: pdfarranger/pdfarranger.py:961 pdfarranger/pdfarranger.py:970 #: pdfarranger/pdfarranger.py:1094 pdfarranger/pdfarranger.py:1144 msgid "_Cancel" msgstr "_Peru" #: pdfarranger/pdfarranger.py:980 data/menu.ui:246 msgid "_Close" msgstr "_Sulje tiedosto" #: data/menu.ui:132 data/menu.ui:268 msgid "_Copy" msgstr "Ko_pioi" #: data/menu.ui:108 data/menu.ui:260 msgid "_Delete" msgstr "Poi_sta" #: data/menu.ui:174 data/menu.ui:317 msgid "_Deselect All" msgstr "_Poista valinta" #: data/menu.ui:87 msgid "_Edit" msgstr "_Muokkaa" #: data/menu.ui:30 msgid "_Import" msgstr "_Tuo" #: data/menu.ui:199 data/menu.ui:342 msgid "_Invert Selection" msgstr "K_äänteinen valinta" #: data/menu.ui:124 data/menu.ui:381 msgid "_Merge Pages…" msgstr "_Yhdistä sivuja…" #: data/menu.ui:36 msgid "_New Window" msgstr "_Uusi ikkuna" #: pdfarranger/config.py:217 pdfarranger/pageutils.py:220 msgid "_OK" msgstr "_OK" #: pdfarranger/pdfarranger.py:1143 data/menu.ui:24 msgid "_Open" msgstr "_Avaa" #: data/menu.ui:100 data/menu.ui:361 msgid "_Page Format…" msgstr "Sivun m_uoto…" #: data/menu.ui:71 msgid "_Print…" msgstr "_Tulosta…" #: pdfarranger/pdfarranger.py:1017 data/menu.ui:252 msgid "_Quit" msgstr "_Sulje ohjelma" #: data/menu.ui:82 msgid "_Redo" msgstr "Tee uu_delleen" #: data/menu.ui:95 data/menu.ui:356 msgid "_Rotate Right" msgstr "Käännä _oikealle" #: pdfarranger/pdfarranger.py:970 pdfarranger/pdfarranger.py:1093 #: data/menu.ui:42 msgid "_Save" msgstr "T_allenna" #: data/menu.ui:166 data/menu.ui:309 msgid "_Select" msgstr "_Valitse" #: data/menu.ui:120 data/menu.ui:377 msgid "_Split Pages…" msgstr "_Jaa sivu…" #: data/menu.ui:78 msgid "_Undo" msgstr "_Kumoa" #: data/menu.ui:206 msgid "_View" msgstr "_Näytä" #: pdfarranger/pageutils.py:139 pdfarranger/pageutils.py:362 #: pdfarranger/pageutils.py:412 msgid "mm" msgstr "mm" #: pdfarranger/core.py:89 msgid "page" msgstr "sivu" #: pdfarranger/pdfarranger.py:811 msgid "untitled" msgstr "Nimetön" pdfarranger-1.10.1/po/fr.po000066400000000000000000000434771451252235000154700ustar00rootroot00000000000000# pdfarranger translation files. # Copyright (C) 2020 Jérôme Robert # This file is part of pdfarranger which is released under the GNU General # Public License version 3 or later. # See file COPYING or go to for full license details. # Translators: # David VANTYGHEM , 2014. # Jérôme Robert , 2019. # Charles Monzat , 2019-2022. # msgid "" msgstr "" "Project-Id-Version: unnamed project\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-04-29 22:45+0200\n" "PO-Revision-Date: 2023-05-14 21:20+0200\n" "Last-Translator: Irénée Thirion \n" "Language-Team: French - France <>\n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Poedit-SourceCharset: utf-8\n" "X-Generator: Poedit 3.2.2\n" #: pdfarranger/splitter.py:87 msgid "#Col" msgstr "#Col" #: pdfarranger/splitter.py:87 msgid "#Row" msgstr "#Lig" #: pdfarranger/pageutils.py:122 pdfarranger/pageutils.py:477 #: pdfarranger/pageutils.py:479 msgid "%" msgstr "%" #: pdfarranger/pageutils.py:170 msgid "% of height" msgstr "% de la hauteur" #: pdfarranger/pageutils.py:170 msgid "% of width" msgstr "% de la largeur" #: pdfarranger/pdfarranger.py:2548 #, python-format msgid "%s is a tool for rearranging and modifying PDF files." msgstr "%s est un outil pour réorganiser et modifier des fichiers PDF." #: pdfarranger/config.py:232 msgid "(Libhandy missing)" msgstr "(Libhandy manquant)" #: pdfarranger/config.py:224 msgid "(Requires restart)" msgstr "(Nécessite de redémarrer)" #: pdfarranger/pageutils.py:461 msgid "(same offset is applied to all pages)" msgstr "(le même décalage est appliqué à toutes les pages)" #: pdfarranger/pdfarranger.py:1130 #, python-format msgid "A file named \"%s\" already exists. Do you want to replace it?" msgstr "Un fichier nommé « %s » existe déjà. Voulez-vous le remplacer ?" #: data/menu.ui:189 data/menu.ui:332 msgid "All From _Same File" msgstr "Pages du _même fichier" #: pdfarranger/pdfarranger.py:507 msgid "All files" msgstr "Tous les fichiers" #: pdfarranger/pdfarranger.py:462 msgid "All pages must have the same size." msgstr "Toutes les pages doivent avoir la même taille." #: pdfarranger/pdfarranger.py:495 msgid "All supported files" msgstr "Tous les fichiers pris en charge" #: pdfarranger/pageutils.py:149 msgid "Bottom" msgstr "En bas" #: pdfarranger/pageutils.py:380 msgid "Bottom to Top" msgstr "De bas en haut" #: pdfarranger/core.py:386 msgid "Clipboard image" msgstr "Image du presse-papiers" #: pdfarranger/pageutils.py:363 pdfarranger/splitter.py:60 msgid "Columns" msgstr "En colonnes" #: pdfarranger/metadata.py:48 msgid "Created" msgstr "Créé le" #: pdfarranger/metadata.py:46 msgid "Creator" msgstr "Auteur" #: pdfarranger/metadata.py:47 msgid "Creator tool" msgstr "Outil" #: pdfarranger/pageutils.py:153 msgid "Crop Margins" msgstr "Rogner les marges" #: data/menu.ui:104 data/menu.ui:365 msgid "Crop White Borders" msgstr "Rogner au contenu" #: pdfarranger/pageutils.py:161 msgid "" "Cropping does not remove any content from the PDF file, it only hides it." msgstr "" "Le contenu rogné reste présent dans le fichier PDF. Il est simplement caché." #: data/menu.ui:128 data/menu.ui:264 msgid "Cu_t" msgstr "C_ouper" #: pdfarranger/pdfarranger.py:1250 msgid "Despite the warnings the document(s) should have no visible issues." msgstr "" "Malgré les avertissements, le ou les documents ne devraient présenter aucun " "problème visible." #: pdfarranger/pdfarranger.py:979 msgid "Discard changes and close?" msgstr "Annuler les modifications et fermer ?" #: pdfarranger/pdfarranger.py:1016 msgid "Discard changes and quit?" msgstr "Annuler les modifications et quitter ?" #: pdfarranger/exporter.py:194 msgid "Do not show this dialog again." msgstr "Ne plus demander." #: pdfarranger/pdfarranger.py:970 msgid "Do_n’t Save" msgstr "Ne _pas enregistrer" #: pdfarranger/pdfarranger.py:1257 msgid "Don't show warnings when saving again." msgstr "Ne plus montrer cet avertissement." #: data/menu.ui:112 data/menu.ui:369 msgid "Dupl_icate" msgstr "D_upliquer" #: data/menu.ui:52 data/menu.ui:395 msgid "E_xport" msgstr "E_xporter" #: data/menu.ui:55 data/menu.ui:398 msgid "E_xport Selection to a Single File…" msgstr "E_xporter la sélection vers un seul fichier…" #: data/menu.ui:228 msgid "Edit _Properties" msgstr "Édi_ter les propriétés" #: pdfarranger/metadata.py:198 msgid "Edit properties" msgstr "Éditer les propriétés" #: pdfarranger/splitter.py:62 msgid "Equal column width" msgstr "Colonnes de largeurs égales" #: pdfarranger/splitter.py:62 msgid "Equal row height" msgstr "Lignes de hauteurs égales" #: data/menu.ui:60 data/menu.ui:403 msgid "Export Selection to _Individual Files…" msgstr "Exporter chaque page sélect_ionnée vers un fichier…" #: data/menu.ui:65 data/menu.ui:408 msgid "Export _All Pages to Individual Files…" msgstr "Exporter ch_aque page vers un fichier…" #: pdfarranger/pdfarranger.py:1088 msgid "Export…" msgstr "Exporter…" #: pdfarranger/core.py:388 pdfarranger/pdfarranger.py:1504 msgid "File is neither pdf nor image" msgstr "Le fichier n’est ni un PDF ni une image" #: pdfarranger/pdfarranger.py:301 msgid "File(s) to open" msgstr "Fichier(s) à ouvrir" #: pdfarranger/config.py:237 msgid "For more options see:" msgstr "Pour plus d'options voir:" #: pdfarranger/exporter.py:192 msgid "Forms and outlines are lost on saving." msgstr "Les formulaires et les signets ne sont pas pris en charge." #: data/menu.ui:221 msgid "Full_screen" msgstr "Plein _écran" #: pdfarranger/pdfarranger.py:2562 msgid "GNU General Public License (GPL) Version 3." msgstr "Licence publique générale GNU (GPL), version 3." #: data/menu.ui:160 data/menu.ui:389 msgid "Generate Booklet" msgstr "Générer un livret" #: pdfarranger/pageutils.py:236 pdfarranger/pageutils.py:240 #: pdfarranger/pageutils.py:328 msgid "Height" msgstr "Hauteur" #: pdfarranger/splitter.py:88 msgid "Height in %" msgstr "Hauteur en %" #: pdfarranger/pageutils.py:375 msgid "Horizontal" msgstr "Horizontal" #: pdfarranger/splitter.py:61 msgid "Horizontal Splits" msgstr "Nombre de lignes" #: pdfarranger/pageutils.py:476 msgid "Horizontal offset" msgstr "Décalage horizontal" #: pdfarranger/core.py:377 msgid "Image files are only supported with img2pdf" msgstr "Les fichiers image sont seulement pris en charge avec img2pdf" #: pdfarranger/core.py:383 msgid "Image format is not supported by img2pdf" msgstr "Le format d’image n’est pas pris en charge par img2pdf" #: data/pdfarranger.ui:58 msgid "Import" msgstr "Importer" #: pdfarranger/pdfarranger.py:1327 msgid "Import…" msgstr "Importer…" #: data/menu.ui:156 data/menu.ui:385 msgid "Insert Blan_k Page…" msgstr "Insérer une page _blanche…" #: pdfarranger/pageutils.py:325 msgid "Insert Blank Page" msgstr "Insérer une page blanche" #: pdfarranger/metadata.py:169 msgid "Invalid date format. Input discarded." msgstr "Format de date non valide." #: pdfarranger/pdfarranger.py:2551 #, python-format msgid "It uses libqpdf %s, pikepdf %s, GTK %s and Python %s." msgstr "Il utilise libqpdf %s, pikepdf %s, GTK %s et Python %s." #: pdfarranger/metadata.py:44 msgid "Keywords" msgstr "Mots-clés" #: pdfarranger/config.py:222 msgid "Language" msgstr "Langue" #: pdfarranger/pageutils.py:460 msgid "Layout for the first page in selection" msgstr "Mise en page de la première page de la sélection" #: pdfarranger/pageutils.py:149 msgid "Left" msgstr "À gauche" #: pdfarranger/pageutils.py:377 msgid "Left to Right" msgstr "De gauche à droite" #: data/pdfarranger.ui:122 msgid "Main Menu" msgstr "Menu principal" #: pdfarranger/pdfarranger.py:2557 msgid "Maintainers and contributors" msgstr "Mainteneurs et contributeurs" #: pdfarranger/pageutils.py:361 msgid "Margin" msgstr "Marges" #: pdfarranger/pageutils.py:347 msgid "Merge Pages" msgstr "Fusionner les pages" #: pdfarranger/pageutils.py:412 msgid "Merged page size:" msgstr "Taille de la page fusionnée :" #: pdfarranger/metadata.py:49 msgid "Modified" msgstr "Modifié le" #: pdfarranger/pageutils.py:392 msgid "Non-uniform page size - using max size" msgstr "Taille de page non uniforme - utilisation de la taille maximale" #: data/pdfarranger.ui:37 msgid "Open" msgstr "Ouvrir" #: pdfarranger/pdfarranger.py:1186 msgid "Open…" msgstr "Ouvrir…" #: pdfarranger/pageutils.py:436 msgid "Overlay" msgstr "Sur-couche" #: pdfarranger/pdfarranger.py:282 msgid "" "PDF Arranger is a small python-gtk application, which helps the user to " "merge or split pdf documents and rotate, crop and rearrange their pages " "using an interactive and intuitive graphical interface. It is a frontend for " "pikepdf." msgstr "" "PDF Arranger est une application basée sur Python GTK, qui permet de " "fusionner ou diviser des documents PDF et de pivoter, recadrer et " "réorganiser leurs pages en utilisant une interface graphique interactive et " "intuitive. C’est une interface pour Pikepdf." #: pdfarranger/pdfarranger.py:1498 msgid "PDF document is damaged" msgstr "Le document PDF est endommagé" #: pdfarranger/pdfarranger.py:499 msgid "PDF files" msgstr "Fichiers PDF" #: pdfarranger/pageutils.py:388 msgid "Page Order" msgstr "Ordre des pages" #: pdfarranger/pageutils.py:241 msgid "Page Size" msgstr "Dimensions" #: pdfarranger/pdfarranger.py:2585 msgid "Page Size:" msgstr "Dimensions de la page :" #: pdfarranger/pageutils.py:230 msgid "Page format" msgstr "Format de page" #: pdfarranger/core.py:285 msgid "Password" msgstr "Mot de passe" #: pdfarranger/core.py:263 msgid "Password required" msgstr "Mot de passe requis" #: data/menu.ui:277 msgid "Past_e Special" msgstr "Coll_age spécial" #: data/menu.ui:295 msgid "Paste As O_verlay…" msgstr "Coller en s_ur-couche" #: data/menu.ui:151 data/menu.ui:290 msgid "Paste As _Even Pages" msgstr "Coller en pages _paires" #: data/menu.ui:146 data/menu.ui:285 msgid "Paste As _Odd Pages" msgstr "Coller en pages i_mpaires" #: data/menu.ui:300 msgid "Paste As _Underlay…" msgstr "Coller en s_ous-couche" #: data/menu.ui:136 data/menu.ui:272 msgid "Paste _After" msgstr "Co_ller après" #: data/menu.ui:141 data/menu.ui:280 msgid "Paste _Before" msgstr "Coller a_vant" #: pdfarranger/pdfarranger.py:1627 msgid "Pasted data not valid. Aborting paste." msgstr "Données collées non valides. Annulation du collage." #: pdfarranger/pdfarranger.py:1589 msgid "Pikepdf >= 3 is needed for overlay/underlay/merge support." msgstr "" "Pikepdf >= 3 est nécessaire pour la prise en charge des sous/sur-couches et " "de la fusion." #: data/menu.ui:234 msgid "Pre_ferences" msgstr "Pré_férences" #: pdfarranger/config.py:212 msgid "Preferences" msgstr "Préférences" #: pdfarranger/pdfarranger.py:293 msgid "Print the version of PDF Arranger and exit" msgstr "Affiche la version de PDF Arranger et quitte" #: pdfarranger/exporter.py:457 msgid "Printing…" msgstr "Impression…" #: pdfarranger/metadata.py:45 msgid "Producer" msgstr "Producteur" #: pdfarranger/metadata.py:212 msgid "Property" msgstr "Propriété" #: data/menu.ui:116 data/menu.ui:373 msgid "Re_verse Order" msgstr "_Inverser l’ordre" #: pdfarranger/pageutils.py:238 msgid "Relative" msgstr "Relative" #: pdfarranger/exporter.py:469 msgid "Rendering Preview…" msgstr "Rendu des aperçus…" #: pdfarranger/pdfarranger.py:732 msgid "Rendering…" msgstr "Calcul du rendu…" #: pdfarranger/pdfarranger.py:1132 msgid "Replace" msgstr "Remplacer" #: pdfarranger/pageutils.py:149 msgid "Right" msgstr "À droite" #: pdfarranger/pageutils.py:378 msgid "Right to Left" msgstr "De droite à gauche" #: data/pdfarranger.ui:203 msgid "Rotate Left" msgstr "Rotation vers la gauche" #: data/pdfarranger.ui:227 msgid "Rotate Right" msgstr "Rotation vers la droite" #: data/menu.ui:90 data/menu.ui:351 msgid "Rotate _Left" msgstr "Rotation vers la _gauche" #: pdfarranger/pageutils.py:364 pdfarranger/splitter.py:60 msgid "Rows" msgstr "En lignes" #: data/menu.ui:194 data/menu.ui:337 msgid "Same Page _Format" msgstr "Pages de même _format" #: data/pdfarranger.ui:78 msgid "Save" msgstr "Enregistrer" #: data/pdfarranger.ui:97 msgid "Save As" msgstr "Enregistrer sous" #: pdfarranger/pdfarranger.py:1088 msgid "Save As…" msgstr "Enregistrer sous…" #: data/menu.ui:47 msgid "Save _As…" msgstr "Enregistrer _sous…" #: pdfarranger/pdfarranger.py:988 msgid "Save changes before closing?" msgstr "Enregistrer les modifications avant la fermeture ?" #: pdfarranger/pdfarranger.py:1025 msgid "Save changes before quitting?" msgstr "Enregistrer les modifications avant de quitter ?" #: pdfarranger/pdfarranger.py:985 msgid "Save changes to “{}” before closing?" msgstr "Enregistrer les modifications du document « {} » avant la fermeture ?" #: pdfarranger/pdfarranger.py:1022 msgid "Save changes to “{}” before quitting?" msgstr "Enregistrer les modifications dans « {} » avant de quitter ?" #: pdfarranger/pdfarranger.py:1249 msgid "Saving produced some warnings" msgstr "La sauvegarde a produit des avertissements" #: pdfarranger/pdfarranger.py:1288 msgid "Saving…" msgstr "Enregistrer…" #: pdfarranger/pageutils.py:116 msgid "Scale factor" msgstr "Facteur d’échelle" #: data/menu.ui:169 data/menu.ui:312 msgid "Select _All" msgstr "_Tout sélectionner" #: data/menu.ui:184 data/menu.ui:327 msgid "Select _Even Pages" msgstr "Pages _paires" #: data/menu.ui:179 data/menu.ui:322 msgid "Select _Odd Pages" msgstr "Pages _impaires" #: pdfarranger/pdfarranger.py:2580 msgid "Selected pages: " msgstr "Pages sélectionnées : " #: pdfarranger/splitter.py:26 msgid "Split Pages" msgstr "Séparer les pages" #: pdfarranger/metadata.py:43 msgid "Subject" msgstr "Sujet" #: pdfarranger/pdfarranger.py:512 msgid "Supported image files" msgstr "Fichiers image pris en charge" #: pdfarranger/config.py:248 pdfarranger/config.py:256 msgid "System setting" msgstr "Configuration système" #: pdfarranger/core.py:275 msgid "" "The document “{}” is locked and requires a password before it can be opened." msgstr "" "Le document « {} » est verrouillé et nécessite un mot de passe avant son " "ouverture." #: pdfarranger/core.py:274 msgid "The password will be remembered until you close PDF Arranger." msgstr "Le mot de passe sera mémorisé jusqu’à la fermeture de PDF Arranger." #: pdfarranger/config.py:230 msgid "Theme" msgstr "Thème" #: pdfarranger/metadata.py:42 msgid "Title" msgstr "Titre" #: pdfarranger/pageutils.py:149 msgid "Top" msgstr "En haut" #: pdfarranger/pageutils.py:379 msgid "Top to Bottom" msgstr "De haut en bas" #: pdfarranger/pageutils.py:436 msgid "Underlay" msgstr "Sous-couche" #: pdfarranger/core.py:361 pdfarranger/pdfarranger.py:1494 msgid "Unknown file format" msgstr "Format de fichier inconnu" #: pdfarranger/metadata.py:212 msgid "Value" msgstr "Valeur" #: pdfarranger/pageutils.py:376 msgid "Vertical" msgstr "Vertical" #: pdfarranger/splitter.py:61 msgid "Vertical Splits" msgstr "Nombre de colonnes" #: pdfarranger/pageutils.py:478 msgid "Vertical offset" msgstr "Décalage vertical" #: pdfarranger/exporter.py:187 msgid "Warning" msgstr "Attention" #: pdfarranger/pageutils.py:235 pdfarranger/pageutils.py:239 #: pdfarranger/pageutils.py:327 msgid "Width" msgstr "Largeur" #: pdfarranger/splitter.py:88 msgid "Width in %" msgstr "Largeur en %" #: pdfarranger/pdfarranger.py:969 msgid "Your changes will be lost if you don’t save them." msgstr "Vos modifications seront perdues si vous ne les enregistrez pas." #: data/pdfarranger.ui:144 msgid "Zoom In" msgstr "Zoom avant" #: data/pdfarranger.ui:167 msgid "Zoom Out" msgstr "Zoom arrière" #: data/menu.ui:217 msgid "Zoom _Fit" msgstr "Zoom _ajusté" #: data/menu.ui:209 msgid "Zoom _In" msgstr "Zoom a_vant" #: data/menu.ui:213 msgid "Zoom _Out" msgstr "Zoom _arrière" #: data/menu.ui:240 msgid "_About" msgstr "À _propos" #: pdfarranger/config.py:216 pdfarranger/pageutils.py:219 #: pdfarranger/pdfarranger.py:961 pdfarranger/pdfarranger.py:970 #: pdfarranger/pdfarranger.py:1094 pdfarranger/pdfarranger.py:1144 msgid "_Cancel" msgstr "A_nnuler" #: pdfarranger/pdfarranger.py:980 data/menu.ui:246 msgid "_Close" msgstr "_Fermer" #: data/menu.ui:132 data/menu.ui:268 msgid "_Copy" msgstr "_Copier" #: data/menu.ui:108 data/menu.ui:260 msgid "_Delete" msgstr "_Supprimer" #: data/menu.ui:174 data/menu.ui:317 msgid "_Deselect All" msgstr "Tout _désélectionner" #: data/menu.ui:87 msgid "_Edit" msgstr "É_dition" #: data/menu.ui:30 msgid "_Import" msgstr "_Importer" #: data/menu.ui:199 data/menu.ui:342 msgid "_Invert Selection" msgstr "_Inverser la sélection" #: data/menu.ui:124 data/menu.ui:381 msgid "_Merge Pages…" msgstr "_Fusionner les pages…" #: data/menu.ui:36 msgid "_New Window" msgstr "_Nouvelle fenêtre" #: pdfarranger/config.py:217 pdfarranger/pageutils.py:220 msgid "_OK" msgstr "_OK" #: pdfarranger/pdfarranger.py:1143 data/menu.ui:24 msgid "_Open" msgstr "_Ouvrir" #: data/menu.ui:100 data/menu.ui:361 msgid "_Page Format…" msgstr "Format de _page…" #: data/menu.ui:71 msgid "_Print…" msgstr "_Imprimer…" #: pdfarranger/pdfarranger.py:1017 data/menu.ui:252 msgid "_Quit" msgstr "_Quitter" #: data/menu.ui:82 msgid "_Redo" msgstr "_Rétablir" #: data/menu.ui:95 data/menu.ui:356 msgid "_Rotate Right" msgstr "Rotation vers la _droite" #: pdfarranger/pdfarranger.py:970 pdfarranger/pdfarranger.py:1093 #: data/menu.ui:42 msgid "_Save" msgstr "_Enregistrer" #: data/menu.ui:166 data/menu.ui:309 msgid "_Select" msgstr "_Sélectionner" #: data/menu.ui:120 data/menu.ui:377 msgid "_Split Pages…" msgstr "_Séparer les pages…" #: data/menu.ui:78 msgid "_Undo" msgstr "Ann_uler" #: data/menu.ui:206 msgid "_View" msgstr "_Vue" #: pdfarranger/pageutils.py:139 pdfarranger/pageutils.py:362 #: pdfarranger/pageutils.py:412 msgid "mm" msgstr "mm" #: pdfarranger/core.py:89 msgid "page" msgstr "page" #: pdfarranger/pdfarranger.py:811 msgid "untitled" msgstr "sans titre" pdfarranger-1.10.1/po/genpot.sh000077500000000000000000000017531451252235000163430ustar00rootroot00000000000000#!/bin/sh # # pdfarranger - GTK+ based utility for splitting, rearrangement and # modification of PDF documents. # Copyright (C) 2008-2017 Konstantinos Poulios # # pdfarranger 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, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # # Make translation files cd "$(dirname "$0")/.." xgettext -s --from-code=utf-8 --output=po/pdfarranger.pot pdfarranger/*.py data/*.ui pdfarranger-1.10.1/po/he.po000066400000000000000000000445531451252235000154510ustar00rootroot00000000000000# PDF Arranger. # Copyright (C) 2023 PDF Arranger Contributors # This file is distributed under the same license as the PDF Arranger package. # Yaron Shahrabani , 2023. # msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-04-29 22:45+0200\n" "PO-Revision-Date: 2023-06-12 11:22+0300\n" "Last-Translator: Yaron Shahrabani \n" "Language-Team: \n" "Language: he\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n==1 ? 0 : n==2 ? 1 : n>10 && n%10==0 ? " "2 : 3);\n" "X-Generator: Poedit 3.3.1\n" #: pdfarranger/splitter.py:87 msgid "#Col" msgstr "מס׳ עמודות" #: pdfarranger/splitter.py:87 msgid "#Row" msgstr "מס׳ שורות" #: pdfarranger/pageutils.py:122 pdfarranger/pageutils.py:477 #: pdfarranger/pageutils.py:479 msgid "%" msgstr "%" #: pdfarranger/pageutils.py:170 #, python-format msgid "% of height" msgstr "% מהגובה" #: pdfarranger/pageutils.py:170 #, python-format msgid "% of width" msgstr "% מהרוחב" #: pdfarranger/pdfarranger.py:2548 #, python-format msgid "%s is a tool for rearranging and modifying PDF files." msgstr "%s הוא כלי לסידור מחדש ועריכה של קובצי PDF." #: pdfarranger/config.py:232 msgid "(Libhandy missing)" msgstr "(Libhandy חסרה)" #: pdfarranger/config.py:224 msgid "(Requires restart)" msgstr "(נדרשת הפעלה מחדש)" #: pdfarranger/pageutils.py:461 msgid "(same offset is applied to all pages)" msgstr "(אותו ההיסט חל על כל העמודים)" #: pdfarranger/pdfarranger.py:1130 #, python-format msgid "A file named \"%s\" already exists. Do you want to replace it?" msgstr "כבר קיים קובץ בשם „%s”. להחליף אותו?" #: data/menu.ui:189 data/menu.ui:332 msgid "All From _Same File" msgstr "הכול מאותו ה_קובץ" #: pdfarranger/pdfarranger.py:507 msgid "All files" msgstr "כל הקבצים" #: pdfarranger/pdfarranger.py:462 msgid "All pages must have the same size." msgstr "כל העמודים חייבים להיות באותו הגודל." #: pdfarranger/pdfarranger.py:495 msgid "All supported files" msgstr "כל הקבצים הנתמכים" #: pdfarranger/pageutils.py:149 msgid "Bottom" msgstr "למטה" #: pdfarranger/pageutils.py:380 msgid "Bottom to Top" msgstr "מלמטה למעלה" #: pdfarranger/core.py:386 msgid "Clipboard image" msgstr "תמונה בלוח גזירים" #: pdfarranger/pageutils.py:363 pdfarranger/splitter.py:60 msgid "Columns" msgstr "עמודות" #: pdfarranger/metadata.py:48 msgid "Created" msgstr "נוצר" #: pdfarranger/metadata.py:46 msgid "Creator" msgstr "יוצר" #: pdfarranger/metadata.py:47 msgid "Creator tool" msgstr "כלי יצירה" #: pdfarranger/pageutils.py:153 msgid "Crop Margins" msgstr "חיתוך השוליים" #: data/menu.ui:104 data/menu.ui:365 msgid "Crop White Borders" msgstr "חיתוך מסגרת לבנה" #: pdfarranger/pageutils.py:161 msgid "" "Cropping does not remove any content from the PDF file, it only hides it." msgstr "חיתוך לא מסיר תוכן מקובץ ה־PDF, הוא רק מסתיר אותו." #: data/menu.ui:128 data/menu.ui:264 msgid "Cu_t" msgstr "_גזירה" #: pdfarranger/pdfarranger.py:1250 msgid "Despite the warnings the document(s) should have no visible issues." msgstr "למרות האזהרות לא אמורות להופיע תקלות חזותיות במסמכים." #: pdfarranger/pdfarranger.py:979 msgid "Discard changes and close?" msgstr "להתעלם מהשינויים ולסגור?" #: pdfarranger/pdfarranger.py:1016 msgid "Discard changes and quit?" msgstr "להתעלם מהשינויים ולצאת?" #: pdfarranger/exporter.py:194 msgid "Do not show this dialog again." msgstr "לא להציג את החלונית הזאת שוב." #: pdfarranger/pdfarranger.py:970 msgid "Do_n’t Save" msgstr "_לא לשמור" #: pdfarranger/pdfarranger.py:1257 msgid "Don't show warnings when saving again." msgstr "לא להציג אזהרות בשמירה חוזרת." #: data/menu.ui:112 data/menu.ui:369 msgid "Dupl_icate" msgstr "_שכפול" #: data/menu.ui:52 data/menu.ui:395 msgid "E_xport" msgstr "יי_צוא" #: data/menu.ui:55 data/menu.ui:398 msgid "E_xport Selection to a Single File…" msgstr "ייצוא ה_בחירה לקובץ יחיד…" #: data/menu.ui:228 msgid "Edit _Properties" msgstr "עריכת מ_אפיינים" #: pdfarranger/metadata.py:198 msgid "Edit properties" msgstr "עריכת מאפיינים" #: pdfarranger/splitter.py:62 msgid "Equal column width" msgstr "רוחב עמודות שווה" #: pdfarranger/splitter.py:62 msgid "Equal row height" msgstr "גובה שורות שווה" #: data/menu.ui:60 data/menu.ui:403 msgid "Export Selection to _Individual Files…" msgstr "ייצוא הבחירה לקבצים _בודדים…" #: data/menu.ui:65 data/menu.ui:408 msgid "Export _All Pages to Individual Files…" msgstr "ייצוא _כל העמודים לקבצים בודדים…" #: pdfarranger/pdfarranger.py:1088 msgid "Export…" msgstr "ייצוא…" #: pdfarranger/core.py:388 pdfarranger/pdfarranger.py:1504 msgid "File is neither pdf nor image" msgstr "הקובץ אינו pdf או תמונה" #: pdfarranger/pdfarranger.py:301 msgid "File(s) to open" msgstr "קבצים לפתיחה" #: pdfarranger/config.py:237 msgid "For more options see:" msgstr "לאפשרויות נוספות ר׳:" #: pdfarranger/exporter.py:192 msgid "Forms and outlines are lost on saving." msgstr "טפסים וקווי מתאר הולכים לאיבוד בשמירה." #: data/menu.ui:221 msgid "Full_screen" msgstr "מסך _מלא" #: pdfarranger/pdfarranger.py:2562 msgid "GNU General Public License (GPL) Version 3." msgstr "הרישיון הציבורי הכללי של גנו (GPL) גרסה 3." #: data/menu.ui:160 data/menu.ui:389 msgid "Generate Booklet" msgstr "יצירת חוברת" #: pdfarranger/pageutils.py:236 pdfarranger/pageutils.py:240 #: pdfarranger/pageutils.py:328 msgid "Height" msgstr "גובה" #: pdfarranger/splitter.py:88 msgid "Height in %" msgstr "גובה ב־%" #: pdfarranger/pageutils.py:375 msgid "Horizontal" msgstr "אופקי" #: pdfarranger/splitter.py:61 msgid "Horizontal Splits" msgstr "פיצולים אופקיים" #: pdfarranger/pageutils.py:476 msgid "Horizontal offset" msgstr "היסט אופקי" #: pdfarranger/core.py:377 msgid "Image files are only supported with img2pdf" msgstr "קובצי התמונה נתמכים רק עם img2pdf" #: pdfarranger/core.py:383 msgid "Image format is not supported by img2pdf" msgstr "סוג התמונה לא נתמך על ידי img2pdf" #: data/pdfarranger.ui:58 msgid "Import" msgstr "ייבוא" #: pdfarranger/pdfarranger.py:1327 msgid "Import…" msgstr "ייבוא…" #: data/menu.ui:156 data/menu.ui:385 msgid "Insert Blan_k Page…" msgstr "הוספת עמוד _ריק…" #: pdfarranger/pageutils.py:325 msgid "Insert Blank Page" msgstr "הוספת עמוד ריק" #: pdfarranger/metadata.py:169 msgid "Invalid date format. Input discarded." msgstr "תבנית התאריך שגויה. הקלט לא התקבל." #: pdfarranger/pdfarranger.py:2551 #, python-format msgid "It uses libqpdf %s, pikepdf %s, GTK %s and Python %s." msgstr "הוא משתמש ב־libqpdf‏ %s, ב־pikepdf‏ %s, ב־GTK‏ %s וב־Python‏ %s." #: pdfarranger/metadata.py:44 msgid "Keywords" msgstr "מילות חיפוש" #: pdfarranger/config.py:222 msgid "Language" msgstr "שפה" #: pdfarranger/pageutils.py:460 msgid "Layout for the first page in selection" msgstr "פריסה עבור העמוד הראשון בבחירה" #: pdfarranger/pageutils.py:149 msgid "Left" msgstr "שמאל" #: pdfarranger/pageutils.py:377 msgid "Left to Right" msgstr "משמאל לימין" #: data/pdfarranger.ui:122 msgid "Main Menu" msgstr "תפריט ראשי" #: pdfarranger/pdfarranger.py:2557 msgid "Maintainers and contributors" msgstr "מתחזקים ומתנדבים" #: pdfarranger/pageutils.py:361 msgid "Margin" msgstr "שול" #: pdfarranger/pageutils.py:347 msgid "Merge Pages" msgstr "מיזוג עמודים" #: pdfarranger/pageutils.py:412 msgid "Merged page size:" msgstr "גודל העמוד הממוזג:" #: pdfarranger/metadata.py:49 msgid "Modified" msgstr "נערך" #: pdfarranger/pageutils.py:392 msgid "Non-uniform page size - using max size" msgstr "גודל עמודים לא אחיד - נעשה שימוש בגודל המרבי" #: data/pdfarranger.ui:37 msgid "Open" msgstr "פתיחה" #: pdfarranger/pdfarranger.py:1186 msgid "Open…" msgstr "פתיחה…" #: pdfarranger/pageutils.py:436 msgid "Overlay" msgstr "שכבת על" #: pdfarranger/pdfarranger.py:282 msgid "" "PDF Arranger is a small python-gtk application, which helps the user to " "merge or split pdf documents and rotate, crop and rearrange their pages " "using an interactive and intuitive graphical interface. It is a frontend for " "pikepdf." msgstr "" "PDF Arranger הוא יישום python-gtk קטן שמסייע למשתמש למזג או לפצל קובצי PDF " "ולהטות, לחתוך או לסדר מחדש את העמודים שלהם באמצעות מנשק גרפי פשוט לשימוש. זה " "למעשה מנשק חזותי ל־pikepdf." #: pdfarranger/pdfarranger.py:1498 msgid "PDF document is damaged" msgstr "מסמך ה־PDF פגום" #: pdfarranger/pdfarranger.py:499 msgid "PDF files" msgstr "קובצי PDF" #: pdfarranger/pageutils.py:388 msgid "Page Order" msgstr "סדר עמודים" #: pdfarranger/pageutils.py:241 msgid "Page Size" msgstr "גודל העמוד" #: pdfarranger/pdfarranger.py:2585 msgid "Page Size:" msgstr "גודל עמוד:" #: pdfarranger/pageutils.py:230 msgid "Page format" msgstr "תצורת העמוד" #: pdfarranger/core.py:285 msgid "Password" msgstr "ססמה" #: pdfarranger/core.py:263 msgid "Password required" msgstr "דרושה ססמה" #: data/menu.ui:277 msgid "Past_e Special" msgstr "הדבקה _מיוחדת" #: data/menu.ui:295 msgid "Paste As O_verlay…" msgstr "הדבקה כ_שכבת על…" #: data/menu.ui:151 data/menu.ui:290 msgid "Paste As _Even Pages" msgstr "הדבקה כדפים _זוגיים" #: data/menu.ui:146 data/menu.ui:285 msgid "Paste As _Odd Pages" msgstr "הדבקה כדפים א_י־זוגיים" #: data/menu.ui:300 msgid "Paste As _Underlay…" msgstr "הדבקה כשכבת _רקע…" #: data/menu.ui:136 data/menu.ui:272 msgid "Paste _After" msgstr "הדבקה _אחרי" #: data/menu.ui:141 data/menu.ui:280 msgid "Paste _Before" msgstr "הדבקה _לפני" #: pdfarranger/pdfarranger.py:1627 msgid "Pasted data not valid. Aborting paste." msgstr "הנתונים שהודבקו שגויים. ההדבקה מבוטלת." #: pdfarranger/pdfarranger.py:1589 msgid "Pikepdf >= 3 is needed for overlay/underlay/merge support." msgstr "Pikepdf >= 3 נחוץ לטובת תמיכה בשכבת על/שכבת רקע/מיזוג." #: data/menu.ui:234 msgid "Pre_ferences" msgstr "ה_עדפות" #: pdfarranger/config.py:212 msgid "Preferences" msgstr "העדפות" #: pdfarranger/pdfarranger.py:293 msgid "Print the version of PDF Arranger and exit" msgstr "להדפיס את הגרסה של PDF Arranger ולצאת" #: pdfarranger/exporter.py:457 msgid "Printing…" msgstr "מתבצעת הדפסה…" #: pdfarranger/metadata.py:45 msgid "Producer" msgstr "מפיק" #: pdfarranger/metadata.py:212 msgid "Property" msgstr "מאפיין" #: data/menu.ui:116 data/menu.ui:373 msgid "Re_verse Order" msgstr "היפוך ה_סדר" #: pdfarranger/pageutils.py:238 msgid "Relative" msgstr "יחסי" #: pdfarranger/exporter.py:469 msgid "Rendering Preview…" msgstr "מתבצע עיבוד של התצוגה המקדימה…" #: pdfarranger/pdfarranger.py:732 msgid "Rendering…" msgstr "מתבצע עיבוד…" #: pdfarranger/pdfarranger.py:1132 msgid "Replace" msgstr "החלפה" #: pdfarranger/pageutils.py:149 msgid "Right" msgstr "ימין" #: pdfarranger/pageutils.py:378 msgid "Right to Left" msgstr "מימין לשמאל" #: data/pdfarranger.ui:203 msgid "Rotate Left" msgstr "הטיה שמאלה" #: data/pdfarranger.ui:227 msgid "Rotate Right" msgstr "הטיה ימינה" #: data/menu.ui:90 data/menu.ui:351 msgid "Rotate _Left" msgstr "הטיה _שמאלה" #: pdfarranger/pageutils.py:364 pdfarranger/splitter.py:60 msgid "Rows" msgstr "שורות" #: data/menu.ui:194 data/menu.ui:337 msgid "Same Page _Format" msgstr "הת_צורה של אותו העמוד" #: data/pdfarranger.ui:78 msgid "Save" msgstr "שמירה" #: data/pdfarranger.ui:97 msgid "Save As" msgstr "שמירה בשם" #: pdfarranger/pdfarranger.py:1088 msgid "Save As…" msgstr "שמירה בשם…" #: data/menu.ui:47 msgid "Save _As…" msgstr "_שמירה בשם…" #: pdfarranger/pdfarranger.py:988 msgid "Save changes before closing?" msgstr "לשמור את השינויים לפני הסגירה?" #: pdfarranger/pdfarranger.py:1025 msgid "Save changes before quitting?" msgstr "לשמור את השינויים לפני היציאה?" #: pdfarranger/pdfarranger.py:985 msgid "Save changes to “{}” before closing?" msgstr "לשמור את השינויים אל „{}” לפני הסגירה?" #: pdfarranger/pdfarranger.py:1022 msgid "Save changes to “{}” before quitting?" msgstr "לשמור את השינויים אל „{}” לפני היציאה?" #: pdfarranger/pdfarranger.py:1249 msgid "Saving produced some warnings" msgstr "השמירה הובילה למספר שגיאות" #: pdfarranger/pdfarranger.py:1288 msgid "Saving…" msgstr "מתבצעת שמירה…" #: pdfarranger/pageutils.py:116 msgid "Scale factor" msgstr "מקדם קנה מידה" #: data/menu.ui:169 data/menu.ui:312 msgid "Select _All" msgstr "בחירה בה_כול" #: data/menu.ui:184 data/menu.ui:327 msgid "Select _Even Pages" msgstr "בחירה בעמודים _זוגיים" #: data/menu.ui:179 data/menu.ui:322 msgid "Select _Odd Pages" msgstr "בחירה בעמודים _אי־זוגיים" #: pdfarranger/pdfarranger.py:2580 msgid "Selected pages: " msgstr "עמודים נבחרים: " #: pdfarranger/splitter.py:26 msgid "Split Pages" msgstr "פיצול עמודים" #: pdfarranger/metadata.py:43 msgid "Subject" msgstr "נושא" #: pdfarranger/pdfarranger.py:512 msgid "Supported image files" msgstr "קובצי התמונה הנתמכים" #: pdfarranger/config.py:248 pdfarranger/config.py:256 msgid "System setting" msgstr "הגדרת המערכת" #: pdfarranger/core.py:275 msgid "" "The document “{}” is locked and requires a password before it can be opened." msgstr "המסמך „{}” נעול ודורש ססמה כדי להיפתח." #: pdfarranger/core.py:274 msgid "The password will be remembered until you close PDF Arranger." msgstr "הססמה תישמר עד לסגירת PDF Arranger." #: pdfarranger/config.py:230 msgid "Theme" msgstr "ערכת עיצוב" #: pdfarranger/metadata.py:42 msgid "Title" msgstr "כותרת" #: pdfarranger/pageutils.py:149 msgid "Top" msgstr "למעלה" #: pdfarranger/pageutils.py:379 msgid "Top to Bottom" msgstr "מלמעלה למטה" #: pdfarranger/pageutils.py:436 msgid "Underlay" msgstr "שכבת רקע" #: pdfarranger/core.py:361 pdfarranger/pdfarranger.py:1494 msgid "Unknown file format" msgstr "סוג הקובץ לא ידוע" #: pdfarranger/metadata.py:212 msgid "Value" msgstr "ערך" #: pdfarranger/pageutils.py:376 msgid "Vertical" msgstr "אנכי" #: pdfarranger/splitter.py:61 msgid "Vertical Splits" msgstr "פיצולים אנכיים" #: pdfarranger/pageutils.py:478 msgid "Vertical offset" msgstr "היסט אנכי" #: pdfarranger/exporter.py:187 msgid "Warning" msgstr "אזהרה" #: pdfarranger/pageutils.py:235 pdfarranger/pageutils.py:239 #: pdfarranger/pageutils.py:327 msgid "Width" msgstr "רוחב" #: pdfarranger/splitter.py:88 msgid "Width in %" msgstr "רוחב ב־%" #: pdfarranger/pdfarranger.py:969 msgid "Your changes will be lost if you don’t save them." msgstr "השינויים שלך יאבדו אם לא יישמרו." #: data/pdfarranger.ui:144 msgid "Zoom In" msgstr "התקרבות" #: data/pdfarranger.ui:167 msgid "Zoom Out" msgstr "התרחקות" #: data/menu.ui:217 msgid "Zoom _Fit" msgstr "התאמת תקריב" #: data/menu.ui:209 msgid "Zoom _In" msgstr "הת_קרבות" #: data/menu.ui:213 msgid "Zoom _Out" msgstr "התר_חקות" #: data/menu.ui:240 msgid "_About" msgstr "_על אודות" #: pdfarranger/config.py:216 pdfarranger/pageutils.py:219 #: pdfarranger/pdfarranger.py:961 pdfarranger/pdfarranger.py:970 #: pdfarranger/pdfarranger.py:1094 pdfarranger/pdfarranger.py:1144 msgid "_Cancel" msgstr "_ביטול" #: pdfarranger/pdfarranger.py:980 data/menu.ui:246 msgid "_Close" msgstr "ל_סגור" #: data/menu.ui:132 data/menu.ui:268 msgid "_Copy" msgstr "ה_עתקה" #: data/menu.ui:108 data/menu.ui:260 msgid "_Delete" msgstr "מ_חיקה" #: data/menu.ui:174 data/menu.ui:317 msgid "_Deselect All" msgstr "ביטול ב_חירה" #: data/menu.ui:87 msgid "_Edit" msgstr "_עריכה" #: data/menu.ui:30 msgid "_Import" msgstr "יי_בוא" #: data/menu.ui:199 data/menu.ui:342 msgid "_Invert Selection" msgstr "היפוך ה_בחירה" #: data/menu.ui:124 data/menu.ui:381 msgid "_Merge Pages…" msgstr "מי_זוג עמודים…" #: data/menu.ui:36 msgid "_New Window" msgstr "_חלון חדש" #: pdfarranger/config.py:217 pdfarranger/pageutils.py:220 msgid "_OK" msgstr "_אישור" #: pdfarranger/pdfarranger.py:1143 data/menu.ui:24 msgid "_Open" msgstr "_פתיחה" #: data/menu.ui:100 data/menu.ui:361 msgid "_Page Format…" msgstr "ת_צורת עמוד…" #: data/menu.ui:71 msgid "_Print…" msgstr "ה_דפסה…" #: pdfarranger/pdfarranger.py:1017 data/menu.ui:252 msgid "_Quit" msgstr "י_ציאה" #: data/menu.ui:82 msgid "_Redo" msgstr "ביצוע מ_חדש" #: data/menu.ui:95 data/menu.ui:356 msgid "_Rotate Right" msgstr "הטיה י_מינה" #: pdfarranger/pdfarranger.py:970 pdfarranger/pdfarranger.py:1093 #: data/menu.ui:42 msgid "_Save" msgstr "_שמירה" #: data/menu.ui:166 data/menu.ui:309 msgid "_Select" msgstr "_בחירה" #: data/menu.ui:120 data/menu.ui:377 msgid "_Split Pages…" msgstr "_פיצול עמודים…" #: data/menu.ui:78 msgid "_Undo" msgstr "_ביטול" #: data/menu.ui:206 msgid "_View" msgstr "ת_צוגה" #: pdfarranger/pageutils.py:139 pdfarranger/pageutils.py:362 #: pdfarranger/pageutils.py:412 msgid "mm" msgstr "מילימטר" #: pdfarranger/core.py:89 msgid "page" msgstr "עמוד" #: pdfarranger/pdfarranger.py:811 msgid "untitled" msgstr "ללא כותרת" pdfarranger-1.10.1/po/hr.po000066400000000000000000000424611451252235000154620ustar00rootroot00000000000000# Croatian translation for pdfarranger. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the pdfarranger package. # Milo Ivir , 2020., 2021. # msgid "" msgstr "" "Project-Id-Version: pdfarranger\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-04-29 22:45+0200\n" "PO-Revision-Date: 2023-06-06 13:27+0200\n" "Last-Translator: Milo Ivir \n" "Language-Team: \n" "Language: hr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 3.0\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<12 || n%100>14) ? 1 : 2);\n" #: pdfarranger/splitter.py:87 msgid "#Col" msgstr "Broj stupaca" #: pdfarranger/splitter.py:87 msgid "#Row" msgstr "Broj redaka" #: pdfarranger/pageutils.py:122 pdfarranger/pageutils.py:477 #: pdfarranger/pageutils.py:479 msgid "%" msgstr "%" #: pdfarranger/pageutils.py:170 #, python-format msgid "% of height" msgstr "% visine" #: pdfarranger/pageutils.py:170 #, python-format msgid "% of width" msgstr "% širine" #: pdfarranger/pdfarranger.py:2548 #, python-format msgid "%s is a tool for rearranging and modifying PDF files." msgstr "%s je alat za preraspoređivanje i mijenjenje PDF datoteka." #: pdfarranger/config.py:232 msgid "(Libhandy missing)" msgstr "(nedostaje Libhandy)" #: pdfarranger/config.py:224 msgid "(Requires restart)" msgstr "(Zahtijeva ponovno pokretanje)" #: pdfarranger/pageutils.py:461 msgid "(same offset is applied to all pages)" msgstr "(isti odmak se primjenjuje na sve stranice)" #: pdfarranger/pdfarranger.py:1130 #, python-format msgid "A file named \"%s\" already exists. Do you want to replace it?" msgstr "Datoteka s imenom „%s” već postoji. Želiš li je zamijeniti?" #: data/menu.ui:189 data/menu.ui:332 msgid "All From _Same File" msgstr "_Sve iz iste datoteke" #: pdfarranger/pdfarranger.py:507 msgid "All files" msgstr "Sve datoteke" #: pdfarranger/pdfarranger.py:462 msgid "All pages must have the same size." msgstr "Sve stranice moraju biti iste veličine." #: pdfarranger/pdfarranger.py:495 msgid "All supported files" msgstr "Sve podržane datoteke" #: pdfarranger/pageutils.py:149 msgid "Bottom" msgstr "Dolje" #: pdfarranger/pageutils.py:380 msgid "Bottom to Top" msgstr "Odozdo prema gore" #: pdfarranger/core.py:386 msgid "Clipboard image" msgstr "Slika međuspremnika" #: pdfarranger/pageutils.py:363 pdfarranger/splitter.py:60 msgid "Columns" msgstr "Stupci" #: pdfarranger/metadata.py:48 msgid "Created" msgstr "Stvoreno" #: pdfarranger/metadata.py:46 msgid "Creator" msgstr "Izvorni program dokumenta" #: pdfarranger/metadata.py:47 msgid "Creator tool" msgstr "Alat izvornog programa" #: pdfarranger/pageutils.py:153 msgid "Crop Margins" msgstr "Odreži margine" #: data/menu.ui:104 data/menu.ui:365 msgid "Crop White Borders" msgstr "Odreži bijele rubove" #: pdfarranger/pageutils.py:161 msgid "" "Cropping does not remove any content from the PDF file, it only hides it." msgstr "Odrezivanjem se sadržaj PDF datoteke ne uklanja, već se samo skriva." #: data/menu.ui:128 data/menu.ui:264 msgid "Cu_t" msgstr "_Izreži" #: pdfarranger/pdfarranger.py:1250 msgid "Despite the warnings the document(s) should have no visible issues." msgstr "Unatoč upozorenja dokumenti ne bi trebali imati vidljivih problema." #: pdfarranger/pdfarranger.py:979 msgid "Discard changes and close?" msgstr "Odbaciti promjene i zatvoriti?" #: pdfarranger/pdfarranger.py:1016 msgid "Discard changes and quit?" msgstr "Odbaciti promjene i zatvoriti program?" #: pdfarranger/exporter.py:194 msgid "Do not show this dialog again." msgstr "Ovaj dijalog više nemoj prikazivati." #: pdfarranger/pdfarranger.py:970 msgid "Do_n’t Save" msgstr "_Nemoj spremiti" #: pdfarranger/pdfarranger.py:1257 msgid "Don't show warnings when saving again." msgstr "Upozorenja više nemoj prikazivati prilikom spremanja." #: data/menu.ui:112 data/menu.ui:369 msgid "Dupl_icate" msgstr "Dupli_ciraj" #: data/menu.ui:52 data/menu.ui:395 msgid "E_xport" msgstr "_Izvezi" #: data/menu.ui:55 data/menu.ui:398 msgid "E_xport Selection to a Single File…" msgstr "_Izvezi odabir u jednu datoteku …" #: data/menu.ui:228 msgid "Edit _Properties" msgstr "Uredi _svojstva" #: pdfarranger/metadata.py:198 msgid "Edit properties" msgstr "Uredi svojstva" #: pdfarranger/splitter.py:62 msgid "Equal column width" msgstr "Stupci jednake širine" #: pdfarranger/splitter.py:62 msgid "Equal row height" msgstr "Redci jednake visine" #: data/menu.ui:60 data/menu.ui:403 msgid "Export Selection to _Individual Files…" msgstr "Izvezi odabir u _pojedinačne datoteke …" #: data/menu.ui:65 data/menu.ui:408 msgid "Export _All Pages to Individual Files…" msgstr "Izvezi _sve stranice u pojedinačne datoteke …" #: pdfarranger/pdfarranger.py:1088 msgid "Export…" msgstr "Izvezi …" #: pdfarranger/core.py:388 pdfarranger/pdfarranger.py:1504 msgid "File is neither pdf nor image" msgstr "Datoteka nije PDF niti slika" #: pdfarranger/pdfarranger.py:301 msgid "File(s) to open" msgstr "Datoteke za otvaranje" #: pdfarranger/config.py:237 msgid "For more options see:" msgstr "Pogledaj daljnje opcije:" #: pdfarranger/exporter.py:192 msgid "Forms and outlines are lost on saving." msgstr "Obrasci i struktura se gube pri spremanju." #: data/menu.ui:221 msgid "Full_screen" msgstr "Cjeloekran_ski prikaz" #: pdfarranger/pdfarranger.py:2562 msgid "GNU General Public License (GPL) Version 3." msgstr "GNU opća javna licenca, verzija 3." #: data/menu.ui:160 data/menu.ui:389 msgid "Generate Booklet" msgstr "Generiraj knjižicu" #: pdfarranger/pageutils.py:236 pdfarranger/pageutils.py:240 #: pdfarranger/pageutils.py:328 msgid "Height" msgstr "Visina" #: pdfarranger/splitter.py:88 msgid "Height in %" msgstr "Visina u %" #: pdfarranger/pageutils.py:375 msgid "Horizontal" msgstr "Vodoravno" #: pdfarranger/splitter.py:61 msgid "Horizontal Splits" msgstr "Vodoravna podjela" #: pdfarranger/pageutils.py:476 msgid "Horizontal offset" msgstr "Vodoravni odmak" #: pdfarranger/core.py:377 msgid "Image files are only supported with img2pdf" msgstr "Slikovne datoteke su podržane samo s img2pdf" #: pdfarranger/core.py:383 msgid "Image format is not supported by img2pdf" msgstr "img2pdf ne podržava format slike" #: data/pdfarranger.ui:58 msgid "Import" msgstr "Uvezi" #: pdfarranger/pdfarranger.py:1327 msgid "Import…" msgstr "Uvezi …" #: data/menu.ui:156 data/menu.ui:385 msgid "Insert Blan_k Page…" msgstr "Umetni pra_znu stranicu…" #: pdfarranger/pageutils.py:325 msgid "Insert Blank Page" msgstr "Umetni praznu stranicu" #: pdfarranger/metadata.py:169 msgid "Invalid date format. Input discarded." msgstr "Neispravan format datuma. Unos se zanemaruje." #: pdfarranger/pdfarranger.py:2551 #, python-format msgid "It uses libqpdf %s, pikepdf %s, GTK %s and Python %s." msgstr "Program koristi libqpdf %s, pikepdf %s, GTK %s i Python %s." #: pdfarranger/metadata.py:44 msgid "Keywords" msgstr "Ključne riječi" #: pdfarranger/config.py:222 msgid "Language" msgstr "Jezik" #: pdfarranger/pageutils.py:460 msgid "Layout for the first page in selection" msgstr "Rapored stranice za prvu stranicu u odabiru" #: pdfarranger/pageutils.py:149 msgid "Left" msgstr "Lijevo" #: pdfarranger/pageutils.py:377 msgid "Left to Right" msgstr "S lijeva na desno" #: data/pdfarranger.ui:122 msgid "Main Menu" msgstr "Glavni izbornik" #: pdfarranger/pdfarranger.py:2557 msgid "Maintainers and contributors" msgstr "Održavatelji i doprinositelji" #: pdfarranger/pageutils.py:361 msgid "Margin" msgstr "Margina" #: pdfarranger/pageutils.py:347 msgid "Merge Pages" msgstr "Sjedini stranice" #: pdfarranger/pageutils.py:412 msgid "Merged page size:" msgstr "Veličina sjedinjenih stranica:" #: pdfarranger/metadata.py:49 msgid "Modified" msgstr "Promijenjeno" #: pdfarranger/pageutils.py:392 msgid "Non-uniform page size - using max size" msgstr "Nejednolika veličina stranica – koristi se maksimaln veličina" #: data/pdfarranger.ui:37 msgid "Open" msgstr "Otvori" #: pdfarranger/pdfarranger.py:1186 msgid "Open…" msgstr "Otvori …" #: pdfarranger/pageutils.py:436 msgid "Overlay" msgstr "Prednji sloj" #: pdfarranger/pdfarranger.py:282 msgid "" "PDF Arranger is a small python-gtk application, which helps the user to " "merge or split pdf documents and rotate, crop and rearrange their pages " "using an interactive and intuitive graphical interface. It is a frontend for " "pikepdf." msgstr "" "PDF Arranger je mali python-gtk program koji pomaže korisniku sjediniti ili " "rastaviti pdf dokumente te okretati, izrezati i preurediti stranice " "koristeći interaktivno i intuitivno grafičko sučelje. Radi se o sučelju za " "pikepdf." #: pdfarranger/pdfarranger.py:1498 msgid "PDF document is damaged" msgstr "PDF dokument je oštećen" #: pdfarranger/pdfarranger.py:499 msgid "PDF files" msgstr "PDF datoteke" #: pdfarranger/pageutils.py:388 msgid "Page Order" msgstr "Redoslijed stranica" #: pdfarranger/pageutils.py:241 msgid "Page Size" msgstr "Veličina stranice" #: pdfarranger/pdfarranger.py:2585 msgid "Page Size:" msgstr "Veličina stranice:" #: pdfarranger/pageutils.py:230 msgid "Page format" msgstr "Format stranice" #: pdfarranger/core.py:285 msgid "Password" msgstr "Lozinka" #: pdfarranger/core.py:263 msgid "Password required" msgstr "Zahtijeva lozinku" #: data/menu.ui:277 msgid "Past_e Special" msgstr "Um_etni" #: data/menu.ui:295 msgid "Paste As O_verlay…" msgstr "Umetni kao p_rednji sloj …" #: data/menu.ui:151 data/menu.ui:290 msgid "Paste As _Even Pages" msgstr "Umetni kao _parne stranice" #: data/menu.ui:146 data/menu.ui:285 msgid "Paste As _Odd Pages" msgstr "Umetni kao _neparne stranice" #: data/menu.ui:300 msgid "Paste As _Underlay…" msgstr "Umetni kao s_tražnji sloj …" #: data/menu.ui:136 data/menu.ui:272 msgid "Paste _After" msgstr "Umetni i_za" #: data/menu.ui:141 data/menu.ui:280 msgid "Paste _Before" msgstr "Umetni i_spred" #: pdfarranger/pdfarranger.py:1627 msgid "Pasted data not valid. Aborting paste." msgstr "Umetnuti podaci nisu ispravni. Umetanje se prekida." #: pdfarranger/pdfarranger.py:1589 msgid "Pikepdf >= 3 is needed for overlay/underlay/merge support." msgstr "" "Za korištenje prednjeg sloja/stražnjeg sloja/sjedinjavanje potrebna je " "Pikepdf verzija 3 ili novija." #: data/menu.ui:234 msgid "Pre_ferences" msgstr "Posta_vke" #: pdfarranger/config.py:212 msgid "Preferences" msgstr "Postavke" #: pdfarranger/pdfarranger.py:293 msgid "Print the version of PDF Arranger and exit" msgstr "Ispiši PDF Arranger verziju i zatvori program" #: pdfarranger/exporter.py:457 msgid "Printing…" msgstr "Ispis …" #: pdfarranger/metadata.py:45 msgid "Producer" msgstr "PDF stvoren pomoću" #: pdfarranger/metadata.py:212 msgid "Property" msgstr "Svojstvo" #: data/menu.ui:116 data/menu.ui:373 msgid "Re_verse Order" msgstr "Preo_kreni redoslijed" #: pdfarranger/pageutils.py:238 msgid "Relative" msgstr "Relativno" #: pdfarranger/exporter.py:469 msgid "Rendering Preview…" msgstr "Iscrtavanje pregleda …" #: pdfarranger/pdfarranger.py:732 msgid "Rendering…" msgstr "Iscrtavanje …" #: pdfarranger/pdfarranger.py:1132 msgid "Replace" msgstr "Zamijeni" #: pdfarranger/pageutils.py:149 msgid "Right" msgstr "Desno" #: pdfarranger/pageutils.py:378 msgid "Right to Left" msgstr "S desna na lijevo" #: data/pdfarranger.ui:203 msgid "Rotate Left" msgstr "Okreni lijevo" #: data/pdfarranger.ui:227 msgid "Rotate Right" msgstr "Okreni desno" #: data/menu.ui:90 data/menu.ui:351 msgid "Rotate _Left" msgstr "Okreni _lijevo" #: pdfarranger/pageutils.py:364 pdfarranger/splitter.py:60 msgid "Rows" msgstr "Redci" #: data/menu.ui:194 data/menu.ui:337 msgid "Same Page _Format" msgstr "Isti _format stranice" #: data/pdfarranger.ui:78 msgid "Save" msgstr "Spremi" #: data/pdfarranger.ui:97 msgid "Save As" msgstr "Spremi kao" #: pdfarranger/pdfarranger.py:1088 msgid "Save As…" msgstr "Spremi kao …" #: data/menu.ui:47 msgid "Save _As…" msgstr "Spremi k_ao …" #: pdfarranger/pdfarranger.py:988 msgid "Save changes before closing?" msgstr "Spremiti promjene prije zatvaranja?" #: pdfarranger/pdfarranger.py:1025 msgid "Save changes before quitting?" msgstr "Spremiti promjene prije zatvaranja programa?" #: pdfarranger/pdfarranger.py:985 msgid "Save changes to “{}” before closing?" msgstr "Spremiti promjene u „{}” prije zatvaranja?" #: pdfarranger/pdfarranger.py:1022 msgid "Save changes to “{}” before quitting?" msgstr "Spremiti promjene u „{}” prije zatvaranja programa?" #: pdfarranger/pdfarranger.py:1249 msgid "Saving produced some warnings" msgstr "Spremanje je proizvelo neka upozorenja" #: pdfarranger/pdfarranger.py:1288 msgid "Saving…" msgstr "Spremanje …" #: pdfarranger/pageutils.py:116 msgid "Scale factor" msgstr "Uvećanje" #: data/menu.ui:169 data/menu.ui:312 msgid "Select _All" msgstr "Odaberi _sve" #: data/menu.ui:184 data/menu.ui:327 msgid "Select _Even Pages" msgstr "Odaberi _parne stranice" #: data/menu.ui:179 data/menu.ui:322 msgid "Select _Odd Pages" msgstr "Odaberi _neparne stranice" #: pdfarranger/pdfarranger.py:2580 msgid "Selected pages: " msgstr "Odabrane stranice: " #: pdfarranger/splitter.py:26 msgid "Split Pages" msgstr "Rastavi stranice" #: pdfarranger/metadata.py:43 msgid "Subject" msgstr "Predmet" #: pdfarranger/pdfarranger.py:512 msgid "Supported image files" msgstr "Podržane slikovne datoteke" #: pdfarranger/config.py:248 pdfarranger/config.py:256 msgid "System setting" msgstr "Postavke sustava" #: pdfarranger/core.py:275 msgid "" "The document “{}” is locked and requires a password before it can be opened." msgstr "" "Dokument „{}” je zaključan. Za otvaranje dokumenta mora se upisati lozinka." #: pdfarranger/core.py:274 msgid "The password will be remembered until you close PDF Arranger." msgstr "Lozinka će se zapamtiti, sve dok se ne zatvori PDF uređivač." #: pdfarranger/config.py:230 msgid "Theme" msgstr "Tema" #: pdfarranger/metadata.py:42 msgid "Title" msgstr "Naslov" #: pdfarranger/pageutils.py:149 msgid "Top" msgstr "Gore" #: pdfarranger/pageutils.py:379 msgid "Top to Bottom" msgstr "Odozgo prema dolje" #: pdfarranger/pageutils.py:436 msgid "Underlay" msgstr "Stražnji sloj" #: pdfarranger/core.py:361 pdfarranger/pdfarranger.py:1494 msgid "Unknown file format" msgstr "Nepoznat datotečni format" #: pdfarranger/metadata.py:212 msgid "Value" msgstr "Vrijednost" #: pdfarranger/pageutils.py:376 msgid "Vertical" msgstr "Okomito" #: pdfarranger/splitter.py:61 msgid "Vertical Splits" msgstr "Okomita podjela" #: pdfarranger/pageutils.py:478 msgid "Vertical offset" msgstr "Okomiti odmak" #: pdfarranger/exporter.py:187 msgid "Warning" msgstr "Upozorenje" #: pdfarranger/pageutils.py:235 pdfarranger/pageutils.py:239 #: pdfarranger/pageutils.py:327 msgid "Width" msgstr "Širina" #: pdfarranger/splitter.py:88 msgid "Width in %" msgstr "Širina u %" #: pdfarranger/pdfarranger.py:969 msgid "Your changes will be lost if you don’t save them." msgstr "Ako promjene ne spremiš, izgubit ćeš ih." #: data/pdfarranger.ui:144 msgid "Zoom In" msgstr "Uvećaj prikaz" #: data/pdfarranger.ui:167 msgid "Zoom Out" msgstr "Umanji prikaz" #: data/menu.ui:217 msgid "Zoom _Fit" msgstr "P_rilagodi prikaz veličini prozora" #: data/menu.ui:209 msgid "Zoom _In" msgstr "U_većaj prikaz" #: data/menu.ui:213 msgid "Zoom _Out" msgstr "U_manji prikaz" #: data/menu.ui:240 msgid "_About" msgstr "_Informacije" #: pdfarranger/config.py:216 pdfarranger/pageutils.py:219 #: pdfarranger/pdfarranger.py:961 pdfarranger/pdfarranger.py:970 #: pdfarranger/pdfarranger.py:1094 pdfarranger/pdfarranger.py:1144 msgid "_Cancel" msgstr "O_dustani" #: pdfarranger/pdfarranger.py:980 data/menu.ui:246 msgid "_Close" msgstr "_Zatvori" #: data/menu.ui:132 data/menu.ui:268 msgid "_Copy" msgstr "_Kopiraj" #: data/menu.ui:108 data/menu.ui:260 msgid "_Delete" msgstr "Iz_briši" #: data/menu.ui:174 data/menu.ui:317 msgid "_Deselect All" msgstr "O_dznači sve" #: data/menu.ui:87 msgid "_Edit" msgstr "Ur_edi" #: data/menu.ui:30 msgid "_Import" msgstr "_Uvezi" #: data/menu.ui:199 data/menu.ui:342 msgid "_Invert Selection" msgstr "Pr_eokreni odabir" #: data/menu.ui:124 data/menu.ui:381 msgid "_Merge Pages…" msgstr "_Sjedini stranice …" #: data/menu.ui:36 msgid "_New Window" msgstr "_Novi prozor" #: pdfarranger/config.py:217 pdfarranger/pageutils.py:220 msgid "_OK" msgstr "U _redu" #: pdfarranger/pdfarranger.py:1143 data/menu.ui:24 msgid "_Open" msgstr "_Otvori" #: data/menu.ui:100 data/menu.ui:361 msgid "_Page Format…" msgstr "_Format stranice …" #: data/menu.ui:71 msgid "_Print…" msgstr "_Ispis …" #: pdfarranger/pdfarranger.py:1017 data/menu.ui:252 msgid "_Quit" msgstr "_Zatvori program" #: data/menu.ui:82 msgid "_Redo" msgstr "_Ponovi" #: data/menu.ui:95 data/menu.ui:356 msgid "_Rotate Right" msgstr "Okreni _desno" #: pdfarranger/pdfarranger.py:970 pdfarranger/pdfarranger.py:1093 #: data/menu.ui:42 msgid "_Save" msgstr "_Spremi" #: data/menu.ui:166 data/menu.ui:309 msgid "_Select" msgstr "_Odaberi" #: data/menu.ui:120 data/menu.ui:377 msgid "_Split Pages…" msgstr "_Rastavi stranice …" #: data/menu.ui:78 msgid "_Undo" msgstr "Po_ništi" #: data/menu.ui:206 msgid "_View" msgstr "Pri_kaz" #: pdfarranger/pageutils.py:139 pdfarranger/pageutils.py:362 #: pdfarranger/pageutils.py:412 msgid "mm" msgstr "mm" #: pdfarranger/core.py:89 msgid "page" msgstr "stranica" #: pdfarranger/pdfarranger.py:811 msgid "untitled" msgstr "bez naslova" pdfarranger-1.10.1/po/hu.po000066400000000000000000000433771451252235000154740ustar00rootroot00000000000000# This file is part of PDF Arranger which is released under the GNU General # Public License version 3 or later. # See file COPYING or go to for full license details. # Translators: # Péter Bojtos , 2011 msgid "" msgstr "" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-04-29 22:45+0200\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: Hungarian\n" "X-Poedit-Country: HUNGARY\n" "X-Poedit-SourceCharset: utf-8\n" #: pdfarranger/splitter.py:87 msgid "#Col" msgstr "Oszlop száma" #: pdfarranger/splitter.py:87 msgid "#Row" msgstr "Sor száma" #: pdfarranger/pageutils.py:122 pdfarranger/pageutils.py:477 #: pdfarranger/pageutils.py:479 msgid "%" msgstr "%" #: pdfarranger/pageutils.py:170 #, python-format msgid "% of height" msgstr "A magasság százaléka" #: pdfarranger/pageutils.py:170 #, python-format msgid "% of width" msgstr "A szélesség százaléka" #: pdfarranger/pdfarranger.py:2548 #, python-format msgid "%s is a tool for rearranging and modifying PDF files." msgstr "" "A(z) %s egy olyan eszköz, mellyel átrendezhetők és módosíthatóak a PDF-" "fájlok." #: pdfarranger/config.py:232 msgid "(Libhandy missing)" msgstr "(libhandy-könyvtár hiányzik)" #: pdfarranger/config.py:224 msgid "(Requires restart)" msgstr "(Újraindítás szükséges)" #: pdfarranger/pageutils.py:461 msgid "(same offset is applied to all pages)" msgstr "(azonos eltolás minden oldalra vonatkozik)" #: pdfarranger/pdfarranger.py:1130 #, python-format msgid "A file named \"%s\" already exists. Do you want to replace it?" msgstr "A(z) „%s” nevű fájl már létezik. Szeretné felülírni?" #: data/menu.ui:189 data/menu.ui:332 msgid "All From _Same File" msgstr "Mindegyik _ugyanabból a fájlból" #: pdfarranger/pdfarranger.py:507 msgid "All files" msgstr "Minden fájl" #: pdfarranger/pdfarranger.py:462 msgid "All pages must have the same size." msgstr "Minden oldalnak azonos méretűnek kell lennie." #: pdfarranger/pdfarranger.py:495 msgid "All supported files" msgstr "Minden támogatott fájl" #: pdfarranger/pageutils.py:149 msgid "Bottom" msgstr "Alulról" #: pdfarranger/pageutils.py:380 msgid "Bottom to Top" msgstr "Alulról felfelé" #: pdfarranger/core.py:386 msgid "Clipboard image" msgstr "Vágólap képe" #: pdfarranger/pageutils.py:363 pdfarranger/splitter.py:60 msgid "Columns" msgstr "Oszlopok" #: pdfarranger/metadata.py:48 msgid "Created" msgstr "Készült" #: pdfarranger/metadata.py:46 msgid "Creator" msgstr "Készítő" #: pdfarranger/metadata.py:47 msgid "Creator tool" msgstr "Készítő eszköz" #: pdfarranger/pageutils.py:153 msgid "Crop Margins" msgstr "Margók körülvágása" #: data/menu.ui:104 data/menu.ui:365 msgid "Crop White Borders" msgstr "Fehér szegélyek körülvágása" #: pdfarranger/pageutils.py:161 msgid "" "Cropping does not remove any content from the PDF file, it only hides it." msgstr "A körülvágás nem távolít el tartalmat a PDF-fájlból, csak elrejti." #: data/menu.ui:128 data/menu.ui:264 msgid "Cu_t" msgstr "_Kivágás" #: pdfarranger/pdfarranger.py:1250 msgid "Despite the warnings the document(s) should have no visible issues." msgstr "" "A figyelmeztetések ellenére a dokumentum(ok)on nem lehetnek látható hibák." #: pdfarranger/pdfarranger.py:979 msgid "Discard changes and close?" msgstr "Módosítások elvetése és bezárás?" #: pdfarranger/pdfarranger.py:1016 msgid "Discard changes and quit?" msgstr "Módosítások elvetése és kilépés?" #: pdfarranger/exporter.py:194 msgid "Do not show this dialog again." msgstr "Ne jelenjen meg újra ez a párbeszédpanel." #: pdfarranger/pdfarranger.py:970 msgid "Do_n’t Save" msgstr "_Nincs mentés" #: pdfarranger/pdfarranger.py:1257 msgid "Don't show warnings when saving again." msgstr "Ne jelenjen meg többé ez az üzenet mentéskor." #: data/menu.ui:112 data/menu.ui:369 msgid "Dupl_icate" msgstr "Megkettő_zés" #: data/menu.ui:52 data/menu.ui:395 msgid "E_xport" msgstr "Exportálás…" #: data/menu.ui:55 data/menu.ui:398 msgid "E_xport Selection to a Single File…" msgstr "Kijelölés e_xportálása egyetlen fájlként…" #: data/menu.ui:228 msgid "Edit _Properties" msgstr "_Tulajdonságok szerkesztése" #: pdfarranger/metadata.py:198 msgid "Edit properties" msgstr "Tulajdonságok szerkesztése" #: pdfarranger/splitter.py:62 msgid "Equal column width" msgstr "Azonos hasábszélesség" #: pdfarranger/splitter.py:62 msgid "Equal row height" msgstr "Azonos sormagasság" #: data/menu.ui:60 data/menu.ui:403 msgid "Export Selection to _Individual Files…" msgstr "Kijelölés exportálása _külön fájlokként…" #: data/menu.ui:65 data/menu.ui:408 msgid "Export _All Pages to Individual Files…" msgstr "Összes _oldal exportálása külön fájlokként" #: pdfarranger/pdfarranger.py:1088 msgid "Export…" msgstr "Exportálás…" #: pdfarranger/core.py:388 pdfarranger/pdfarranger.py:1504 msgid "File is neither pdf nor image" msgstr "A fájl nem pdf vagy kép" #: pdfarranger/pdfarranger.py:301 msgid "File(s) to open" msgstr "Megnyitandó fájl(ok)" #: pdfarranger/config.py:237 msgid "For more options see:" msgstr "További beállításokért lásd:" #: pdfarranger/exporter.py:192 msgid "Forms and outlines are lost on saving." msgstr "Az űrlapok és a körvonalak elvesznek a mentéskor." #: data/menu.ui:221 msgid "Full_screen" msgstr "_Teljes képernyő" #: pdfarranger/pdfarranger.py:2562 msgid "GNU General Public License (GPL) Version 3." msgstr "" "GNU GPL (General Public License - általános nyilvános engedély) 3. verzió." #: data/menu.ui:160 data/menu.ui:389 msgid "Generate Booklet" msgstr "Füzet létrehozása" #: pdfarranger/pageutils.py:236 pdfarranger/pageutils.py:240 #: pdfarranger/pageutils.py:328 msgid "Height" msgstr "Magasság" #: pdfarranger/splitter.py:88 msgid "Height in %" msgstr "Magasság százalékként" #: pdfarranger/pageutils.py:375 msgid "Horizontal" msgstr "Vízszintes" #: pdfarranger/splitter.py:61 msgid "Horizontal Splits" msgstr "Vízszintes felosztása" #: pdfarranger/pageutils.py:476 msgid "Horizontal offset" msgstr "Vízszintes eltolása" #: pdfarranger/core.py:377 msgid "Image files are only supported with img2pdf" msgstr "A képfájlokat csak az img2pdf támogatja" #: pdfarranger/core.py:383 msgid "Image format is not supported by img2pdf" msgstr "Az img2pdf nem támogatja a képformátumot" #: data/pdfarranger.ui:58 msgid "Import" msgstr "Importálás" #: pdfarranger/pdfarranger.py:1327 msgid "Import…" msgstr "Importálás…" #: data/menu.ui:156 data/menu.ui:385 msgid "Insert Blan_k Page…" msgstr "Üres oldal bes_zúrása…" #: pdfarranger/pageutils.py:325 msgid "Insert Blank Page" msgstr "Üres oldal beszúrása" #: pdfarranger/metadata.py:169 msgid "Invalid date format. Input discarded." msgstr "Érvénytelen dátumformátum. A bevitelt elvetve." #: pdfarranger/pdfarranger.py:2551 #, python-format msgid "It uses libqpdf %s, pikepdf %s, GTK %s and Python %s." msgstr "A libqpdf %s, a pikepdf %s, a GTK %s és a Python %s használata" #: pdfarranger/metadata.py:44 msgid "Keywords" msgstr "Kulcsszavak" #: pdfarranger/config.py:222 msgid "Language" msgstr "Nyelv" #: pdfarranger/pageutils.py:460 msgid "Layout for the first page in selection" msgstr "A kijelölés első oldalának elrendezése" #: pdfarranger/pageutils.py:149 msgid "Left" msgstr "Balról" #: pdfarranger/pageutils.py:377 msgid "Left to Right" msgstr "Balról jobbra" #: data/pdfarranger.ui:122 msgid "Main Menu" msgstr "Főmenü" #: pdfarranger/pdfarranger.py:2557 msgid "Maintainers and contributors" msgstr "Fenntartók és közreműködők" #: pdfarranger/pageutils.py:361 msgid "Margin" msgstr "Margó" #: pdfarranger/pageutils.py:347 msgid "Merge Pages" msgstr "Oldalak egyesítése" #: pdfarranger/pageutils.py:412 msgid "Merged page size:" msgstr "Egyesített oldal mérete:" #: pdfarranger/metadata.py:49 msgid "Modified" msgstr "Módosítva" #: pdfarranger/pageutils.py:392 msgid "Non-uniform page size - using max size" msgstr "Nem egységes oldalméret – a legfeljebb méret használata" #: data/pdfarranger.ui:37 msgid "Open" msgstr "Megnyitás" #: pdfarranger/pdfarranger.py:1186 msgid "Open…" msgstr "Megnyitás…" #: pdfarranger/pageutils.py:436 msgid "Overlay" msgstr "Átfedés" #: pdfarranger/pdfarranger.py:282 msgid "" "PDF Arranger is a small python-gtk application, which helps the user to " "merge or split pdf documents and rotate, crop and rearrange their pages " "using an interactive and intuitive graphical interface. It is a frontend for " "pikepdf." msgstr "" "A PDF-rendező egy kis python-gtk alkalmazás, amely egy interaktív és " "intuitív grafikus felület segítségével segíti a felhasználót a pdf " "dokumentumok egyesítésében vagy felosztásában, valamint az oldalak " "elforgatásában, kivágásában és átrendezésében. Ez a pikepdf Python-könyvtár " "kezelőfelülete." #: pdfarranger/pdfarranger.py:1498 msgid "PDF document is damaged" msgstr "A PDF-dokumentum sérült" #: pdfarranger/pdfarranger.py:499 msgid "PDF files" msgstr "PDF-fájlok" #: pdfarranger/pageutils.py:388 msgid "Page Order" msgstr "Oldalsorrend" #: pdfarranger/pageutils.py:241 msgid "Page Size" msgstr "Oldalméret" #: pdfarranger/pdfarranger.py:2585 msgid "Page Size:" msgstr "Oldalméret:" #: pdfarranger/pageutils.py:230 msgid "Page format" msgstr "Oldalformátum" #: pdfarranger/core.py:285 msgid "Password" msgstr "Jelszó" #: pdfarranger/core.py:263 msgid "Password required" msgstr "Jelszó szükséges" #: data/menu.ui:277 msgid "Past_e Special" msgstr "Irá_nyított beillesztés" #: data/menu.ui:295 msgid "Paste As O_verlay…" msgstr "Beillesztés _átfedésként…" #: data/menu.ui:151 data/menu.ui:290 msgid "Paste As _Even Pages" msgstr "Beillesztés _páros oldalakként" #: data/menu.ui:146 data/menu.ui:285 msgid "Paste As _Odd Pages" msgstr "Beillesztés párat_lan oldalakként" #: data/menu.ui:300 msgid "Paste As _Underlay…" msgstr "Beillesztés _alátfedésként…" #: data/menu.ui:136 data/menu.ui:272 msgid "Paste _After" msgstr "Beillesztés _után" #: data/menu.ui:141 data/menu.ui:280 msgid "Paste _Before" msgstr "Beillesztés _előtt" #: pdfarranger/pdfarranger.py:1627 msgid "Pasted data not valid. Aborting paste." msgstr "A beillesztett adatok érvénytelenek. A beillesztés megszakadt." #: pdfarranger/pdfarranger.py:1589 msgid "Pikepdf >= 3 is needed for overlay/underlay/merge support." msgstr "Pikepdf >= 3 szükséges az átfedéshez, alátfedéshez, egyesítés támogatásához." #: data/menu.ui:234 msgid "Pre_ferences" msgstr "_Beállítások" #: pdfarranger/config.py:212 msgid "Preferences" msgstr "Beállítások" #: pdfarranger/pdfarranger.py:293 msgid "Print the version of PDF Arranger and exit" msgstr "PDF-rendező verzió nyomtatása és kilépés" #: pdfarranger/exporter.py:457 msgid "Printing…" msgstr "Nyomtatás…" #: pdfarranger/metadata.py:45 msgid "Producer" msgstr "Gyártó" #: pdfarranger/metadata.py:212 msgid "Property" msgstr "Tulajdonság" #: data/menu.ui:116 data/menu.ui:373 msgid "Re_verse Order" msgstr "Sorrend meg_fordítása" #: pdfarranger/pageutils.py:238 msgid "Relative" msgstr "Viszonylagos" #: pdfarranger/exporter.py:469 msgid "Rendering Preview…" msgstr "Előnézet megjelenítése…" #: pdfarranger/pdfarranger.py:732 msgid "Rendering…" msgstr "Renderelés folyamatban van…" #: pdfarranger/pdfarranger.py:1132 msgid "Replace" msgstr "Csere" #: pdfarranger/pageutils.py:149 msgid "Right" msgstr "Jobbról" #: pdfarranger/pageutils.py:378 msgid "Right to Left" msgstr "Jobbról balra" #: data/pdfarranger.ui:203 msgid "Rotate Left" msgstr "Forgatás balra" #: data/pdfarranger.ui:227 msgid "Rotate Right" msgstr "Forgatás jobbra" #: data/menu.ui:90 data/menu.ui:351 msgid "Rotate _Left" msgstr "Forgatás _balra" #: pdfarranger/pageutils.py:364 pdfarranger/splitter.py:60 msgid "Rows" msgstr "Sorok" #: data/menu.ui:194 data/menu.ui:337 msgid "Same Page _Format" msgstr "Ugyanaz az oldal_formátum" #: data/pdfarranger.ui:78 msgid "Save" msgstr "Mentés" #: data/pdfarranger.ui:97 msgid "Save As" msgstr "Mentés másként…" #: pdfarranger/pdfarranger.py:1088 msgid "Save As…" msgstr "Mentés másként…" #: data/menu.ui:47 msgid "Save _As…" msgstr "Menté_s másként…" #: pdfarranger/pdfarranger.py:988 msgid "Save changes before closing?" msgstr "Menti a módosításokat a bezárás előtt?" #: pdfarranger/pdfarranger.py:1025 msgid "Save changes before quitting?" msgstr "Menti a módosításokat a kilépés előtt?" #: pdfarranger/pdfarranger.py:985 msgid "Save changes to “{}” before closing?" msgstr "Menti a változásokat a(z) „{}” fájlba bezárás előtt?" #: pdfarranger/pdfarranger.py:1022 msgid "Save changes to “{}” before quitting?" msgstr "Menti a(z) „{}” módosításait a kilépés előtt?" #: pdfarranger/pdfarranger.py:1249 msgid "Saving produced some warnings" msgstr "A mentés néhány figyelmeztetést jelentett" #: pdfarranger/pdfarranger.py:1288 msgid "Saving…" msgstr "Mentés…" #: pdfarranger/pageutils.py:116 msgid "Scale factor" msgstr "Nagyságrendi tényező" #: data/menu.ui:169 data/menu.ui:312 msgid "Select _All" msgstr "_Az összes kijelölése" #: data/menu.ui:184 data/menu.ui:327 msgid "Select _Even Pages" msgstr "_Páros oldalak kijelölése" #: data/menu.ui:179 data/menu.ui:322 msgid "Select _Odd Pages" msgstr "Párat_lan oldalak kijelölése" #: pdfarranger/pdfarranger.py:2580 msgid "Selected pages: " msgstr "Kiválasztott oldalak: " #: pdfarranger/splitter.py:26 msgid "Split Pages" msgstr "Oldalak felosztása" #: pdfarranger/metadata.py:43 msgid "Subject" msgstr "Tárgy" #: pdfarranger/pdfarranger.py:512 msgid "Supported image files" msgstr "Támogatott képfájlok" #: pdfarranger/config.py:248 pdfarranger/config.py:256 msgid "System setting" msgstr "Rendszerbeállítás" #: pdfarranger/core.py:275 msgid "" "The document “{}” is locked and requires a password before it can be opened." msgstr "A(z) „{}” dokumentum zárolva van és megnyitásához jelszó szükséges." #: pdfarranger/core.py:274 msgid "The password will be remembered until you close PDF Arranger." msgstr "A jelszó mindaddig emlékezetes marad, amíg bezárja a PDF-rendezőt" #: pdfarranger/config.py:230 msgid "Theme" msgstr "Téma" #: pdfarranger/metadata.py:42 msgid "Title" msgstr "Cím" #: pdfarranger/pageutils.py:149 msgid "Top" msgstr "Felülről" #: pdfarranger/pageutils.py:379 msgid "Top to Bottom" msgstr "Fentről lefelé" #: pdfarranger/pageutils.py:436 msgid "Underlay" msgstr "Alátfedés" #: pdfarranger/core.py:361 pdfarranger/pdfarranger.py:1494 msgid "Unknown file format" msgstr "Ismeretlen fájlformátum" #: pdfarranger/metadata.py:212 msgid "Value" msgstr "Érték" #: pdfarranger/pageutils.py:376 msgid "Vertical" msgstr "Függőleges" #: pdfarranger/splitter.py:61 msgid "Vertical Splits" msgstr "Függőleges felosztása" #: pdfarranger/pageutils.py:478 msgid "Vertical offset" msgstr "Függőleges eltolása" #: pdfarranger/exporter.py:187 msgid "Warning" msgstr "Figyelmeztetés" #: pdfarranger/pageutils.py:235 pdfarranger/pageutils.py:239 #: pdfarranger/pageutils.py:327 msgid "Width" msgstr "Szélesség" #: pdfarranger/splitter.py:88 msgid "Width in %" msgstr "Szélesség százalékként" #: pdfarranger/pdfarranger.py:969 msgid "Your changes will be lost if you don’t save them." msgstr "A változtatások elvesznek, ha nem menti őket." #: data/pdfarranger.ui:144 msgid "Zoom In" msgstr "Nagyítás" #: data/pdfarranger.ui:167 msgid "Zoom Out" msgstr "Kicsinyítés" #: data/menu.ui:217 msgid "Zoom _Fit" msgstr "_Mérethez igazítás" #: data/menu.ui:209 msgid "Zoom _In" msgstr "Na_gyítás" #: data/menu.ui:213 msgid "Zoom _Out" msgstr "Ki_csinyítés" #: data/menu.ui:240 msgid "_About" msgstr "_Névjegy" #: pdfarranger/config.py:216 pdfarranger/pageutils.py:219 #: pdfarranger/pdfarranger.py:961 pdfarranger/pdfarranger.py:970 #: pdfarranger/pdfarranger.py:1094 pdfarranger/pdfarranger.py:1144 msgid "_Cancel" msgstr "_Mégse" #: pdfarranger/pdfarranger.py:980 data/menu.ui:246 msgid "_Close" msgstr "_Bezárás" #: data/menu.ui:132 data/menu.ui:268 msgid "_Copy" msgstr "_Másolás" #: data/menu.ui:108 data/menu.ui:260 msgid "_Delete" msgstr "_Törlés" #: data/menu.ui:174 data/menu.ui:317 msgid "_Deselect All" msgstr "Öss_zes kijelölés törlése" #: data/menu.ui:87 msgid "_Edit" msgstr "S_zerkesztés" #: data/menu.ui:30 msgid "_Import" msgstr "_Importálás…" #: data/menu.ui:199 data/menu.ui:342 msgid "_Invert Selection" msgstr "Kijelölés meg_fordítása" #: data/menu.ui:124 data/menu.ui:381 msgid "_Merge Pages…" msgstr "Oldalak _egyesítése…" #: data/menu.ui:36 msgid "_New Window" msgstr "Új _ablak" #: pdfarranger/config.py:217 pdfarranger/pageutils.py:220 msgid "_OK" msgstr "_Rendben" #: pdfarranger/pdfarranger.py:1143 data/menu.ui:24 msgid "_Open" msgstr "_Megnyitás…" #: data/menu.ui:100 data/menu.ui:361 msgid "_Page Format…" msgstr "_Oldalformátum…" #: data/menu.ui:71 msgid "_Print…" msgstr "_Nyomtatás…" #: pdfarranger/pdfarranger.py:1017 data/menu.ui:252 msgid "_Quit" msgstr "_Kilépés" #: data/menu.ui:82 msgid "_Redo" msgstr "Új_ra" #: data/menu.ui:95 data/menu.ui:356 msgid "_Rotate Right" msgstr "Forgatás _jobbra" #: pdfarranger/pdfarranger.py:970 pdfarranger/pdfarranger.py:1093 #: data/menu.ui:42 msgid "_Save" msgstr "_Mentés" #: data/menu.ui:166 data/menu.ui:309 msgid "_Select" msgstr "_Kijelölés" #: data/menu.ui:120 data/menu.ui:377 msgid "_Split Pages…" msgstr "Oldalak fel_osztása…" #: data/menu.ui:78 msgid "_Undo" msgstr "_Visszavonás" #: data/menu.ui:206 msgid "_View" msgstr "_Nézet" #: pdfarranger/pageutils.py:139 pdfarranger/pageutils.py:362 #: pdfarranger/pageutils.py:412 msgid "mm" msgstr "mm" #: pdfarranger/core.py:89 msgid "page" msgstr "oldal" #: pdfarranger/pdfarranger.py:811 msgid "untitled" msgstr "névtelen" pdfarranger-1.10.1/po/id.po000066400000000000000000000424331451252235000154440ustar00rootroot00000000000000# Copyright (C) 2021 pdfarranger contributors # Indonesian translation for pdfarranger. # This file is distributed under the same license as the PACKAGE package. # Translators: # Abdul Munif Hanafi , 2019., 2021. # Ryan Faiz Sanie , 2023. # msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-06-09 18:18+0200\n" "PO-Revision-Date: 2023-06-08 10:00+0700\n" "Last-Translator: Abdul Munif Hanafi \n" "Language-Team: \n" "Language: id\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: pdfarranger/splitter.py:87 msgid "#Col" msgstr "#Kolom" #: pdfarranger/splitter.py:87 msgid "#Row" msgstr "#Baris" #: pdfarranger/pageutils.py:122 pdfarranger/pageutils.py:477 #: pdfarranger/pageutils.py:479 msgid "%" msgstr "%" #: pdfarranger/pageutils.py:170 #, python-format msgid "% of height" msgstr "% dari tinggi" #: pdfarranger/pageutils.py:170 #, python-format msgid "% of width" msgstr "% dari lebar" #: pdfarranger/pdfarranger.py:2549 #, python-format msgid "%s is a tool for rearranging and modifying PDF files." msgstr "%s adalah alat untuk menyusun dan memodifikasi file PDF" #: pdfarranger/config.py:233 msgid "(Libhandy missing)" msgstr "(Libhandy tidak ditemukan)" #: pdfarranger/config.py:225 msgid "(Requires restart)" msgstr "(Mulai ulang diperlukan)" #: pdfarranger/pageutils.py:461 msgid "(same offset is applied to all pages)" msgstr "(offset yang sama diterapkan ke semua halaman)" #: pdfarranger/pdfarranger.py:1130 #, python-format msgid "A file named \"%s\" already exists. Do you want to replace it?" msgstr "File dengan nama \"%s\" sudah ada. Apakah Anda ingin menggantinya?" #: data/menu.ui:202 data/menu.ui:345 msgid "All From _Same File" msgstr "Semua dari Berkas yang _Sama" #: pdfarranger/pdfarranger.py:507 msgid "All files" msgstr "Semua File" #: pdfarranger/pdfarranger.py:462 msgid "All pages must have the same size." msgstr "Semua halaman harus memiliki ukuran yang sama" #: pdfarranger/pdfarranger.py:495 msgid "All supported files" msgstr "Semua file yang didukung" #: pdfarranger/pageutils.py:149 msgid "Bottom" msgstr "Bawah" #: pdfarranger/pageutils.py:380 msgid "Bottom to Top" msgstr "Bawah ke Atas" #: pdfarranger/core.py:386 msgid "Clipboard image" msgstr "Gambar papan klip" #: pdfarranger/pageutils.py:363 pdfarranger/splitter.py:60 msgid "Columns" msgstr "Kolom" #: pdfarranger/metadata.py:49 msgid "Created" msgstr "Dibuat" #: pdfarranger/metadata.py:47 msgid "Creator" msgstr "Pencipta" #: pdfarranger/metadata.py:48 msgid "Creator tool" msgstr "Alat pencipta" #: pdfarranger/pageutils.py:153 msgid "Crop Margins" msgstr "Margin Pangkas" #: data/menu.ui:149 data/menu.ui:378 msgid "Crop White Borders" msgstr "Potong Tepian Berwarna Putih" #: pdfarranger/pageutils.py:161 msgid "" "Cropping does not remove any content from the PDF file, it only hides it." msgstr "" "Pemangkasan tidak menghapus konten apa pun dari berkas PDF, melainkan hanya " "menyembunyikannya" #: data/menu.ui:94 data/menu.ui:277 msgid "Cu_t" msgstr "_Potong" #: pdfarranger/pdfarranger.py:1250 msgid "Despite the warnings the document(s) should have no visible issues." msgstr "" "Meskipun ada peringatan, dokumen seharusnya tidak memiliki masalah yang " "terlihat." #: pdfarranger/pdfarranger.py:979 msgid "Discard changes and close?" msgstr "Buang perubahan dan tutup?" #: pdfarranger/pdfarranger.py:1016 msgid "Discard changes and quit?" msgstr "Buang perubahan dan keluar?" #: pdfarranger/exporter.py:194 msgid "Do not show this dialog again." msgstr "Jangan munculkan dialog ini lagi." #: pdfarranger/pdfarranger.py:970 msgid "Do_n’t Save" msgstr "Ja_ngan Simpan" #: pdfarranger/pdfarranger.py:1257 msgid "Don't show warnings when saving again." msgstr "Jangan tampilkan peringatan lagi saat menyimpan. " #: data/menu.ui:153 data/menu.ui:382 msgid "Dupl_icate" msgstr "Gan_dakan" #: data/menu.ui:52 data/menu.ui:408 msgid "E_xport" msgstr "E_kspor" #: data/menu.ui:55 data/menu.ui:411 msgid "E_xport Selection to a Single File…" msgstr "_Ekspor Terpilih ke Sebuah Berkas Tunggal…" #: data/menu.ui:241 msgid "Edit _Properties" msgstr "Sunting Prop_erti" #: pdfarranger/metadata.py:199 msgid "Edit properties" msgstr "Ubah properti" #: pdfarranger/splitter.py:62 msgid "Equal column width" msgstr "Lebar kolom yang sama" #: pdfarranger/splitter.py:62 msgid "Equal row height" msgstr "Lebar baris yang sama" #: data/menu.ui:60 data/menu.ui:416 msgid "Export Selection to _Individual Files…" msgstr "Ekspor Terpilih ke _Masing-masing Berkas…" #: data/menu.ui:65 data/menu.ui:421 msgid "Export _All Pages to Individual Files…" msgstr "Ekspor Semu_a Halaman menjadi Masing-masing Berkas…" #: pdfarranger/pdfarranger.py:1088 msgid "Export…" msgstr "Ekspor…" #: pdfarranger/core.py:388 pdfarranger/pdfarranger.py:1504 msgid "File is neither pdf nor image" msgstr "File bukan dalam format pdf ataupun gambar" #: pdfarranger/pdfarranger.py:301 msgid "File(s) to open" msgstr "File yang akan dibuka" #: pdfarranger/config.py:238 msgid "For more options see:" msgstr "Untuk opsi lebih lanjut, lihat:" #: pdfarranger/exporter.py:192 msgid "Forms and outlines are lost on saving." msgstr "Formulir dan garis-garis kerangka hilang saat disimpan" #: data/menu.ui:234 msgid "Full_screen" msgstr "Layar_penuh" #: pdfarranger/pdfarranger.py:2563 msgid "GNU General Public License (GPL) Version 3." msgstr "Lisensi Publik Umum GNU (GNU General Public License/GPL) Versi 3." #: data/menu.ui:173 data/menu.ui:402 msgid "Generate Booklet" msgstr "Membuat Buku Saku" #: pdfarranger/pageutils.py:236 pdfarranger/pageutils.py:240 #: pdfarranger/pageutils.py:328 msgid "Height" msgstr "Tinggi" #: pdfarranger/splitter.py:88 msgid "Height in %" msgstr "Tinggi dalam %" #: pdfarranger/pageutils.py:375 msgid "Horizontal" msgstr "Horizontal" #: pdfarranger/splitter.py:61 msgid "Horizontal Splits" msgstr "Pemisahan Horizontal." #: pdfarranger/pageutils.py:476 msgid "Horizontal offset" msgstr "Offset horizontal" #: pdfarranger/core.py:377 msgid "Image files are only supported with img2pdf" msgstr "File gambar hanya didukung dengan img2pdf." #: pdfarranger/core.py:383 msgid "Image format is not supported by img2pdf" msgstr "File gambar tidak didukung dengan img2pdf" #: data/pdfarranger.ui:58 msgid "Import" msgstr "Impor" #: pdfarranger/pdfarranger.py:1327 msgid "Import…" msgstr "Impor…" #: data/menu.ui:169 data/menu.ui:398 msgid "Insert Blan_k Page…" msgstr "Sisipkan Halaman _Kosong…" #: pdfarranger/pageutils.py:325 msgid "Insert Blank Page" msgstr "Sisipkan Halaman Kosong" #: pdfarranger/metadata.py:170 msgid "Invalid date format. Input discarded." msgstr "Format tanggal tidak valid. Input dibatalkan." #: pdfarranger/pdfarranger.py:2552 #, python-format msgid "It uses libqpdf %s, pikepdf %s, GTK %s and Python %s." msgstr "Ini menggunakan libqpdf %s, pikepdf %s, GTK %s, dan Python %s." #: pdfarranger/metadata.py:45 msgid "Keywords" msgstr "Kata kunci" #: pdfarranger/config.py:223 msgid "Language" msgstr "Bahasa" #: pdfarranger/pageutils.py:460 msgid "Layout for the first page in selection" msgstr "Tata letak untuk halaman pertama dalam pilihan" #: pdfarranger/pageutils.py:149 msgid "Left" msgstr "Kiri" #: pdfarranger/pageutils.py:377 msgid "Left to Right" msgstr "Kiri ke Kanan" #: data/pdfarranger.ui:122 msgid "Main Menu" msgstr "Menu Utama" #: pdfarranger/pdfarranger.py:2558 msgid "Maintainers and contributors" msgstr "Maintainers and contributors" #: pdfarranger/pageutils.py:361 msgid "Margin" msgstr "Margin" #: pdfarranger/pageutils.py:347 msgid "Merge Pages" msgstr "Gabungkan Halaman" #: pdfarranger/pageutils.py:412 msgid "Merged page size:" msgstr "Ukuran halaman yang digabungkan: " #: pdfarranger/metadata.py:50 msgid "Modified" msgstr "Diubah" #: pdfarranger/pageutils.py:392 msgid "Non-uniform page size - using max size" msgstr "Ukuran halaman yang tidak seragam - menggunakan ukuran maksimum." #: data/pdfarranger.ui:37 msgid "Open" msgstr "Buka" #: pdfarranger/pdfarranger.py:1186 msgid "Open…" msgstr "Buka…" #: pdfarranger/pageutils.py:436 msgid "Overlay" msgstr "" #: pdfarranger/pdfarranger.py:282 msgid "" "PDF Arranger is a small python-gtk application, which helps the user to " "merge or split pdf documents and rotate, crop and rearrange their pages " "using an interactive and intuitive graphical interface. It is a frontend for " "pikepdf." msgstr "" "PDF Arranger adalah aplikasi Python-GTK kecil yang membantu pengguna untuk " "menggabungkan atau membagi dokumen PDF serta memutar, memotong, dan menyusun " "ulang halaman-halaman PDF menggunakan antarmuka grafis interaktif dan " "intuitif. Ini adalah antarmuka pengguna untuk pikepdf." #: pdfarranger/pdfarranger.py:1498 msgid "PDF document is damaged" msgstr "Dokumen PDF rusak" #: pdfarranger/pdfarranger.py:499 msgid "PDF files" msgstr "File PDF" #: pdfarranger/pageutils.py:388 msgid "Page Order" msgstr "Susunan Halaman" #: pdfarranger/pageutils.py:241 msgid "Page Size" msgstr "Ukuran Halaman" #: pdfarranger/pdfarranger.py:2586 msgid "Page Size:" msgstr "Ukuran Halaman:" #: pdfarranger/pageutils.py:230 msgid "Page format" msgstr "Format halaman" #: pdfarranger/core.py:285 msgid "Password" msgstr "Kata Sandi" #: pdfarranger/core.py:263 msgid "Password required" msgstr "Kata Sandi diperlukan" #: data/menu.ui:107 data/menu.ui:290 msgid "Past_e Special" msgstr "Temp_el Spesial" #: data/menu.ui:124 data/menu.ui:308 msgid "Paste As O_verlay…" msgstr "Tempel Sebagai O_verlay…" #: data/menu.ui:119 data/menu.ui:303 msgid "Paste As _Even Pages" msgstr "Tempel Sebagai Halaman _Genap" #: data/menu.ui:114 data/menu.ui:298 msgid "Paste As _Odd Pages" msgstr "Tempel Sebagai Halaman _Ganjil" #: data/menu.ui:129 data/menu.ui:313 msgid "Paste As _Underlay…" msgstr "Tempel Sebagai _Underlay…" #: data/menu.ui:102 data/menu.ui:285 msgid "Paste _After" msgstr "Tempel _Setelah" #: data/menu.ui:109 data/menu.ui:293 msgid "Paste _Before" msgstr "Tempel _Sebelum" #: pdfarranger/pdfarranger.py:1627 msgid "Pasted data not valid. Aborting paste." msgstr "Data yang ditempelkan tidak valid. Membatalkan tempel." #: pdfarranger/pdfarranger.py:1589 msgid "Pikepdf >= 3 is needed for overlay/underlay/merge support." msgstr "" "Pikepdf versi 3 atau yang lebih baru diperlukan untuk mendukung fitur " "overlay/underlay/merge." #: data/menu.ui:247 msgid "Pre_ferences" msgstr "Pre_ferensi" #: pdfarranger/config.py:213 msgid "Preferences" msgstr "Preferensi" #: pdfarranger/pdfarranger.py:293 msgid "Print the version of PDF Arranger and exit" msgstr "Cetak versi PDF Arranger dan keluar" #: pdfarranger/exporter.py:461 msgid "Printing…" msgstr "Mencetak" #: pdfarranger/metadata.py:46 msgid "Producer" msgstr "Produsen" #: pdfarranger/metadata.py:213 msgid "Property" msgstr "Properti" #: data/menu.ui:157 data/menu.ui:386 msgid "Re_verse Order" msgstr "Ba_likkan Urutan" #: pdfarranger/pageutils.py:238 msgid "Relative" msgstr "Relatif" #: pdfarranger/exporter.py:473 msgid "Rendering Preview…" msgstr "Pratinjau Rendering…" #: pdfarranger/pdfarranger.py:732 msgid "Rendering…" msgstr "Rendering…" #: pdfarranger/pdfarranger.py:1132 msgid "Replace" msgstr "Ganti" #: pdfarranger/pageutils.py:149 msgid "Right" msgstr "Kanan" #: pdfarranger/pageutils.py:378 msgid "Right to Left" msgstr "Kanan ke Kiri" #: data/pdfarranger.ui:203 msgid "Rotate Left" msgstr "Rotasi ke Kiri" #: data/pdfarranger.ui:227 msgid "Rotate Right" msgstr "Rotasi ke Kanan" #: data/menu.ui:135 data/menu.ui:364 msgid "Rotate _Left" msgstr "Rotasi ke _Kiri" #: pdfarranger/pageutils.py:364 pdfarranger/splitter.py:60 msgid "Rows" msgstr "Baris" #: data/menu.ui:207 data/menu.ui:350 msgid "Same Page _Format" msgstr "_Format Halaman yang Sama" #: data/pdfarranger.ui:78 msgid "Save" msgstr "Simpan" #: data/pdfarranger.ui:97 msgid "Save As" msgstr "Simpan Sebagai" #: pdfarranger/pdfarranger.py:1088 msgid "Save As…" msgstr "Simpan Sebagai…" #: data/menu.ui:47 msgid "Save _As…" msgstr "Simpan _Sebagai…" #: pdfarranger/pdfarranger.py:988 msgid "Save changes before closing?" msgstr "Simpan perubahan sebelum menutup?" #: pdfarranger/pdfarranger.py:1025 msgid "Save changes before quitting?" msgstr "Simpan perubahan sebelum keluar?" #: pdfarranger/pdfarranger.py:985 msgid "Save changes to “{}” before closing?" msgstr "Simpan perubahan ke “{}” sebelum menutup?" #: pdfarranger/pdfarranger.py:1022 msgid "Save changes to “{}” before quitting?" msgstr "Simpan perubahan ke “{}” sebelum keluar?" #: pdfarranger/pdfarranger.py:1249 msgid "Saving produced some warnings" msgstr "Menyimpan dapat menghasilkan beberapa peringatan" #: pdfarranger/pdfarranger.py:1288 msgid "Saving…" msgstr "Menyimpan…" #: pdfarranger/pageutils.py:116 msgid "Scale factor" msgstr "Faktor Skala" #: data/menu.ui:182 data/menu.ui:325 msgid "Select _All" msgstr "Pilih _Semua" #: data/menu.ui:197 data/menu.ui:340 msgid "Select _Even Pages" msgstr "Pilih Halaman _Genap" #: data/menu.ui:192 data/menu.ui:335 msgid "Select _Odd Pages" msgstr "Pilih Halaman _Ganjil" #: pdfarranger/pdfarranger.py:2581 msgid "Selected pages: " msgstr "Halaman yang dipilih: " #: pdfarranger/splitter.py:26 msgid "Split Pages" msgstr "Pisahkan Halaman" #: pdfarranger/metadata.py:44 msgid "Subject" msgstr "Subjek" #: pdfarranger/pdfarranger.py:512 msgid "Supported image files" msgstr "File gambar yang didukung" #: pdfarranger/config.py:249 pdfarranger/config.py:257 msgid "System setting" msgstr "Setelan sistem" #: pdfarranger/core.py:275 msgid "" "The document “{}” is locked and requires a password before it can be opened." msgstr "Dokumen “{}” terkunci dan memerlukan password sebelum bisa dibuka." #: pdfarranger/core.py:274 msgid "The password will be remembered until you close PDF Arranger." msgstr "Password akan diingat sampai Anda menutup PDF Arranger." #: pdfarranger/config.py:231 msgid "Theme" msgstr "Tema" #: pdfarranger/metadata.py:43 msgid "Title" msgstr "Judul" #: pdfarranger/pageutils.py:149 msgid "Top" msgstr "Atas" #: pdfarranger/pageutils.py:379 msgid "Top to Bottom" msgstr "Atas ke Bawah" #: pdfarranger/pageutils.py:436 msgid "Underlay" msgstr "" #: pdfarranger/core.py:361 pdfarranger/pdfarranger.py:1494 msgid "Unknown file format" msgstr "Format file tidak dikenali" #: pdfarranger/metadata.py:213 msgid "Value" msgstr "Nilai" #: pdfarranger/pageutils.py:376 msgid "Vertical" msgstr "Vertikal" #: pdfarranger/splitter.py:61 msgid "Vertical Splits" msgstr "Pemisahan Vertikal" #: pdfarranger/pageutils.py:478 msgid "Vertical offset" msgstr "Offset vertikal" #: pdfarranger/exporter.py:187 msgid "Warning" msgstr "Peringatan" #: pdfarranger/pageutils.py:235 pdfarranger/pageutils.py:239 #: pdfarranger/pageutils.py:327 msgid "Width" msgstr "Lebar" #: pdfarranger/splitter.py:88 msgid "Width in %" msgstr "Lebar dalam %" #: pdfarranger/pdfarranger.py:969 msgid "Your changes will be lost if you don’t save them." msgstr "Perubahan Anda akan hilang jika Anda tidak menyimpannya." #: data/pdfarranger.ui:144 msgid "Zoom In" msgstr "Zoom Perbesar" #: data/pdfarranger.ui:167 msgid "Zoom Out" msgstr "Zoom Perkecil" #: data/menu.ui:230 msgid "Zoom _Fit" msgstr "_Sesuaikan Zoom" #: data/menu.ui:222 msgid "Zoom _In" msgstr "Zoom _Perbesar" #: data/menu.ui:226 msgid "Zoom _Out" msgstr "Zoom _Perkecil" #: data/menu.ui:253 msgid "_About" msgstr "Tent_ang" #: pdfarranger/config.py:217 pdfarranger/pageutils.py:219 #: pdfarranger/pdfarranger.py:961 pdfarranger/pdfarranger.py:970 #: pdfarranger/pdfarranger.py:1094 pdfarranger/pdfarranger.py:1144 msgid "_Cancel" msgstr "_Batalkan" #: pdfarranger/pdfarranger.py:980 data/menu.ui:259 msgid "_Close" msgstr "_Tutup" #: data/menu.ui:98 data/menu.ui:281 msgid "_Copy" msgstr "_Salin" #: data/menu.ui:90 data/menu.ui:273 msgid "_Delete" msgstr "_Hapus" #: data/menu.ui:187 data/menu.ui:330 msgid "_Deselect All" msgstr "_Batal Pilih Semua" #: data/menu.ui:87 msgid "_Edit" msgstr "_Sunting" #: data/menu.ui:30 msgid "_Import" msgstr "_Impor" #: data/menu.ui:212 data/menu.ui:355 msgid "_Invert Selection" msgstr "Pi_lih Sebaliknya" #: data/menu.ui:165 data/menu.ui:394 msgid "_Merge Pages…" msgstr "_Gabungkan Halaman…" #: data/menu.ui:36 msgid "_New Window" msgstr "Je_ndela Baru" #: pdfarranger/config.py:218 pdfarranger/pageutils.py:220 msgid "_OK" msgstr "_OKE" #: pdfarranger/pdfarranger.py:1143 data/menu.ui:24 msgid "_Open" msgstr "Buk_a" #: data/menu.ui:145 data/menu.ui:374 msgid "_Page Format…" msgstr "_Format Halaman…" #: data/menu.ui:71 msgid "_Print…" msgstr "_Cetak…" #: pdfarranger/pdfarranger.py:1017 data/menu.ui:265 msgid "_Quit" msgstr "Kelua_r" #: data/menu.ui:82 msgid "_Redo" msgstr "_Mengulangi Tindakan Terakhir" #: data/menu.ui:140 data/menu.ui:369 msgid "_Rotate Right" msgstr "Putar ke K_anan" #: pdfarranger/pdfarranger.py:970 pdfarranger/pdfarranger.py:1093 #: data/menu.ui:42 msgid "_Save" msgstr "_Simpan" #: data/menu.ui:179 data/menu.ui:322 msgid "_Select" msgstr "Pili_h" #: data/menu.ui:161 data/menu.ui:390 msgid "_Split Pages…" msgstr "Pe_cah Halaman…" #: data/menu.ui:78 msgid "_Undo" msgstr "_Batalkan Tindakan Terakhir" #: data/menu.ui:219 msgid "_View" msgstr "_Lihat" #: pdfarranger/pageutils.py:139 pdfarranger/pageutils.py:362 #: pdfarranger/pageutils.py:412 msgid "mm" msgstr "mm" #: pdfarranger/core.py:89 msgid "page" msgstr "halaman" #: pdfarranger/pdfarranger.py:811 msgid "untitled" msgstr "tanpa judul" pdfarranger-1.10.1/po/is.po000066400000000000000000000420711451252235000154610ustar00rootroot00000000000000# Icelandic translation of PDF Arranger # Copyright (C) 2021 PDF Arranger # This file is distributed under the same license as the pdfarranger package. # # Sveinn í Felli , 2021, 2022, 2023. msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-04-29 22:45+0200\n" "PO-Revision-Date: 2023-06-06 21:50+0000\n" "Last-Translator: Sveinn í Felli \n" "Language-Team: Icelandic\n" "Language: is\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Lokalize 21.12.3\n" #: pdfarranger/splitter.py:87 msgid "#Col" msgstr "#Dál" #: pdfarranger/splitter.py:87 msgid "#Row" msgstr "#Röð" #: pdfarranger/pageutils.py:122 pdfarranger/pageutils.py:477 #: pdfarranger/pageutils.py:479 msgid "%" msgstr "%" #: pdfarranger/pageutils.py:170 msgid "% of height" msgstr "% af hæð" #: pdfarranger/pageutils.py:170 msgid "% of width" msgstr "% af breidd" #: pdfarranger/pdfarranger.py:2548 #, python-format msgid "%s is a tool for rearranging and modifying PDF files." msgstr "%s er verkfæri til að endurraða og breyta PDF-skrám." #: pdfarranger/config.py:232 msgid "(Libhandy missing)" msgstr "(Libhandy vantar)" #: pdfarranger/config.py:224 msgid "(Requires restart)" msgstr "(krefst endurræsingar)" #: pdfarranger/pageutils.py:461 msgid "(same offset is applied to all pages)" msgstr "(sömu hliðrun er beitt á allar síður)" #: pdfarranger/pdfarranger.py:1130 #, python-format msgid "A file named \"%s\" already exists. Do you want to replace it?" msgstr "Það er þegar til skrá sem heitir \"%s\". Viltu skipta henni út?" #: data/menu.ui:189 data/menu.ui:332 msgid "All From _Same File" msgstr "Allt úr _sömu skrá" #: pdfarranger/pdfarranger.py:507 msgid "All files" msgstr "Allar skrár" #: pdfarranger/pdfarranger.py:462 msgid "All pages must have the same size." msgstr "Allar síður verða að hafa sömu stærð." #: pdfarranger/pdfarranger.py:495 msgid "All supported files" msgstr "Allar studdar skrár" #: pdfarranger/pageutils.py:149 msgid "Bottom" msgstr "Neðst" #: pdfarranger/pageutils.py:380 msgid "Bottom to Top" msgstr "Neðan og upp" #: pdfarranger/core.py:386 msgid "Clipboard image" msgstr "Mynd á klippispjaldi" #: pdfarranger/pageutils.py:363 pdfarranger/splitter.py:60 msgid "Columns" msgstr "Dálkar" #: pdfarranger/metadata.py:48 msgid "Created" msgstr "Búið til" #: pdfarranger/metadata.py:46 msgid "Creator" msgstr "Höfundur" #: pdfarranger/metadata.py:47 msgid "Creator tool" msgstr "Verkfæri fyrir hönnuði" #: pdfarranger/pageutils.py:153 msgid "Crop Margins" msgstr "Skera utan af spássíum" #: data/menu.ui:104 data/menu.ui:365 msgid "Crop White Borders" msgstr "Skera af hvíta jaðra" #: pdfarranger/pageutils.py:161 msgid "" "Cropping does not remove any content from the PDF file, it only hides it." msgstr "" "Utanskurður fjarlægir ekki neitt efni úr PDF-skránni, það er einungis falið." #: data/menu.ui:128 data/menu.ui:264 msgid "Cu_t" msgstr "_Klippa" #: pdfarranger/pdfarranger.py:1250 msgid "Despite the warnings the document(s) should have no visible issues." msgstr "" "Þrátt fyrir aðvaranirnar er skjalið/skölin ekki með nein sýnileg vandamál." #: pdfarranger/pdfarranger.py:979 msgid "Discard changes and close?" msgstr "Henda breytingum og loka?" #: pdfarranger/pdfarranger.py:1016 msgid "Discard changes and quit?" msgstr "Henda breytingum og hætta?" #: pdfarranger/exporter.py:194 msgid "Do not show this dialog again." msgstr "Ekki sýna þennan glugga aftur." #: pdfarranger/pdfarranger.py:970 msgid "Do_n’t Save" msgstr "E_kki vista" #: pdfarranger/pdfarranger.py:1257 msgid "Don't show warnings when saving again." msgstr "Ekki birta neinar aðvaranir aftur við vistun." #: data/menu.ui:112 data/menu.ui:369 msgid "Dupl_icate" msgstr "Tvíta_ka" #: data/menu.ui:52 data/menu.ui:395 msgid "E_xport" msgstr "Fl_ytja út" #: data/menu.ui:55 data/menu.ui:398 msgid "E_xport Selection to a Single File…" msgstr "Fl_ytja út valið í eina skrá…" #: data/menu.ui:228 msgid "Edit _Properties" msgstr "_Breyta eiginleikum" #: pdfarranger/metadata.py:198 msgid "Edit properties" msgstr "Breyta eiginleikum" #: pdfarranger/splitter.py:62 msgid "Equal column width" msgstr "Jöfn breidd dálka" #: pdfarranger/splitter.py:62 msgid "Equal row height" msgstr "Jöfn hæð raða" #: data/menu.ui:60 data/menu.ui:403 msgid "Export Selection to _Individual Files…" msgstr "Flyt_ja út valið í stakar skrár…" #: data/menu.ui:65 data/menu.ui:408 msgid "Export _All Pages to Individual Files…" msgstr "Flytja út _allar síður í stakar skrár…" #: pdfarranger/pdfarranger.py:1088 msgid "Export…" msgstr "Flytja út…" #: pdfarranger/core.py:388 pdfarranger/pdfarranger.py:1504 msgid "File is neither pdf nor image" msgstr "Skráin er hvorki PDF-skrá né mynd" #: pdfarranger/pdfarranger.py:301 msgid "File(s) to open" msgstr "Skrá(r) til að opna" #: pdfarranger/config.py:237 msgid "For more options see:" msgstr "Fyrir fleiri valkosti skaltu skoða:" #: pdfarranger/exporter.py:192 msgid "Forms and outlines are lost on saving." msgstr "Útfyllingarform og efnisskipan tapast við vistun." #: data/menu.ui:221 msgid "Full_screen" msgstr "_Skjáfylli" #: pdfarranger/pdfarranger.py:2562 msgid "GNU General Public License (GPL) Version 3." msgstr "GNU General Public notkunarleyfið útgáfa 3." #: data/menu.ui:160 data/menu.ui:389 msgid "Generate Booklet" msgstr "Útbúa bækling" #: pdfarranger/pageutils.py:236 pdfarranger/pageutils.py:240 #: pdfarranger/pageutils.py:328 msgid "Height" msgstr "Hæð" #: pdfarranger/splitter.py:88 msgid "Height in %" msgstr "Hæð í %" #: pdfarranger/pageutils.py:375 msgid "Horizontal" msgstr "Lárétt" #: pdfarranger/splitter.py:61 msgid "Horizontal Splits" msgstr "Klofið lárétt" #: pdfarranger/pageutils.py:476 msgid "Horizontal offset" msgstr "Lárétt hliðrun" #: pdfarranger/core.py:377 msgid "Image files are only supported with img2pdf" msgstr "Myndskrár eru einungis studdar í gegnum img2pdf" #: pdfarranger/core.py:383 msgid "Image format is not supported by img2pdf" msgstr "Myndskrársnið er ekki stutt af img2pdf" #: data/pdfarranger.ui:58 msgid "Import" msgstr "Flytja inn" #: pdfarranger/pdfarranger.py:1327 msgid "Import…" msgstr "Flytja inn…" #: data/menu.ui:156 data/menu.ui:385 msgid "Insert Blan_k Page…" msgstr "Set_ja inn auða síðu…" #: pdfarranger/pageutils.py:325 msgid "Insert Blank Page" msgstr "Setja inn auða síðu" #: pdfarranger/metadata.py:169 msgid "Invalid date format. Input discarded." msgstr "Ógilt dagsetningasnið. Inntaki hent." #: pdfarranger/pdfarranger.py:2551 #, python-format msgid "It uses libqpdf %s, pikepdf %s, GTK %s and Python %s." msgstr "Notar libqpdf %s, pikepdf %s, GTK %s og Python %s." #: pdfarranger/metadata.py:44 msgid "Keywords" msgstr "Stikkorð" #: pdfarranger/config.py:222 msgid "Language" msgstr "Tungumál" #: pdfarranger/pageutils.py:460 msgid "Layout for the first page in selection" msgstr "Framsetning fyrstu síðu í vali" #: pdfarranger/pageutils.py:149 msgid "Left" msgstr "Vinstri" #: pdfarranger/pageutils.py:377 msgid "Left to Right" msgstr "Vinstri til hægri" #: data/pdfarranger.ui:122 msgid "Main Menu" msgstr "Aðalvalmynd" #: pdfarranger/pdfarranger.py:2557 msgid "Maintainers and contributors" msgstr "Höfundar og önnur framlög" #: pdfarranger/pageutils.py:361 msgid "Margin" msgstr "Spássía" #: pdfarranger/pageutils.py:347 msgid "Merge Pages" msgstr "Sameina síður" #: pdfarranger/pageutils.py:412 msgid "Merged page size:" msgstr "Stærð á sameinaðri síðu:" #: pdfarranger/metadata.py:49 msgid "Modified" msgstr "Breytt" #: pdfarranger/pageutils.py:392 msgid "Non-uniform page size - using max size" msgstr "Ekki-einsleit blaðastærð - nota hámarksstærð" #: data/pdfarranger.ui:37 msgid "Open" msgstr "Opna" #: pdfarranger/pdfarranger.py:1186 msgid "Open…" msgstr "Opna..." #: pdfarranger/pageutils.py:436 msgid "Overlay" msgstr "Yfirlag" #: pdfarranger/pdfarranger.py:282 msgid "" "PDF Arranger is a small python-gtk application, which helps the user to " "merge or split pdf documents and rotate, crop and rearrange their pages " "using an interactive and intuitive graphical interface. It is a frontend for " "pikepdf." msgstr "" "PDF Arranger er lítið python-gtk forrit, sem hjálpar notandanum að sameina " "eða skipta upp PDF-skjölum, snúa síðum eða skera utan af þeim, allt í " "gagnvirku og auðveldu myndrænu viðmóti. Það er í grunninn aðgangsviðmót " "fyrir pikepdf." #: pdfarranger/pdfarranger.py:1498 msgid "PDF document is damaged" msgstr "PDF-skjal er skemmt" #: pdfarranger/pdfarranger.py:499 msgid "PDF files" msgstr "PDF-skrár" #: pdfarranger/pageutils.py:388 msgid "Page Order" msgstr "Síðuröð" #: pdfarranger/pageutils.py:241 msgid "Page Size" msgstr "Blaðsíðustærð" #: pdfarranger/pdfarranger.py:2585 msgid "Page Size:" msgstr "Blaðsíðustærð:" #: pdfarranger/pageutils.py:230 msgid "Page format" msgstr "Blaðsíðusnið" #: pdfarranger/core.py:285 msgid "Password" msgstr "Lykilorð" #: pdfarranger/core.py:263 msgid "Password required" msgstr "Lykilorð nauðsynlegt" #: data/menu.ui:277 msgid "Past_e Special" msgstr "Sérstök _líming" #: data/menu.ui:295 msgid "Paste As O_verlay…" msgstr "Líma sem _yfirlag…" #: data/menu.ui:151 data/menu.ui:290 msgid "Paste As _Even Pages" msgstr "Líma s_em jafntölusíður" #: data/menu.ui:146 data/menu.ui:285 msgid "Paste As _Odd Pages" msgstr "Líma sem _oddatölusíður" #: data/menu.ui:300 msgid "Paste As _Underlay…" msgstr "Líma sem _undirlag…" #: data/menu.ui:136 data/menu.ui:272 msgid "Paste _After" msgstr "Lím_a á eftir" #: data/menu.ui:141 data/menu.ui:280 msgid "Paste _Before" msgstr "Lí_ma á undan" #: pdfarranger/pdfarranger.py:1627 msgid "Pasted data not valid. Aborting paste." msgstr "Límd gögn ekki gild. Hætti við límingu." #: pdfarranger/pdfarranger.py:1589 msgid "Pikepdf >= 3 is needed for overlay/underlay/merge support." msgstr "" "Pikepdf >= 3 er nauðsynlegt fyrir stuðning við yfirlag/undirlag/sameiningu." #: data/menu.ui:234 msgid "Pre_ferences" msgstr "K_jörstillingar" #: pdfarranger/config.py:212 msgid "Preferences" msgstr "Kjörstillingar" #: pdfarranger/pdfarranger.py:293 msgid "Print the version of PDF Arranger and exit" msgstr "Birta upplýsingar um PDF Arranger og hætta" #: pdfarranger/exporter.py:457 msgid "Printing…" msgstr "Prenta..." #: pdfarranger/metadata.py:45 msgid "Producer" msgstr "Framleiðandi" #: pdfarranger/metadata.py:212 msgid "Property" msgstr "Eiginleiki" #: data/menu.ui:116 data/menu.ui:373 msgid "Re_verse Order" msgstr "Öfu_g röð" #: pdfarranger/pageutils.py:238 msgid "Relative" msgstr "Hlutfallslegt" #: pdfarranger/exporter.py:469 msgid "Rendering Preview…" msgstr "Myndgeri forskoðun…" #: pdfarranger/pdfarranger.py:732 msgid "Rendering…" msgstr "Myndgeri…" #: pdfarranger/pdfarranger.py:1132 msgid "Replace" msgstr "Skipta út" #: pdfarranger/pageutils.py:149 msgid "Right" msgstr "Hægri" #: pdfarranger/pageutils.py:378 msgid "Right to Left" msgstr "Hægri til vinstri" #: data/pdfarranger.ui:203 msgid "Rotate Left" msgstr "Snúa til vinstri" #: data/pdfarranger.ui:227 msgid "Rotate Right" msgstr "Snúa til hægri" #: data/menu.ui:90 data/menu.ui:351 msgid "Rotate _Left" msgstr "Snúa til _vinstri" #: pdfarranger/pageutils.py:364 pdfarranger/splitter.py:60 msgid "Rows" msgstr "Raðir" #: data/menu.ui:194 data/menu.ui:337 msgid "Same Page _Format" msgstr "Sama _blaðsíðusnið" #: data/pdfarranger.ui:78 msgid "Save" msgstr "Vista" #: data/pdfarranger.ui:97 msgid "Save As" msgstr "Vista sem" #: pdfarranger/pdfarranger.py:1088 msgid "Save As…" msgstr "Vista sem…" #: data/menu.ui:47 msgid "Save _As…" msgstr "Vist_a sem..." #: pdfarranger/pdfarranger.py:988 msgid "Save changes before closing?" msgstr "Vista breytingar áður en lokað er?" #: pdfarranger/pdfarranger.py:1025 msgid "Save changes before quitting?" msgstr "Vista breytingar áður en þú hættir?" #: pdfarranger/pdfarranger.py:985 msgid "Save changes to “{}” before closing?" msgstr "Vista breytingar á '{}' áður en lokað er?" #: pdfarranger/pdfarranger.py:1022 msgid "Save changes to “{}” before quitting?" msgstr "Vista breytingar á '{}' áður en þú hættir?" #: pdfarranger/pdfarranger.py:1249 msgid "Saving produced some warnings" msgstr "Vistun gaf einhverjar aðvaranir" #: pdfarranger/pdfarranger.py:1288 msgid "Saving…" msgstr "Vista…" #: pdfarranger/pageutils.py:116 msgid "Scale factor" msgstr "Kvörðunargildi" #: data/menu.ui:169 data/menu.ui:312 msgid "Select _All" msgstr "Velja _allt" #: data/menu.ui:184 data/menu.ui:327 msgid "Select _Even Pages" msgstr "V_elja jafntölusíður" #: data/menu.ui:179 data/menu.ui:322 msgid "Select _Odd Pages" msgstr "Velja _oddatölusíður" #: pdfarranger/pdfarranger.py:2580 msgid "Selected pages: " msgstr "Valdar síður:" #: pdfarranger/splitter.py:26 msgid "Split Pages" msgstr "Kljúfa síður" #: pdfarranger/metadata.py:43 msgid "Subject" msgstr "Viðfangsefni" #: pdfarranger/pdfarranger.py:512 msgid "Supported image files" msgstr "Studdar myndskrár" #: pdfarranger/config.py:248 pdfarranger/config.py:256 msgid "System setting" msgstr "Kerfisstilling" #: pdfarranger/core.py:275 msgid "" "The document “{}” is locked and requires a password before it can be opened." msgstr "Skjalið “{}” er læst, til að opna það þarf lykilorð." #: pdfarranger/core.py:274 msgid "The password will be remembered until you close PDF Arranger." msgstr "Lykilorðið er geymt þar til þú lokar PDF Arranger." #: pdfarranger/config.py:230 msgid "Theme" msgstr "Þema" #: pdfarranger/metadata.py:42 msgid "Title" msgstr "Titill" #: pdfarranger/pageutils.py:149 msgid "Top" msgstr "Efst" #: pdfarranger/pageutils.py:379 msgid "Top to Bottom" msgstr "Ofan og niður" #: pdfarranger/pageutils.py:436 msgid "Underlay" msgstr "Undirlag" #: pdfarranger/core.py:361 pdfarranger/pdfarranger.py:1494 msgid "Unknown file format" msgstr "Óþekkt skráarsnið" #: pdfarranger/metadata.py:212 msgid "Value" msgstr "Gildi" #: pdfarranger/pageutils.py:376 msgid "Vertical" msgstr "Lóðrétt" #: pdfarranger/splitter.py:61 msgid "Vertical Splits" msgstr "Klofið lóðrétt" #: pdfarranger/pageutils.py:478 msgid "Vertical offset" msgstr "Lóðrétt hliðrun" #: pdfarranger/exporter.py:187 msgid "Warning" msgstr "Aðvörun" #: pdfarranger/pageutils.py:235 pdfarranger/pageutils.py:239 #: pdfarranger/pageutils.py:327 msgid "Width" msgstr "Breidd" #: pdfarranger/splitter.py:88 msgid "Width in %" msgstr "Breidd í %" #: pdfarranger/pdfarranger.py:969 msgid "Your changes will be lost if you don’t save them." msgstr "Breytingarnar þínar tapast ef þú vistar þær ekki." #: data/pdfarranger.ui:144 msgid "Zoom In" msgstr "Renna að" #: data/pdfarranger.ui:167 msgid "Zoom Out" msgstr "Renna frá" #: data/menu.ui:217 msgid "Zoom _Fit" msgstr "Aðdráttur svo _passi" #: data/menu.ui:209 msgid "Zoom _In" msgstr "Renna _að" #: data/menu.ui:213 msgid "Zoom _Out" msgstr "Renna _frá" #: data/menu.ui:240 msgid "_About" msgstr "_Um hugbúnaðinn" #: pdfarranger/config.py:216 pdfarranger/pageutils.py:219 #: pdfarranger/pdfarranger.py:961 pdfarranger/pdfarranger.py:970 #: pdfarranger/pdfarranger.py:1094 pdfarranger/pdfarranger.py:1144 msgid "_Cancel" msgstr "_Hætta við" #: pdfarranger/pdfarranger.py:980 data/menu.ui:246 msgid "_Close" msgstr "_Loka" #: data/menu.ui:132 data/menu.ui:268 msgid "_Copy" msgstr "A_frita" #: data/menu.ui:108 data/menu.ui:260 msgid "_Delete" msgstr "_Eyða" #: data/menu.ui:174 data/menu.ui:317 msgid "_Deselect All" msgstr "A_fvelja allt" #: data/menu.ui:87 msgid "_Edit" msgstr "Br_eyta" #: data/menu.ui:30 msgid "_Import" msgstr "Flytja _inn" #: data/menu.ui:199 data/menu.ui:342 msgid "_Invert Selection" msgstr "Snúa vali v_ið" #: data/menu.ui:124 data/menu.ui:381 msgid "_Merge Pages…" msgstr "Sa_meina síður…" #: data/menu.ui:36 msgid "_New Window" msgstr "_Nýr gluggi" #: pdfarranger/config.py:217 pdfarranger/pageutils.py:220 msgid "_OK" msgstr "Í _lagi" #: pdfarranger/pdfarranger.py:1143 data/menu.ui:24 msgid "_Open" msgstr "_Opna" #: data/menu.ui:100 data/menu.ui:361 msgid "_Page Format…" msgstr "_Blaðsíðusnið…" #: data/menu.ui:71 msgid "_Print…" msgstr "_Prenta…" #: pdfarranger/pdfarranger.py:1017 data/menu.ui:252 msgid "_Quit" msgstr "_Hætta" #: data/menu.ui:82 msgid "_Redo" msgstr "Endu_rtaka" #: data/menu.ui:95 data/menu.ui:356 msgid "_Rotate Right" msgstr "Snúa til _hægri" #: pdfarranger/pdfarranger.py:970 pdfarranger/pdfarranger.py:1093 #: data/menu.ui:42 msgid "_Save" msgstr "Vi_sta" #: data/menu.ui:166 data/menu.ui:309 msgid "_Select" msgstr "_Velja" #: data/menu.ui:120 data/menu.ui:377 msgid "_Split Pages…" msgstr "_Kljúfa síður…" #: data/menu.ui:78 msgid "_Undo" msgstr "Aft_urkalla" #: data/menu.ui:206 msgid "_View" msgstr "S_koða" #: pdfarranger/pageutils.py:139 pdfarranger/pageutils.py:362 #: pdfarranger/pageutils.py:412 msgid "mm" msgstr "mm" #: pdfarranger/core.py:89 msgid "page" msgstr "síða" #: pdfarranger/pdfarranger.py:811 msgid "untitled" msgstr "ónefnt" pdfarranger-1.10.1/po/it.po000066400000000000000000000424301451252235000154610ustar00rootroot00000000000000# Italian translation of pdfarranger # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the pdfarranger package. # # Massimo Pissarello , 2022, 2023. msgid "" msgstr "" "Project-Id-Version: pdfarranger master\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-04-29 22:45+0200\n" "PO-Revision-Date: 2023-05-01 20:12+0200\n" "Last-Translator: Massimo Pissarello \n" "Language-Team: Italian <>\n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Lokalize 23.04.0\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: pdfarranger/splitter.py:87 msgid "#Col" msgstr "#Col" #: pdfarranger/splitter.py:87 msgid "#Row" msgstr "#Rig" #: pdfarranger/pageutils.py:122 pdfarranger/pageutils.py:477 #: pdfarranger/pageutils.py:479 msgid "%" msgstr "%" #: pdfarranger/pageutils.py:170 #, python-format msgid "% of height" msgstr "% in altezza" #: pdfarranger/pageutils.py:170 #, python-format msgid "% of width" msgstr "% in larghezza" #: pdfarranger/pdfarranger.py:2548 #, python-format msgid "%s is a tool for rearranging and modifying PDF files." msgstr "%s è uno strumento per riorganizzare e modificare i file PDF." #: pdfarranger/config.py:232 msgid "(Libhandy missing)" msgstr "(Libhandy mancante)" #: pdfarranger/config.py:224 msgid "(Requires restart)" msgstr "(Richiede riavvio)" #: pdfarranger/pageutils.py:461 msgid "(same offset is applied to all pages)" msgstr "(stesso spostamento per tutte le pagine)" #: pdfarranger/pdfarranger.py:1130 #, python-format msgid "A file named \"%s\" already exists. Do you want to replace it?" msgstr "Esiste già un file denominato \"%s\". Vuoi sostituirlo?" #: data/menu.ui:189 data/menu.ui:332 msgid "All From _Same File" msgstr "Tutto dallo _stesso file" #: pdfarranger/pdfarranger.py:507 msgid "All files" msgstr "Tutti i file" #: pdfarranger/pdfarranger.py:462 msgid "All pages must have the same size." msgstr "Tutte le pagine devono avere le stesse dimensioni." #: pdfarranger/pdfarranger.py:495 msgid "All supported files" msgstr "Tutti i file supportati" #: pdfarranger/pageutils.py:149 msgid "Bottom" msgstr "Basso" #: pdfarranger/pageutils.py:380 msgid "Bottom to Top" msgstr "Dal basso verso l'alto" #: pdfarranger/core.py:386 msgid "Clipboard image" msgstr "Immagine appunti" #: pdfarranger/pageutils.py:363 pdfarranger/splitter.py:60 msgid "Columns" msgstr "Colonne" #: pdfarranger/metadata.py:48 msgid "Created" msgstr "Creato il" #: pdfarranger/metadata.py:46 msgid "Creator" msgstr "Autore" #: pdfarranger/metadata.py:47 msgid "Creator tool" msgstr "Applicazione" #: pdfarranger/pageutils.py:153 msgid "Crop Margins" msgstr "Taglia margini" #: data/menu.ui:104 data/menu.ui:365 msgid "Crop White Borders" msgstr "Ritaglia bordi bianchi" #: pdfarranger/pageutils.py:161 msgid "" "Cropping does not remove any content from the PDF file, it only hides it." msgstr "" "Il ritaglio non rimuove alcun contenuto dal file PDF, lo nasconde solo." #: data/menu.ui:128 data/menu.ui:264 msgid "Cu_t" msgstr "_Taglia" #: pdfarranger/pdfarranger.py:1250 msgid "Despite the warnings the document(s) should have no visible issues." msgstr "" "Nonostante gli avvertimenti, i documenti non dovrebbero avere problemi " "visibili." #: pdfarranger/pdfarranger.py:979 msgid "Discard changes and close?" msgstr "Scartare le modifiche e chiudere?" #: pdfarranger/pdfarranger.py:1016 msgid "Discard changes and quit?" msgstr "Annullare le modifiche e uscire?" #: pdfarranger/exporter.py:194 msgid "Do not show this dialog again." msgstr "Non mostrare più questo messaggio." #: pdfarranger/pdfarranger.py:970 msgid "Do_n’t Save" msgstr "_Non salvare" #: pdfarranger/pdfarranger.py:1257 msgid "Don't show warnings when saving again." msgstr "Non mostrare avvertimenti quando salvi di nuovo." #: data/menu.ui:112 data/menu.ui:369 msgid "Dupl_icate" msgstr "Dupl_ica" #: data/menu.ui:52 data/menu.ui:395 msgid "E_xport" msgstr "E_sporta" #: data/menu.ui:55 data/menu.ui:398 msgid "E_xport Selection to a Single File…" msgstr "Es_porta selezione su un singolo file..." #: data/menu.ui:228 msgid "Edit _Properties" msgstr "Modifica _proprietà" #: pdfarranger/metadata.py:198 msgid "Edit properties" msgstr "Modifica proprietà" #: pdfarranger/splitter.py:62 msgid "Equal column width" msgstr "Uguale larghezza della colonna" #: pdfarranger/splitter.py:62 msgid "Equal row height" msgstr "Uguale altezza della riga" #: data/menu.ui:60 data/menu.ui:403 msgid "Export Selection to _Individual Files…" msgstr "Esporta selezione in singoli _file..." #: data/menu.ui:65 data/menu.ui:408 msgid "Export _All Pages to Individual Files…" msgstr "Esporta _tutte le pagine in singoli file..." #: pdfarranger/pdfarranger.py:1088 msgid "Export…" msgstr "Esporta…" #: pdfarranger/core.py:388 pdfarranger/pdfarranger.py:1504 msgid "File is neither pdf nor image" msgstr "Il file non è un pdf o una immagine" #: pdfarranger/pdfarranger.py:301 msgid "File(s) to open" msgstr "File da aprire" #: pdfarranger/config.py:237 msgid "For more options see:" msgstr "Per ulteriori opzioni vedi:" #: pdfarranger/exporter.py:192 msgid "Forms and outlines are lost on saving." msgstr "Moduli e contorni vengono persi durante il salvataggio." #: data/menu.ui:221 msgid "Full_screen" msgstr "Schermo intero" #: pdfarranger/pdfarranger.py:2562 msgid "GNU General Public License (GPL) Version 3." msgstr "GNU General Public License (GPL) Version 3." #: data/menu.ui:160 data/menu.ui:389 msgid "Generate Booklet" msgstr "Genera libretto" #: pdfarranger/pageutils.py:236 pdfarranger/pageutils.py:240 #: pdfarranger/pageutils.py:328 msgid "Height" msgstr "Altezza" #: pdfarranger/splitter.py:88 msgid "Height in %" msgstr "Altezza in %" #: pdfarranger/pageutils.py:375 msgid "Horizontal" msgstr "Orizzontale" #: pdfarranger/splitter.py:61 msgid "Horizontal Splits" msgstr "Divisioni orizzontali" #: pdfarranger/pageutils.py:476 msgid "Horizontal offset" msgstr "Spostamento orizzontale" #: pdfarranger/core.py:377 msgid "Image files are only supported with img2pdf" msgstr "I file di immagine sono supportati solo con img2pdf" #: pdfarranger/core.py:383 msgid "Image format is not supported by img2pdf" msgstr "Il formato dell'immagine non è supportato da img2pdf" #: data/pdfarranger.ui:58 msgid "Import" msgstr "Importa" #: pdfarranger/pdfarranger.py:1327 msgid "Import…" msgstr "Importa…" #: data/menu.ui:156 data/menu.ui:385 msgid "Insert Blan_k Page…" msgstr "Inserisci pagi_na vuota…" #: pdfarranger/pageutils.py:325 msgid "Insert Blank Page" msgstr "Inserisci pagina vuota" #: pdfarranger/metadata.py:169 msgid "Invalid date format. Input discarded." msgstr "Formato data non valido. Input scartato." #: pdfarranger/pdfarranger.py:2551 #, python-format msgid "It uses libqpdf %s, pikepdf %s, GTK %s and Python %s." msgstr "Utilizza libqpdf %s, pikepdf %s, GTK %s e Python %s." #: pdfarranger/metadata.py:44 msgid "Keywords" msgstr "Parole chiave" #: pdfarranger/config.py:222 msgid "Language" msgstr "Lingua" #: pdfarranger/pageutils.py:460 msgid "Layout for the first page in selection" msgstr "Disposizione per la prima pagina nella selezione" #: pdfarranger/pageutils.py:149 msgid "Left" msgstr "Sinistra" #: pdfarranger/pageutils.py:377 msgid "Left to Right" msgstr "Da sinistra a destra" #: data/pdfarranger.ui:122 msgid "Main Menu" msgstr "Menu principale" #: pdfarranger/pdfarranger.py:2557 msgid "Maintainers and contributors" msgstr "Manutentori e collaboratori" #: pdfarranger/pageutils.py:361 msgid "Margin" msgstr "Margine" #: pdfarranger/pageutils.py:347 msgid "Merge Pages" msgstr "Unisci pagine" #: pdfarranger/pageutils.py:412 msgid "Merged page size:" msgstr "Dimensione pagine unite:" #: pdfarranger/metadata.py:49 msgid "Modified" msgstr "Modificato" #: pdfarranger/pageutils.py:392 msgid "Non-uniform page size - using max size" msgstr "" "Dimensioni della pagina non uniformi: utilizzo della dimensione massima" #: data/pdfarranger.ui:37 msgid "Open" msgstr "Apri" #: pdfarranger/pdfarranger.py:1186 msgid "Open…" msgstr "Apri…" #: pdfarranger/pageutils.py:436 msgid "Overlay" msgstr "Sovrastante" #: pdfarranger/pdfarranger.py:282 msgid "" "PDF Arranger is a small python-gtk application, which helps the user to " "merge or split pdf documents and rotate, crop and rearrange their pages " "using an interactive and intuitive graphical interface. It is a frontend for " "pikepdf." msgstr "" "PDF Arranger è una piccola applicazione python-gtk che aiuta l'utente a " "unire o dividere documenti pdf e a ruotare, ritagliare e riordinare le loro " "pagine utilizzando un'interattiva interfaccia grafica intuitiva È un " "frontend per pikepdf." #: pdfarranger/pdfarranger.py:1498 msgid "PDF document is damaged" msgstr "Il documento PDF è danneggiato" #: pdfarranger/pdfarranger.py:499 msgid "PDF files" msgstr "File PDF" #: pdfarranger/pageutils.py:388 msgid "Page Order" msgstr "Ordine pagine" #: pdfarranger/pageutils.py:241 msgid "Page Size" msgstr "Dimensione pagina" #: pdfarranger/pdfarranger.py:2585 msgid "Page Size:" msgstr "Dimensioni pagina:" #: pdfarranger/pageutils.py:230 msgid "Page format" msgstr "Formato pagina" #: pdfarranger/core.py:285 msgid "Password" msgstr "Password" #: pdfarranger/core.py:263 msgid "Password required" msgstr "Password richiesta" #: data/menu.ui:277 msgid "Past_e Special" msgstr "Incolla specia_le" #: data/menu.ui:295 msgid "Paste As O_verlay…" msgstr "Incolla come _sovrastante..." #: data/menu.ui:151 data/menu.ui:290 msgid "Paste As _Even Pages" msgstr "Incolla come pa_gine pari" #: data/menu.ui:146 data/menu.ui:285 msgid "Paste As _Odd Pages" msgstr "Incolla come pagi_ne dispari" #: data/menu.ui:300 msgid "Paste As _Underlay…" msgstr "Incolla come so_ttostante..." #: data/menu.ui:136 data/menu.ui:272 msgid "Paste _After" msgstr "Incolla _dopo" #: data/menu.ui:141 data/menu.ui:280 msgid "Paste _Before" msgstr "Incolla _prima" #: pdfarranger/pdfarranger.py:1627 msgid "Pasted data not valid. Aborting paste." msgstr "Dati incollati non validi. Incolla annullato." #: pdfarranger/pdfarranger.py:1589 msgid "Pikepdf >= 3 is needed for overlay/underlay/merge support." msgstr "" "Pikepdf >= 3 è necessario per il supporto sovrastante/sottostante/unione." #: data/menu.ui:234 msgid "Pre_ferences" msgstr "Pre_ferenze" #: pdfarranger/config.py:212 msgid "Preferences" msgstr "Preferenze" #: pdfarranger/pdfarranger.py:293 msgid "Print the version of PDF Arranger and exit" msgstr "Stampa la versione di PDF Arranger ed esci" #: pdfarranger/exporter.py:457 msgid "Printing…" msgstr "Stampa…" #: pdfarranger/metadata.py:45 msgid "Producer" msgstr "Produttore" #: pdfarranger/metadata.py:212 msgid "Property" msgstr "Proprietà" #: data/menu.ui:116 data/menu.ui:373 msgid "Re_verse Order" msgstr "In_verti ordine" #: pdfarranger/pageutils.py:238 msgid "Relative" msgstr "Relativa" #: pdfarranger/exporter.py:469 msgid "Rendering Preview…" msgstr "Anteprima di rendering..." #: pdfarranger/pdfarranger.py:732 msgid "Rendering…" msgstr "Rendering…" #: pdfarranger/pdfarranger.py:1132 msgid "Replace" msgstr "Sostituisci" #: pdfarranger/pageutils.py:149 msgid "Right" msgstr "Destra" #: pdfarranger/pageutils.py:378 msgid "Right to Left" msgstr "Da destra a sinistra" #: data/pdfarranger.ui:203 msgid "Rotate Left" msgstr "Ruota a sinistra" #: data/pdfarranger.ui:227 msgid "Rotate Right" msgstr "Ruota a destra" #: data/menu.ui:90 data/menu.ui:351 msgid "Rotate _Left" msgstr "Ruota a _sinistra" #: pdfarranger/pageutils.py:364 pdfarranger/splitter.py:60 msgid "Rows" msgstr "Righe" #: data/menu.ui:194 data/menu.ui:337 msgid "Same Page _Format" msgstr "Stesso formato _di pagina" #: data/pdfarranger.ui:78 msgid "Save" msgstr "Salva" #: data/pdfarranger.ui:97 msgid "Save As" msgstr "Salva come" #: pdfarranger/pdfarranger.py:1088 msgid "Save As…" msgstr "Salva come…" #: data/menu.ui:47 msgid "Save _As…" msgstr "S_alva come…" #: pdfarranger/pdfarranger.py:988 msgid "Save changes before closing?" msgstr "Salvare le modifiche prima di chiudere?" #: pdfarranger/pdfarranger.py:1025 msgid "Save changes before quitting?" msgstr "Salvare le modifiche prima di uscire?" #: pdfarranger/pdfarranger.py:985 msgid "Save changes to “{}” before closing?" msgstr "Salvare le modifiche in \"{}\" prima della chiusura?" #: pdfarranger/pdfarranger.py:1022 msgid "Save changes to “{}” before quitting?" msgstr "Salvare le modifiche in \"{}\" prima di uscire? " #: pdfarranger/pdfarranger.py:1249 msgid "Saving produced some warnings" msgstr "Il salvataggio ha prodotto alcuni avvertimenti" #: pdfarranger/pdfarranger.py:1288 msgid "Saving…" msgstr "Salvataggio…" #: pdfarranger/pageutils.py:116 msgid "Scale factor" msgstr "Ridimensionamento" #: data/menu.ui:169 data/menu.ui:312 msgid "Select _All" msgstr "Seleziona _tutto" #: data/menu.ui:184 data/menu.ui:327 msgid "Select _Even Pages" msgstr "Seleziona pagine _pari" #: data/menu.ui:179 data/menu.ui:322 msgid "Select _Odd Pages" msgstr "Seleziona pagine _dispari" #: pdfarranger/pdfarranger.py:2580 msgid "Selected pages: " msgstr "Pagine selezionate: " #: pdfarranger/splitter.py:26 msgid "Split Pages" msgstr "Dividi pagine" #: pdfarranger/metadata.py:43 msgid "Subject" msgstr "Oggetto" #: pdfarranger/pdfarranger.py:512 msgid "Supported image files" msgstr "File di immagine supportati" #: pdfarranger/config.py:248 pdfarranger/config.py:256 msgid "System setting" msgstr "Impostazioni di sistema" #: pdfarranger/core.py:275 msgid "" "The document “{}” is locked and requires a password before it can be opened." msgstr "" "Il documento “{}” è bloccato e richiede una password prima di poter essere " "aperto." #: pdfarranger/core.py:274 msgid "The password will be remembered until you close PDF Arranger." msgstr "La password verrà ricordata fino alla chiusura di PDF Arranger." #: pdfarranger/config.py:230 msgid "Theme" msgstr "Tema" #: pdfarranger/metadata.py:42 msgid "Title" msgstr "Titolo" #: pdfarranger/pageutils.py:149 msgid "Top" msgstr "Alto" #: pdfarranger/pageutils.py:379 msgid "Top to Bottom" msgstr "Dall'alto al basso" #: pdfarranger/pageutils.py:436 msgid "Underlay" msgstr "Sottostante" #: pdfarranger/core.py:361 pdfarranger/pdfarranger.py:1494 msgid "Unknown file format" msgstr "Formato file sconosciuto" #: pdfarranger/metadata.py:212 msgid "Value" msgstr "Valore" #: pdfarranger/pageutils.py:376 msgid "Vertical" msgstr "Verticale" #: pdfarranger/splitter.py:61 msgid "Vertical Splits" msgstr "Divisioni verticali" #: pdfarranger/pageutils.py:478 msgid "Vertical offset" msgstr "Spostamento verticale" #: pdfarranger/exporter.py:187 msgid "Warning" msgstr "Avvertimento" #: pdfarranger/pageutils.py:235 pdfarranger/pageutils.py:239 #: pdfarranger/pageutils.py:327 msgid "Width" msgstr "Larghezza" #: pdfarranger/splitter.py:88 msgid "Width in %" msgstr "Larghezza in %" #: pdfarranger/pdfarranger.py:969 msgid "Your changes will be lost if you don’t save them." msgstr "Le modifiche andranno perse se non le salvi." #: data/pdfarranger.ui:144 msgid "Zoom In" msgstr "Zoom avanti" #: data/pdfarranger.ui:167 msgid "Zoom Out" msgstr "Zoom indietro" #: data/menu.ui:217 msgid "Zoom _Fit" msgstr "Zoom _adattivo" #: data/menu.ui:209 msgid "Zoom _In" msgstr "Zoom a_vanti" #: data/menu.ui:213 msgid "Zoom _Out" msgstr "Zoom in_dietro" #: data/menu.ui:240 msgid "_About" msgstr "Informazioni _su" #: pdfarranger/config.py:216 pdfarranger/pageutils.py:219 #: pdfarranger/pdfarranger.py:961 pdfarranger/pdfarranger.py:970 #: pdfarranger/pdfarranger.py:1094 pdfarranger/pdfarranger.py:1144 msgid "_Cancel" msgstr "_Annulla" #: pdfarranger/pdfarranger.py:980 data/menu.ui:246 msgid "_Close" msgstr "_Chiudi" #: data/menu.ui:132 data/menu.ui:268 msgid "_Copy" msgstr "_Copia" #: data/menu.ui:108 data/menu.ui:260 msgid "_Delete" msgstr "_Elimina" #: data/menu.ui:174 data/menu.ui:317 msgid "_Deselect All" msgstr "_Deseleziona tutto" #: data/menu.ui:87 msgid "_Edit" msgstr "_Modifica" #: data/menu.ui:30 msgid "_Import" msgstr "_Importa" #: data/menu.ui:199 data/menu.ui:342 msgid "_Invert Selection" msgstr "_Inverti selezione" #: data/menu.ui:124 data/menu.ui:381 msgid "_Merge Pages…" msgstr "_Unisci pagine..." #: data/menu.ui:36 msgid "_New Window" msgstr "_Nuova finestra" #: pdfarranger/config.py:217 pdfarranger/pageutils.py:220 msgid "_OK" msgstr "_OK" #: pdfarranger/pdfarranger.py:1143 data/menu.ui:24 msgid "_Open" msgstr "_Apri" #: data/menu.ui:100 data/menu.ui:361 msgid "_Page Format…" msgstr "Formato _pagina…" #: data/menu.ui:71 msgid "_Print…" msgstr "_Stampa…" #: pdfarranger/pdfarranger.py:1017 data/menu.ui:252 msgid "_Quit" msgstr "_Esci" #: data/menu.ui:82 msgid "_Redo" msgstr "_Ripristina" #: data/menu.ui:95 data/menu.ui:356 msgid "_Rotate Right" msgstr "Ruota a _destra" #: pdfarranger/pdfarranger.py:970 pdfarranger/pdfarranger.py:1093 #: data/menu.ui:42 msgid "_Save" msgstr "_Salva" #: data/menu.ui:166 data/menu.ui:309 msgid "_Select" msgstr "_Seleziona" #: data/menu.ui:120 data/menu.ui:377 msgid "_Split Pages…" msgstr "Dividi pa_gine…" #: data/menu.ui:78 msgid "_Undo" msgstr "_Annulla" #: data/menu.ui:206 msgid "_View" msgstr "_Visualizza" #: pdfarranger/pageutils.py:139 pdfarranger/pageutils.py:362 #: pdfarranger/pageutils.py:412 msgid "mm" msgstr "mm" #: pdfarranger/core.py:89 msgid "page" msgstr "pagina" #: pdfarranger/pdfarranger.py:811 msgid "untitled" msgstr "senza titolo" pdfarranger-1.10.1/po/ja.po000066400000000000000000000424551451252235000154460ustar00rootroot00000000000000# Japanese translation for pdfarranger. # Copyright (C) 2008-2017 Konstantinos Poulios # Copyright (C) 2018-2022 pdfarranger's COPYRIGHT HOLDER # This file is distributed under the same license as the pdfarranger package. # Toshiharu Kudoh , 2010. # sicklylife , 2019-2022. # msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-04-29 22:45+0200\n" "PO-Revision-Date: 2022-09-01 00:40+0900\n" "Last-Translator: sicklylife \n" "Language-Team: Japanese\n" "Language: ja\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" #: pdfarranger/splitter.py:87 msgid "#Col" msgstr "#列" #: pdfarranger/splitter.py:87 msgid "#Row" msgstr "#行" #: pdfarranger/pageutils.py:122 pdfarranger/pageutils.py:477 #: pdfarranger/pageutils.py:479 msgid "%" msgstr "%" #: pdfarranger/pageutils.py:170 #, python-format msgid "% of height" msgstr "% (高さ)" #: pdfarranger/pageutils.py:170 #, python-format msgid "% of width" msgstr "% (幅)" #: pdfarranger/pdfarranger.py:2548 #, python-format msgid "%s is a tool for rearranging and modifying PDF files." msgstr "" "%s は PDF ファイルの内容の追加や削除、順序の入れ替えやその他のちょっとした変" "更を行うためのツールです。" #: pdfarranger/config.py:232 msgid "(Libhandy missing)" msgstr "" #: pdfarranger/config.py:224 msgid "(Requires restart)" msgstr "" #: pdfarranger/pageutils.py:461 msgid "(same offset is applied to all pages)" msgstr "" #: pdfarranger/pdfarranger.py:1130 #, python-format msgid "A file named \"%s\" already exists. Do you want to replace it?" msgstr "" #: data/menu.ui:189 data/menu.ui:332 msgid "All From _Same File" msgstr "同じファイルのページ(_S)" #: pdfarranger/pdfarranger.py:507 msgid "All files" msgstr "すべてのファイル" #: pdfarranger/pdfarranger.py:462 msgid "All pages must have the same size." msgstr "すべてのページが同じサイズである必要があります。" #: pdfarranger/pdfarranger.py:495 msgid "All supported files" msgstr "サポートしているすべてのファイル" #: pdfarranger/pageutils.py:149 msgid "Bottom" msgstr "下" #: pdfarranger/pageutils.py:380 msgid "Bottom to Top" msgstr "" #: pdfarranger/core.py:386 msgid "Clipboard image" msgstr "クリップボードの画像" #: pdfarranger/pageutils.py:363 pdfarranger/splitter.py:60 msgid "Columns" msgstr "列" #: pdfarranger/metadata.py:48 msgid "Created" msgstr "作成日時" #: pdfarranger/metadata.py:46 msgid "Creator" msgstr "作成" #: pdfarranger/metadata.py:47 msgid "Creator tool" msgstr "作成ツール" #: pdfarranger/pageutils.py:153 msgid "Crop Margins" msgstr "余白のトリミング" #: data/menu.ui:104 data/menu.ui:365 msgid "Crop White Borders" msgstr "白枠をトリミング" #: pdfarranger/pageutils.py:161 msgid "" "Cropping does not remove any content from the PDF file, it only hides it." msgstr "" "トリミングは PDF ファイルから内容自体は削除せずに、指定部分を見えなくします。" #: data/menu.ui:128 data/menu.ui:264 msgid "Cu_t" msgstr "切り取り(_T)" #: pdfarranger/pdfarranger.py:1250 msgid "Despite the warnings the document(s) should have no visible issues." msgstr "警告はありましたが見た目に問題はないはずです。" #: pdfarranger/pdfarranger.py:979 msgid "Discard changes and close?" msgstr "変更内容を破棄して閉じますか?" #: pdfarranger/pdfarranger.py:1016 msgid "Discard changes and quit?" msgstr "変更内容を破棄して終了しますか?" #: pdfarranger/exporter.py:194 msgid "Do not show this dialog again." msgstr "今後このダイアログを表示しない" #: pdfarranger/pdfarranger.py:970 msgid "Do_n’t Save" msgstr "保存しない(_N)" #: pdfarranger/pdfarranger.py:1257 msgid "Don't show warnings when saving again." msgstr "" #: data/menu.ui:112 data/menu.ui:369 msgid "Dupl_icate" msgstr "複製(_I)" #: data/menu.ui:52 data/menu.ui:395 msgid "E_xport" msgstr "エクスポート(_X)" #: data/menu.ui:55 data/menu.ui:398 msgid "E_xport Selection to a Single File…" msgstr "選択したものを単一のファイルにエクスポート(_X)…" #: data/menu.ui:228 msgid "Edit _Properties" msgstr "プロパティを編集(_P)" #: pdfarranger/metadata.py:198 msgid "Edit properties" msgstr "プロパティを編集" #: pdfarranger/splitter.py:62 msgid "Equal column width" msgstr "幅を均等にする" #: pdfarranger/splitter.py:62 msgid "Equal row height" msgstr "高さを均等にする" #: data/menu.ui:60 data/menu.ui:403 msgid "Export Selection to _Individual Files…" msgstr "選択したものを個別のファイルにエクスポート(_I)…" #: data/menu.ui:65 data/menu.ui:408 msgid "Export _All Pages to Individual Files…" msgstr "すべてのページを個別のファイルにエクスポート(_A)…" #: pdfarranger/pdfarranger.py:1088 msgid "Export…" msgstr "エクスポート…" #: pdfarranger/core.py:388 pdfarranger/pdfarranger.py:1504 msgid "File is neither pdf nor image" msgstr "ファイルが PDF でも画像でもありません" #: pdfarranger/pdfarranger.py:301 msgid "File(s) to open" msgstr "開くファイル" #: pdfarranger/config.py:237 msgid "For more options see:" msgstr "" #: pdfarranger/exporter.py:192 msgid "Forms and outlines are lost on saving." msgstr "フォームとアウトラインは保存時に失われます。" #: data/menu.ui:221 msgid "Full_screen" msgstr "フルスクリーン(_S)" #: pdfarranger/pdfarranger.py:2562 msgid "GNU General Public License (GPL) Version 3." msgstr "GNU General Public License (GPL) Version 3." #: data/menu.ui:160 data/menu.ui:389 msgid "Generate Booklet" msgstr "ブックレットを生成" #: pdfarranger/pageutils.py:236 pdfarranger/pageutils.py:240 #: pdfarranger/pageutils.py:328 msgid "Height" msgstr "高さ" #: pdfarranger/splitter.py:88 msgid "Height in %" msgstr "高さ (%)" #: pdfarranger/pageutils.py:375 msgid "Horizontal" msgstr "" #: pdfarranger/splitter.py:61 msgid "Horizontal Splits" msgstr "水平分割" #: pdfarranger/pageutils.py:476 msgid "Horizontal offset" msgstr "" #: pdfarranger/core.py:377 msgid "Image files are only supported with img2pdf" msgstr "画像ファイルは img2pdf でのみサポートしています" #: pdfarranger/core.py:383 msgid "Image format is not supported by img2pdf" msgstr "img2pdf がサポートしていない画像形式です" #: data/pdfarranger.ui:58 msgid "Import" msgstr "" #: pdfarranger/pdfarranger.py:1327 msgid "Import…" msgstr "インポート…" #: data/menu.ui:156 data/menu.ui:385 msgid "Insert Blan_k Page…" msgstr "空白ページを挿入(_K)…" #: pdfarranger/pageutils.py:325 msgid "Insert Blank Page" msgstr "空白ページを挿入" #: pdfarranger/metadata.py:169 msgid "Invalid date format. Input discarded." msgstr "日付の書式が正しくありません。破棄します。" #: pdfarranger/pdfarranger.py:2551 #, python-format msgid "It uses libqpdf %s, pikepdf %s, GTK %s and Python %s." msgstr "libqpdf %s、pikepdf %s、GTK %s、Python %s を使用しています。" #: pdfarranger/metadata.py:44 msgid "Keywords" msgstr "キーワード" #: pdfarranger/config.py:222 msgid "Language" msgstr "" #: pdfarranger/pageutils.py:460 msgid "Layout for the first page in selection" msgstr "" #: pdfarranger/pageutils.py:149 msgid "Left" msgstr "左" #: pdfarranger/pageutils.py:377 msgid "Left to Right" msgstr "" #: data/pdfarranger.ui:122 msgid "Main Menu" msgstr "メインメニュー" #: pdfarranger/pdfarranger.py:2557 msgid "Maintainers and contributors" msgstr "メンテナーと貢献者" #: pdfarranger/pageutils.py:361 msgid "Margin" msgstr "" #: pdfarranger/pageutils.py:347 msgid "Merge Pages" msgstr "" #: pdfarranger/pageutils.py:412 msgid "Merged page size:" msgstr "" #: pdfarranger/metadata.py:49 msgid "Modified" msgstr "更新日時" #: pdfarranger/pageutils.py:392 msgid "Non-uniform page size - using max size" msgstr "" #: data/pdfarranger.ui:37 msgid "Open" msgstr "開く" #: pdfarranger/pdfarranger.py:1186 msgid "Open…" msgstr "開く…" #: pdfarranger/pageutils.py:436 msgid "Overlay" msgstr "" #: pdfarranger/pdfarranger.py:282 msgid "" "PDF Arranger is a small python-gtk application, which helps the user to " "merge or split pdf documents and rotate, crop and rearrange their pages " "using an interactive and intuitive graphical interface. It is a frontend for " "pikepdf." msgstr "" "PDF Arranger は対話的かつ直感的なグラフィカルインターフェイスで PDF の分割や" "結合、ページの回転・トリミング・入れ替えを行うことができる、pikepdf のフロン" "トエンドとして動作する小さな python-gtk アプリケーションです。" #: pdfarranger/pdfarranger.py:1498 msgid "PDF document is damaged" msgstr "PDF 文書が破損しています" #: pdfarranger/pdfarranger.py:499 msgid "PDF files" msgstr "PDF ファイル" #: pdfarranger/pageutils.py:388 msgid "Page Order" msgstr "" #: pdfarranger/pageutils.py:241 msgid "Page Size" msgstr "ページサイズ" #: pdfarranger/pdfarranger.py:2585 msgid "Page Size:" msgstr "ページサイズ:" #: pdfarranger/pageutils.py:230 msgid "Page format" msgstr "ページのフォーマット" #: pdfarranger/core.py:285 msgid "Password" msgstr "パスワード" #: pdfarranger/core.py:263 msgid "Password required" msgstr "パスワードが必要です" #: data/menu.ui:277 msgid "Past_e Special" msgstr "特殊貼り付け(_E)" #: data/menu.ui:295 msgid "Paste As O_verlay…" msgstr "" #: data/menu.ui:151 data/menu.ui:290 msgid "Paste As _Even Pages" msgstr "偶数ページとして貼り付け(_E)" #: data/menu.ui:146 data/menu.ui:285 msgid "Paste As _Odd Pages" msgstr "奇数ページとして貼り付け(_O)" #: data/menu.ui:300 msgid "Paste As _Underlay…" msgstr "" #: data/menu.ui:136 data/menu.ui:272 msgid "Paste _After" msgstr "後に貼り付け(_A)" #: data/menu.ui:141 data/menu.ui:280 msgid "Paste _Before" msgstr "前に貼り付け(_B)" #: pdfarranger/pdfarranger.py:1627 msgid "Pasted data not valid. Aborting paste." msgstr "不正なデータが貼り付けられました。貼り付けを中止します。" #: pdfarranger/pdfarranger.py:1589 msgid "Pikepdf >= 3 is needed for overlay/underlay/merge support." msgstr "" #: data/menu.ui:234 msgid "Pre_ferences" msgstr "" #: pdfarranger/config.py:212 msgid "Preferences" msgstr "" #: pdfarranger/pdfarranger.py:293 msgid "Print the version of PDF Arranger and exit" msgstr "PDF Arranger のバージョンを表示して終了する" #: pdfarranger/exporter.py:457 msgid "Printing…" msgstr "" #: pdfarranger/metadata.py:45 msgid "Producer" msgstr "変換" #: pdfarranger/metadata.py:212 msgid "Property" msgstr "プロパティ" #: data/menu.ui:116 data/menu.ui:373 msgid "Re_verse Order" msgstr "逆順(_V)" #: pdfarranger/pageutils.py:238 msgid "Relative" msgstr "比率" #: pdfarranger/exporter.py:469 msgid "Rendering Preview…" msgstr "" #: pdfarranger/pdfarranger.py:732 msgid "Rendering…" msgstr "描画中…" #: pdfarranger/pdfarranger.py:1132 msgid "Replace" msgstr "" #: pdfarranger/pageutils.py:149 msgid "Right" msgstr "右" #: pdfarranger/pageutils.py:378 msgid "Right to Left" msgstr "" #: data/pdfarranger.ui:203 msgid "Rotate Left" msgstr "左に回転" #: data/pdfarranger.ui:227 msgid "Rotate Right" msgstr "右に回転" #: data/menu.ui:90 data/menu.ui:351 msgid "Rotate _Left" msgstr "左に回転(_L)" #: pdfarranger/pageutils.py:364 pdfarranger/splitter.py:60 msgid "Rows" msgstr "行" #: data/menu.ui:194 data/menu.ui:337 msgid "Same Page _Format" msgstr "同じページフォーマット(_F)" #: data/pdfarranger.ui:78 msgid "Save" msgstr "保存" #: data/pdfarranger.ui:97 msgid "Save As" msgstr "名前を付けて保存" #: pdfarranger/pdfarranger.py:1088 msgid "Save As…" msgstr "" #: data/menu.ui:47 msgid "Save _As…" msgstr "名前を付けて保存(_A)…" #: pdfarranger/pdfarranger.py:988 msgid "Save changes before closing?" msgstr "閉じる前に変更内容を保存しますか?" #: pdfarranger/pdfarranger.py:1025 msgid "Save changes before quitting?" msgstr "" #: pdfarranger/pdfarranger.py:985 msgid "Save changes to “{}” before closing?" msgstr "閉じる前に変更内容を“{}”に保存しますか?" #: pdfarranger/pdfarranger.py:1022 msgid "Save changes to “{}” before quitting?" msgstr "" #: pdfarranger/pdfarranger.py:1249 msgid "Saving produced some warnings" msgstr "保存時にいくつかの警告がありました" #: pdfarranger/pdfarranger.py:1288 msgid "Saving…" msgstr "保存中…" #: pdfarranger/pageutils.py:116 msgid "Scale factor" msgstr "倍率" #: data/menu.ui:169 data/menu.ui:312 msgid "Select _All" msgstr "すべて選択(_A)" #: data/menu.ui:184 data/menu.ui:327 msgid "Select _Even Pages" msgstr "偶数ページを選択(_E)" #: data/menu.ui:179 data/menu.ui:322 msgid "Select _Odd Pages" msgstr "奇数ページを選択(_O)" #: pdfarranger/pdfarranger.py:2580 msgid "Selected pages: " msgstr "選択したページ: " #: pdfarranger/splitter.py:26 msgid "Split Pages" msgstr "ページを分割" #: pdfarranger/metadata.py:43 msgid "Subject" msgstr "サブタイトル" #: pdfarranger/pdfarranger.py:512 msgid "Supported image files" msgstr "サポートしている画像ファイル" #: pdfarranger/config.py:248 pdfarranger/config.py:256 msgid "System setting" msgstr "" #: pdfarranger/core.py:275 msgid "" "The document “{}” is locked and requires a password before it can be opened." msgstr "ロックされているドキュメント“{}”を開くにはパスワードが必要です。" #: pdfarranger/core.py:274 msgid "The password will be remembered until you close PDF Arranger." msgstr "パスワードは PDF Arranger を閉じるまで記憶されます。" #: pdfarranger/config.py:230 msgid "Theme" msgstr "" #: pdfarranger/metadata.py:42 msgid "Title" msgstr "タイトル" #: pdfarranger/pageutils.py:149 msgid "Top" msgstr "上" #: pdfarranger/pageutils.py:379 msgid "Top to Bottom" msgstr "" #: pdfarranger/pageutils.py:436 msgid "Underlay" msgstr "" #: pdfarranger/core.py:361 pdfarranger/pdfarranger.py:1494 msgid "Unknown file format" msgstr "不明なファイル形式です" #: pdfarranger/metadata.py:212 msgid "Value" msgstr "値" #: pdfarranger/pageutils.py:376 msgid "Vertical" msgstr "" #: pdfarranger/splitter.py:61 msgid "Vertical Splits" msgstr "垂直分割" #: pdfarranger/pageutils.py:478 msgid "Vertical offset" msgstr "" #: pdfarranger/exporter.py:187 msgid "Warning" msgstr "警告" #: pdfarranger/pageutils.py:235 pdfarranger/pageutils.py:239 #: pdfarranger/pageutils.py:327 msgid "Width" msgstr "幅" #: pdfarranger/splitter.py:88 msgid "Width in %" msgstr "幅 (%)" #: pdfarranger/pdfarranger.py:969 msgid "Your changes will be lost if you don’t save them." msgstr "保存しないと変更内容は失われます。" #: data/pdfarranger.ui:144 msgid "Zoom In" msgstr "拡大" #: data/pdfarranger.ui:167 msgid "Zoom Out" msgstr "縮小" #: data/menu.ui:217 msgid "Zoom _Fit" msgstr "" #: data/menu.ui:209 msgid "Zoom _In" msgstr "拡大(_I)" #: data/menu.ui:213 msgid "Zoom _Out" msgstr "縮小(_O)" #: data/menu.ui:240 msgid "_About" msgstr "情報(_A)" #: pdfarranger/config.py:216 pdfarranger/pageutils.py:219 #: pdfarranger/pdfarranger.py:961 pdfarranger/pdfarranger.py:970 #: pdfarranger/pdfarranger.py:1094 pdfarranger/pdfarranger.py:1144 msgid "_Cancel" msgstr "キャンセル(_C)" #: pdfarranger/pdfarranger.py:980 data/menu.ui:246 msgid "_Close" msgstr "閉じる(_C)" #: data/menu.ui:132 data/menu.ui:268 msgid "_Copy" msgstr "コピー(_C)" #: data/menu.ui:108 data/menu.ui:260 msgid "_Delete" msgstr "削除(_D)" #: data/menu.ui:174 data/menu.ui:317 msgid "_Deselect All" msgstr "すべて選択解除(_D)" #: data/menu.ui:87 msgid "_Edit" msgstr "編集(_E)" #: data/menu.ui:30 msgid "_Import" msgstr "インポート(_I)" #: data/menu.ui:199 data/menu.ui:342 msgid "_Invert Selection" msgstr "選択を反転(_I)" #: data/menu.ui:124 data/menu.ui:381 msgid "_Merge Pages…" msgstr "" #: data/menu.ui:36 msgid "_New Window" msgstr "新しいウィンドウ(_N)" #: pdfarranger/config.py:217 pdfarranger/pageutils.py:220 msgid "_OK" msgstr "" #: pdfarranger/pdfarranger.py:1143 data/menu.ui:24 msgid "_Open" msgstr "開く(_O)" #: data/menu.ui:100 data/menu.ui:361 msgid "_Page Format…" msgstr "ページのフォーマット(_P)…" #: data/menu.ui:71 msgid "_Print…" msgstr "印刷(_P)…" #: pdfarranger/pdfarranger.py:1017 data/menu.ui:252 msgid "_Quit" msgstr "終了(_Q)" #: data/menu.ui:82 msgid "_Redo" msgstr "やり直す(_R)" #: data/menu.ui:95 data/menu.ui:356 msgid "_Rotate Right" msgstr "右に回転(_R)" #: pdfarranger/pdfarranger.py:970 pdfarranger/pdfarranger.py:1093 #: data/menu.ui:42 msgid "_Save" msgstr "保存(_S)" #: data/menu.ui:166 data/menu.ui:309 msgid "_Select" msgstr "選択(_S)" #: data/menu.ui:120 data/menu.ui:377 msgid "_Split Pages…" msgstr "ページを分割(_S)…" #: data/menu.ui:78 msgid "_Undo" msgstr "元に戻す(_U)" #: data/menu.ui:206 msgid "_View" msgstr "表示(_V)" #: pdfarranger/pageutils.py:139 pdfarranger/pageutils.py:362 #: pdfarranger/pageutils.py:412 msgid "mm" msgstr "mm" #: pdfarranger/core.py:89 msgid "page" msgstr "ページ" #: pdfarranger/pdfarranger.py:811 msgid "untitled" msgstr "タイトルなし" pdfarranger-1.10.1/po/ko.po000066400000000000000000000410371451252235000154600ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-04-29 22:45+0200\n" "PO-Revision-Date: 2021-11-26 15:38+0900\n" "Last-Translator: \n" "Language-Team: \n" "Language: ko\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 3.0\n" "Plural-Forms: nplurals=1; plural=0;\n" #: pdfarranger/splitter.py:87 msgid "#Col" msgstr "#Col" #: pdfarranger/splitter.py:87 msgid "#Row" msgstr "#Row" #: pdfarranger/pageutils.py:122 pdfarranger/pageutils.py:477 #: pdfarranger/pageutils.py:479 msgid "%" msgstr "%" #: pdfarranger/pageutils.py:170 #, python-format msgid "% of height" msgstr "" #: pdfarranger/pageutils.py:170 #, python-format msgid "% of width" msgstr "" #: pdfarranger/pdfarranger.py:2548 #, python-format msgid "%s is a tool for rearranging and modifying PDF files." msgstr "%s는 PDF 파일을 재정렬하거나 수정하는 도구입니다." #: pdfarranger/config.py:232 msgid "(Libhandy missing)" msgstr "" #: pdfarranger/config.py:224 msgid "(Requires restart)" msgstr "" #: pdfarranger/pageutils.py:461 msgid "(same offset is applied to all pages)" msgstr "" #: pdfarranger/pdfarranger.py:1130 #, python-format msgid "A file named \"%s\" already exists. Do you want to replace it?" msgstr "" #: data/menu.ui:189 data/menu.ui:332 msgid "All From _Same File" msgstr "같은 파일에서 선택(_S)" #: pdfarranger/pdfarranger.py:507 msgid "All files" msgstr "모든 파일" #: pdfarranger/pdfarranger.py:462 msgid "All pages must have the same size." msgstr "모든 페이지는 같은 크기이여야만 합니다." #: pdfarranger/pdfarranger.py:495 msgid "All supported files" msgstr "지원하는 모든 파일" #: pdfarranger/pageutils.py:149 msgid "Bottom" msgstr "아래" #: pdfarranger/pageutils.py:380 msgid "Bottom to Top" msgstr "" #: pdfarranger/core.py:386 msgid "Clipboard image" msgstr "클립보드 이미지" #: pdfarranger/pageutils.py:363 pdfarranger/splitter.py:60 msgid "Columns" msgstr "행" #: pdfarranger/metadata.py:48 msgid "Created" msgstr "만든 날짜" #: pdfarranger/metadata.py:46 msgid "Creator" msgstr "만든이" #: pdfarranger/metadata.py:47 msgid "Creator tool" msgstr "만든 도구" #: pdfarranger/pageutils.py:153 msgid "Crop Margins" msgstr "차이 잘라내기" #: data/menu.ui:104 data/menu.ui:365 msgid "Crop White Borders" msgstr "흰 테두리 잘라내기" #: pdfarranger/pageutils.py:161 msgid "" "Cropping does not remove any content from the PDF file, it only hides it." msgstr "잘라내기는 PDF 파일의 내용을 삭제하지 않으며, 해당 영역만 숨깁니다." #: data/menu.ui:128 data/menu.ui:264 msgid "Cu_t" msgstr "잘라내기(_T)" #: pdfarranger/pdfarranger.py:1250 msgid "Despite the warnings the document(s) should have no visible issues." msgstr "" #: pdfarranger/pdfarranger.py:979 msgid "Discard changes and close?" msgstr "변경 사항을 저장하지 않고 닫으시겠습니까?" #: pdfarranger/pdfarranger.py:1016 msgid "Discard changes and quit?" msgstr "변경 사항을 저장하지 않고 종료하시겠습니까?" #: pdfarranger/exporter.py:194 msgid "Do not show this dialog again." msgstr "이 대화상자를 다시 표시하지 않습니다." #: pdfarranger/pdfarranger.py:970 msgid "Do_n’t Save" msgstr "저장 안 함(_N)" #: pdfarranger/pdfarranger.py:1257 msgid "Don't show warnings when saving again." msgstr "" #: data/menu.ui:112 data/menu.ui:369 msgid "Dupl_icate" msgstr "복제(_I)" #: data/menu.ui:52 data/menu.ui:395 msgid "E_xport" msgstr "내보내기(_X)" #: data/menu.ui:55 data/menu.ui:398 msgid "E_xport Selection to a Single File…" msgstr "선택된 내용들을 하나의 파일로 내보내기…(_X)" #: data/menu.ui:228 msgid "Edit _Properties" msgstr "정보 편집(_E)" #: pdfarranger/metadata.py:198 msgid "Edit properties" msgstr "정보 편집" #: pdfarranger/splitter.py:62 msgid "Equal column width" msgstr "행 너비 맞추기" #: pdfarranger/splitter.py:62 msgid "Equal row height" msgstr "열 높이 맞추기" #: data/menu.ui:60 data/menu.ui:403 msgid "Export Selection to _Individual Files…" msgstr "선택된 내용들을 개별의 파일로 내보내기…(_I)" #: data/menu.ui:65 data/menu.ui:408 msgid "Export _All Pages to Individual Files…" msgstr "모든 페이지를 개별의 파일로 내보내기…(_A)" #: pdfarranger/pdfarranger.py:1088 msgid "Export…" msgstr "내보내기…" #: pdfarranger/core.py:388 pdfarranger/pdfarranger.py:1504 msgid "File is neither pdf nor image" msgstr "PDF 및 그림 파일이 아닙니다" #: pdfarranger/pdfarranger.py:301 msgid "File(s) to open" msgstr "파일 선택" #: pdfarranger/config.py:237 msgid "For more options see:" msgstr "" #: pdfarranger/exporter.py:192 msgid "Forms and outlines are lost on saving." msgstr "폼과 윤곽선은 저장 시 사라집니다." #: data/menu.ui:221 msgid "Full_screen" msgstr "전체 화면(_S)" #: pdfarranger/pdfarranger.py:2562 msgid "GNU General Public License (GPL) Version 3." msgstr "GNU General Public License (GPL) 버전 3을 사용합니다." #: data/menu.ui:160 data/menu.ui:389 msgid "Generate Booklet" msgstr "북클렛 만들기" #: pdfarranger/pageutils.py:236 pdfarranger/pageutils.py:240 #: pdfarranger/pageutils.py:328 msgid "Height" msgstr "높이" #: pdfarranger/splitter.py:88 msgid "Height in %" msgstr "높이(%)" #: pdfarranger/pageutils.py:375 msgid "Horizontal" msgstr "" #: pdfarranger/splitter.py:61 msgid "Horizontal Splits" msgstr "가로로 나누기" #: pdfarranger/pageutils.py:476 msgid "Horizontal offset" msgstr "" #: pdfarranger/core.py:377 msgid "Image files are only supported with img2pdf" msgstr "이미지 파일은 img2pdf만 지원합니다" #: pdfarranger/core.py:383 msgid "Image format is not supported by img2pdf" msgstr "해당 이미지 형식은 img2pdf에서 지원하지 않습니다" #: data/pdfarranger.ui:58 msgid "Import" msgstr "" #: pdfarranger/pdfarranger.py:1327 msgid "Import…" msgstr "불러오기…" #: data/menu.ui:156 data/menu.ui:385 msgid "Insert Blan_k Page…" msgstr "빈 페이지 삽입(_K)…" #: pdfarranger/pageutils.py:325 msgid "Insert Blank Page" msgstr "빈 페이지 삽입" #: pdfarranger/metadata.py:169 msgid "Invalid date format. Input discarded." msgstr "잘못된 날짜 형식입니다." #: pdfarranger/pdfarranger.py:2551 #, python-format msgid "It uses libqpdf %s, pikepdf %s, GTK %s and Python %s." msgstr "" #: pdfarranger/metadata.py:44 msgid "Keywords" msgstr "검색어" #: pdfarranger/config.py:222 msgid "Language" msgstr "" #: pdfarranger/pageutils.py:460 msgid "Layout for the first page in selection" msgstr "" #: pdfarranger/pageutils.py:149 msgid "Left" msgstr "왼쪽" #: pdfarranger/pageutils.py:377 msgid "Left to Right" msgstr "" #: data/pdfarranger.ui:122 msgid "Main Menu" msgstr "메인 메뉴" #: pdfarranger/pdfarranger.py:2557 msgid "Maintainers and contributors" msgstr "만든 사람과 기여자" #: pdfarranger/pageutils.py:361 msgid "Margin" msgstr "" #: pdfarranger/pageutils.py:347 msgid "Merge Pages" msgstr "" #: pdfarranger/pageutils.py:412 msgid "Merged page size:" msgstr "" #: pdfarranger/metadata.py:49 msgid "Modified" msgstr "수정 날짜" #: pdfarranger/pageutils.py:392 msgid "Non-uniform page size - using max size" msgstr "" #: data/pdfarranger.ui:37 msgid "Open" msgstr "열기" #: pdfarranger/pdfarranger.py:1186 msgid "Open…" msgstr "열기…" #: pdfarranger/pageutils.py:436 msgid "Overlay" msgstr "" #: pdfarranger/pdfarranger.py:282 msgid "" "PDF Arranger is a small python-gtk application, which helps the user to " "merge or split pdf documents and rotate, crop and rearrange their pages " "using an interactive and intuitive graphical interface. It is a frontend for " "pikepdf." msgstr "" "PDF 편집기는 사용자가 PDF 문서를 합치거나 나누고 페이지를 재정렬할 수 있는 다" "기능 그래픽 인터페이스를 사용하는 간단한 python-gtk 프로그램입니다." #: pdfarranger/pdfarranger.py:1498 msgid "PDF document is damaged" msgstr "PDF 문서가 손상되었습니다" #: pdfarranger/pdfarranger.py:499 msgid "PDF files" msgstr "PDF 파일" #: pdfarranger/pageutils.py:388 msgid "Page Order" msgstr "" #: pdfarranger/pageutils.py:241 msgid "Page Size" msgstr "용지 크기" #: pdfarranger/pdfarranger.py:2585 msgid "Page Size:" msgstr "페이지 크기:" #: pdfarranger/pageutils.py:230 msgid "Page format" msgstr "용지 크기" #: pdfarranger/core.py:285 msgid "Password" msgstr "비밀번호" #: pdfarranger/core.py:263 msgid "Password required" msgstr "비밀번호 필요" #: data/menu.ui:277 msgid "Past_e Special" msgstr "다른 방식으로 붙여놓기(_E)" #: data/menu.ui:295 msgid "Paste As O_verlay…" msgstr "" #: data/menu.ui:151 data/menu.ui:290 msgid "Paste As _Even Pages" msgstr "짝수 페이지마다 붙여넣기(_E)" #: data/menu.ui:146 data/menu.ui:285 msgid "Paste As _Odd Pages" msgstr "홀수 페이지마다 붙여넣기(_O)" #: data/menu.ui:300 msgid "Paste As _Underlay…" msgstr "" #: data/menu.ui:136 data/menu.ui:272 msgid "Paste _After" msgstr "뒤 페이지에 붙여넣기(_A)" #: data/menu.ui:141 data/menu.ui:280 msgid "Paste _Before" msgstr "앞 페이지에 붙여넣기(_B)" #: pdfarranger/pdfarranger.py:1627 msgid "Pasted data not valid. Aborting paste." msgstr "붙여넣은 데이터가 잘못되었습니다." #: pdfarranger/pdfarranger.py:1589 msgid "Pikepdf >= 3 is needed for overlay/underlay/merge support." msgstr "" #: data/menu.ui:234 msgid "Pre_ferences" msgstr "" #: pdfarranger/config.py:212 msgid "Preferences" msgstr "" #: pdfarranger/pdfarranger.py:293 msgid "Print the version of PDF Arranger and exit" msgstr "PDF 편집기의 버전을 출력한 후 닫기" #: pdfarranger/exporter.py:457 msgid "Printing…" msgstr "" #: pdfarranger/metadata.py:45 msgid "Producer" msgstr "글쓴이" #: pdfarranger/metadata.py:212 msgid "Property" msgstr "우선도" #: data/menu.ui:116 data/menu.ui:373 msgid "Re_verse Order" msgstr "순서 바꾸기(_V)" #: pdfarranger/pageutils.py:238 msgid "Relative" msgstr "" #: pdfarranger/exporter.py:469 msgid "Rendering Preview…" msgstr "" #: pdfarranger/pdfarranger.py:732 msgid "Rendering…" msgstr "렌더링 중…" #: pdfarranger/pdfarranger.py:1132 msgid "Replace" msgstr "" #: pdfarranger/pageutils.py:149 msgid "Right" msgstr "오른쪽" #: pdfarranger/pageutils.py:378 msgid "Right to Left" msgstr "" #: data/pdfarranger.ui:203 msgid "Rotate Left" msgstr "왼쪽으로 회전" #: data/pdfarranger.ui:227 msgid "Rotate Right" msgstr "오른쪽으로 회전" #: data/menu.ui:90 data/menu.ui:351 msgid "Rotate _Left" msgstr "왼쪽으로 회전(_L)" #: pdfarranger/pageutils.py:364 pdfarranger/splitter.py:60 msgid "Rows" msgstr "열" #: data/menu.ui:194 data/menu.ui:337 msgid "Same Page _Format" msgstr "같은 페이지 형식(_F)" #: data/pdfarranger.ui:78 msgid "Save" msgstr "저장" #: data/pdfarranger.ui:97 msgid "Save As" msgstr "다른 이름으로 저장" #: pdfarranger/pdfarranger.py:1088 msgid "Save As…" msgstr "" #: data/menu.ui:47 msgid "Save _As…" msgstr "다른 이름으로 저장…(_A)" #: pdfarranger/pdfarranger.py:988 msgid "Save changes before closing?" msgstr "닫기 전에 펀집한 사항을 저장하시겠습니까?" #: pdfarranger/pdfarranger.py:1025 msgid "Save changes before quitting?" msgstr "" #: pdfarranger/pdfarranger.py:985 msgid "Save changes to “{}” before closing?" msgstr "닫기 전에 \"{}\"을 편집한 사항을 저장하시겠습니까?" #: pdfarranger/pdfarranger.py:1022 msgid "Save changes to “{}” before quitting?" msgstr "" #: pdfarranger/pdfarranger.py:1249 msgid "Saving produced some warnings" msgstr "만들어진 몇몇 경고를 포함하여 저장하는 중" #: pdfarranger/pdfarranger.py:1288 msgid "Saving…" msgstr "저장 중…" #: pdfarranger/pageutils.py:116 msgid "Scale factor" msgstr "확대 상수" #: data/menu.ui:169 data/menu.ui:312 msgid "Select _All" msgstr "모두 선택(_A)" #: data/menu.ui:184 data/menu.ui:327 msgid "Select _Even Pages" msgstr "짝수 페이지만 선택(_E)" #: data/menu.ui:179 data/menu.ui:322 msgid "Select _Odd Pages" msgstr "홀수 페이지만 선택(_O)" #: pdfarranger/pdfarranger.py:2580 msgid "Selected pages: " msgstr "선택된 페이지: " #: pdfarranger/splitter.py:26 msgid "Split Pages" msgstr "페이지 나누기" #: pdfarranger/metadata.py:43 msgid "Subject" msgstr "주제" #: pdfarranger/pdfarranger.py:512 msgid "Supported image files" msgstr "지원하는 이미지 파일" #: pdfarranger/config.py:248 pdfarranger/config.py:256 msgid "System setting" msgstr "" #: pdfarranger/core.py:275 msgid "" "The document “{}” is locked and requires a password before it can be opened." msgstr "보호된 문서인 \"{}\"(을)를 열기 전에 비밀번호를 입력해야 합니다." #: pdfarranger/core.py:274 msgid "The password will be remembered until you close PDF Arranger." msgstr "PDF 편집기를 닫기 전까지 비밀번호를 기억합니다." #: pdfarranger/config.py:230 msgid "Theme" msgstr "" #: pdfarranger/metadata.py:42 msgid "Title" msgstr "제목" #: pdfarranger/pageutils.py:149 msgid "Top" msgstr "위" #: pdfarranger/pageutils.py:379 msgid "Top to Bottom" msgstr "" #: pdfarranger/pageutils.py:436 msgid "Underlay" msgstr "" #: pdfarranger/core.py:361 pdfarranger/pdfarranger.py:1494 msgid "Unknown file format" msgstr "알 수 없는 형식" #: pdfarranger/metadata.py:212 msgid "Value" msgstr "값" #: pdfarranger/pageutils.py:376 msgid "Vertical" msgstr "" #: pdfarranger/splitter.py:61 msgid "Vertical Splits" msgstr "세로로 나누기" #: pdfarranger/pageutils.py:478 msgid "Vertical offset" msgstr "" #: pdfarranger/exporter.py:187 msgid "Warning" msgstr "경고" #: pdfarranger/pageutils.py:235 pdfarranger/pageutils.py:239 #: pdfarranger/pageutils.py:327 msgid "Width" msgstr "너비" #: pdfarranger/splitter.py:88 msgid "Width in %" msgstr "너비(%)" #: pdfarranger/pdfarranger.py:969 msgid "Your changes will be lost if you don’t save them." msgstr "저장하지 않으면 편집한 사항을 잃게 됩니다." #: data/pdfarranger.ui:144 msgid "Zoom In" msgstr "확대" #: data/pdfarranger.ui:167 msgid "Zoom Out" msgstr "축소" #: data/menu.ui:217 msgid "Zoom _Fit" msgstr "" #: data/menu.ui:209 msgid "Zoom _In" msgstr "확대(_I)" #: data/menu.ui:213 msgid "Zoom _Out" msgstr "축소(_O)" #: data/menu.ui:240 msgid "_About" msgstr "정보(_A)" #: pdfarranger/config.py:216 pdfarranger/pageutils.py:219 #: pdfarranger/pdfarranger.py:961 pdfarranger/pdfarranger.py:970 #: pdfarranger/pdfarranger.py:1094 pdfarranger/pdfarranger.py:1144 msgid "_Cancel" msgstr "취소(_C)" #: pdfarranger/pdfarranger.py:980 data/menu.ui:246 msgid "_Close" msgstr "닫기(_C)" #: data/menu.ui:132 data/menu.ui:268 msgid "_Copy" msgstr "복사(_C)" #: data/menu.ui:108 data/menu.ui:260 msgid "_Delete" msgstr "삭제(_D)" #: data/menu.ui:174 data/menu.ui:317 msgid "_Deselect All" msgstr "모두 선택 해제(_D)" #: data/menu.ui:87 msgid "_Edit" msgstr "편집(_E)" #: data/menu.ui:30 msgid "_Import" msgstr "불러오기(_I)" #: data/menu.ui:199 data/menu.ui:342 msgid "_Invert Selection" msgstr "선택 반전(_I)" #: data/menu.ui:124 data/menu.ui:381 msgid "_Merge Pages…" msgstr "" #: data/menu.ui:36 msgid "_New Window" msgstr "새 창(_N)" #: pdfarranger/config.py:217 pdfarranger/pageutils.py:220 msgid "_OK" msgstr "" #: pdfarranger/pdfarranger.py:1143 data/menu.ui:24 msgid "_Open" msgstr "열기(O)" #: data/menu.ui:100 data/menu.ui:361 msgid "_Page Format…" msgstr "용지 크기(_P)…" #: data/menu.ui:71 msgid "_Print…" msgstr "인쇄…(_P)" #: pdfarranger/pdfarranger.py:1017 data/menu.ui:252 msgid "_Quit" msgstr "종료(_Q)" #: data/menu.ui:82 msgid "_Redo" msgstr "다시 실행(_R)" #: data/menu.ui:95 data/menu.ui:356 msgid "_Rotate Right" msgstr "오른쪽으로 회전(_R)" #: pdfarranger/pdfarranger.py:970 pdfarranger/pdfarranger.py:1093 #: data/menu.ui:42 msgid "_Save" msgstr "저장(_S)" #: data/menu.ui:166 data/menu.ui:309 msgid "_Select" msgstr "선택(_S)" #: data/menu.ui:120 data/menu.ui:377 msgid "_Split Pages…" msgstr "페이지 나누기(_S)…" #: data/menu.ui:78 msgid "_Undo" msgstr "실행 취소(_U)" #: data/menu.ui:206 msgid "_View" msgstr "보기(_V)" #: pdfarranger/pageutils.py:139 pdfarranger/pageutils.py:362 #: pdfarranger/pageutils.py:412 msgid "mm" msgstr "mm" #: pdfarranger/core.py:89 msgid "page" msgstr "페이지" #: pdfarranger/pdfarranger.py:811 msgid "untitled" msgstr "제목 없음" pdfarranger-1.10.1/po/nl.po000066400000000000000000000431441451252235000154610ustar00rootroot00000000000000# PDF-Shuffler translation files. # Copyright (C) 2008-2017 Konstantinos Poulios # This file is part of PDF-Shuffler which is released under the GNU General # Public License version 3 or later. # See file COPYING or go to for full license details. # Translators: # Heimen Stoffels , 2016, 2022. # Thomas De Rocker, 2011. msgid "" msgstr "" "Project-Id-Version: PDF-Shuffler 0.7\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-04-29 22:45+0200\n" "PO-Revision-Date: 2023-06-11 14:36+0200\n" "Last-Translator: Heimen Stoffels \n" "Language-Team: Dutch\n" "Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.3.1\n" #: pdfarranger/splitter.py:87 msgid "#Col" msgstr "#Kol." #: pdfarranger/splitter.py:87 msgid "#Row" msgstr "#Rij" #: pdfarranger/pageutils.py:122 pdfarranger/pageutils.py:477 #: pdfarranger/pageutils.py:479 msgid "%" msgstr "%" #: pdfarranger/pageutils.py:170 msgid "% of height" msgstr "% van de hoogte" #: pdfarranger/pageutils.py:170 msgid "% of width" msgstr "% van de breedte" #: pdfarranger/pdfarranger.py:2548 #, python-format msgid "%s is a tool for rearranging and modifying PDF files." msgstr "" "%s is een hulpprogramma voor het herordenen en bewerken van pdf-bestanden." #: pdfarranger/config.py:232 msgid "(Libhandy missing)" msgstr "(Libhandy ontbreekt)" #: pdfarranger/config.py:224 msgid "(Requires restart)" msgstr "(herstart vereist)" #: pdfarranger/pageutils.py:461 msgid "(same offset is applied to all pages)" msgstr "(deze verschuiving geldt voor alle pagina's)" #: pdfarranger/pdfarranger.py:1130 #, python-format msgid "A file named \"%s\" already exists. Do you want to replace it?" msgstr "Er is al een bestand genaamd “%s”. Wilt u dit vervangen?" #: data/menu.ui:189 data/menu.ui:332 msgid "All From _Same File" msgstr "Alles uit _hetzelfde bestand" #: pdfarranger/pdfarranger.py:507 msgid "All files" msgstr "Alle bestanden" #: pdfarranger/pdfarranger.py:462 msgid "All pages must have the same size." msgstr "Alle pagina's dienen even groot te zijn." #: pdfarranger/pdfarranger.py:495 msgid "All supported files" msgstr "Alle ondersteunde bestanden" #: pdfarranger/pageutils.py:149 msgid "Bottom" msgstr "Onder" #: pdfarranger/pageutils.py:380 msgid "Bottom to Top" msgstr "Van onder naar boven" #: pdfarranger/core.py:386 msgid "Clipboard image" msgstr "Klembordafbeelding" #: pdfarranger/pageutils.py:363 pdfarranger/splitter.py:60 msgid "Columns" msgstr "Kolommen" #: pdfarranger/metadata.py:48 msgid "Created" msgstr "Gemaakt op" #: pdfarranger/metadata.py:46 msgid "Creator" msgstr "Maker" #: pdfarranger/metadata.py:47 msgid "Creator tool" msgstr "Gemaakt met" #: pdfarranger/pageutils.py:153 msgid "Crop Margins" msgstr "Marges bijsnijden" #: data/menu.ui:104 data/menu.ui:365 msgid "Crop White Borders" msgstr "Witte randen bijsnijden" #: pdfarranger/pageutils.py:161 msgid "" "Cropping does not remove any content from the PDF file, it only hides it." msgstr "" "Bijsnijden verwijdert geen inhoud uit het pdf-bestand; het verbergt het " "alleen." #: data/menu.ui:128 data/menu.ui:264 msgid "Cu_t" msgstr "_Knippen" #: pdfarranger/pdfarranger.py:1250 msgid "Despite the warnings the document(s) should have no visible issues." msgstr "" "Ondanks de waarschuwingen, zou het bestand/de bestanden geen zichtbare " "problemen moet(en) vertonen." #: pdfarranger/pdfarranger.py:979 msgid "Discard changes and close?" msgstr "Wilt u de aanpassingen negeren en sluiten?" #: pdfarranger/pdfarranger.py:1016 msgid "Discard changes and quit?" msgstr "Wilt u de aanpassingen negeren en afsluiten?" #: pdfarranger/exporter.py:194 msgid "Do not show this dialog again." msgstr "Niet meer tonen" #: pdfarranger/pdfarranger.py:970 msgid "Do_n’t Save" msgstr "_Niet opslaan" #: pdfarranger/pdfarranger.py:1257 msgid "Don't show warnings when saving again." msgstr "Niet meer tonen" #: data/menu.ui:112 data/menu.ui:369 msgid "Dupl_icate" msgstr "Dupl_iceren" #: data/menu.ui:52 data/menu.ui:395 msgid "E_xport" msgstr "E_xporteren" #: data/menu.ui:55 data/menu.ui:398 msgid "E_xport Selection to a Single File…" msgstr "Selectie _exporteren naar bestand…" #: data/menu.ui:228 msgid "Edit _Properties" msgstr "Eigenschappen bewerken" #: pdfarranger/metadata.py:198 msgid "Edit properties" msgstr "Eigenschappen bewerken" #: pdfarranger/splitter.py:62 msgid "Equal column width" msgstr "Gelijke kolombreedtes" #: pdfarranger/splitter.py:62 msgid "Equal row height" msgstr "Gelijke rijhoogten" #: data/menu.ui:60 data/menu.ui:403 msgid "Export Selection to _Individual Files…" msgstr "Selectie exporteren naar _meerdere bestanden…" #: data/menu.ui:65 data/menu.ui:408 msgid "Export _All Pages to Individual Files…" msgstr "_Alle pagina's exporteren naar meerdere bestanden…" #: pdfarranger/pdfarranger.py:1088 msgid "Export…" msgstr "Exporteren…" #: pdfarranger/core.py:388 pdfarranger/pdfarranger.py:1504 msgid "File is neither pdf nor image" msgstr "Het bestand is geen pdf of afbeelding" #: pdfarranger/pdfarranger.py:301 msgid "File(s) to open" msgstr "Te openen bestand(en)" #: pdfarranger/config.py:237 msgid "For more options see:" msgstr "Ga voor meer opties naar:" #: pdfarranger/exporter.py:192 msgid "Forms and outlines are lost on saving." msgstr "Formulieren en contouren gaan verloren bij het opslaan." #: data/menu.ui:221 msgid "Full_screen" msgstr "_Schermvullende weergave" #: pdfarranger/pdfarranger.py:2562 msgid "GNU General Public License (GPL) Version 3." msgstr "GNU General Public License (GPL), versie 3." #: data/menu.ui:160 data/menu.ui:389 msgid "Generate Booklet" msgstr "Boekje samenstellen" #: pdfarranger/pageutils.py:236 pdfarranger/pageutils.py:240 #: pdfarranger/pageutils.py:328 msgid "Height" msgstr "Hoogte" #: pdfarranger/splitter.py:88 msgid "Height in %" msgstr "Hoogte, in %" #: pdfarranger/pageutils.py:375 msgid "Horizontal" msgstr "Horizontaal" #: pdfarranger/splitter.py:61 msgid "Horizontal Splits" msgstr "Horizontale splitsingen" #: pdfarranger/pageutils.py:476 msgid "Horizontal offset" msgstr "Horizontale verschuiving" #: pdfarranger/core.py:377 msgid "Image files are only supported with img2pdf" msgstr "Afbeeldingsbestanden kunnen alleen worden gebruikt met img2pdf" #: pdfarranger/core.py:383 msgid "Image format is not supported by img2pdf" msgstr "Dit afbeeldingsbestand wordt niet ondersteund door img2pdf" #: data/pdfarranger.ui:58 msgid "Import" msgstr "Importeren" #: pdfarranger/pdfarranger.py:1327 msgid "Import…" msgstr "Importeren…" #: data/menu.ui:156 data/menu.ui:385 msgid "Insert Blan_k Page…" msgstr "Blan_co pagina invoegen…" #: pdfarranger/pageutils.py:325 msgid "Insert Blank Page" msgstr "Blanco pagina invoegen" #: pdfarranger/metadata.py:169 msgid "Invalid date format. Input discarded." msgstr "Ongeldige datumopmaak - de inhoud is verworpen." #: pdfarranger/pdfarranger.py:2551 #, python-format msgid "It uses libqpdf %s, pikepdf %s, GTK %s and Python %s." msgstr "" "Het programma maakt gebruik van libqpdf %s, pikepdf %s, GTK %s en Python %s." #: pdfarranger/metadata.py:44 msgid "Keywords" msgstr "Trefwoorden" #: pdfarranger/config.py:222 msgid "Language" msgstr "Taal" #: pdfarranger/pageutils.py:460 msgid "Layout for the first page in selection" msgstr "Indeling van de eerste pagina van de selectie" #: pdfarranger/pageutils.py:149 msgid "Left" msgstr "Links" #: pdfarranger/pageutils.py:377 msgid "Left to Right" msgstr "Van links naar rechts" #: data/pdfarranger.ui:122 msgid "Main Menu" msgstr "Hoofdmenu" #: pdfarranger/pdfarranger.py:2557 msgid "Maintainers and contributors" msgstr "Onderhouders en bijdragers" #: pdfarranger/pageutils.py:361 msgid "Margin" msgstr "Marge" #: pdfarranger/pageutils.py:347 msgid "Merge Pages" msgstr "Pagina's samenvoegen" #: pdfarranger/pageutils.py:412 msgid "Merged page size:" msgstr "Samengevoegde paginagrootte:" #: pdfarranger/metadata.py:49 msgid "Modified" msgstr "Aangepast op" #: pdfarranger/pageutils.py:392 msgid "Non-uniform page size - using max size" msgstr "Inconsistente paginagrootte - de max. grootte wordt gebruikt" #: data/pdfarranger.ui:37 msgid "Open" msgstr "Openen" #: pdfarranger/pdfarranger.py:1186 msgid "Open…" msgstr "Openen…" #: pdfarranger/pageutils.py:436 msgid "Overlay" msgstr "Bovenste laag" #: pdfarranger/pdfarranger.py:282 msgid "" "PDF Arranger is a small python-gtk application, which helps the user to " "merge or split pdf documents and rotate, crop and rearrange their pages " "using an interactive and intuitive graphical interface. It is a frontend for " "pikepdf." msgstr "" "PDF Arranger is een eenvoudig hulpprogramma voor het herordenen en bewerken " "van pdf-bestanden, gemaakt met python-gtk. Pagina's kunnen worden " "samengevoegd, herordend en bijgesneden. Ook kunnen documenten worden " "gesplitst. PDF Arranger is een frontend voor pikepdf." #: pdfarranger/pdfarranger.py:1498 msgid "PDF document is damaged" msgstr "Het pdf-bestand is beschadigd" #: pdfarranger/pdfarranger.py:499 msgid "PDF files" msgstr "PDF-bestanden" #: pdfarranger/pageutils.py:388 msgid "Page Order" msgstr "Paginavolgorde" #: pdfarranger/pageutils.py:241 msgid "Page Size" msgstr "Paginagrootte" #: pdfarranger/pdfarranger.py:2585 msgid "Page Size:" msgstr "Paginagrootte:" #: pdfarranger/pageutils.py:230 msgid "Page format" msgstr "Paginaformaat" #: pdfarranger/core.py:285 msgid "Password" msgstr "Wachtwoord" #: pdfarranger/core.py:263 msgid "Password required" msgstr "Wachtwoord vereist" #: data/menu.ui:277 msgid "Past_e Special" msgstr "Sp_eciaal plakken" #: data/menu.ui:295 msgid "Paste As O_verlay…" msgstr "Plakken als b_ovenste laag…" #: data/menu.ui:151 data/menu.ui:290 msgid "Paste As _Even Pages" msgstr "Plakken als _even pagina's" #: data/menu.ui:146 data/menu.ui:285 msgid "Paste As _Odd Pages" msgstr "Plakken als _oneven pagina's" #: data/menu.ui:300 msgid "Paste As _Underlay…" msgstr "Plakken als on_derste laag…" #: data/menu.ui:136 data/menu.ui:272 msgid "Paste _After" msgstr "Plakken _na" #: data/menu.ui:141 data/menu.ui:280 msgid "Paste _Before" msgstr "Plakken _vóór" #: pdfarranger/pdfarranger.py:1627 msgid "Pasted data not valid. Aborting paste." msgstr "De geplakte gegevens zijn ongeldig - het plakken wordt afgebroken." #: pdfarranger/pdfarranger.py:1589 msgid "Pikepdf >= 3 is needed for overlay/underlay/merge support." msgstr "" "Pikepdf >= 3 is vereist om pagina's samen te voegen en op te delen in lagen." #: data/menu.ui:234 msgid "Pre_ferences" msgstr "_Voorkeuren" #: pdfarranger/config.py:212 msgid "Preferences" msgstr "Voorkeuren" #: pdfarranger/pdfarranger.py:293 msgid "Print the version of PDF Arranger and exit" msgstr "Toon het versienummer en sluit af" #: pdfarranger/exporter.py:457 msgid "Printing…" msgstr "Bezig met afdrukken…" #: pdfarranger/metadata.py:45 msgid "Producer" msgstr "Producent" #: pdfarranger/metadata.py:212 msgid "Property" msgstr "Eigenschap" #: data/menu.ui:116 data/menu.ui:373 msgid "Re_verse Order" msgstr "Omgekeerde _volgorde" #: pdfarranger/pageutils.py:238 msgid "Relative" msgstr "Relatief" #: pdfarranger/exporter.py:469 msgid "Rendering Preview…" msgstr "Bezig met maken van voorvertoning…" #: pdfarranger/pdfarranger.py:732 msgid "Rendering…" msgstr "Bezig met samenstellen…" #: pdfarranger/pdfarranger.py:1132 msgid "Replace" msgstr "Vervangen" #: pdfarranger/pageutils.py:149 msgid "Right" msgstr "Rechts" #: pdfarranger/pageutils.py:378 msgid "Right to Left" msgstr "Van rechts naar links" #: data/pdfarranger.ui:203 msgid "Rotate Left" msgstr "Naar links draaien" #: data/pdfarranger.ui:227 msgid "Rotate Right" msgstr "Naar rechts draaien" #: data/menu.ui:90 data/menu.ui:351 msgid "Rotate _Left" msgstr "Naar _links draaien" #: pdfarranger/pageutils.py:364 pdfarranger/splitter.py:60 msgid "Rows" msgstr "Rijen" #: data/menu.ui:194 data/menu.ui:337 msgid "Same Page _Format" msgstr "Hetzelfde pagina_formaat" #: data/pdfarranger.ui:78 msgid "Save" msgstr "Opslaan" #: data/pdfarranger.ui:97 msgid "Save As" msgstr "Opslaan als" #: pdfarranger/pdfarranger.py:1088 msgid "Save As…" msgstr "Opslaan als…" #: data/menu.ui:47 msgid "Save _As…" msgstr "Opslaan _als…" #: pdfarranger/pdfarranger.py:988 msgid "Save changes before closing?" msgstr "Aanpassingen opslaan voor afsluiten?" #: pdfarranger/pdfarranger.py:1025 msgid "Save changes before quitting?" msgstr "Aanpassingen opslaan voor afsluiten?" #: pdfarranger/pdfarranger.py:985 msgid "Save changes to “{}” before closing?" msgstr "Wilt u de aanpassingen aan ‘{}’ opslaan alvorens af te sluiten?" #: pdfarranger/pdfarranger.py:1022 msgid "Save changes to “{}” before quitting?" msgstr "Wilt u de aanpassingen aan ‘{}’ opslaan alvorens af te sluiten?" #: pdfarranger/pdfarranger.py:1249 msgid "Saving produced some warnings" msgstr "Waarschuwingen tijdens opslaan" #: pdfarranger/pdfarranger.py:1288 msgid "Saving…" msgstr "Bezig met opslaan…" #: pdfarranger/pageutils.py:116 msgid "Scale factor" msgstr "Vergrotingsfactor" #: data/menu.ui:169 data/menu.ui:312 msgid "Select _All" msgstr "_Alles selecteren" #: data/menu.ui:184 data/menu.ui:327 msgid "Select _Even Pages" msgstr "_Even pagina's selecteren" #: data/menu.ui:179 data/menu.ui:322 msgid "Select _Odd Pages" msgstr "_Oneven pagina's selecteren" #: pdfarranger/pdfarranger.py:2580 msgid "Selected pages: " msgstr "Geselecteerde pagina': " #: pdfarranger/splitter.py:26 msgid "Split Pages" msgstr "Pagina's splitsen" #: pdfarranger/metadata.py:43 msgid "Subject" msgstr "Onderwerp" #: pdfarranger/pdfarranger.py:512 msgid "Supported image files" msgstr "Ondersteunde afbeeldingsbestanden" #: pdfarranger/config.py:248 pdfarranger/config.py:256 msgid "System setting" msgstr "Systeemvoorkeur" #: pdfarranger/core.py:275 msgid "" "The document “{}” is locked and requires a password before it can be opened." msgstr "“{}” is beveiligd en kan alleen worden geopend met een wachtwoord." #: pdfarranger/core.py:274 msgid "The password will be remembered until you close PDF Arranger." msgstr "PDF Arranger bewaart het wachtwoord totdat u afsluit." #: pdfarranger/config.py:230 msgid "Theme" msgstr "Thema" #: pdfarranger/metadata.py:42 msgid "Title" msgstr "Naam" #: pdfarranger/pageutils.py:149 msgid "Top" msgstr "Boven" #: pdfarranger/pageutils.py:379 msgid "Top to Bottom" msgstr "Van boven naar onder" #: pdfarranger/pageutils.py:436 msgid "Underlay" msgstr "Onderste laag" #: pdfarranger/core.py:361 pdfarranger/pdfarranger.py:1494 msgid "Unknown file format" msgstr "Onbekend bestandstype" #: pdfarranger/metadata.py:212 msgid "Value" msgstr "Waarde" #: pdfarranger/pageutils.py:376 msgid "Vertical" msgstr "Verticaal" #: pdfarranger/splitter.py:61 msgid "Vertical Splits" msgstr "Verticale splitsingen" #: pdfarranger/pageutils.py:478 msgid "Vertical offset" msgstr "Verticale verschuiving" #: pdfarranger/exporter.py:187 msgid "Warning" msgstr "Waarschuwing" #: pdfarranger/pageutils.py:235 pdfarranger/pageutils.py:239 #: pdfarranger/pageutils.py:327 msgid "Width" msgstr "Breedte" #: pdfarranger/splitter.py:88 msgid "Width in %" msgstr "Breedte, in %" #: pdfarranger/pdfarranger.py:969 msgid "Your changes will be lost if you don’t save them." msgstr "Als u dat niet doet, gaan ze definitief verloren." #: data/pdfarranger.ui:144 msgid "Zoom In" msgstr "Inzoomen" #: data/pdfarranger.ui:167 msgid "Zoom Out" msgstr "Uitzoomen" #: data/menu.ui:217 msgid "Zoom _Fit" msgstr "In_passen" #: data/menu.ui:209 msgid "Zoom _In" msgstr "_Inzoomen" #: data/menu.ui:213 msgid "Zoom _Out" msgstr "_Uitzoomen" #: data/menu.ui:240 msgid "_About" msgstr "_Over" #: pdfarranger/config.py:216 pdfarranger/pageutils.py:219 #: pdfarranger/pdfarranger.py:961 pdfarranger/pdfarranger.py:970 #: pdfarranger/pdfarranger.py:1094 pdfarranger/pdfarranger.py:1144 msgid "_Cancel" msgstr "_Annuleren" #: pdfarranger/pdfarranger.py:980 data/menu.ui:246 msgid "_Close" msgstr "_Sluiten" #: data/menu.ui:132 data/menu.ui:268 msgid "_Copy" msgstr "_Kopiëren" #: data/menu.ui:108 data/menu.ui:260 msgid "_Delete" msgstr "_Verwijderen" #: data/menu.ui:174 data/menu.ui:317 msgid "_Deselect All" msgstr "_Niets selecteren" #: data/menu.ui:87 msgid "_Edit" msgstr "_Bewerken" #: data/menu.ui:30 msgid "_Import" msgstr "_Importeren" #: data/menu.ui:199 data/menu.ui:342 msgid "_Invert Selection" msgstr "Selectie _omkeren" #: data/menu.ui:124 data/menu.ui:381 msgid "_Merge Pages…" msgstr "Pagina's sa_menvoegen…" #: data/menu.ui:36 msgid "_New Window" msgstr "_Nieuw venster" #: pdfarranger/config.py:217 pdfarranger/pageutils.py:220 msgid "_OK" msgstr "_Oké" #: pdfarranger/pdfarranger.py:1143 data/menu.ui:24 msgid "_Open" msgstr "_Openen" #: data/menu.ui:100 data/menu.ui:361 msgid "_Page Format…" msgstr "Paginaformaat…" #: data/menu.ui:71 msgid "_Print…" msgstr "Afdrukken…" #: pdfarranger/pdfarranger.py:1017 data/menu.ui:252 msgid "_Quit" msgstr "_Afsluiten" #: data/menu.ui:82 msgid "_Redo" msgstr "Opnieu_w uitvoeren" #: data/menu.ui:95 data/menu.ui:356 msgid "_Rotate Right" msgstr "Naar rechts _draaien" #: pdfarranger/pdfarranger.py:970 pdfarranger/pdfarranger.py:1093 #: data/menu.ui:42 msgid "_Save" msgstr "Op_slaan" #: data/menu.ui:166 data/menu.ui:309 msgid "_Select" msgstr "_Selecteren" #: data/menu.ui:120 data/menu.ui:377 msgid "_Split Pages…" msgstr "Pagina's _splitsen…" #: data/menu.ui:78 msgid "_Undo" msgstr "_Ongedaan maken" #: data/menu.ui:206 msgid "_View" msgstr "_Beeld" #: pdfarranger/pageutils.py:139 pdfarranger/pageutils.py:362 #: pdfarranger/pageutils.py:412 msgid "mm" msgstr "mm" #: pdfarranger/core.py:89 msgid "page" msgstr "pagina" #: pdfarranger/pdfarranger.py:811 msgid "untitled" msgstr "naamloos" pdfarranger-1.10.1/po/oc.po000066400000000000000000000427271451252235000154570ustar00rootroot00000000000000# Occitan translation file # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Quentin PAGÈS, 2023. # msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-04-29 22:45+0200\n" "PO-Revision-Date: 2023-05-19 09:47+0200\n" "Last-Translator: Quentin PAGÈS\n" "Language-Team: \n" "Language: oc\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Generator: Poedit 3.3.1\n" #: pdfarranger/splitter.py:87 msgid "#Col" msgstr "#Col" #: pdfarranger/splitter.py:87 msgid "#Row" msgstr "#Linha" #: pdfarranger/pageutils.py:122 pdfarranger/pageutils.py:477 #: pdfarranger/pageutils.py:479 msgid "%" msgstr "%" #: pdfarranger/pageutils.py:170 msgid "% of height" msgstr "% de la nautor" #: pdfarranger/pageutils.py:170 msgid "% of width" msgstr "% de la largor" #: pdfarranger/pdfarranger.py:2548 #, python-format msgid "%s is a tool for rearranging and modifying PDF files." msgstr "%s es una aisina per reorganizar e modificar los fichièrs PDF." #: pdfarranger/config.py:232 msgid "(Libhandy missing)" msgstr "(Libhandy mancanta)" #: pdfarranger/config.py:224 msgid "(Requires restart)" msgstr "(Reaviada necessària)" #: pdfarranger/pageutils.py:461 msgid "(same offset is applied to all pages)" msgstr "(lo meteis descalatge es aplicat a totas las paginas)" #: pdfarranger/pdfarranger.py:1130 #, python-format msgid "A file named \"%s\" already exists. Do you want to replace it?" msgstr "Un fichièr nomenat « %s » existís ja. Lo volètz remplaçar ?" #: data/menu.ui:189 data/menu.ui:332 msgid "All From _Same File" msgstr "Totas del _meteis fichièr" #: pdfarranger/pdfarranger.py:507 msgid "All files" msgstr "Totes los fichièrs" #: pdfarranger/pdfarranger.py:462 msgid "All pages must have the same size." msgstr "Totes las paginas devon aver la meteissa talha." #: pdfarranger/pdfarranger.py:495 msgid "All supported files" msgstr "Totes los fichièrs preses en carga" #: pdfarranger/pageutils.py:149 msgid "Bottom" msgstr "En bas" #: pdfarranger/pageutils.py:380 msgid "Bottom to Top" msgstr "D'aval cap amont" #: pdfarranger/core.py:386 msgid "Clipboard image" msgstr "Imatge del quichapapièr" #: pdfarranger/pageutils.py:363 pdfarranger/splitter.py:60 msgid "Columns" msgstr "Colomnas" #: pdfarranger/metadata.py:48 msgid "Created" msgstr "Creacion" #: pdfarranger/metadata.py:46 msgid "Creator" msgstr "Creator" #: pdfarranger/metadata.py:47 msgid "Creator tool" msgstr "Logicial de creacion" #: pdfarranger/pageutils.py:153 msgid "Crop Margins" msgstr "Talhar los marges" #: data/menu.ui:104 data/menu.ui:365 msgid "Crop White Borders" msgstr "Talhar las bordaduras blancas" #: pdfarranger/pageutils.py:161 msgid "" "Cropping does not remove any content from the PDF file, it only hides it." msgstr "Talhar lèva pas cap de contengut del fichièr PDF, l’amaga sonque." #: data/menu.ui:128 data/menu.ui:264 msgid "Cu_t" msgstr "_Copar" #: pdfarranger/pdfarranger.py:1250 msgid "Despite the warnings the document(s) should have no visible issues." msgstr "" "En defòra dels avertiments lo(s) document(s) deurián pas aver de problèmas " "visibles." #: pdfarranger/pdfarranger.py:979 msgid "Discard changes and close?" msgstr "Abandonar las modificacion e tampar ?" #: pdfarranger/pdfarranger.py:1016 msgid "Discard changes and quit?" msgstr "Abandonar las modificacions e quitar ?" #: pdfarranger/exporter.py:194 msgid "Do not show this dialog again." msgstr "Afichar pas mai aquesta fenèstra." #: pdfarranger/pdfarranger.py:970 msgid "Do_n’t Save" msgstr "E_nregistrar pas" #: pdfarranger/pdfarranger.py:1257 msgid "Don't show warnings when saving again." msgstr "Mostrar pas mai d’avertiments en enregistrant." #: data/menu.ui:112 data/menu.ui:369 msgid "Dupl_icate" msgstr "Dupl_icar" #: data/menu.ui:52 data/menu.ui:395 msgid "E_xport" msgstr "E_xportar" #: data/menu.ui:55 data/menu.ui:398 msgid "E_xport Selection to a Single File…" msgstr "E_xportar la seleccion dins un unic fichièr…" #: data/menu.ui:228 msgid "Edit _Properties" msgstr "Modificar las _proprietats" #: pdfarranger/metadata.py:198 msgid "Edit properties" msgstr "Modificar las proprietats" #: pdfarranger/splitter.py:62 msgid "Equal column width" msgstr "Egal a la largor de colomna" #: pdfarranger/splitter.py:62 msgid "Equal row height" msgstr "Egal a la nautor de la linha" #: data/menu.ui:60 data/menu.ui:403 msgid "Export Selection to _Individual Files…" msgstr "Exportar la seleccion dins de fichièrs _individuals…" #: data/menu.ui:65 data/menu.ui:408 msgid "Export _All Pages to Individual Files…" msgstr "Exportar _totas las paginas dins de fichièrs _individuals…" #: pdfarranger/pdfarranger.py:1088 msgid "Export…" msgstr "Exportar…" #: pdfarranger/core.py:388 pdfarranger/pdfarranger.py:1504 msgid "File is neither pdf nor image" msgstr "Lo fichièr es pas un pdf nimai un imatge" #: pdfarranger/pdfarranger.py:301 msgid "File(s) to open" msgstr "Fichièr(s) de dobrir" #: pdfarranger/config.py:237 msgid "For more options see:" msgstr "Per mai d’opcions vejatz :" #: pdfarranger/exporter.py:192 msgid "Forms and outlines are lost on saving." msgstr "Los formularis e contorns se pèrdon en salvant." #: data/menu.ui:221 msgid "Full_screen" msgstr "Ecran _complèt" #: pdfarranger/pdfarranger.py:2562 msgid "GNU General Public License (GPL) Version 3." msgstr "Licéncia publica generala GNU (GPL) version 3." #: data/menu.ui:160 data/menu.ui:389 msgid "Generate Booklet" msgstr "Generar lo Booklet" #: pdfarranger/pageutils.py:236 pdfarranger/pageutils.py:240 #: pdfarranger/pageutils.py:328 msgid "Height" msgstr "Nautor" #: pdfarranger/splitter.py:88 msgid "Height in %" msgstr "Nautor en %" #: pdfarranger/pageutils.py:375 msgid "Horizontal" msgstr "Orizontal" #: pdfarranger/splitter.py:61 msgid "Horizontal Splits" msgstr "Partison orizontal" #: pdfarranger/pageutils.py:476 msgid "Horizontal offset" msgstr "Descalatge orizontal" #: pdfarranger/core.py:377 msgid "Image files are only supported with img2pdf" msgstr "Los fichièrs imatge son solament preses en carga amb img2pdf" #: pdfarranger/core.py:383 msgid "Image format is not supported by img2pdf" msgstr "Lo format d’imatge pas pres en carga per img2pdf" #: data/pdfarranger.ui:58 msgid "Import" msgstr "Importar" #: pdfarranger/pdfarranger.py:1327 msgid "Import…" msgstr "Importacion…" #: data/menu.ui:156 data/menu.ui:385 msgid "Insert Blan_k Page…" msgstr "Inserir una pagina _voida…" #: pdfarranger/pageutils.py:325 msgid "Insert Blank Page" msgstr "Inserir una pagina voida" #: pdfarranger/metadata.py:169 msgid "Invalid date format. Input discarded." msgstr "Format de data invalid. Entrada ignorada." #: pdfarranger/pdfarranger.py:2551 #, python-format msgid "It uses libqpdf %s, pikepdf %s, GTK %s and Python %s." msgstr "Utiliza libqpdf %s, pikepdf %s, GTK %s e Python %s." #: pdfarranger/metadata.py:44 msgid "Keywords" msgstr "Mots clau" #: pdfarranger/config.py:222 msgid "Language" msgstr "Lenga " #: pdfarranger/pageutils.py:460 msgid "Layout for the first page in selection" msgstr "Disposicion de la primièra pagina en seleccion" #: pdfarranger/pageutils.py:149 msgid "Left" msgstr "Esquèrra" #: pdfarranger/pageutils.py:377 msgid "Left to Right" msgstr "D’esquèrra a drecha" #: data/pdfarranger.ui:122 msgid "Main Menu" msgstr "Menú principal" #: pdfarranger/pdfarranger.py:2557 msgid "Maintainers and contributors" msgstr "Manteneires e contributors" #: pdfarranger/pageutils.py:361 msgid "Margin" msgstr "Marge" #: pdfarranger/pageutils.py:347 msgid "Merge Pages" msgstr "Marge de las paginas" #: pdfarranger/pageutils.py:412 msgid "Merged page size:" msgstr "Talha de las paginas amb marge :" #: pdfarranger/metadata.py:49 msgid "Modified" msgstr "Modificacion" #: pdfarranger/pageutils.py:392 msgid "Non-uniform page size - using max size" msgstr "Talha de pagina non unifòrma - utilizacion de la talha max" #: data/pdfarranger.ui:37 msgid "Open" msgstr "Dobrir" #: pdfarranger/pdfarranger.py:1186 msgid "Open…" msgstr "Dobrir…" #: pdfarranger/pageutils.py:436 msgid "Overlay" msgstr "Superposicion" #: pdfarranger/pdfarranger.py:282 msgid "" "PDF Arranger is a small python-gtk application, which helps the user to " "merge or split pdf documents and rotate, crop and rearrange their pages " "using an interactive and intuitive graphical interface. It is a frontend for " "pikepdf." msgstr "" "PDF Arranger es una pichona aplicacion python-gtk qu’ajuda l’utilizaire a " "fusionar o copar de documents pdf e tanben los virar, talhar e reorganizar " "en utilizant una interfàcia interactiva e intuitiva. Es un frontend per " "pikepdf." #: pdfarranger/pdfarranger.py:1498 msgid "PDF document is damaged" msgstr "Lo document PDF es damatjat" #: pdfarranger/pdfarranger.py:499 msgid "PDF files" msgstr "Fichièrs PDF" #: pdfarranger/pageutils.py:388 msgid "Page Order" msgstr "Òrdre de las paginas" #: pdfarranger/pageutils.py:241 msgid "Page Size" msgstr "Talha de la pagina" #: pdfarranger/pdfarranger.py:2585 msgid "Page Size:" msgstr "Talha de la pagina :" #: pdfarranger/pageutils.py:230 msgid "Page format" msgstr "Format de pagina" #: pdfarranger/core.py:285 msgid "Password" msgstr "Senhal" #: pdfarranger/core.py:263 msgid "Password required" msgstr "Senhal requesit" #: data/menu.ui:277 msgid "Past_e Special" msgstr "Emp_egament especial" #: data/menu.ui:295 msgid "Paste As O_verlay…" msgstr "Pegar coma s_uperposicion…" #: data/menu.ui:151 data/menu.ui:290 msgid "Paste As _Even Pages" msgstr "Pegar coma paginas _paras" #: data/menu.ui:146 data/menu.ui:285 msgid "Paste As _Odd Pages" msgstr "Pegar coma paginas _imparas" #: data/menu.ui:300 msgid "Paste As _Underlay…" msgstr "Pegar coma j_os jaç…" #: data/menu.ui:136 data/menu.ui:272 msgid "Paste _After" msgstr "Pegar _aprèp" #: data/menu.ui:141 data/menu.ui:280 msgid "Paste _Before" msgstr "Pegar _avant" #: pdfarranger/pdfarranger.py:1627 msgid "Pasted data not valid. Aborting paste." msgstr "Donadas pegadas invalidas. Abandon de l’empegament." #: pdfarranger/pdfarranger.py:1589 msgid "Pikepdf >= 3 is needed for overlay/underlay/merge support." msgstr "" "Pikepdf >= 3 es requerit per la presa en carga de la fusion d’incrustacion " "sus o jos la pagina." #: data/menu.ui:234 msgid "Pre_ferences" msgstr "Pre_feréncias" #: pdfarranger/config.py:212 msgid "Preferences" msgstr "Preferéncias" #: pdfarranger/pdfarranger.py:293 msgid "Print the version of PDF Arranger and exit" msgstr "Afichar la version de PDF Arranger e quitar" #: pdfarranger/exporter.py:457 msgid "Printing…" msgstr "Impression…" #: pdfarranger/metadata.py:45 msgid "Producer" msgstr "Productor" #: pdfarranger/metadata.py:212 msgid "Property" msgstr "Proprietat" #: data/menu.ui:116 data/menu.ui:373 msgid "Re_verse Order" msgstr "In_versar l'òrdre" #: pdfarranger/pageutils.py:238 msgid "Relative" msgstr "Relativa" #: pdfarranger/exporter.py:469 msgid "Rendering Preview…" msgstr "Generacion de l’apercebut…" #: pdfarranger/pdfarranger.py:732 msgid "Rendering…" msgstr "Rendut en cors…" #: pdfarranger/pdfarranger.py:1132 msgid "Replace" msgstr "Remplaçar" #: pdfarranger/pageutils.py:149 msgid "Right" msgstr "Drecha" #: pdfarranger/pageutils.py:378 msgid "Right to Left" msgstr "De drecha a esquèrra" #: data/pdfarranger.ui:203 msgid "Rotate Left" msgstr "Pivotar cap a esquèrra" #: data/pdfarranger.ui:227 msgid "Rotate Right" msgstr "Pivotar cap a drecha" #: data/menu.ui:90 data/menu.ui:351 msgid "Rotate _Left" msgstr "Pivotar cap a es_quèrra" #: pdfarranger/pageutils.py:364 pdfarranger/splitter.py:60 msgid "Rows" msgstr "Linhas" #: data/menu.ui:194 data/menu.ui:337 msgid "Same Page _Format" msgstr "Meteis _format de pagina" #: data/pdfarranger.ui:78 msgid "Save" msgstr "Enregistrar" #: data/pdfarranger.ui:97 msgid "Save As" msgstr "Enregistrar jos" #: pdfarranger/pdfarranger.py:1088 msgid "Save As…" msgstr "Enregistrar jos…" #: data/menu.ui:47 msgid "Save _As…" msgstr "Enregistrar _jos…" #: pdfarranger/pdfarranger.py:988 msgid "Save changes before closing?" msgstr "Enregistrar las modificacions abans de tampar ?" #: pdfarranger/pdfarranger.py:1025 msgid "Save changes before quitting?" msgstr "Enregistrar las modificacions abans de tampar ?" #: pdfarranger/pdfarranger.py:985 msgid "Save changes to “{}” before closing?" msgstr "Enregistrar las modificacions de « {} » abans de tampar ?" #: pdfarranger/pdfarranger.py:1022 msgid "Save changes to “{}” before quitting?" msgstr "Enregistrar las modificacions de « {} » abans de tampar ?" #: pdfarranger/pdfarranger.py:1249 msgid "Saving produced some warnings" msgstr "L’enregistrament a portat d’unes avertiments" #: pdfarranger/pdfarranger.py:1288 msgid "Saving…" msgstr "Enregistrament…" #: pdfarranger/pageutils.py:116 msgid "Scale factor" msgstr "Factor d'escala" #: data/menu.ui:169 data/menu.ui:312 msgid "Select _All" msgstr "_Tot seleccionar" #: data/menu.ui:184 data/menu.ui:327 msgid "Select _Even Pages" msgstr "Seleccionar las paginas _paras" #: data/menu.ui:179 data/menu.ui:322 msgid "Select _Odd Pages" msgstr "Seleccionar las paginas _imparas" #: pdfarranger/pdfarranger.py:2580 msgid "Selected pages: " msgstr "Paginas seleccionadas : " #: pdfarranger/splitter.py:26 msgid "Split Pages" msgstr "Devesir paginas" #: pdfarranger/metadata.py:43 msgid "Subject" msgstr "Subjècte" #: pdfarranger/pdfarranger.py:512 msgid "Supported image files" msgstr "Fichièrs imatge preses en carga" #: pdfarranger/config.py:248 pdfarranger/config.py:256 msgid "System setting" msgstr "Paramètres sistèma" #: pdfarranger/core.py:275 msgid "" "The document “{}” is locked and requires a password before it can be opened." msgstr "Lo document « {} » es verrolhat e requerís un senhal per se dobrir." #: pdfarranger/core.py:274 msgid "The password will be remembered until you close PDF Arranger." msgstr "S’enregistrarà lo senhal fins que tampetz PDF Arranger." #: pdfarranger/config.py:230 msgid "Theme" msgstr "Tèma" #: pdfarranger/metadata.py:42 msgid "Title" msgstr "Títol" #: pdfarranger/pageutils.py:149 msgid "Top" msgstr "Ennaut" #: pdfarranger/pageutils.py:379 msgid "Top to Bottom" msgstr "D'amont cap aval" #: pdfarranger/pageutils.py:436 msgid "Underlay" msgstr "Jos jaç" #: pdfarranger/core.py:361 pdfarranger/pdfarranger.py:1494 msgid "Unknown file format" msgstr "Format de fichièr desconegut" #: pdfarranger/metadata.py:212 msgid "Value" msgstr "Valor" #: pdfarranger/pageutils.py:376 msgid "Vertical" msgstr "Vertical" #: pdfarranger/splitter.py:61 msgid "Vertical Splits" msgstr "Partison vertical" #: pdfarranger/pageutils.py:478 msgid "Vertical offset" msgstr "Descalatge vertical" #: pdfarranger/exporter.py:187 msgid "Warning" msgstr "Avertiment" #: pdfarranger/pageutils.py:235 pdfarranger/pageutils.py:239 #: pdfarranger/pageutils.py:327 msgid "Width" msgstr "Largor" #: pdfarranger/splitter.py:88 msgid "Width in %" msgstr "Largor en %" #: pdfarranger/pdfarranger.py:969 msgid "Your changes will be lost if you don’t save them." msgstr "Vòstras modificacions seràn perdudas se las enregistratz pas." #: data/pdfarranger.ui:144 msgid "Zoom In" msgstr "Agrandir" #: data/pdfarranger.ui:167 msgid "Zoom Out" msgstr "Redusir" #: data/menu.ui:217 msgid "Zoom _Fit" msgstr "_Adaptar" #: data/menu.ui:209 msgid "Zoom _In" msgstr "Agran_dir" #: data/menu.ui:213 msgid "Zoom _Out" msgstr "_Reduire" #: data/menu.ui:240 msgid "_About" msgstr "_A prepaus" #: pdfarranger/config.py:216 pdfarranger/pageutils.py:219 #: pdfarranger/pdfarranger.py:961 pdfarranger/pdfarranger.py:970 #: pdfarranger/pdfarranger.py:1094 pdfarranger/pdfarranger.py:1144 msgid "_Cancel" msgstr "_Anullar" #: pdfarranger/pdfarranger.py:980 data/menu.ui:246 msgid "_Close" msgstr "_Tampar" #: data/menu.ui:132 data/menu.ui:268 msgid "_Copy" msgstr "_Copiar" #: data/menu.ui:108 data/menu.ui:260 msgid "_Delete" msgstr "_Suprimir" #: data/menu.ui:174 data/menu.ui:317 msgid "_Deselect All" msgstr "_Tot deseleccionar" #: data/menu.ui:87 msgid "_Edit" msgstr "_Editar" #: data/menu.ui:30 msgid "_Import" msgstr "_Importar" #: data/menu.ui:199 data/menu.ui:342 msgid "_Invert Selection" msgstr "_Inversar la seleccion" #: data/menu.ui:124 data/menu.ui:381 msgid "_Merge Pages…" msgstr "_Marge de las paginas…" #: data/menu.ui:36 msgid "_New Window" msgstr "Fenèstra _novèla" #: pdfarranger/config.py:217 pdfarranger/pageutils.py:220 msgid "_OK" msgstr "_D'acòrdi" #: pdfarranger/pdfarranger.py:1143 data/menu.ui:24 msgid "_Open" msgstr "_Dobrir" #: data/menu.ui:100 data/menu.ui:361 msgid "_Page Format…" msgstr "Format de _pagina…" #: data/menu.ui:71 msgid "_Print…" msgstr "_Imprimir…" #: pdfarranger/pdfarranger.py:1017 data/menu.ui:252 msgid "_Quit" msgstr "_Quitar" #: data/menu.ui:82 msgid "_Redo" msgstr "_Restablir" #: data/menu.ui:95 data/menu.ui:356 msgid "_Rotate Right" msgstr "Pivotar cap a _drecha" #: pdfarranger/pdfarranger.py:970 pdfarranger/pdfarranger.py:1093 #: data/menu.ui:42 msgid "_Save" msgstr "_Enregistrar" #: data/menu.ui:166 data/menu.ui:309 msgid "_Select" msgstr "_Seleccionar" #: data/menu.ui:120 data/menu.ui:377 msgid "_Split Pages…" msgstr "_Devesir las paginas…" #: data/menu.ui:78 msgid "_Undo" msgstr "_Desfar" #: data/menu.ui:206 msgid "_View" msgstr "_Afichatge" #: pdfarranger/pageutils.py:139 pdfarranger/pageutils.py:362 #: pdfarranger/pageutils.py:412 msgid "mm" msgstr "mm" #: pdfarranger/core.py:89 msgid "page" msgstr "pagina" #: pdfarranger/pdfarranger.py:811 msgid "untitled" msgstr "sens títol" pdfarranger-1.10.1/po/pdfarranger.pot000066400000000000000000000325111451252235000175230ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-04-29 22:45+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: pdfarranger/splitter.py:87 msgid "#Col" msgstr "" #: pdfarranger/splitter.py:87 msgid "#Row" msgstr "" #: pdfarranger/pageutils.py:122 pdfarranger/pageutils.py:477 #: pdfarranger/pageutils.py:479 msgid "%" msgstr "" #: pdfarranger/pageutils.py:170 msgid "% of height" msgstr "" #: pdfarranger/pageutils.py:170 msgid "% of width" msgstr "" #: pdfarranger/pdfarranger.py:2548 #, python-format msgid "%s is a tool for rearranging and modifying PDF files." msgstr "" #: pdfarranger/config.py:232 msgid "(Libhandy missing)" msgstr "" #: pdfarranger/config.py:224 msgid "(Requires restart)" msgstr "" #: pdfarranger/pageutils.py:461 msgid "(same offset is applied to all pages)" msgstr "" #: pdfarranger/pdfarranger.py:1130 #, python-format msgid "A file named \"%s\" already exists. Do you want to replace it?" msgstr "" #: data/menu.ui:189 data/menu.ui:332 msgid "All From _Same File" msgstr "" #: pdfarranger/pdfarranger.py:507 msgid "All files" msgstr "" #: pdfarranger/pdfarranger.py:462 msgid "All pages must have the same size." msgstr "" #: pdfarranger/pdfarranger.py:495 msgid "All supported files" msgstr "" #: pdfarranger/pageutils.py:149 msgid "Bottom" msgstr "" #: pdfarranger/pageutils.py:380 msgid "Bottom to Top" msgstr "" #: pdfarranger/core.py:386 msgid "Clipboard image" msgstr "" #: pdfarranger/pageutils.py:363 pdfarranger/splitter.py:60 msgid "Columns" msgstr "" #: pdfarranger/metadata.py:48 msgid "Created" msgstr "" #: pdfarranger/metadata.py:46 msgid "Creator" msgstr "" #: pdfarranger/metadata.py:47 msgid "Creator tool" msgstr "" #: pdfarranger/pageutils.py:153 msgid "Crop Margins" msgstr "" #: data/menu.ui:104 data/menu.ui:365 msgid "Crop White Borders" msgstr "" #: pdfarranger/pageutils.py:161 msgid "" "Cropping does not remove any content from the PDF file, it only hides it." msgstr "" #: data/menu.ui:128 data/menu.ui:264 msgid "Cu_t" msgstr "" #: pdfarranger/pdfarranger.py:1250 msgid "Despite the warnings the document(s) should have no visible issues." msgstr "" #: pdfarranger/pdfarranger.py:979 msgid "Discard changes and close?" msgstr "" #: pdfarranger/pdfarranger.py:1016 msgid "Discard changes and quit?" msgstr "" #: pdfarranger/exporter.py:194 msgid "Do not show this dialog again." msgstr "" #: pdfarranger/pdfarranger.py:970 msgid "Do_n’t Save" msgstr "" #: pdfarranger/pdfarranger.py:1257 msgid "Don't show warnings when saving again." msgstr "" #: data/menu.ui:112 data/menu.ui:369 msgid "Dupl_icate" msgstr "" #: data/menu.ui:52 data/menu.ui:395 msgid "E_xport" msgstr "" #: data/menu.ui:55 data/menu.ui:398 msgid "E_xport Selection to a Single File…" msgstr "" #: data/menu.ui:228 msgid "Edit _Properties" msgstr "" #: pdfarranger/metadata.py:198 msgid "Edit properties" msgstr "" #: pdfarranger/splitter.py:62 msgid "Equal column width" msgstr "" #: pdfarranger/splitter.py:62 msgid "Equal row height" msgstr "" #: data/menu.ui:60 data/menu.ui:403 msgid "Export Selection to _Individual Files…" msgstr "" #: data/menu.ui:65 data/menu.ui:408 msgid "Export _All Pages to Individual Files…" msgstr "" #: pdfarranger/pdfarranger.py:1088 msgid "Export…" msgstr "" #: pdfarranger/core.py:388 pdfarranger/pdfarranger.py:1504 msgid "File is neither pdf nor image" msgstr "" #: pdfarranger/pdfarranger.py:301 msgid "File(s) to open" msgstr "" #: pdfarranger/config.py:237 msgid "For more options see:" msgstr "" #: pdfarranger/exporter.py:192 msgid "Forms and outlines are lost on saving." msgstr "" #: data/menu.ui:221 msgid "Full_screen" msgstr "" #: pdfarranger/pdfarranger.py:2562 msgid "GNU General Public License (GPL) Version 3." msgstr "" #: data/menu.ui:160 data/menu.ui:389 msgid "Generate Booklet" msgstr "" #: pdfarranger/pageutils.py:236 pdfarranger/pageutils.py:240 #: pdfarranger/pageutils.py:328 msgid "Height" msgstr "" #: pdfarranger/splitter.py:88 msgid "Height in %" msgstr "" #: pdfarranger/pageutils.py:375 msgid "Horizontal" msgstr "" #: pdfarranger/splitter.py:61 msgid "Horizontal Splits" msgstr "" #: pdfarranger/pageutils.py:476 msgid "Horizontal offset" msgstr "" #: pdfarranger/core.py:377 msgid "Image files are only supported with img2pdf" msgstr "" #: pdfarranger/core.py:383 msgid "Image format is not supported by img2pdf" msgstr "" #: data/pdfarranger.ui:58 msgid "Import" msgstr "" #: pdfarranger/pdfarranger.py:1327 msgid "Import…" msgstr "" #: data/menu.ui:156 data/menu.ui:385 msgid "Insert Blan_k Page…" msgstr "" #: pdfarranger/pageutils.py:325 msgid "Insert Blank Page" msgstr "" #: pdfarranger/metadata.py:169 msgid "Invalid date format. Input discarded." msgstr "" #: pdfarranger/pdfarranger.py:2551 #, python-format msgid "It uses libqpdf %s, pikepdf %s, GTK %s and Python %s." msgstr "" #: pdfarranger/metadata.py:44 msgid "Keywords" msgstr "" #: pdfarranger/config.py:222 msgid "Language" msgstr "" #: pdfarranger/pageutils.py:460 msgid "Layout for the first page in selection" msgstr "" #: pdfarranger/pageutils.py:149 msgid "Left" msgstr "" #: pdfarranger/pageutils.py:377 msgid "Left to Right" msgstr "" #: data/pdfarranger.ui:122 msgid "Main Menu" msgstr "" #: pdfarranger/pdfarranger.py:2557 msgid "Maintainers and contributors" msgstr "" #: pdfarranger/pageutils.py:361 msgid "Margin" msgstr "" #: pdfarranger/pageutils.py:347 msgid "Merge Pages" msgstr "" #: pdfarranger/pageutils.py:412 msgid "Merged page size:" msgstr "" #: pdfarranger/metadata.py:49 msgid "Modified" msgstr "" #: pdfarranger/pageutils.py:392 msgid "Non-uniform page size - using max size" msgstr "" #: data/pdfarranger.ui:37 msgid "Open" msgstr "" #: pdfarranger/pdfarranger.py:1186 msgid "Open…" msgstr "" #: pdfarranger/pageutils.py:436 msgid "Overlay" msgstr "" #: pdfarranger/pdfarranger.py:282 msgid "" "PDF Arranger is a small python-gtk application, which helps the user to " "merge or split pdf documents and rotate, crop and rearrange their pages " "using an interactive and intuitive graphical interface. It is a frontend for " "pikepdf." msgstr "" #: pdfarranger/pdfarranger.py:1498 msgid "PDF document is damaged" msgstr "" #: pdfarranger/pdfarranger.py:499 msgid "PDF files" msgstr "" #: pdfarranger/pageutils.py:388 msgid "Page Order" msgstr "" #: pdfarranger/pageutils.py:241 msgid "Page Size" msgstr "" #: pdfarranger/pdfarranger.py:2585 msgid "Page Size:" msgstr "" #: pdfarranger/pageutils.py:230 msgid "Page format" msgstr "" #: pdfarranger/core.py:285 msgid "Password" msgstr "" #: pdfarranger/core.py:263 msgid "Password required" msgstr "" #: data/menu.ui:277 msgid "Past_e Special" msgstr "" #: data/menu.ui:295 msgid "Paste As O_verlay…" msgstr "" #: data/menu.ui:151 data/menu.ui:290 msgid "Paste As _Even Pages" msgstr "" #: data/menu.ui:146 data/menu.ui:285 msgid "Paste As _Odd Pages" msgstr "" #: data/menu.ui:300 msgid "Paste As _Underlay…" msgstr "" #: data/menu.ui:136 data/menu.ui:272 msgid "Paste _After" msgstr "" #: data/menu.ui:141 data/menu.ui:280 msgid "Paste _Before" msgstr "" #: pdfarranger/pdfarranger.py:1627 msgid "Pasted data not valid. Aborting paste." msgstr "" #: pdfarranger/pdfarranger.py:1589 msgid "Pikepdf >= 3 is needed for overlay/underlay/merge support." msgstr "" #: data/menu.ui:234 msgid "Pre_ferences" msgstr "" #: pdfarranger/config.py:212 msgid "Preferences" msgstr "" #: pdfarranger/pdfarranger.py:293 msgid "Print the version of PDF Arranger and exit" msgstr "" #: pdfarranger/exporter.py:457 msgid "Printing…" msgstr "" #: pdfarranger/metadata.py:45 msgid "Producer" msgstr "" #: pdfarranger/metadata.py:212 msgid "Property" msgstr "" #: data/menu.ui:116 data/menu.ui:373 msgid "Re_verse Order" msgstr "" #: pdfarranger/pageutils.py:238 msgid "Relative" msgstr "" #: pdfarranger/exporter.py:469 msgid "Rendering Preview…" msgstr "" #: pdfarranger/pdfarranger.py:732 msgid "Rendering…" msgstr "" #: pdfarranger/pdfarranger.py:1132 msgid "Replace" msgstr "" #: pdfarranger/pageutils.py:149 msgid "Right" msgstr "" #: pdfarranger/pageutils.py:378 msgid "Right to Left" msgstr "" #: data/pdfarranger.ui:203 msgid "Rotate Left" msgstr "" #: data/pdfarranger.ui:227 msgid "Rotate Right" msgstr "" #: data/menu.ui:90 data/menu.ui:351 msgid "Rotate _Left" msgstr "" #: pdfarranger/pageutils.py:364 pdfarranger/splitter.py:60 msgid "Rows" msgstr "" #: data/menu.ui:194 data/menu.ui:337 msgid "Same Page _Format" msgstr "" #: data/pdfarranger.ui:78 msgid "Save" msgstr "" #: data/pdfarranger.ui:97 msgid "Save As" msgstr "" #: pdfarranger/pdfarranger.py:1088 msgid "Save As…" msgstr "" #: data/menu.ui:47 msgid "Save _As…" msgstr "" #: pdfarranger/pdfarranger.py:988 msgid "Save changes before closing?" msgstr "" #: pdfarranger/pdfarranger.py:1025 msgid "Save changes before quitting?" msgstr "" #: pdfarranger/pdfarranger.py:985 msgid "Save changes to “{}” before closing?" msgstr "" #: pdfarranger/pdfarranger.py:1022 msgid "Save changes to “{}” before quitting?" msgstr "" #: pdfarranger/pdfarranger.py:1249 msgid "Saving produced some warnings" msgstr "" #: pdfarranger/pdfarranger.py:1288 msgid "Saving…" msgstr "" #: pdfarranger/pageutils.py:116 msgid "Scale factor" msgstr "" #: data/menu.ui:169 data/menu.ui:312 msgid "Select _All" msgstr "" #: data/menu.ui:184 data/menu.ui:327 msgid "Select _Even Pages" msgstr "" #: data/menu.ui:179 data/menu.ui:322 msgid "Select _Odd Pages" msgstr "" #: pdfarranger/pdfarranger.py:2580 msgid "Selected pages: " msgstr "" #: pdfarranger/splitter.py:26 msgid "Split Pages" msgstr "" #: pdfarranger/metadata.py:43 msgid "Subject" msgstr "" #: pdfarranger/pdfarranger.py:512 msgid "Supported image files" msgstr "" #: pdfarranger/config.py:248 pdfarranger/config.py:256 msgid "System setting" msgstr "" #: pdfarranger/core.py:275 msgid "" "The document “{}” is locked and requires a password before it can be opened." msgstr "" #: pdfarranger/core.py:274 msgid "The password will be remembered until you close PDF Arranger." msgstr "" #: pdfarranger/config.py:230 msgid "Theme" msgstr "" #: pdfarranger/metadata.py:42 msgid "Title" msgstr "" #: pdfarranger/pageutils.py:149 msgid "Top" msgstr "" #: pdfarranger/pageutils.py:379 msgid "Top to Bottom" msgstr "" #: pdfarranger/pageutils.py:436 msgid "Underlay" msgstr "" #: pdfarranger/core.py:361 pdfarranger/pdfarranger.py:1494 msgid "Unknown file format" msgstr "" #: pdfarranger/metadata.py:212 msgid "Value" msgstr "" #: pdfarranger/pageutils.py:376 msgid "Vertical" msgstr "" #: pdfarranger/splitter.py:61 msgid "Vertical Splits" msgstr "" #: pdfarranger/pageutils.py:478 msgid "Vertical offset" msgstr "" #: pdfarranger/exporter.py:187 msgid "Warning" msgstr "" #: pdfarranger/pageutils.py:235 pdfarranger/pageutils.py:239 #: pdfarranger/pageutils.py:327 msgid "Width" msgstr "" #: pdfarranger/splitter.py:88 msgid "Width in %" msgstr "" #: pdfarranger/pdfarranger.py:969 msgid "Your changes will be lost if you don’t save them." msgstr "" #: data/pdfarranger.ui:144 msgid "Zoom In" msgstr "" #: data/pdfarranger.ui:167 msgid "Zoom Out" msgstr "" #: data/menu.ui:217 msgid "Zoom _Fit" msgstr "" #: data/menu.ui:209 msgid "Zoom _In" msgstr "" #: data/menu.ui:213 msgid "Zoom _Out" msgstr "" #: data/menu.ui:240 msgid "_About" msgstr "" #: pdfarranger/config.py:216 pdfarranger/pageutils.py:219 #: pdfarranger/pdfarranger.py:961 pdfarranger/pdfarranger.py:970 #: pdfarranger/pdfarranger.py:1094 pdfarranger/pdfarranger.py:1144 msgid "_Cancel" msgstr "" #: pdfarranger/pdfarranger.py:980 data/menu.ui:246 msgid "_Close" msgstr "" #: data/menu.ui:132 data/menu.ui:268 msgid "_Copy" msgstr "" #: data/menu.ui:108 data/menu.ui:260 msgid "_Delete" msgstr "" #: data/menu.ui:174 data/menu.ui:317 msgid "_Deselect All" msgstr "" #: data/menu.ui:87 msgid "_Edit" msgstr "" #: data/menu.ui:30 msgid "_Import" msgstr "" #: data/menu.ui:199 data/menu.ui:342 msgid "_Invert Selection" msgstr "" #: data/menu.ui:124 data/menu.ui:381 msgid "_Merge Pages…" msgstr "" #: data/menu.ui:36 msgid "_New Window" msgstr "" #: pdfarranger/config.py:217 pdfarranger/pageutils.py:220 msgid "_OK" msgstr "" #: pdfarranger/pdfarranger.py:1143 data/menu.ui:24 msgid "_Open" msgstr "" #: data/menu.ui:100 data/menu.ui:361 msgid "_Page Format…" msgstr "" #: data/menu.ui:71 msgid "_Print…" msgstr "" #: pdfarranger/pdfarranger.py:1017 data/menu.ui:252 msgid "_Quit" msgstr "" #: data/menu.ui:82 msgid "_Redo" msgstr "" #: data/menu.ui:95 data/menu.ui:356 msgid "_Rotate Right" msgstr "" #: pdfarranger/pdfarranger.py:970 pdfarranger/pdfarranger.py:1093 #: data/menu.ui:42 msgid "_Save" msgstr "" #: data/menu.ui:166 data/menu.ui:309 msgid "_Select" msgstr "" #: data/menu.ui:120 data/menu.ui:377 msgid "_Split Pages…" msgstr "" #: data/menu.ui:78 msgid "_Undo" msgstr "" #: data/menu.ui:206 msgid "_View" msgstr "" #: pdfarranger/pageutils.py:139 pdfarranger/pageutils.py:362 #: pdfarranger/pageutils.py:412 msgid "mm" msgstr "" #: pdfarranger/core.py:89 msgid "page" msgstr "" #: pdfarranger/pdfarranger.py:811 msgid "untitled" msgstr "" pdfarranger-1.10.1/po/pl_PL.po000066400000000000000000000373561451252235000160660ustar00rootroot00000000000000# PDF-Shuffler translation files. # Copyright (C) 2008-2017 Konstantinos Poulios # This file is part of PDF-Shuffler which is released under the GNU General # Public License version 3 or later. # See file COPYING or go to for full license details. # Translators: # Toratora , 2014 msgid "" msgstr "" "Project-Id-Version: PDF-Shuffler 0.7\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-04-29 22:45+0200\n" "PO-Revision-Date: 2021-12-30 17:13+0100\n" "Last-Translator: Toratora \n" "Language-Team: Polish (Poland) (http://www.transifex.com/logari81/" "pdfshuffler/language/pl_PL/)\n" "Language: pl_PL\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2);\n" "X-Generator: Poedit 3.0.1\n" "X-Language: pl_PL\n" "X-Source-Language: C\n" #: pdfarranger/splitter.py:87 msgid "#Col" msgstr "" #: pdfarranger/splitter.py:87 msgid "#Row" msgstr "" #: pdfarranger/pageutils.py:122 pdfarranger/pageutils.py:477 #: pdfarranger/pageutils.py:479 msgid "%" msgstr "%" #: pdfarranger/pageutils.py:170 #, python-format msgid "% of height" msgstr "" #: pdfarranger/pageutils.py:170 #, python-format msgid "% of width" msgstr "" #: pdfarranger/pdfarranger.py:2548 #, python-format msgid "%s is a tool for rearranging and modifying PDF files." msgstr "" #: pdfarranger/config.py:232 msgid "(Libhandy missing)" msgstr "" #: pdfarranger/config.py:224 msgid "(Requires restart)" msgstr "" #: pdfarranger/pageutils.py:461 msgid "(same offset is applied to all pages)" msgstr "" #: pdfarranger/pdfarranger.py:1130 #, python-format msgid "A file named \"%s\" already exists. Do you want to replace it?" msgstr "" #: data/menu.ui:189 data/menu.ui:332 msgid "All From _Same File" msgstr "Wszystko z _tego samego pliku" #: pdfarranger/pdfarranger.py:507 msgid "All files" msgstr "Wszystkie pliki" #: pdfarranger/pdfarranger.py:462 msgid "All pages must have the same size." msgstr "Wszystkie strony muszą mieć ten sam rozmiar." #: pdfarranger/pdfarranger.py:495 msgid "All supported files" msgstr "" #: pdfarranger/pageutils.py:149 msgid "Bottom" msgstr "Dół" #: pdfarranger/pageutils.py:380 msgid "Bottom to Top" msgstr "" #: pdfarranger/core.py:386 msgid "Clipboard image" msgstr "" #: pdfarranger/pageutils.py:363 pdfarranger/splitter.py:60 msgid "Columns" msgstr "Kolumny" #: pdfarranger/metadata.py:48 msgid "Created" msgstr "" #: pdfarranger/metadata.py:46 msgid "Creator" msgstr "Kreator" #: pdfarranger/metadata.py:47 msgid "Creator tool" msgstr "Narzędzie kreatora" #: pdfarranger/pageutils.py:153 msgid "Crop Margins" msgstr "Przytnij margines" #: data/menu.ui:104 data/menu.ui:365 msgid "Crop White Borders" msgstr "Przytnij białe obramowania" #: pdfarranger/pageutils.py:161 msgid "" "Cropping does not remove any content from the PDF file, it only hides it." msgstr "Przycinanie nie usuwa żadnej zawartości z pliku PDF, ukrywa tylko." #: data/menu.ui:128 data/menu.ui:264 msgid "Cu_t" msgstr "Wy_tnij" #: pdfarranger/pdfarranger.py:1250 msgid "Despite the warnings the document(s) should have no visible issues." msgstr "" #: pdfarranger/pdfarranger.py:979 msgid "Discard changes and close?" msgstr "" #: pdfarranger/pdfarranger.py:1016 msgid "Discard changes and quit?" msgstr "" #: pdfarranger/exporter.py:194 msgid "Do not show this dialog again." msgstr "Nie pokazuj ponownie tego okna dialogowego." #: pdfarranger/pdfarranger.py:970 msgid "Do_n’t Save" msgstr "_Nie zapisuj" #: pdfarranger/pdfarranger.py:1257 msgid "Don't show warnings when saving again." msgstr "" #: data/menu.ui:112 data/menu.ui:369 msgid "Dupl_icate" msgstr "Zdu_plikowane" #: data/menu.ui:52 data/menu.ui:395 msgid "E_xport" msgstr "" #: data/menu.ui:55 data/menu.ui:398 msgid "E_xport Selection to a Single File…" msgstr "" #: data/menu.ui:228 msgid "Edit _Properties" msgstr "Edytuj _właściwości" #: pdfarranger/metadata.py:198 msgid "Edit properties" msgstr "Edytuj właściwości" #: pdfarranger/splitter.py:62 msgid "Equal column width" msgstr "Równa szerokość kolumny" #: pdfarranger/splitter.py:62 msgid "Equal row height" msgstr "" #: data/menu.ui:60 data/menu.ui:403 msgid "Export Selection to _Individual Files…" msgstr "" #: data/menu.ui:65 data/menu.ui:408 msgid "Export _All Pages to Individual Files…" msgstr "Eksportuj _Wszystkie strony do pojedynczych plików…" #: pdfarranger/pdfarranger.py:1088 msgid "Export…" msgstr "Eksportuj…" #: pdfarranger/core.py:388 pdfarranger/pdfarranger.py:1504 msgid "File is neither pdf nor image" msgstr "Plik nie jest ani pdfem, ani obrazem" #: pdfarranger/pdfarranger.py:301 msgid "File(s) to open" msgstr "Plik(i) do otwarcia" #: pdfarranger/config.py:237 msgid "For more options see:" msgstr "" #: pdfarranger/exporter.py:192 msgid "Forms and outlines are lost on saving." msgstr "Formularze i kontury są tracone podczas zapisywania." #: data/menu.ui:221 msgid "Full_screen" msgstr "" #: pdfarranger/pdfarranger.py:2562 msgid "GNU General Public License (GPL) Version 3." msgstr "" #: data/menu.ui:160 data/menu.ui:389 msgid "Generate Booklet" msgstr "Wygeneruj broszurę" #: pdfarranger/pageutils.py:236 pdfarranger/pageutils.py:240 #: pdfarranger/pageutils.py:328 msgid "Height" msgstr "" #: pdfarranger/splitter.py:88 msgid "Height in %" msgstr "Wysokość w %" #: pdfarranger/pageutils.py:375 msgid "Horizontal" msgstr "" #: pdfarranger/splitter.py:61 msgid "Horizontal Splits" msgstr "Podziały poziome" #: pdfarranger/pageutils.py:476 msgid "Horizontal offset" msgstr "" #: pdfarranger/core.py:377 msgid "Image files are only supported with img2pdf" msgstr "Pliki graficzne są obsługiwane tylko przez img2pdf" #: pdfarranger/core.py:383 msgid "Image format is not supported by img2pdf" msgstr "Format obrazu nie jest obsługiwany przez img2pdf" #: data/pdfarranger.ui:58 msgid "Import" msgstr "" #: pdfarranger/pdfarranger.py:1327 msgid "Import…" msgstr "Importuj…" #: data/menu.ui:156 data/menu.ui:385 msgid "Insert Blan_k Page…" msgstr "Wstaw pustą stronę…" #: pdfarranger/pageutils.py:325 msgid "Insert Blank Page" msgstr "Wstaw pustą stronę" #: pdfarranger/metadata.py:169 msgid "Invalid date format. Input discarded." msgstr "Zły format daty. Dane wejściowe odrzucone." #: pdfarranger/pdfarranger.py:2551 #, python-format msgid "It uses libqpdf %s, pikepdf %s, GTK %s and Python %s." msgstr "" #: pdfarranger/metadata.py:44 msgid "Keywords" msgstr "Słowa kluczowe" #: pdfarranger/config.py:222 msgid "Language" msgstr "" #: pdfarranger/pageutils.py:460 msgid "Layout for the first page in selection" msgstr "" #: pdfarranger/pageutils.py:149 msgid "Left" msgstr "Lewa" #: pdfarranger/pageutils.py:377 msgid "Left to Right" msgstr "" #: data/pdfarranger.ui:122 msgid "Main Menu" msgstr "Menu główne" #: pdfarranger/pdfarranger.py:2557 msgid "Maintainers and contributors" msgstr "Opiekunowie i współpracownicy" #: pdfarranger/pageutils.py:361 msgid "Margin" msgstr "" #: pdfarranger/pageutils.py:347 msgid "Merge Pages" msgstr "" #: pdfarranger/pageutils.py:412 msgid "Merged page size:" msgstr "" #: pdfarranger/metadata.py:49 msgid "Modified" msgstr "Zmodyfikowane" #: pdfarranger/pageutils.py:392 msgid "Non-uniform page size - using max size" msgstr "" #: data/pdfarranger.ui:37 msgid "Open" msgstr "" #: pdfarranger/pdfarranger.py:1186 msgid "Open…" msgstr "" #: pdfarranger/pageutils.py:436 msgid "Overlay" msgstr "" #: pdfarranger/pdfarranger.py:282 msgid "" "PDF Arranger is a small python-gtk application, which helps the user to " "merge or split pdf documents and rotate, crop and rearrange their pages " "using an interactive and intuitive graphical interface. It is a frontend for " "pikepdf." msgstr "" "PDF Arranger to niewielka aplikacja python-gtk, która pomaga użytkownikowi " "łączyć lub dzielić dokumenty PDF oraz obracać, przycinać i zmieniać " "kolejność ich stron za pomocą interaktywnego i intuicyjnego interfejsu " "graficznego. Jest to nakładka na pikepdf." #: pdfarranger/pdfarranger.py:1498 msgid "PDF document is damaged" msgstr "Dokument PDF jest uszkodzony" #: pdfarranger/pdfarranger.py:499 msgid "PDF files" msgstr "Pliki PDF" #: pdfarranger/pageutils.py:388 msgid "Page Order" msgstr "" #: pdfarranger/pageutils.py:241 msgid "Page Size" msgstr "Rozmiar strony" #: pdfarranger/pdfarranger.py:2585 msgid "Page Size:" msgstr "Rozmiar strony:" #: pdfarranger/pageutils.py:230 msgid "Page format" msgstr "Format strony" #: pdfarranger/core.py:285 msgid "Password" msgstr "" #: pdfarranger/core.py:263 msgid "Password required" msgstr "Wymagane hasło" #: data/menu.ui:277 msgid "Past_e Special" msgstr "Wkle_j specjalne" #: data/menu.ui:295 msgid "Paste As O_verlay…" msgstr "" #: data/menu.ui:151 data/menu.ui:290 msgid "Paste As _Even Pages" msgstr "" #: data/menu.ui:146 data/menu.ui:285 msgid "Paste As _Odd Pages" msgstr "" #: data/menu.ui:300 msgid "Paste As _Underlay…" msgstr "" #: data/menu.ui:136 data/menu.ui:272 msgid "Paste _After" msgstr "Wklej _po" #: data/menu.ui:141 data/menu.ui:280 msgid "Paste _Before" msgstr "Wklej _przed" #: pdfarranger/pdfarranger.py:1627 msgid "Pasted data not valid. Aborting paste." msgstr "Wklejone dane są nieprawidłowe. Przerywanie wklejania." #: pdfarranger/pdfarranger.py:1589 msgid "Pikepdf >= 3 is needed for overlay/underlay/merge support." msgstr "" #: data/menu.ui:234 msgid "Pre_ferences" msgstr "" #: pdfarranger/config.py:212 msgid "Preferences" msgstr "" #: pdfarranger/pdfarranger.py:293 msgid "Print the version of PDF Arranger and exit" msgstr "Wydrukuj wersję PDF Arranger i wyjdź" #: pdfarranger/exporter.py:457 msgid "Printing…" msgstr "" #: pdfarranger/metadata.py:45 msgid "Producer" msgstr "Producent" #: pdfarranger/metadata.py:212 msgid "Property" msgstr "" #: data/menu.ui:116 data/menu.ui:373 msgid "Re_verse Order" msgstr "Od_wrotna kolejność" #: pdfarranger/pageutils.py:238 msgid "Relative" msgstr "Względny" #: pdfarranger/exporter.py:469 msgid "Rendering Preview…" msgstr "" #: pdfarranger/pdfarranger.py:732 msgid "Rendering…" msgstr "Wykonanie…" #: pdfarranger/pdfarranger.py:1132 msgid "Replace" msgstr "" #: pdfarranger/pageutils.py:149 msgid "Right" msgstr "Prawa" #: pdfarranger/pageutils.py:378 msgid "Right to Left" msgstr "" #: data/pdfarranger.ui:203 msgid "Rotate Left" msgstr "Obrót w_lewo" #: data/pdfarranger.ui:227 msgid "Rotate Right" msgstr "_Obrót w prawo" #: data/menu.ui:90 data/menu.ui:351 msgid "Rotate _Left" msgstr "Obróć w_lewo" #: pdfarranger/pageutils.py:364 pdfarranger/splitter.py:60 msgid "Rows" msgstr "Linie" #: data/menu.ui:194 data/menu.ui:337 msgid "Same Page _Format" msgstr "Ta sama strona _Format" #: data/pdfarranger.ui:78 msgid "Save" msgstr "Zapisz" #: data/pdfarranger.ui:97 msgid "Save As" msgstr "Zapisz jako" #: pdfarranger/pdfarranger.py:1088 msgid "Save As…" msgstr "" #: data/menu.ui:47 msgid "Save _As…" msgstr "Zapisz _jako…" #: pdfarranger/pdfarranger.py:988 msgid "Save changes before closing?" msgstr "Zapisać zmiany przed zamknięciem?" #: pdfarranger/pdfarranger.py:1025 msgid "Save changes before quitting?" msgstr "" #: pdfarranger/pdfarranger.py:985 msgid "Save changes to “{}” before closing?" msgstr "Zapisać zmiany w „{}” przed zamknięciem?" #: pdfarranger/pdfarranger.py:1022 msgid "Save changes to “{}” before quitting?" msgstr "" #: pdfarranger/pdfarranger.py:1249 msgid "Saving produced some warnings" msgstr "" #: pdfarranger/pdfarranger.py:1288 msgid "Saving…" msgstr "" #: pdfarranger/pageutils.py:116 msgid "Scale factor" msgstr "Współczynnik skali" #: data/menu.ui:169 data/menu.ui:312 msgid "Select _All" msgstr "Zaznacz wszystko" #: data/menu.ui:184 data/menu.ui:327 msgid "Select _Even Pages" msgstr "" #: data/menu.ui:179 data/menu.ui:322 msgid "Select _Odd Pages" msgstr "" #: pdfarranger/pdfarranger.py:2580 msgid "Selected pages: " msgstr "" #: pdfarranger/splitter.py:26 msgid "Split Pages" msgstr "" #: pdfarranger/metadata.py:43 msgid "Subject" msgstr "Przedmiot" #: pdfarranger/pdfarranger.py:512 msgid "Supported image files" msgstr "Obsługiwane pliki graficzne" #: pdfarranger/config.py:248 pdfarranger/config.py:256 msgid "System setting" msgstr "" #: pdfarranger/core.py:275 msgid "" "The document “{}” is locked and requires a password before it can be opened." msgstr "" #: pdfarranger/core.py:274 msgid "The password will be remembered until you close PDF Arranger." msgstr "" #: pdfarranger/config.py:230 msgid "Theme" msgstr "" #: pdfarranger/metadata.py:42 msgid "Title" msgstr "Tytuł" #: pdfarranger/pageutils.py:149 msgid "Top" msgstr "Góra" #: pdfarranger/pageutils.py:379 msgid "Top to Bottom" msgstr "" #: pdfarranger/pageutils.py:436 msgid "Underlay" msgstr "" #: pdfarranger/core.py:361 pdfarranger/pdfarranger.py:1494 msgid "Unknown file format" msgstr "Nieznany format pliku" #: pdfarranger/metadata.py:212 msgid "Value" msgstr "Wartość" #: pdfarranger/pageutils.py:376 msgid "Vertical" msgstr "" #: pdfarranger/splitter.py:61 msgid "Vertical Splits" msgstr "Podziały pionowe" #: pdfarranger/pageutils.py:478 msgid "Vertical offset" msgstr "" #: pdfarranger/exporter.py:187 msgid "Warning" msgstr "Ostrzeżenie" #: pdfarranger/pageutils.py:235 pdfarranger/pageutils.py:239 #: pdfarranger/pageutils.py:327 msgid "Width" msgstr "Szerokość" #: pdfarranger/splitter.py:88 msgid "Width in %" msgstr "Szerokość w %" #: pdfarranger/pdfarranger.py:969 msgid "Your changes will be lost if you don’t save them." msgstr "Twoje zmiany zostaną utracone, jeśli ich nie zapiszesz." #: data/pdfarranger.ui:144 msgid "Zoom In" msgstr "Powiększ" #: data/pdfarranger.ui:167 msgid "Zoom Out" msgstr "Pomniejsz" #: data/menu.ui:217 msgid "Zoom _Fit" msgstr "" #: data/menu.ui:209 msgid "Zoom _In" msgstr "Powiększ" #: data/menu.ui:213 msgid "Zoom _Out" msgstr "Pomniejsz" #: data/menu.ui:240 msgid "_About" msgstr "_O programie" #: pdfarranger/config.py:216 pdfarranger/pageutils.py:219 #: pdfarranger/pdfarranger.py:961 pdfarranger/pdfarranger.py:970 #: pdfarranger/pdfarranger.py:1094 pdfarranger/pdfarranger.py:1144 msgid "_Cancel" msgstr "Anuluj" #: pdfarranger/pdfarranger.py:980 data/menu.ui:246 msgid "_Close" msgstr "" #: data/menu.ui:132 data/menu.ui:268 msgid "_Copy" msgstr "_Kopiuj" #: data/menu.ui:108 data/menu.ui:260 msgid "_Delete" msgstr "_Usuń" #: data/menu.ui:174 data/menu.ui:317 msgid "_Deselect All" msgstr "Odznacz wszystkie" #: data/menu.ui:87 msgid "_Edit" msgstr "_Edycja" #: data/menu.ui:30 msgid "_Import" msgstr "_Importuj" #: data/menu.ui:199 data/menu.ui:342 msgid "_Invert Selection" msgstr "" #: data/menu.ui:124 data/menu.ui:381 msgid "_Merge Pages…" msgstr "" #: data/menu.ui:36 msgid "_New Window" msgstr "_Nowe okno" #: pdfarranger/config.py:217 pdfarranger/pageutils.py:220 msgid "_OK" msgstr "" #: pdfarranger/pdfarranger.py:1143 data/menu.ui:24 msgid "_Open" msgstr "" #: data/menu.ui:100 data/menu.ui:361 msgid "_Page Format…" msgstr "_Format strony…" #: data/menu.ui:71 msgid "_Print…" msgstr "" #: pdfarranger/pdfarranger.py:1017 data/menu.ui:252 msgid "_Quit" msgstr "_Wyjście" #: data/menu.ui:82 msgid "_Redo" msgstr "_Ponów" #: data/menu.ui:95 data/menu.ui:356 msgid "_Rotate Right" msgstr "_Obróć w prawo" #: pdfarranger/pdfarranger.py:970 pdfarranger/pdfarranger.py:1093 #: data/menu.ui:42 msgid "_Save" msgstr "_Zapisz" #: data/menu.ui:166 data/menu.ui:309 msgid "_Select" msgstr "Zaznacz" #: data/menu.ui:120 data/menu.ui:377 msgid "_Split Pages…" msgstr "_Podziel strony…" #: data/menu.ui:78 msgid "_Undo" msgstr "_Cofnij" #: data/menu.ui:206 msgid "_View" msgstr "" #: pdfarranger/pageutils.py:139 pdfarranger/pageutils.py:362 #: pdfarranger/pageutils.py:412 msgid "mm" msgstr "mm" #: pdfarranger/core.py:89 msgid "page" msgstr "strona" #: pdfarranger/pdfarranger.py:811 msgid "untitled" msgstr "" pdfarranger-1.10.1/po/pt_BR.po000066400000000000000000000427471451252235000160660ustar00rootroot00000000000000# Brazilian portuguese translation for PDF Arranger. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Rogênio Belém , 2013 # Túlio César do Nascimento Peroni ; 2022 # msgid "" msgstr "" "Project-Id-Version: pdfarranger\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-05-19 21:33-0300\n" "PO-Revision-Date: 2023-05-20 22:20-0300\n" "Last-Translator: Túlio Peroni \n" "Language-Team: BR (Brazil)\n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 3.1.1\n" #: pdfarranger/splitter.py:87 msgid "#Col" msgstr "#Col" #: pdfarranger/splitter.py:87 msgid "#Row" msgstr "#Lin" #: pdfarranger/pageutils.py:122 pdfarranger/pageutils.py:477 #: pdfarranger/pageutils.py:479 msgid "%" msgstr "%" #: pdfarranger/pageutils.py:170 #, python-format msgid "% of height" msgstr "% da altura" #: pdfarranger/pageutils.py:170 #, python-format msgid "% of width" msgstr "% da largura" #: pdfarranger/pdfarranger.py:2549 #, python-format msgid "%s is a tool for rearranging and modifying PDF files." msgstr "%s é uma ferramenta que reorganiza e modifica arquivos PDF." #: pdfarranger/config.py:232 msgid "(Libhandy missing)" msgstr "(Libhandy ausente)" #: pdfarranger/config.py:224 msgid "(Requires restart)" msgstr "(Requer reinício)" #: pdfarranger/pageutils.py:461 msgid "(same offset is applied to all pages)" msgstr "(o mesmo deslocamento é aplicado a todas as páginas)" #: pdfarranger/pdfarranger.py:1130 #, python-format msgid "A file named \"%s\" already exists. Do you want to replace it?" msgstr "Já existe um arquivo chamado \"%s\". Deseja substituí-lo?" #: data/menu.ui:202 data/menu.ui:345 msgid "All From _Same File" msgstr "Todas as páginas do me_smo arquivo" #: pdfarranger/pdfarranger.py:507 msgid "All files" msgstr "Todos os arquivos" #: pdfarranger/pdfarranger.py:462 msgid "All pages must have the same size." msgstr "Todas as páginas devem ter o mesmo tamanho." #: pdfarranger/pdfarranger.py:495 msgid "All supported files" msgstr "Todos os arquivos suportados" #: pdfarranger/pageutils.py:149 msgid "Bottom" msgstr "Inferior" #: pdfarranger/pageutils.py:380 msgid "Bottom to Top" msgstr "De baixo para cima" #: pdfarranger/core.py:386 msgid "Clipboard image" msgstr "Imagem da área de transferência" #: pdfarranger/pageutils.py:363 pdfarranger/splitter.py:60 msgid "Columns" msgstr "Colunas" #: pdfarranger/metadata.py:48 msgid "Created" msgstr "Criado em" #: pdfarranger/metadata.py:46 msgid "Creator" msgstr "Autor" #: pdfarranger/metadata.py:47 msgid "Creator tool" msgstr "Ferramenta de criação" #: pdfarranger/pageutils.py:153 msgid "Crop Margins" msgstr "Recortar as margens" #: data/menu.ui:149 data/menu.ui:378 msgid "Crop White Borders" msgstr "Recortar _margens em branco" #: pdfarranger/pageutils.py:161 msgid "" "Cropping does not remove any content from the PDF file, it only hides it." msgstr "Recortar não remove o conteúdo do arquivo PDF, apenas o oculta." #: data/menu.ui:94 data/menu.ui:277 msgid "Cu_t" msgstr "Cor_tar" #: pdfarranger/pdfarranger.py:1250 msgid "Despite the warnings the document(s) should have no visible issues." msgstr "" "Apesar dos avisos, o(s) documento(s) não deve(m) ter problemas visíveis." #: pdfarranger/pdfarranger.py:979 msgid "Discard changes and close?" msgstr "Descartar alterações e fechar?" #: pdfarranger/pdfarranger.py:1016 msgid "Discard changes and quit?" msgstr "Descartar alterações e sair?" #: pdfarranger/exporter.py:194 msgid "Do not show this dialog again." msgstr "Não mostre este diálogo novamente." #: pdfarranger/pdfarranger.py:970 msgid "Do_n’t Save" msgstr "_Não salvar" #: pdfarranger/pdfarranger.py:1257 msgid "Don't show warnings when saving again." msgstr "Não mostre avisos ao salvar novamente." #: data/menu.ui:153 data/menu.ui:382 msgid "Dupl_icate" msgstr "Dupl_icar" #: data/menu.ui:52 data/menu.ui:408 msgid "E_xport" msgstr "E_xportar" #: data/menu.ui:55 data/menu.ui:411 msgid "E_xport Selection to a Single File…" msgstr "E_xportar seleção para um único arquivo…" #: data/menu.ui:241 msgid "Edit _Properties" msgstr "Editar _Propriedades" #: pdfarranger/metadata.py:198 msgid "Edit properties" msgstr "Editar propriedades" #: pdfarranger/splitter.py:62 msgid "Equal column width" msgstr "Igualar largura das colunas" #: pdfarranger/splitter.py:62 msgid "Equal row height" msgstr "Igualar altura das linhas" #: data/menu.ui:60 data/menu.ui:416 msgid "Export Selection to _Individual Files…" msgstr "Exportar seleção em arquivos _individuais…" #: data/menu.ui:65 data/menu.ui:421 msgid "Export _All Pages to Individual Files…" msgstr "Export_ar todas as páginas em arquivos individuais…" #: pdfarranger/pdfarranger.py:1088 msgid "Export…" msgstr "Exportar…" #: pdfarranger/core.py:388 pdfarranger/pdfarranger.py:1504 msgid "File is neither pdf nor image" msgstr "O arquivo não é PDF nem imagem" #: pdfarranger/pdfarranger.py:301 msgid "File(s) to open" msgstr "Arquivo(s) a abrir" #: pdfarranger/config.py:237 msgid "For more options see:" msgstr "Para mais opções consulte:" #: pdfarranger/exporter.py:192 msgid "Forms and outlines are lost on saving." msgstr "Os formulários e marcadores serão perdidos ao salvar o documento." #: data/menu.ui:234 msgid "Full_screen" msgstr "_Tela cheia" #: pdfarranger/pdfarranger.py:2563 msgid "GNU General Public License (GPL) Version 3." msgstr "GNU General Public License (GPL) Versão 3." #: data/menu.ui:173 data/menu.ui:402 msgid "Generate Booklet" msgstr "_Gerar livreto" #: pdfarranger/pageutils.py:236 pdfarranger/pageutils.py:240 #: pdfarranger/pageutils.py:328 msgid "Height" msgstr "Altura" #: pdfarranger/splitter.py:88 msgid "Height in %" msgstr "Altura em %" #: pdfarranger/pageutils.py:375 msgid "Horizontal" msgstr "Horizontal" #: pdfarranger/splitter.py:61 msgid "Horizontal Splits" msgstr "Divisões na horizontal" #: pdfarranger/pageutils.py:476 msgid "Horizontal offset" msgstr "Deslocamento horizontal" #: pdfarranger/core.py:377 msgid "Image files are only supported with img2pdf" msgstr "Arquivos de imagem somente são suportados com o img2pdf" #: pdfarranger/core.py:383 msgid "Image format is not supported by img2pdf" msgstr "A imagem não é suportada pelo img2pdf" #: data/pdfarranger.ui:58 msgid "Import" msgstr "Importar" #: pdfarranger/pdfarranger.py:1327 msgid "Import…" msgstr "Importar…" #: data/menu.ui:169 data/menu.ui:398 msgid "Insert Blan_k Page…" msgstr "Inserir página em _branco…" #: pdfarranger/pageutils.py:325 msgid "Insert Blank Page" msgstr "Inserir página em branco" #: pdfarranger/metadata.py:169 msgid "Invalid date format. Input discarded." msgstr "Formato de data inválido. Entrada descartada." #: pdfarranger/pdfarranger.py:2552 #, python-format msgid "It uses libqpdf %s, pikepdf %s, GTK %s and Python %s." msgstr "Utiliza libqpdf %s, pikepdf %s, GTK %s e Python %s." #: pdfarranger/metadata.py:44 msgid "Keywords" msgstr "Palavras-chave" #: pdfarranger/config.py:222 msgid "Language" msgstr "Idioma" #: pdfarranger/pageutils.py:460 msgid "Layout for the first page in selection" msgstr "Layout da primeira página na seleção" #: pdfarranger/pageutils.py:149 msgid "Left" msgstr "Esquerda" #: pdfarranger/pageutils.py:377 msgid "Left to Right" msgstr "Da esquerda para direita" #: data/pdfarranger.ui:122 msgid "Main Menu" msgstr "Menu principal" #: pdfarranger/pdfarranger.py:2558 msgid "Maintainers and contributors" msgstr "Programadores e colaboradores" #: pdfarranger/pageutils.py:361 msgid "Margin" msgstr "Margem" #: pdfarranger/pageutils.py:347 msgid "Merge Pages" msgstr "Mesclar páginas" #: pdfarranger/pageutils.py:412 msgid "Merged page size:" msgstr "Tamanho da página mesclada:" #: pdfarranger/metadata.py:49 msgid "Modified" msgstr "Modificado em" #: pdfarranger/pageutils.py:392 msgid "Non-uniform page size - using max size" msgstr "Tamanho de página não uniforme - usando o tamanho máximo" #: data/pdfarranger.ui:37 msgid "Open" msgstr "Abrir" #: pdfarranger/pdfarranger.py:1186 msgid "Open…" msgstr "Abrir…" #: pdfarranger/pageutils.py:436 msgid "Overlay" msgstr "Sobreposição" #: pdfarranger/pdfarranger.py:282 msgid "" "PDF Arranger is a small python-gtk application, which helps the user to " "merge or split pdf documents and rotate, crop and rearrange their pages " "using an interactive and intuitive graphical interface. It is a frontend for " "pikepdf." msgstr "" "PDF Arranger é um pequeno aplicativo python-gtk, que ajuda o usuário a " "mesclar ou dividir documentos PDF e girar, cortar e reorganizar suas páginas " "usando uma interface gráfica interativa e intuitiva. É um frontend para o " "pikepdf." #: pdfarranger/pdfarranger.py:1498 msgid "PDF document is damaged" msgstr "O documento PDF está danificado" #: pdfarranger/pdfarranger.py:499 msgid "PDF files" msgstr "Arquivos PDF" #: pdfarranger/pageutils.py:388 msgid "Page Order" msgstr "Ordem das páginas" #: pdfarranger/pageutils.py:241 msgid "Page Size" msgstr "Tamanho da página" #: pdfarranger/pdfarranger.py:2586 msgid "Page Size:" msgstr "Tamanho da página:" #: pdfarranger/pageutils.py:230 msgid "Page format" msgstr "Formatar página" #: pdfarranger/core.py:285 msgid "Password" msgstr "Senha" #: pdfarranger/core.py:263 msgid "Password required" msgstr "Senha obrigatória" #: data/menu.ui:107 data/menu.ui:290 msgid "Past_e Special" msgstr "Colar _especial" #: data/menu.ui:124 data/menu.ui:308 msgid "Paste As O_verlay…" msgstr "Colar como S_obreposição…" #: data/menu.ui:119 data/menu.ui:303 msgid "Paste As _Even Pages" msgstr "Colar como páginas par_es" #: data/menu.ui:114 data/menu.ui:298 msgid "Paste As _Odd Pages" msgstr "Co_lar como páginas ímpares" #: data/menu.ui:129 data/menu.ui:313 msgid "Paste As _Underlay…" msgstr "Colar como _Subposição…" #: data/menu.ui:102 data/menu.ui:285 msgid "Paste _After" msgstr "Col_ar depois" #: data/menu.ui:109 data/menu.ui:293 msgid "Paste _Before" msgstr "Colar a_ntes" #: pdfarranger/pdfarranger.py:1627 msgid "Pasted data not valid. Aborting paste." msgstr "Os dados colados são inválidos. Cancelando operação." #: pdfarranger/pdfarranger.py:1589 msgid "Pikepdf >= 3 is needed for overlay/underlay/merge support." msgstr "" "O Pikepdf >= 3 é necessário para oferecer suporte a sobreposição/subposição/" "mesclar." #: data/menu.ui:247 msgid "Pre_ferences" msgstr "Pre_ferências" #: pdfarranger/config.py:212 msgid "Preferences" msgstr "Preferências" #: pdfarranger/pdfarranger.py:293 msgid "Print the version of PDF Arranger and exit" msgstr "Mostrar a versão do PDF Arranger e sair" #: pdfarranger/exporter.py:457 msgid "Printing…" msgstr "Imprimir…" #: pdfarranger/metadata.py:45 msgid "Producer" msgstr "Produtor" #: pdfarranger/metadata.py:212 msgid "Property" msgstr "Propriedade" #: data/menu.ui:157 data/menu.ui:386 msgid "Re_verse Order" msgstr "Inverter _ordem" #: pdfarranger/pageutils.py:238 msgid "Relative" msgstr "Relativo" #: pdfarranger/exporter.py:469 msgid "Rendering Preview…" msgstr "Pré-visualização de renderização…" #: pdfarranger/pdfarranger.py:732 msgid "Rendering…" msgstr "Renderizando…" #: pdfarranger/pdfarranger.py:1132 msgid "Replace" msgstr "Substituir" #: pdfarranger/pageutils.py:149 msgid "Right" msgstr "Direita" #: pdfarranger/pageutils.py:378 msgid "Right to Left" msgstr "Da direita para esquerda" #: data/pdfarranger.ui:203 msgid "Rotate Left" msgstr "Rotacionar à esquerda" #: data/pdfarranger.ui:227 msgid "Rotate Right" msgstr "Rotacionar à direita" #: data/menu.ui:135 data/menu.ui:364 msgid "Rotate _Left" msgstr "Rotacionar à es_querda" #: pdfarranger/pageutils.py:364 pdfarranger/splitter.py:60 msgid "Rows" msgstr "Linhas" #: data/menu.ui:207 data/menu.ui:350 msgid "Same Page _Format" msgstr "Páginas com o mesmo _formato" #: data/pdfarranger.ui:78 msgid "Save" msgstr "Salvar" #: data/pdfarranger.ui:97 msgid "Save As" msgstr "Salvar como" #: pdfarranger/pdfarranger.py:1088 msgid "Save As…" msgstr "Salvar como…" #: data/menu.ui:47 msgid "Save _As…" msgstr "Salvar _Como…" #: pdfarranger/pdfarranger.py:988 msgid "Save changes before closing?" msgstr "Salvar alterações antes de fechar?" #: pdfarranger/pdfarranger.py:1025 msgid "Save changes before quitting?" msgstr "Salvar alterações antes de sair?" #: pdfarranger/pdfarranger.py:985 msgid "Save changes to “{}” before closing?" msgstr "Salvar as alterações em “{}” antes de fechar?" #: pdfarranger/pdfarranger.py:1022 msgid "Save changes to “{}” before quitting?" msgstr "Salvar as alterações em “{}” antes de sair?" #: pdfarranger/pdfarranger.py:1249 msgid "Saving produced some warnings" msgstr "Salvar produziu alguns avisos" #: pdfarranger/pdfarranger.py:1288 msgid "Saving…" msgstr "Salvando…" #: pdfarranger/pageutils.py:116 msgid "Scale factor" msgstr "Fator de escala" #: data/menu.ui:182 data/menu.ui:325 msgid "Select _All" msgstr "Selecion_ar tudo" #: data/menu.ui:197 data/menu.ui:340 msgid "Select _Even Pages" msgstr "Selecionar páginas par_es" #: data/menu.ui:192 data/menu.ui:335 msgid "Select _Odd Pages" msgstr "Seleci_onar páginas ímpares" #: pdfarranger/pdfarranger.py:2581 msgid "Selected pages: " msgstr "Páginas selecionadas: " #: pdfarranger/splitter.py:26 msgid "Split Pages" msgstr "Dividir página" #: pdfarranger/metadata.py:43 msgid "Subject" msgstr "Assunto" #: pdfarranger/pdfarranger.py:512 msgid "Supported image files" msgstr "Arquivos de imagem suportados" #: pdfarranger/config.py:248 pdfarranger/config.py:256 msgid "System setting" msgstr "Configuração do sistema" #: pdfarranger/core.py:275 msgid "" "The document “{}” is locked and requires a password before it can be opened." msgstr "" "O documento “{}” está bloqueado e requer uma senha antes de ser aberto." #: pdfarranger/core.py:274 msgid "The password will be remembered until you close PDF Arranger." msgstr "A senha será lembrada até que você feche o PDF Arranger." #: pdfarranger/config.py:230 msgid "Theme" msgstr "Tema" #: pdfarranger/metadata.py:42 msgid "Title" msgstr "Título" #: pdfarranger/pageutils.py:149 msgid "Top" msgstr "Superior" #: pdfarranger/pageutils.py:379 msgid "Top to Bottom" msgstr "De cima para baixo" #: pdfarranger/pageutils.py:436 msgid "Underlay" msgstr "Subposição" #: pdfarranger/core.py:361 pdfarranger/pdfarranger.py:1494 msgid "Unknown file format" msgstr "Formato de arquivo desconhecido" #: pdfarranger/metadata.py:212 msgid "Value" msgstr "Valor" #: pdfarranger/pageutils.py:376 msgid "Vertical" msgstr "Vertical" #: pdfarranger/splitter.py:61 msgid "Vertical Splits" msgstr "Divisões na vertical" #: pdfarranger/pageutils.py:478 msgid "Vertical offset" msgstr "Deslocamento vertical" #: pdfarranger/exporter.py:187 msgid "Warning" msgstr "Atenção" #: pdfarranger/pageutils.py:235 pdfarranger/pageutils.py:239 #: pdfarranger/pageutils.py:327 msgid "Width" msgstr "Largura" #: pdfarranger/splitter.py:88 msgid "Width in %" msgstr "Largura em %" #: pdfarranger/pdfarranger.py:969 msgid "Your changes will be lost if you don’t save them." msgstr "Suas alterações serão perdidas se você não salvá-las." #: data/pdfarranger.ui:144 msgid "Zoom In" msgstr "Ampliar" #: data/pdfarranger.ui:167 msgid "Zoom Out" msgstr "Reduzir" #: data/menu.ui:230 msgid "Zoom _Fit" msgstr "Ajustar _zoom" #: data/menu.ui:222 msgid "Zoom _In" msgstr "_Ampliar" #: data/menu.ui:226 msgid "Zoom _Out" msgstr "_Reduzir" #: data/menu.ui:253 msgid "_About" msgstr "S_obre" #: pdfarranger/config.py:216 pdfarranger/pageutils.py:219 #: pdfarranger/pdfarranger.py:961 pdfarranger/pdfarranger.py:970 #: pdfarranger/pdfarranger.py:1094 pdfarranger/pdfarranger.py:1144 msgid "_Cancel" msgstr "_Cancelar" #: pdfarranger/pdfarranger.py:980 data/menu.ui:259 msgid "_Close" msgstr "_Fechar" #: data/menu.ui:98 data/menu.ui:281 msgid "_Copy" msgstr "_Copiar" #: data/menu.ui:90 data/menu.ui:273 msgid "_Delete" msgstr "Remo_ver" #: data/menu.ui:187 data/menu.ui:330 msgid "_Deselect All" msgstr "_Desmarcar tudo" #: data/menu.ui:87 msgid "_Edit" msgstr "_Editar" #: data/menu.ui:30 msgid "_Import" msgstr "_Importar" #: data/menu.ui:212 data/menu.ui:355 msgid "_Invert Selection" msgstr "_Inverter seleção" #: data/menu.ui:165 data/menu.ui:394 msgid "_Merge Pages…" msgstr "_Mesclar páginas…" #: data/menu.ui:36 msgid "_New Window" msgstr "_Nova Janela" #: pdfarranger/config.py:217 pdfarranger/pageutils.py:220 msgid "_OK" msgstr "_OK" #: pdfarranger/pdfarranger.py:1143 data/menu.ui:24 msgid "_Open" msgstr "_Abrir" #: data/menu.ui:145 data/menu.ui:374 msgid "_Page Format…" msgstr "Formatar _página…" #: data/menu.ui:71 msgid "_Print…" msgstr "Im_primir…" #: pdfarranger/pdfarranger.py:1017 data/menu.ui:265 msgid "_Quit" msgstr "_Sair" #: data/menu.ui:82 msgid "_Redo" msgstr "_Refazer" #: data/menu.ui:140 data/menu.ui:369 msgid "_Rotate Right" msgstr "_Rotacionar à direita" #: pdfarranger/pdfarranger.py:970 pdfarranger/pdfarranger.py:1093 #: data/menu.ui:42 msgid "_Save" msgstr "_Salvar" #: data/menu.ui:179 data/menu.ui:322 msgid "_Select" msgstr "_Selecionar" #: data/menu.ui:161 data/menu.ui:390 msgid "_Split Pages…" msgstr "_Dividir página…" #: data/menu.ui:78 msgid "_Undo" msgstr "_Desfazer" #: data/menu.ui:219 msgid "_View" msgstr "_Visualização" #: pdfarranger/pageutils.py:139 pdfarranger/pageutils.py:362 #: pdfarranger/pageutils.py:412 msgid "mm" msgstr "mm" #: pdfarranger/core.py:89 msgid "page" msgstr "página" #: pdfarranger/pdfarranger.py:811 msgid "untitled" msgstr "sem título" pdfarranger-1.10.1/po/pt_PT.po000066400000000000000000000430241451252235000160730ustar00rootroot00000000000000# Portuguese(Portugal) translation for pdfarranger. # Copyright (C) 2020 Jérôme Robert # This file is part of pdfarranger which is released under the GNU General # Public License version 3 or later. # See file COPYING or go to for full license details. # Translators: # Sérgio Marques , 2021, 2022,2023. # Hugo Carvalho , 2021, 2022,2023. # msgid "" msgstr "" "Project-Id-Version: pdfarranger\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-04-29 22:45+0200\n" "PO-Revision-Date: 2023-06-07 21:17+0000\n" "Last-Translator: Hugo Carvalho \n" "Language-Team: Portuguese (Portugal)\n" "Language: pt-PT\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Loco-Source-Locale: en_PT\n" "X-Generator: Loco https://localise.biz/\n" "X-Loco-Parser: loco_parse_po" #: pdfarranger/splitter.py:87 msgid "#Col" msgstr "#Coluna" #: pdfarranger/splitter.py:87 msgid "#Row" msgstr "#Linha" #: pdfarranger/pageutils.py:122 pdfarranger/pageutils.py:477 #: pdfarranger/pageutils.py:479 msgid "%" msgstr "%" #: pdfarranger/pageutils.py:170 #, python-format msgid "% of height" msgstr "% da altura" #: pdfarranger/pageutils.py:170 #, python-format msgid "% of width" msgstr "% da largura" #: pdfarranger/pdfarranger.py:2548 #, python-format msgid "%s is a tool for rearranging and modifying PDF files." msgstr "%s é uma ferramenta para organizar e modificar ficheiros PDF." #: pdfarranger/config.py:232 msgid "(Libhandy missing)" msgstr "(Biblioteca libhandy em falta)" #: pdfarranger/config.py:224 msgid "(Requires restart)" msgstr "(Tem que reiniciar)" #: pdfarranger/pageutils.py:461 msgid "(same offset is applied to all pages)" msgstr "(mesmo desvio em todas as páginas)" #: pdfarranger/pdfarranger.py:1130 #, python-format msgid "A file named \"%s\" already exists. Do you want to replace it?" msgstr "" "Já existe um ficheiro com o nome \"%s\". Deseja substituir o ficheiro " "existente?" #: data/menu.ui:189 data/menu.ui:332 msgid "All From _Same File" msgstr "Tudo do me_smo ficheiro" #: pdfarranger/pdfarranger.py:507 msgid "All files" msgstr "Todos os ficheiros" #: pdfarranger/pdfarranger.py:462 msgid "All pages must have the same size." msgstr "Todas as páginas devem ter o mesmo tamanho." #: pdfarranger/pdfarranger.py:495 msgid "All supported files" msgstr "Todos os ficheiros suportados" #: pdfarranger/pageutils.py:149 msgid "Bottom" msgstr "Baixo" #: pdfarranger/pageutils.py:380 msgid "Bottom to Top" msgstr "Baixo para cima" #: pdfarranger/core.py:386 msgid "Clipboard image" msgstr "Imagem da área de transferência" #: pdfarranger/pageutils.py:363 pdfarranger/splitter.py:60 msgid "Columns" msgstr "Colunas" #: pdfarranger/metadata.py:48 msgid "Created" msgstr "Criado" #: pdfarranger/metadata.py:46 msgid "Creator" msgstr "Criador" #: pdfarranger/metadata.py:47 msgid "Creator tool" msgstr "Criado por" #: pdfarranger/pageutils.py:153 msgid "Crop Margins" msgstr "Margens de recorte" #: data/menu.ui:104 data/menu.ui:365 msgid "Crop White Borders" msgstr "Recortar margens brancas" #: pdfarranger/pageutils.py:161 msgid "" "Cropping does not remove any content from the PDF file, it only hides it." msgstr "O corte oculta o conteúdo do ficheiro PDF mas não o remove." #: data/menu.ui:128 data/menu.ui:264 msgid "Cu_t" msgstr "Cor_tar" #: pdfarranger/pdfarranger.py:1250 msgid "Despite the warnings the document(s) should have no visible issues." msgstr "" "Apesar dos avisos, o(s) documento(s) não parece(m) ter problemas visíveis." #: pdfarranger/pdfarranger.py:979 msgid "Discard changes and close?" msgstr "Descartar alterações e fechar?" #: pdfarranger/pdfarranger.py:1016 msgid "Discard changes and quit?" msgstr "Descartar alterações e sair?" #: pdfarranger/exporter.py:194 msgid "Do not show this dialog again." msgstr "Não mostrar novamente." #: pdfarranger/pdfarranger.py:970 msgid "Do_n’t Save" msgstr "_Não guardar" #: pdfarranger/pdfarranger.py:1257 msgid "Don't show warnings when saving again." msgstr "Não mostrar avisos ao guardar novamente." #: data/menu.ui:112 data/menu.ui:369 msgid "Dupl_icate" msgstr "Dupl_icar" #: data/menu.ui:52 data/menu.ui:395 msgid "E_xport" msgstr "E_xportar" #: data/menu.ui:55 data/menu.ui:398 msgid "E_xport Selection to a Single File…" msgstr "E_xportar seleção para um ficheiro…" #: data/menu.ui:228 msgid "Edit _Properties" msgstr "Editar _propriedades" #: pdfarranger/metadata.py:198 msgid "Edit properties" msgstr "Editar propriedades" #: pdfarranger/splitter.py:62 msgid "Equal column width" msgstr "Igualar largura de colunas" #: pdfarranger/splitter.py:62 msgid "Equal row height" msgstr "Igualar altura de linhas" #: data/menu.ui:60 data/menu.ui:403 msgid "Export Selection to _Individual Files…" msgstr "Exportar seleção para f_icheiros distintos…" #: data/menu.ui:65 data/menu.ui:408 msgid "Export _All Pages to Individual Files…" msgstr "Export_ar todas as páginas para ficheiros distintos…" #: pdfarranger/pdfarranger.py:1088 msgid "Export…" msgstr "Exportar…" #: pdfarranger/core.py:388 pdfarranger/pdfarranger.py:1504 msgid "File is neither pdf nor image" msgstr "O ficheiro não é um PDF nem uma imagem" #: pdfarranger/pdfarranger.py:301 msgid "File(s) to open" msgstr "Ficheiro(s) a abrir" #: pdfarranger/config.py:237 msgid "For more options see:" msgstr "Para mais opções, consulte:" #: pdfarranger/exporter.py:192 msgid "Forms and outlines are lost on saving." msgstr "Os formulários e tópicos não são guardados." #: data/menu.ui:221 msgid "Full_screen" msgstr "Ecrã completo" #: pdfarranger/pdfarranger.py:2562 msgid "GNU General Public License (GPL) Version 3." msgstr "GNU General Public License (GPL), versão 3." #: data/menu.ui:160 data/menu.ui:389 msgid "Generate Booklet" msgstr "Gerar folheto" #: pdfarranger/pageutils.py:236 pdfarranger/pageutils.py:240 #: pdfarranger/pageutils.py:328 msgid "Height" msgstr "Altura" #: pdfarranger/splitter.py:88 msgid "Height in %" msgstr "Altura em %" #: pdfarranger/pageutils.py:375 msgid "Horizontal" msgstr "Horizontal" #: pdfarranger/splitter.py:61 msgid "Horizontal Splits" msgstr "Separação horizontal" #: pdfarranger/pageutils.py:476 msgid "Horizontal offset" msgstr "Desvio horizontal" #: pdfarranger/core.py:377 msgid "Image files are only supported with img2pdf" msgstr "Ficheiros de imagem apenas suportados com img2pdf" #: pdfarranger/core.py:383 msgid "Image format is not supported by img2pdf" msgstr "Formato de imagem não suportado por img2pdf" #: data/pdfarranger.ui:58 msgid "Import" msgstr "Importar" #: pdfarranger/pdfarranger.py:1327 msgid "Import…" msgstr "Importar…" #: data/menu.ui:156 data/menu.ui:385 msgid "Insert Blan_k Page…" msgstr "Inserir página em bran_co…" #: pdfarranger/pageutils.py:325 msgid "Insert Blank Page" msgstr "Inserir página vazia" #: pdfarranger/metadata.py:169 msgid "Invalid date format. Input discarded." msgstr "Formato de data inválido. Será descartado." #: pdfarranger/pdfarranger.py:2551 #, python-format msgid "It uses libqpdf %s, pikepdf %s, GTK %s and Python %s." msgstr "Utiliza libqpdf %s, pikepdf %s, GTK %s e Python %s." #: pdfarranger/metadata.py:44 msgid "Keywords" msgstr "Palavras-chave" #: pdfarranger/config.py:222 msgid "Language" msgstr "Idioma" #: pdfarranger/pageutils.py:460 msgid "Layout for the first page in selection" msgstr "Esquema para a primeira página da seleção" #: pdfarranger/pageutils.py:149 msgid "Left" msgstr "Esquerda" #: pdfarranger/pageutils.py:377 msgid "Left to Right" msgstr "Direita para esquerda" #: data/pdfarranger.ui:122 msgid "Main Menu" msgstr "Menu" #: pdfarranger/pdfarranger.py:2557 msgid "Maintainers and contributors" msgstr "Programadores e colaboradores" #: pdfarranger/pageutils.py:361 msgid "Margin" msgstr "Margem" #: pdfarranger/pageutils.py:347 msgid "Merge Pages" msgstr "Unir páginas" #: pdfarranger/pageutils.py:412 msgid "Merged page size:" msgstr "Tamanho das páginas unidas:" #: pdfarranger/metadata.py:49 msgid "Modified" msgstr "Modificado" #: pdfarranger/pageutils.py:392 msgid "Non-uniform page size - using max size" msgstr "Tamanho não uniforme - utilizar tamanho máximo" #: data/pdfarranger.ui:37 msgid "Open" msgstr "Abrir" #: pdfarranger/pdfarranger.py:1186 msgid "Open…" msgstr "Abrir…" #: pdfarranger/pageutils.py:436 msgid "Overlay" msgstr "Sobreposição" #: pdfarranger/pdfarranger.py:282 msgid "" "PDF Arranger is a small python-gtk application, which helps the user to " "merge or split pdf documents and rotate, crop and rearrange their pages " "using an interactive and intuitive graphical interface. It is a frontend for " "pikepdf." msgstr "" "O PDF Arranger é uma pequena aplicação em python-gtk, que ajuda o utilizador " "a juntar ou dividir documentos pdf e a rodar, cortar e reorganizar as suas " "páginas usando uma interface gráfica interativa e intuitiva. É uma interface " "para pikepdf." #: pdfarranger/pdfarranger.py:1498 msgid "PDF document is damaged" msgstr "O documento PDF está danificado" #: pdfarranger/pdfarranger.py:499 msgid "PDF files" msgstr "Ficheiros PDF" #: pdfarranger/pageutils.py:388 msgid "Page Order" msgstr "Ordem das páginas" #: pdfarranger/pageutils.py:241 msgid "Page Size" msgstr "Tamanho da página" #: pdfarranger/pdfarranger.py:2585 msgid "Page Size:" msgstr "Tamanho da página:" #: pdfarranger/pageutils.py:230 msgid "Page format" msgstr "Formato da página" #: pdfarranger/core.py:285 msgid "Password" msgstr "Palavra-passe" #: pdfarranger/core.py:263 msgid "Password required" msgstr "Requer palavra-passe" #: data/menu.ui:277 msgid "Past_e Special" msgstr "Colar _especial" #: data/menu.ui:295 msgid "Paste As O_verlay…" msgstr "Colar por _cima" #: data/menu.ui:151 data/menu.ui:290 msgid "Paste As _Even Pages" msgstr "Colar como páginas par_es" #: data/menu.ui:146 data/menu.ui:285 msgid "Paste As _Odd Pages" msgstr "C_olar como páginas ímpares" #: data/menu.ui:300 msgid "Paste As _Underlay…" msgstr "Colar por _baixo" #: data/menu.ui:136 data/menu.ui:272 msgid "Paste _After" msgstr "Col_ar depois" #: data/menu.ui:141 data/menu.ui:280 msgid "Paste _Before" msgstr "Colar a_ntes" #: pdfarranger/pdfarranger.py:1627 msgid "Pasted data not valid. Aborting paste." msgstr "Os dados colados são inválidos. A abortar." #: pdfarranger/pdfarranger.py:1589 msgid "Pikepdf >= 3 is needed for overlay/underlay/merge support." msgstr "Requer Pikepdf >=3 para as opções sobreposição/colocar por baixo/unir." #: data/menu.ui:234 msgid "Pre_ferences" msgstr "Pre_ferências" #: pdfarranger/config.py:212 msgid "Preferences" msgstr "Preferências" #: pdfarranger/pdfarranger.py:293 msgid "Print the version of PDF Arranger and exit" msgstr "Mostra a versão do PDF Arranger e sai" #: pdfarranger/exporter.py:457 msgid "Printing…" msgstr "A imprimir…" #: pdfarranger/metadata.py:45 msgid "Producer" msgstr "Produtor" #: pdfarranger/metadata.py:212 msgid "Property" msgstr "Propriedade" #: data/menu.ui:116 data/menu.ui:373 msgid "Re_verse Order" msgstr "Ordem in_versa" #: pdfarranger/pageutils.py:238 msgid "Relative" msgstr "Relativa" #: pdfarranger/exporter.py:469 msgid "Rendering Preview…" msgstr "Pré-visualização da renderização…" #: pdfarranger/pdfarranger.py:732 msgid "Rendering…" msgstr "Renderização…" #: pdfarranger/pdfarranger.py:1132 msgid "Replace" msgstr "Substituir" #: pdfarranger/pageutils.py:149 msgid "Right" msgstr "Direita" #: pdfarranger/pageutils.py:378 msgid "Right to Left" msgstr "Direita para esquerda" #: data/pdfarranger.ui:203 msgid "Rotate Left" msgstr "Rodar à esquerda" #: data/pdfarranger.ui:227 msgid "Rotate Right" msgstr "Rodar à direita" #: data/menu.ui:90 data/menu.ui:351 msgid "Rotate _Left" msgstr "Rodar à _esquerda" #: pdfarranger/pageutils.py:364 pdfarranger/splitter.py:60 msgid "Rows" msgstr "Linhas" #: data/menu.ui:194 data/menu.ui:337 msgid "Same Page _Format" msgstr "Mesmo _formato de página" #: data/pdfarranger.ui:78 msgid "Save" msgstr "Guardar" #: data/pdfarranger.ui:97 msgid "Save As" msgstr "Guardar como" #: pdfarranger/pdfarranger.py:1088 msgid "Save As…" msgstr "Guardar como…" #: data/menu.ui:47 msgid "Save _As…" msgstr "Guard_ar como…" #: pdfarranger/pdfarranger.py:988 msgid "Save changes before closing?" msgstr "Guardar alterações antes de fechar?" #: pdfarranger/pdfarranger.py:1025 msgid "Save changes before quitting?" msgstr "Guardar alterações antes de sair?" #: pdfarranger/pdfarranger.py:985 msgid "Save changes to “{}” before closing?" msgstr "Guardar alterações a “{}” antes de fechar?" #: pdfarranger/pdfarranger.py:1022 msgid "Save changes to “{}” before quitting?" msgstr "Guardar alterações a “{}” antes de sair?" #: pdfarranger/pdfarranger.py:1249 msgid "Saving produced some warnings" msgstr "A gravação gerou alguns avisos" #: pdfarranger/pdfarranger.py:1288 msgid "Saving…" msgstr "A guardar…" #: pdfarranger/pageutils.py:116 msgid "Scale factor" msgstr "Fator de escala" #: data/menu.ui:169 data/menu.ui:312 msgid "Select _All" msgstr "M_arcar tudo" #: data/menu.ui:184 data/menu.ui:327 msgid "Select _Even Pages" msgstr "Marcar páginas par_es" #: data/menu.ui:179 data/menu.ui:322 msgid "Select _Odd Pages" msgstr "Marcar páginas í_mpares" #: pdfarranger/pdfarranger.py:2580 msgid "Selected pages: " msgstr "Páginas selecionadas: " #: pdfarranger/splitter.py:26 msgid "Split Pages" msgstr "Separar páginas" #: pdfarranger/metadata.py:43 msgid "Subject" msgstr "Assunto" #: pdfarranger/pdfarranger.py:512 msgid "Supported image files" msgstr "Ficheiros de imagem suportados" #: pdfarranger/config.py:248 pdfarranger/config.py:256 msgid "System setting" msgstr "Definição do sistema" #: pdfarranger/core.py:275 msgid "" "The document “{}” is locked and requires a password before it can be opened." msgstr "" "O documento “{}” está bloqueado e requer uma palavra-passe para poder ser " "aberto." #: pdfarranger/core.py:274 msgid "The password will be remembered until you close PDF Arranger." msgstr "O PDF Arranger apenas irá memorizar a palavra-passe para esta sessão." #: pdfarranger/config.py:230 msgid "Theme" msgstr "Tema" #: pdfarranger/metadata.py:42 msgid "Title" msgstr "Título" #: pdfarranger/pageutils.py:149 msgid "Top" msgstr "Cima" #: pdfarranger/pageutils.py:379 msgid "Top to Bottom" msgstr "Cima para baixo" #: pdfarranger/pageutils.py:436 msgid "Underlay" msgstr "Colar por baixo" #: pdfarranger/core.py:361 pdfarranger/pdfarranger.py:1494 msgid "Unknown file format" msgstr "Formato desconhecido" #: pdfarranger/metadata.py:212 msgid "Value" msgstr "Valor" #: pdfarranger/pageutils.py:376 msgid "Vertical" msgstr "Vertical" #: pdfarranger/splitter.py:61 msgid "Vertical Splits" msgstr "Separação vertical" #: pdfarranger/pageutils.py:478 msgid "Vertical offset" msgstr "Desvio vertical" #: pdfarranger/exporter.py:187 msgid "Warning" msgstr "Aviso" #: pdfarranger/pageutils.py:235 pdfarranger/pageutils.py:239 #: pdfarranger/pageutils.py:327 msgid "Width" msgstr "Largura" #: pdfarranger/splitter.py:88 msgid "Width in %" msgstr "Largura em %" #: pdfarranger/pdfarranger.py:969 msgid "Your changes will be lost if you don’t save them." msgstr "Se não as guardar, perderá todas as alterações." #: data/pdfarranger.ui:144 msgid "Zoom In" msgstr "Ampliar" #: data/pdfarranger.ui:167 msgid "Zoom Out" msgstr "Reduzir" #: data/menu.ui:217 msgid "Zoom _Fit" msgstr "A_justar" #: data/menu.ui:209 msgid "Zoom _In" msgstr "Ampl_iar" #: data/menu.ui:213 msgid "Zoom _Out" msgstr "Redu_zir" #: data/menu.ui:240 msgid "_About" msgstr "_Acerca" #: pdfarranger/config.py:216 pdfarranger/pageutils.py:219 #: pdfarranger/pdfarranger.py:961 pdfarranger/pdfarranger.py:970 #: pdfarranger/pdfarranger.py:1094 pdfarranger/pdfarranger.py:1144 msgid "_Cancel" msgstr "_Cancelar" #: pdfarranger/pdfarranger.py:980 data/menu.ui:246 msgid "_Close" msgstr "Fe_char" #: data/menu.ui:132 data/menu.ui:268 msgid "_Copy" msgstr "_Copiar" #: data/menu.ui:108 data/menu.ui:260 msgid "_Delete" msgstr "E_liminar" #: data/menu.ui:174 data/menu.ui:317 msgid "_Deselect All" msgstr "_Desmarcar tudo" #: data/menu.ui:87 msgid "_Edit" msgstr "_Editar" #: data/menu.ui:30 msgid "_Import" msgstr "_Importar" #: data/menu.ui:199 data/menu.ui:342 msgid "_Invert Selection" msgstr "_Inverter seleção" #: data/menu.ui:124 data/menu.ui:381 msgid "_Merge Pages…" msgstr "Unir pági_nas..." #: data/menu.ui:36 msgid "_New Window" msgstr "_Nova janela" #: pdfarranger/config.py:217 pdfarranger/pageutils.py:220 msgid "_OK" msgstr "_OK" #: pdfarranger/pdfarranger.py:1143 data/menu.ui:24 msgid "_Open" msgstr "_Abrir" #: data/menu.ui:100 data/menu.ui:361 msgid "_Page Format…" msgstr "Formato da _página…" #: data/menu.ui:71 msgid "_Print…" msgstr "Im_primir…" #: pdfarranger/pdfarranger.py:1017 data/menu.ui:252 msgid "_Quit" msgstr "_Sair" #: data/menu.ui:82 msgid "_Redo" msgstr "_Refazer" #: data/menu.ui:95 data/menu.ui:356 msgid "_Rotate Right" msgstr "Rodar à _direita" #: pdfarranger/pdfarranger.py:970 pdfarranger/pdfarranger.py:1093 #: data/menu.ui:42 msgid "_Save" msgstr "_Guardar" #: data/menu.ui:166 data/menu.ui:309 msgid "_Select" msgstr "_Selecionar" #: data/menu.ui:120 data/menu.ui:377 msgid "_Split Pages…" msgstr "_Separar páginas…" #: data/menu.ui:78 msgid "_Undo" msgstr "An_ular" #: data/menu.ui:206 msgid "_View" msgstr "_Ver" #: pdfarranger/pageutils.py:139 pdfarranger/pageutils.py:362 #: pdfarranger/pageutils.py:412 msgid "mm" msgstr "mm" #: pdfarranger/core.py:89 msgid "page" msgstr "página" #: pdfarranger/pdfarranger.py:811 msgid "untitled" msgstr "sem título" pdfarranger-1.10.1/po/ru.po000066400000000000000000000503751451252235000155020ustar00rootroot00000000000000# Russian translation for pdfarranger. # Copyright (C) 2020 Alexander Volkov # This file is distributed under the same license as the pdfarranger package. # Translators: # Alexander Volkov, 2020 msgid "" msgstr "" "Project-Id-Version: pdfarranger master\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-04-29 22:45+0200\n" "PO-Revision-Date: 2023-05-19 23:19+1000\n" "Last-Translator: Ser82-png \n" "Language-Team: \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 3.0.1\n" #: pdfarranger/splitter.py:87 msgid "#Col" msgstr "#Столбец" #: pdfarranger/splitter.py:87 msgid "#Row" msgstr "#Ряд" #: pdfarranger/pageutils.py:122 pdfarranger/pageutils.py:477 #: pdfarranger/pageutils.py:479 msgid "%" msgstr "%" #: pdfarranger/pageutils.py:170 msgid "% of height" msgstr "% oт высоты" #: pdfarranger/pageutils.py:170 msgid "% of width" msgstr "% oт ширины" #: pdfarranger/pdfarranger.py:2548 #, python-format msgid "%s is a tool for rearranging and modifying PDF files." msgstr "%s - инструмент для переупорядочивания и изменения файлов PDF." #: pdfarranger/config.py:232 msgid "(Libhandy missing)" msgstr "(Libhandy отсутствует)" #: pdfarranger/config.py:224 msgid "(Requires restart)" msgstr "(Требуется перезагрузка)" #: pdfarranger/pageutils.py:461 msgid "(same offset is applied to all pages)" msgstr "(одинаковое смещение ко всем страницам)" #: pdfarranger/pdfarranger.py:1130 #, python-format msgid "A file named \"%s\" already exists. Do you want to replace it?" msgstr "Файл «%s» уже существует. Заменить его?" #: data/menu.ui:189 data/menu.ui:332 msgid "All From _Same File" msgstr "Все из _одного файла" #: pdfarranger/pdfarranger.py:507 msgid "All files" msgstr "Все файлы" #: pdfarranger/pdfarranger.py:462 msgid "All pages must have the same size." msgstr "Все страницы должны иметь одинаковый размер." #: pdfarranger/pdfarranger.py:495 msgid "All supported files" msgstr "Все поддерживаемые файлы" #: pdfarranger/pageutils.py:149 msgid "Bottom" msgstr "Снизу" #: pdfarranger/pageutils.py:380 msgid "Bottom to Top" msgstr "Снизу вверх" #: pdfarranger/core.py:386 msgid "Clipboard image" msgstr "Изображение буфера обмена" #: pdfarranger/pageutils.py:363 pdfarranger/splitter.py:60 msgid "Columns" msgstr "Столбцы" #: pdfarranger/metadata.py:48 msgid "Created" msgstr "Создан" #: pdfarranger/metadata.py:46 msgid "Creator" msgstr "Автор" #: pdfarranger/metadata.py:47 msgid "Creator tool" msgstr "Создано с помощью" #: pdfarranger/pageutils.py:153 msgid "Crop Margins" msgstr "Обрезать поля" #: data/menu.ui:104 data/menu.ui:365 msgid "Crop White Borders" msgstr "Обрезать белые края" #: pdfarranger/pageutils.py:161 msgid "" "Cropping does not remove any content from the PDF file, it only hides it." msgstr "Обрезка не удаляет содержимое файла PDF, а только скрывает его." #: data/menu.ui:128 data/menu.ui:264 msgid "Cu_t" msgstr "Вы_резать" #: pdfarranger/pdfarranger.py:1250 msgid "Despite the warnings the document(s) should have no visible issues." msgstr "" "Несмотря на предупреждения, документ(ы) не должен(ны) иметь видимых проблем." #: pdfarranger/pdfarranger.py:979 msgid "Discard changes and close?" msgstr "Отменить изменения и закрыть?" #: pdfarranger/pdfarranger.py:1016 msgid "Discard changes and quit?" msgstr "Отменить изменения и выйти?" #: pdfarranger/exporter.py:194 msgid "Do not show this dialog again." msgstr "Не показывать этот диалог снова." #: pdfarranger/pdfarranger.py:970 msgid "Do_n’t Save" msgstr "_Не сохранять" #: pdfarranger/pdfarranger.py:1257 msgid "Don't show warnings when saving again." msgstr "Не показывать предупреждения при повторном сохранении." #: data/menu.ui:112 data/menu.ui:369 msgid "Dupl_icate" msgstr "_Дублировать" #: data/menu.ui:52 data/menu.ui:395 msgid "E_xport" msgstr "_Экспорт" #: data/menu.ui:55 data/menu.ui:398 msgid "E_xport Selection to a Single File…" msgstr "Экспорт выделенного фрагмента в _один файл…" #: data/menu.ui:228 msgid "Edit _Properties" msgstr "Редактировать _свойства" #: pdfarranger/metadata.py:198 msgid "Edit properties" msgstr "Редактировать свойства" #: pdfarranger/splitter.py:62 msgid "Equal column width" msgstr "Равная ширина столбцов" #: pdfarranger/splitter.py:62 msgid "Equal row height" msgstr "Равная высота рядов" #: data/menu.ui:60 data/menu.ui:403 msgid "Export Selection to _Individual Files…" msgstr "Экспорт выделенных фрагментов в от_дельные файлы…" #: data/menu.ui:65 data/menu.ui:408 msgid "Export _All Pages to Individual Files…" msgstr "Экспорт _всех страниц в отдельные файлы…" #: pdfarranger/pdfarranger.py:1088 msgid "Export…" msgstr "Экспорт…" #: pdfarranger/core.py:388 pdfarranger/pdfarranger.py:1504 msgid "File is neither pdf nor image" msgstr "Файл не является ни PDF, ни изображением" #: pdfarranger/pdfarranger.py:301 msgid "File(s) to open" msgstr "Файл(ы) для открытия" #: pdfarranger/config.py:237 msgid "For more options see:" msgstr "Подробнее о параметрах смотрите:" #: pdfarranger/exporter.py:192 msgid "Forms and outlines are lost on saving." msgstr "Формы и очертания будут потеряны при сохранении." #: data/menu.ui:221 msgid "Full_screen" msgstr "_Во весь экран" #: pdfarranger/pdfarranger.py:2562 msgid "GNU General Public License (GPL) Version 3." msgstr "GNU General Public License (GPL) версия 3." #: data/menu.ui:160 data/menu.ui:389 msgid "Generate Booklet" msgstr "Создать буклет" #: pdfarranger/pageutils.py:236 pdfarranger/pageutils.py:240 #: pdfarranger/pageutils.py:328 msgid "Height" msgstr "Высота" #: pdfarranger/splitter.py:88 msgid "Height in %" msgstr "Высота в %" #: pdfarranger/pageutils.py:375 msgid "Horizontal" msgstr "Горизонтальная" #: pdfarranger/splitter.py:61 msgid "Horizontal Splits" msgstr "Горизонтальные разделения" #: pdfarranger/pageutils.py:476 msgid "Horizontal offset" msgstr "Горизонтальное смещение" #: pdfarranger/core.py:377 msgid "Image files are only supported with img2pdf" msgstr "Файлы изображений поддерживаются только с img2pdf" #: pdfarranger/core.py:383 msgid "Image format is not supported by img2pdf" msgstr "Формат изображения не поддерживается img2pdf" #: data/pdfarranger.ui:58 msgid "Import" msgstr "Импортировать" #: pdfarranger/pdfarranger.py:1327 msgid "Import…" msgstr "Импорт…" #: data/menu.ui:156 data/menu.ui:385 msgid "Insert Blan_k Page…" msgstr "Вставить _пустую страницу…" #: pdfarranger/pageutils.py:325 msgid "Insert Blank Page" msgstr "Вставить пустую страницу" #: pdfarranger/metadata.py:169 msgid "Invalid date format. Input discarded." msgstr "Неверный формат даты. Вход отклонен." #: pdfarranger/pdfarranger.py:2551 #, python-format msgid "It uses libqpdf %s, pikepdf %s, GTK %s and Python %s." msgstr "Приложение использует libqpdf %s, и pikepdf %s, GTK %s и Python %s." #: pdfarranger/metadata.py:44 msgid "Keywords" msgstr "Ключевые слова" #: pdfarranger/config.py:222 msgid "Language" msgstr "Язык" #: pdfarranger/pageutils.py:460 msgid "Layout for the first page in selection" msgstr "Макет для первой выбранной страницы" #: pdfarranger/pageutils.py:149 msgid "Left" msgstr "Слева" #: pdfarranger/pageutils.py:377 msgid "Left to Right" msgstr "Слева направо" #: data/pdfarranger.ui:122 msgid "Main Menu" msgstr "Главное меню" #: pdfarranger/pdfarranger.py:2557 msgid "Maintainers and contributors" msgstr "Сопровождающие и участники проекта" #: pdfarranger/pageutils.py:361 msgid "Margin" msgstr "Поле" #: pdfarranger/pageutils.py:347 msgid "Merge Pages" msgstr "Объединение страниц" #: pdfarranger/pageutils.py:412 msgid "Merged page size:" msgstr "Размер объединённой страницы:" #: pdfarranger/metadata.py:49 msgid "Modified" msgstr "Изменён" #: pdfarranger/pageutils.py:392 msgid "Non-uniform page size - using max size" msgstr "Неравномерный размер страниц — используется максимальный размер" #: data/pdfarranger.ui:37 msgid "Open" msgstr "Открыть" #: pdfarranger/pdfarranger.py:1186 msgid "Open…" msgstr "Открыть…" #: pdfarranger/pageutils.py:436 msgid "Overlay" msgstr "Наложение" #: pdfarranger/pdfarranger.py:282 msgid "" "PDF Arranger is a small python-gtk application, which helps the user to " "merge or split pdf documents and rotate, crop and rearrange their pages " "using an interactive and intuitive graphical interface. It is a frontend for " "pikepdf." msgstr "" "PDF Arranger - это небольшое python-gtk приложение, которое помогает " "пользователю объединять или разделять документы PDF, а также вращать, " "обрезать и изменять порядок страниц с помощью интерактивного и интуитивно " "понятного графического интерфейса. Это клиентский интерфейс для pikepdf." #: pdfarranger/pdfarranger.py:1498 msgid "PDF document is damaged" msgstr "Документ PDF повреждён" #: pdfarranger/pdfarranger.py:499 msgid "PDF files" msgstr "Файлы PDF" #: pdfarranger/pageutils.py:388 msgid "Page Order" msgstr "Порядок страниц" #: pdfarranger/pageutils.py:241 msgid "Page Size" msgstr "Размер страницы" #: pdfarranger/pdfarranger.py:2585 msgid "Page Size:" msgstr "Размер страницы:" #: pdfarranger/pageutils.py:230 msgid "Page format" msgstr "Форматировать страницу" #: pdfarranger/core.py:285 msgid "Password" msgstr "Пароль" #: pdfarranger/core.py:263 msgid "Password required" msgstr "Требуется пароль" #: data/menu.ui:277 msgid "Past_e Special" msgstr "_Специальная вставка" #: data/menu.ui:295 msgid "Paste As O_verlay…" msgstr "Вставить как нало_жение…" #: data/menu.ui:151 data/menu.ui:290 msgid "Paste As _Even Pages" msgstr "Вставить как _чётные страницы" #: data/menu.ui:146 data/menu.ui:285 msgid "Paste As _Odd Pages" msgstr "Вставить как _нечётные страницы" #: data/menu.ui:300 msgid "Paste As _Underlay…" msgstr "Вставить как _подложку…" #: data/menu.ui:136 data/menu.ui:272 msgid "Paste _After" msgstr "Вставить п_осле" #: data/menu.ui:141 data/menu.ui:280 msgid "Paste _Before" msgstr "Вставить _до" #: pdfarranger/pdfarranger.py:1627 msgid "Pasted data not valid. Aborting paste." msgstr "Вставляемые данные недопустимы. Вставка прервана." #: pdfarranger/pdfarranger.py:1589 msgid "Pikepdf >= 3 is needed for overlay/underlay/merge support." msgstr "Для поддержки наложения/подложки/объединения требуется Pikepdf >= 3." #: data/menu.ui:234 msgid "Pre_ferences" msgstr "_Параметры" #: pdfarranger/config.py:212 msgid "Preferences" msgstr "Параметры" #: pdfarranger/pdfarranger.py:293 msgid "Print the version of PDF Arranger and exit" msgstr "Распечатать версию программы PDF Arranger и выйти" #: pdfarranger/exporter.py:457 msgid "Printing…" msgstr "Печать…" #: pdfarranger/metadata.py:45 msgid "Producer" msgstr "Программа" #: pdfarranger/metadata.py:212 msgid "Property" msgstr "Свойство" #: data/menu.ui:116 data/menu.ui:373 msgid "Re_verse Order" msgstr "_Обратный порядок" #: pdfarranger/pageutils.py:238 msgid "Relative" msgstr "Относительный" #: pdfarranger/exporter.py:469 msgid "Rendering Preview…" msgstr "Предварительная визуализация…" #: pdfarranger/pdfarranger.py:732 msgid "Rendering…" msgstr "Визуализация…" #: pdfarranger/pdfarranger.py:1132 msgid "Replace" msgstr "Заменить" #: pdfarranger/pageutils.py:149 msgid "Right" msgstr "Справа" #: pdfarranger/pageutils.py:378 msgid "Right to Left" msgstr "Справа налево" #: data/pdfarranger.ui:203 msgid "Rotate Left" msgstr "Повернуть влево" #: data/pdfarranger.ui:227 msgid "Rotate Right" msgstr "Повернуть вправо" #: data/menu.ui:90 data/menu.ui:351 msgid "Rotate _Left" msgstr "Повернуть в_лево" #: pdfarranger/pageutils.py:364 pdfarranger/splitter.py:60 msgid "Rows" msgstr "Ряды" #: data/menu.ui:194 data/menu.ui:337 msgid "Same Page _Format" msgstr "Страницы того же _формата" #: data/pdfarranger.ui:78 msgid "Save" msgstr "Сохранить" #: data/pdfarranger.ui:97 msgid "Save As" msgstr "Сохранить как" #: pdfarranger/pdfarranger.py:1088 msgid "Save As…" msgstr "Сохранить как…" #: data/menu.ui:47 msgid "Save _As…" msgstr "Сохранить _как…" #: pdfarranger/pdfarranger.py:988 msgid "Save changes before closing?" msgstr "Сохранить изменения в перед закрытием?" #: pdfarranger/pdfarranger.py:1025 msgid "Save changes before quitting?" msgstr "Сохранить изменения в перед выходом?" #: pdfarranger/pdfarranger.py:985 msgid "Save changes to “{}” before closing?" msgstr "Сохранить изменения в «{}» перед закрытием?" #: pdfarranger/pdfarranger.py:1022 msgid "Save changes to “{}” before quitting?" msgstr "Сохранить изменения в «{}» перед выходом?" #: pdfarranger/pdfarranger.py:1249 msgid "Saving produced some warnings" msgstr "Сохранение выдало несколько предупреждений" #: pdfarranger/pdfarranger.py:1288 msgid "Saving…" msgstr "Сохранение…" #: pdfarranger/pageutils.py:116 msgid "Scale factor" msgstr "Масштаб" #: data/menu.ui:169 data/menu.ui:312 msgid "Select _All" msgstr "Выделить _всё" #: data/menu.ui:184 data/menu.ui:327 msgid "Select _Even Pages" msgstr "Выделить _чётные страницы" #: data/menu.ui:179 data/menu.ui:322 msgid "Select _Odd Pages" msgstr "Выделить _нечётные страницы" #: pdfarranger/pdfarranger.py:2580 msgid "Selected pages: " msgstr "Выбранные страницы: " #: pdfarranger/splitter.py:26 msgid "Split Pages" msgstr "Разделить страницы" #: pdfarranger/metadata.py:43 msgid "Subject" msgstr "Тема" #: pdfarranger/pdfarranger.py:512 msgid "Supported image files" msgstr "Поддерживаемые файлы изображений" #: pdfarranger/config.py:248 pdfarranger/config.py:256 msgid "System setting" msgstr "Системные настройки" #: pdfarranger/core.py:275 msgid "" "The document “{}” is locked and requires a password before it can be opened." msgstr "Документ «{}» заблокирован, для его открытия требуется пароль." #: pdfarranger/core.py:274 msgid "The password will be remembered until you close PDF Arranger." msgstr "Пароль будет запомнен, пока вы не закроете PDF Arranger." #: pdfarranger/config.py:230 msgid "Theme" msgstr "Тема" #: pdfarranger/metadata.py:42 msgid "Title" msgstr "Заголовок" #: pdfarranger/pageutils.py:149 msgid "Top" msgstr "Сверху" #: pdfarranger/pageutils.py:379 msgid "Top to Bottom" msgstr "Сверху вниз" #: pdfarranger/pageutils.py:436 msgid "Underlay" msgstr "Подложка" #: pdfarranger/core.py:361 pdfarranger/pdfarranger.py:1494 msgid "Unknown file format" msgstr "Неизвестный формат файла" #: pdfarranger/metadata.py:212 msgid "Value" msgstr "Значение" #: pdfarranger/pageutils.py:376 msgid "Vertical" msgstr "Вертикальная" #: pdfarranger/splitter.py:61 msgid "Vertical Splits" msgstr "Вертикальные разделения" #: pdfarranger/pageutils.py:478 msgid "Vertical offset" msgstr "Вертикальное смещение" #: pdfarranger/exporter.py:187 msgid "Warning" msgstr "Предупреждение" #: pdfarranger/pageutils.py:235 pdfarranger/pageutils.py:239 #: pdfarranger/pageutils.py:327 msgid "Width" msgstr "Ширина" #: pdfarranger/splitter.py:88 msgid "Width in %" msgstr "Ширина в %" #: pdfarranger/pdfarranger.py:969 msgid "Your changes will be lost if you don’t save them." msgstr "Ваши изменения будут потеряны, если их не сохранить." #: data/pdfarranger.ui:144 msgid "Zoom In" msgstr "Увеличить" #: data/pdfarranger.ui:167 msgid "Zoom Out" msgstr "Уменьшить" #: data/menu.ui:217 msgid "Zoom _Fit" msgstr "Страница _целиком" #: data/menu.ui:209 msgid "Zoom _In" msgstr "У_величить" #: data/menu.ui:213 msgid "Zoom _Out" msgstr "У_меньшить" #: data/menu.ui:240 msgid "_About" msgstr "_О приложении" #: pdfarranger/config.py:216 pdfarranger/pageutils.py:219 #: pdfarranger/pdfarranger.py:961 pdfarranger/pdfarranger.py:970 #: pdfarranger/pdfarranger.py:1094 pdfarranger/pdfarranger.py:1144 msgid "_Cancel" msgstr "_Отмена" #: pdfarranger/pdfarranger.py:980 data/menu.ui:246 msgid "_Close" msgstr "_Закрыть" #: data/menu.ui:132 data/menu.ui:268 msgid "_Copy" msgstr "_Копировать" #: data/menu.ui:108 data/menu.ui:260 msgid "_Delete" msgstr "_Удалить" #: data/menu.ui:174 data/menu.ui:317 msgid "_Deselect All" msgstr "Сн_ять выделение" #: data/menu.ui:87 msgid "_Edit" msgstr "П_равка" #: data/menu.ui:30 msgid "_Import" msgstr "_Импорт" #: data/menu.ui:199 data/menu.ui:342 msgid "_Invert Selection" msgstr "_Инвертировать выделение" #: data/menu.ui:124 data/menu.ui:381 msgid "_Merge Pages…" msgstr "_Объединение страниц…" #: data/menu.ui:36 msgid "_New Window" msgstr "_Создать окно" #: pdfarranger/config.py:217 pdfarranger/pageutils.py:220 msgid "_OK" msgstr "_ОК" #: pdfarranger/pdfarranger.py:1143 data/menu.ui:24 msgid "_Open" msgstr "_Открыть" #: data/menu.ui:100 data/menu.ui:361 msgid "_Page Format…" msgstr "_Форматировать страницу…" #: data/menu.ui:71 msgid "_Print…" msgstr "_Печать…" #: pdfarranger/pdfarranger.py:1017 data/menu.ui:252 msgid "_Quit" msgstr "В_ыход" #: data/menu.ui:82 msgid "_Redo" msgstr "_Повторить" #: data/menu.ui:95 data/menu.ui:356 msgid "_Rotate Right" msgstr "Повернуть в_право" #: pdfarranger/pdfarranger.py:970 pdfarranger/pdfarranger.py:1093 #: data/menu.ui:42 msgid "_Save" msgstr "_Сохранить" #: data/menu.ui:166 data/menu.ui:309 msgid "_Select" msgstr "В_ыделить" #: data/menu.ui:120 data/menu.ui:377 msgid "_Split Pages…" msgstr "Раз_делить страницы…" #: data/menu.ui:78 msgid "_Undo" msgstr "О_тменить" #: data/menu.ui:206 msgid "_View" msgstr "_Вид" #: pdfarranger/pageutils.py:139 pdfarranger/pageutils.py:362 #: pdfarranger/pageutils.py:412 msgid "mm" msgstr "мм" #: pdfarranger/core.py:89 msgid "page" msgstr "страница" #: pdfarranger/pdfarranger.py:811 msgid "untitled" msgstr "без_названия" pdfarranger-1.10.1/po/sv.po000066400000000000000000000420041451252235000154720ustar00rootroot00000000000000# Swedish translation for pdfarranger. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the pdfarranger package. # Translators: # kbengs, 2020 msgid "" msgstr "" "Project-Id-Version: pdfarranger\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-04-29 22:45+0200\n" "PO-Revision-Date: 2023-05-18 07:19+0300\n" "Last-Translator: kbengs\n" "Language-Team: Swedish\n" "Language: sv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.0.1\n" #: pdfarranger/splitter.py:87 msgid "#Col" msgstr "#Kolumn" #: pdfarranger/splitter.py:87 msgid "#Row" msgstr "#Rad" #: pdfarranger/pageutils.py:122 pdfarranger/pageutils.py:477 #: pdfarranger/pageutils.py:479 msgid "%" msgstr "%" #: pdfarranger/pageutils.py:170 #, python-format msgid "% of height" msgstr "% av höjd" #: pdfarranger/pageutils.py:170 #, python-format msgid "% of width" msgstr "% av bredd" #: pdfarranger/pdfarranger.py:2548 #, python-format msgid "%s is a tool for rearranging and modifying PDF files." msgstr "%s är ett verktyg för att arrangera om och modifiera PDF filer." #: pdfarranger/config.py:232 msgid "(Libhandy missing)" msgstr "(Libhandy saknas)" #: pdfarranger/config.py:224 msgid "(Requires restart)" msgstr "(Kräver omstart)" #: pdfarranger/pageutils.py:461 msgid "(same offset is applied to all pages)" msgstr "(samma offset tillämpas på alla sidor)" #: pdfarranger/pdfarranger.py:1130 #, python-format msgid "A file named \"%s\" already exists. Do you want to replace it?" msgstr "En fil med namnet \"%s\" finns redan. Vill du skriva över den?" #: data/menu.ui:189 data/menu.ui:332 msgid "All From _Same File" msgstr "Alla från samma _fil" #: pdfarranger/pdfarranger.py:507 msgid "All files" msgstr "Alla filer" #: pdfarranger/pdfarranger.py:462 msgid "All pages must have the same size." msgstr "Alla sidor måste ha samma storlek." #: pdfarranger/pdfarranger.py:495 msgid "All supported files" msgstr "Alla filer som stöds" #: pdfarranger/pageutils.py:149 msgid "Bottom" msgstr "Under" #: pdfarranger/pageutils.py:380 msgid "Bottom to Top" msgstr "Nerifrån uppåt" #: pdfarranger/core.py:386 msgid "Clipboard image" msgstr "Urklipp bild" #: pdfarranger/pageutils.py:363 pdfarranger/splitter.py:60 msgid "Columns" msgstr "Kolumner" #: pdfarranger/metadata.py:48 msgid "Created" msgstr "Skapad" #: pdfarranger/metadata.py:46 msgid "Creator" msgstr "Författare" #: pdfarranger/metadata.py:47 msgid "Creator tool" msgstr "Program" #: pdfarranger/pageutils.py:153 msgid "Crop Margins" msgstr "Beskär marginaler" #: data/menu.ui:104 data/menu.ui:365 msgid "Crop White Borders" msgstr "_Beskär vita marginaler" #: pdfarranger/pageutils.py:161 msgid "" "Cropping does not remove any content from the PDF file, it only hides it." msgstr "" "Innehåll tas inte bort från PDF-filen vid beskärning, utan döljs endast." #: data/menu.ui:128 data/menu.ui:264 msgid "Cu_t" msgstr "_Klipp ut" #: pdfarranger/pdfarranger.py:1250 msgid "Despite the warnings the document(s) should have no visible issues." msgstr "Trots varningarna borde dokumenten inte ha noterbara problem." #: pdfarranger/pdfarranger.py:979 msgid "Discard changes and close?" msgstr "Förkasta ändringar och stäng?" #: pdfarranger/pdfarranger.py:1016 msgid "Discard changes and quit?" msgstr "Förkasta ändringar och avsluta?" #: pdfarranger/exporter.py:194 msgid "Do not show this dialog again." msgstr "Visa inte detta meddelande igen." #: pdfarranger/pdfarranger.py:970 msgid "Do_n’t Save" msgstr "Spara _inte" #: pdfarranger/pdfarranger.py:1257 msgid "Don't show warnings when saving again." msgstr "Visa inte varningar när dokument sparas." #: data/menu.ui:112 data/menu.ui:369 msgid "Dupl_icate" msgstr "Dupli_cera" #: data/menu.ui:52 data/menu.ui:395 msgid "E_xport" msgstr "E_xportera" #: data/menu.ui:55 data/menu.ui:398 msgid "E_xport Selection to a Single File…" msgstr "E_xportera markerade sidor till en fil…" #: data/menu.ui:228 msgid "Edit _Properties" msgstr "Redigera _egenskaper" #: pdfarranger/metadata.py:198 msgid "Edit properties" msgstr "Dokument egenskaper" #: pdfarranger/splitter.py:62 msgid "Equal column width" msgstr "Samma kolumnbredd" #: pdfarranger/splitter.py:62 msgid "Equal row height" msgstr "Samma radhöjd" #: data/menu.ui:60 data/menu.ui:403 msgid "Export Selection to _Individual Files…" msgstr "Exportera markerade sidor till _enskilda filer…" #: data/menu.ui:65 data/menu.ui:408 msgid "Export _All Pages to Individual Files…" msgstr "Exportera _alla sidor till enskilda filer…" #: pdfarranger/pdfarranger.py:1088 msgid "Export…" msgstr "Exportera…" #: pdfarranger/core.py:388 pdfarranger/pdfarranger.py:1504 msgid "File is neither pdf nor image" msgstr "Filen är varken en PDF eller en bildfil" #: pdfarranger/pdfarranger.py:301 msgid "File(s) to open" msgstr "Fil(er) att öppna" #: pdfarranger/config.py:237 msgid "For more options see:" msgstr "För fler inställningar se:" #: pdfarranger/exporter.py:192 msgid "Forms and outlines are lost on saving." msgstr "Formulär och bokmärken går förlorade när dokumentet sparas." #: data/menu.ui:221 msgid "Full_screen" msgstr "_Helskärm" #: pdfarranger/pdfarranger.py:2562 msgid "GNU General Public License (GPL) Version 3." msgstr "GNU General Public License (GPL) Version 3." #: data/menu.ui:160 data/menu.ui:389 msgid "Generate Booklet" msgstr "Skapa ett häfte" #: pdfarranger/pageutils.py:236 pdfarranger/pageutils.py:240 #: pdfarranger/pageutils.py:328 msgid "Height" msgstr "Höjd" #: pdfarranger/splitter.py:88 msgid "Height in %" msgstr "Höjd i %" #: pdfarranger/pageutils.py:375 msgid "Horizontal" msgstr "Horizontell" #: pdfarranger/splitter.py:61 msgid "Horizontal Splits" msgstr "Horisontell delning" #: pdfarranger/pageutils.py:476 msgid "Horizontal offset" msgstr "Horizontell offset" #: pdfarranger/core.py:377 msgid "Image files are only supported with img2pdf" msgstr "Img2pdf krävs för stöd av bildfiler" #: pdfarranger/core.py:383 msgid "Image format is not supported by img2pdf" msgstr "Bildformatet stöds inte av img2pdf" #: data/pdfarranger.ui:58 msgid "Import" msgstr "Importera" #: pdfarranger/pdfarranger.py:1327 msgid "Import…" msgstr "Importera…" #: data/menu.ui:156 data/menu.ui:385 msgid "Insert Blan_k Page…" msgstr "_Infoga tom sida…" #: pdfarranger/pageutils.py:325 msgid "Insert Blank Page" msgstr "Infoga tom sida" #: pdfarranger/metadata.py:169 msgid "Invalid date format. Input discarded." msgstr "Ogiltigt datumformat." #: pdfarranger/pdfarranger.py:2551 #, python-format msgid "It uses libqpdf %s, pikepdf %s, GTK %s and Python %s." msgstr "Programmet använder %s, pikepdf %s, GTK %s och Python %s." #: pdfarranger/metadata.py:44 msgid "Keywords" msgstr "Nyckelord" #: pdfarranger/config.py:222 msgid "Language" msgstr "Språk" #: pdfarranger/pageutils.py:460 msgid "Layout for the first page in selection" msgstr "Layouten för första sidan i markeringen" #: pdfarranger/pageutils.py:149 msgid "Left" msgstr "Vänster" #: pdfarranger/pageutils.py:377 msgid "Left to Right" msgstr "Vänster till höger" #: data/pdfarranger.ui:122 msgid "Main Menu" msgstr "Huvudmeny" #: pdfarranger/pdfarranger.py:2557 msgid "Maintainers and contributors" msgstr "Administratörer och bidragsgivare" #: pdfarranger/pageutils.py:361 msgid "Margin" msgstr "Marginal" #: pdfarranger/pageutils.py:347 msgid "Merge Pages" msgstr "Slå samman sidor" #: pdfarranger/pageutils.py:412 msgid "Merged page size:" msgstr "Sammanslagna sidstorleken:" #: pdfarranger/metadata.py:49 msgid "Modified" msgstr "Ändrad" #: pdfarranger/pageutils.py:392 msgid "Non-uniform page size - using max size" msgstr "Sidorna har olika storlek - max storleken används" #: data/pdfarranger.ui:37 msgid "Open" msgstr "Öppna" #: pdfarranger/pdfarranger.py:1186 msgid "Open…" msgstr "Öppna…" #: pdfarranger/pageutils.py:436 msgid "Overlay" msgstr "Klistra in ovanpå" #: pdfarranger/pdfarranger.py:282 msgid "" "PDF Arranger is a small python-gtk application, which helps the user to " "merge or split pdf documents and rotate, crop and rearrange their pages " "using an interactive and intuitive graphical interface. It is a frontend for " "pikepdf." msgstr "" "PDF Arranger är ett litet python-gtk program som hjälper användaren att slå " "samman och dela pdf dokument samt att rotera och arrangera om dess sidor med " "ett interaktivt och intuitivt grafiskt användargränssnitt. Programmet " "använder pikepdf i bakgrunden." #: pdfarranger/pdfarranger.py:1498 msgid "PDF document is damaged" msgstr "PDF dokumentet är skadat" #: pdfarranger/pdfarranger.py:499 msgid "PDF files" msgstr "PDF filer" #: pdfarranger/pageutils.py:388 msgid "Page Order" msgstr "Sidordning" #: pdfarranger/pageutils.py:241 msgid "Page Size" msgstr "Sidstorlek" #: pdfarranger/pdfarranger.py:2585 msgid "Page Size:" msgstr "Sidstorlek:" #: pdfarranger/pageutils.py:230 msgid "Page format" msgstr "Sidformat" #: pdfarranger/core.py:285 msgid "Password" msgstr "Lösenord" #: pdfarranger/core.py:263 msgid "Password required" msgstr "Lösenord krävs" #: data/menu.ui:277 msgid "Past_e Special" msgstr "Klistra in _special" #: data/menu.ui:295 msgid "Paste As O_verlay…" msgstr "Klistra in ovanp_å…" #: data/menu.ui:151 data/menu.ui:290 msgid "Paste As _Even Pages" msgstr "Klistra in som _jämna sidor" #: data/menu.ui:146 data/menu.ui:285 msgid "Paste As _Odd Pages" msgstr "Klistra in som _udda sidor" #: data/menu.ui:300 msgid "Paste As _Underlay…" msgstr "Klistra in unde_r…" #: data/menu.ui:136 data/menu.ui:272 msgid "Paste _After" msgstr "Klistra in _efter" #: data/menu.ui:141 data/menu.ui:280 msgid "Paste _Before" msgstr "Klistra in _före" #: pdfarranger/pdfarranger.py:1627 msgid "Pasted data not valid. Aborting paste." msgstr "Inklistrat data är inte giltigt. Inklistringen avbryts." #: pdfarranger/pdfarranger.py:1589 msgid "Pikepdf >= 3 is needed for overlay/underlay/merge support." msgstr "Pikepdf >= 3 behövs för stöd av lager/slå samman sidor." #: data/menu.ui:234 msgid "Pre_ferences" msgstr "_Inställningar" #: pdfarranger/config.py:212 msgid "Preferences" msgstr "Inställningar" #: pdfarranger/pdfarranger.py:293 msgid "Print the version of PDF Arranger and exit" msgstr "Skriv ut PDF Arranger versionen och avsluta" #: pdfarranger/exporter.py:457 msgid "Printing…" msgstr "Skriver ut…" #: pdfarranger/metadata.py:45 msgid "Producer" msgstr "PDF-framställning" #: pdfarranger/metadata.py:212 msgid "Property" msgstr "Fält" #: data/menu.ui:116 data/menu.ui:373 msgid "Re_verse Order" msgstr "Omv_änd ordningen" #: pdfarranger/pageutils.py:238 msgid "Relative" msgstr "Relativt" #: pdfarranger/exporter.py:469 msgid "Rendering Preview…" msgstr "Renderar förhandsgranskning…" #: pdfarranger/pdfarranger.py:732 msgid "Rendering…" msgstr "Renderar…" #: pdfarranger/pdfarranger.py:1132 msgid "Replace" msgstr "Ersätt" #: pdfarranger/pageutils.py:149 msgid "Right" msgstr "Höger" #: pdfarranger/pageutils.py:378 msgid "Right to Left" msgstr "Höger till vänster" #: data/pdfarranger.ui:203 msgid "Rotate Left" msgstr "Rotera åt vänster" #: data/pdfarranger.ui:227 msgid "Rotate Right" msgstr "Rotera åt höger" #: data/menu.ui:90 data/menu.ui:351 msgid "Rotate _Left" msgstr "Rotera åt _vänster" #: pdfarranger/pageutils.py:364 pdfarranger/splitter.py:60 msgid "Rows" msgstr "Rader" #: data/menu.ui:194 data/menu.ui:337 msgid "Same Page _Format" msgstr "Alla med samma _sidformat" #: data/pdfarranger.ui:78 msgid "Save" msgstr "Spara" #: data/pdfarranger.ui:97 msgid "Save As" msgstr "Spara som" #: pdfarranger/pdfarranger.py:1088 msgid "Save As…" msgstr "Spara som…" #: data/menu.ui:47 msgid "Save _As…" msgstr "Spara s_om…" #: pdfarranger/pdfarranger.py:988 msgid "Save changes before closing?" msgstr "Spara ändringar innan stängning?" #: pdfarranger/pdfarranger.py:1025 msgid "Save changes before quitting?" msgstr "Spara ändringar innan programmet avslutas?" #: pdfarranger/pdfarranger.py:985 msgid "Save changes to “{}” before closing?" msgstr "Spara ändringar till “{}” innan stängning?" #: pdfarranger/pdfarranger.py:1022 msgid "Save changes to “{}” before quitting?" msgstr "Spara ändringar till “{}” innan programmet avslutas?" #: pdfarranger/pdfarranger.py:1249 msgid "Saving produced some warnings" msgstr "Spara-processen skapade varningar" #: pdfarranger/pdfarranger.py:1288 msgid "Saving…" msgstr "Sparar…" #: pdfarranger/pageutils.py:116 msgid "Scale factor" msgstr "Skalningsfaktor" #: data/menu.ui:169 data/menu.ui:312 msgid "Select _All" msgstr "_Markera allt" #: data/menu.ui:184 data/menu.ui:327 msgid "Select _Even Pages" msgstr "Markera _jämna sidor" #: data/menu.ui:179 data/menu.ui:322 msgid "Select _Odd Pages" msgstr "Markera _udda sidor" #: pdfarranger/pdfarranger.py:2580 msgid "Selected pages: " msgstr "Markerade sidor: " #: pdfarranger/splitter.py:26 msgid "Split Pages" msgstr "Dela sidor" #: pdfarranger/metadata.py:43 msgid "Subject" msgstr "Ämne" #: pdfarranger/pdfarranger.py:512 msgid "Supported image files" msgstr "Bildfiler som stöds" #: pdfarranger/config.py:248 pdfarranger/config.py:256 msgid "System setting" msgstr "Systemets inställning" #: pdfarranger/core.py:275 msgid "" "The document “{}” is locked and requires a password before it can be opened." msgstr "Dokumentet “{}” är låst och ett lösenord krävs innan det kan öppnas." #: pdfarranger/core.py:274 msgid "The password will be remembered until you close PDF Arranger." msgstr "Lösenordet kommer att vara sparat tills du stänger PDF Arranger." #: pdfarranger/config.py:230 msgid "Theme" msgstr "Tema" #: pdfarranger/metadata.py:42 msgid "Title" msgstr "Titel" #: pdfarranger/pageutils.py:149 msgid "Top" msgstr "Över" #: pdfarranger/pageutils.py:379 msgid "Top to Bottom" msgstr "Uppifrån neråt" #: pdfarranger/pageutils.py:436 msgid "Underlay" msgstr "Klistra in under" #: pdfarranger/core.py:361 pdfarranger/pdfarranger.py:1494 msgid "Unknown file format" msgstr "Okänt filformat" #: pdfarranger/metadata.py:212 msgid "Value" msgstr "Innehåll" #: pdfarranger/pageutils.py:376 msgid "Vertical" msgstr "Vertikal" #: pdfarranger/splitter.py:61 msgid "Vertical Splits" msgstr "Vertikal delning" #: pdfarranger/pageutils.py:478 msgid "Vertical offset" msgstr "Vertikal offset" #: pdfarranger/exporter.py:187 msgid "Warning" msgstr "Varning" #: pdfarranger/pageutils.py:235 pdfarranger/pageutils.py:239 #: pdfarranger/pageutils.py:327 msgid "Width" msgstr "Bredd" #: pdfarranger/splitter.py:88 msgid "Width in %" msgstr "Bredd i %" #: pdfarranger/pdfarranger.py:969 msgid "Your changes will be lost if you don’t save them." msgstr "Dina ändringar går förlorade om du inte sparar dem." #: data/pdfarranger.ui:144 msgid "Zoom In" msgstr "Zooma in" #: data/pdfarranger.ui:167 msgid "Zoom Out" msgstr "Zooma ut" #: data/menu.ui:217 msgid "Zoom _Fit" msgstr "_Anpassa zoom" #: data/menu.ui:209 msgid "Zoom _In" msgstr "Zooma _in" #: data/menu.ui:213 msgid "Zoom _Out" msgstr "Zooma _ut" #: data/menu.ui:240 msgid "_About" msgstr "_Om PDF Arranger" #: pdfarranger/config.py:216 pdfarranger/pageutils.py:219 #: pdfarranger/pdfarranger.py:961 pdfarranger/pdfarranger.py:970 #: pdfarranger/pdfarranger.py:1094 pdfarranger/pdfarranger.py:1144 msgid "_Cancel" msgstr "_Avbryt" #: pdfarranger/pdfarranger.py:980 data/menu.ui:246 msgid "_Close" msgstr "_Stäng" #: data/menu.ui:132 data/menu.ui:268 msgid "_Copy" msgstr "K_opiera" #: data/menu.ui:108 data/menu.ui:260 msgid "_Delete" msgstr "_Ta bort" #: data/menu.ui:174 data/menu.ui:317 msgid "_Deselect All" msgstr "_Avmarkera allt" #: data/menu.ui:87 msgid "_Edit" msgstr "_Redigera" #: data/menu.ui:30 msgid "_Import" msgstr "Im_portera" #: data/menu.ui:199 data/menu.ui:342 msgid "_Invert Selection" msgstr "_Invertera markeringen" #: data/menu.ui:124 data/menu.ui:381 msgid "_Merge Pages…" msgstr "Sl_å samman sidor…" #: data/menu.ui:36 msgid "_New Window" msgstr "_Nytt fönster" #: pdfarranger/config.py:217 pdfarranger/pageutils.py:220 msgid "_OK" msgstr "_OK" #: pdfarranger/pdfarranger.py:1143 data/menu.ui:24 msgid "_Open" msgstr "_Öppna" #: data/menu.ui:100 data/menu.ui:361 msgid "_Page Format…" msgstr "_Sidformat…" #: data/menu.ui:71 msgid "_Print…" msgstr "_Skriv ut…" #: pdfarranger/pdfarranger.py:1017 data/menu.ui:252 msgid "_Quit" msgstr "_Avsluta" #: data/menu.ui:82 msgid "_Redo" msgstr "_Gör om" #: data/menu.ui:95 data/menu.ui:356 msgid "_Rotate Right" msgstr "Rotera åt _höger" #: pdfarranger/pdfarranger.py:970 pdfarranger/pdfarranger.py:1093 #: data/menu.ui:42 msgid "_Save" msgstr "_Spara" #: data/menu.ui:166 data/menu.ui:309 msgid "_Select" msgstr "_Markera" #: data/menu.ui:120 data/menu.ui:377 msgid "_Split Pages…" msgstr "_Dela sidor…" #: data/menu.ui:78 msgid "_Undo" msgstr "_Ångra" #: data/menu.ui:206 msgid "_View" msgstr "_Visa" #: pdfarranger/pageutils.py:139 pdfarranger/pageutils.py:362 #: pdfarranger/pageutils.py:412 msgid "mm" msgstr "mm" #: pdfarranger/core.py:89 msgid "page" msgstr "sida" #: pdfarranger/pdfarranger.py:811 msgid "untitled" msgstr "Osparat dokument" pdfarranger-1.10.1/po/tr.po000066400000000000000000000416631451252235000155010ustar00rootroot00000000000000# Turkish translation of pdfarranger # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the pdfarranger package. # Murathan BOSTANCI , 2018 # Emin Tufan Çetin , 2020, 2021, 2022. # Oğuz Ersen , 2021-2023. # msgid "" msgstr "" "Project-Id-Version: pdfarranger master\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-04-29 22:45+0200\n" "PO-Revision-Date: 2023-01-22 21:30+0300\n" "Last-Translator: Oğuz Ersen \n" "Language-Team: Turkish \n" "Language: tr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" #: pdfarranger/splitter.py:87 msgid "#Col" msgstr "#Süt" #: pdfarranger/splitter.py:87 msgid "#Row" msgstr "#Sat" #: pdfarranger/pageutils.py:122 pdfarranger/pageutils.py:477 #: pdfarranger/pageutils.py:479 msgid "%" msgstr "%" #: pdfarranger/pageutils.py:170 #, python-format msgid "% of height" msgstr "% olarak yükseklik" #: pdfarranger/pageutils.py:170 #, python-format msgid "% of width" msgstr "% olarak genişlik" #: pdfarranger/pdfarranger.py:2548 #, python-format msgid "%s is a tool for rearranging and modifying PDF files." msgstr "" "%s, PDF dosyalarını yeniden düzenlemek ve değiştirmek için bir araçtır." #: pdfarranger/config.py:232 msgid "(Libhandy missing)" msgstr "(Libhandy eksik)" #: pdfarranger/config.py:224 msgid "(Requires restart)" msgstr "(Yeniden başlatma gerektirir)" #: pdfarranger/pageutils.py:461 msgid "(same offset is applied to all pages)" msgstr "" #: pdfarranger/pdfarranger.py:1130 #, python-format msgid "A file named \"%s\" already exists. Do you want to replace it?" msgstr "\"%s\" adında bir dosya zaten var. Değiştirmek istiyor musunuz?" #: data/menu.ui:189 data/menu.ui:332 msgid "All From _Same File" msgstr "_Aynı Dosyadan Tümü" #: pdfarranger/pdfarranger.py:507 msgid "All files" msgstr "Tüm dosyalar" #: pdfarranger/pdfarranger.py:462 msgid "All pages must have the same size." msgstr "Tüm sayfalar aynı boyutta olmalıdır." #: pdfarranger/pdfarranger.py:495 msgid "All supported files" msgstr "Desteklenen tüm dosyalar" #: pdfarranger/pageutils.py:149 msgid "Bottom" msgstr "Alt" #: pdfarranger/pageutils.py:380 msgid "Bottom to Top" msgstr "" #: pdfarranger/core.py:386 msgid "Clipboard image" msgstr "Pano resmi" #: pdfarranger/pageutils.py:363 pdfarranger/splitter.py:60 msgid "Columns" msgstr "Sütunlar" #: pdfarranger/metadata.py:48 msgid "Created" msgstr "Oluşturulma" #: pdfarranger/metadata.py:46 msgid "Creator" msgstr "Oluşturucu" #: pdfarranger/metadata.py:47 msgid "Creator tool" msgstr "Oluşturucu araç" #: pdfarranger/pageutils.py:153 msgid "Crop Margins" msgstr "Kenarları Kırp" #: data/menu.ui:104 data/menu.ui:365 msgid "Crop White Borders" msgstr "Beyaz Kenarları Kırp" #: pdfarranger/pageutils.py:161 msgid "" "Cropping does not remove any content from the PDF file, it only hides it." msgstr "" "Kırparak PDF dosyasından herhangi bir veri kaldırılmaz, yalnızca gizlenir." #: data/menu.ui:128 data/menu.ui:264 msgid "Cu_t" msgstr "_Kes" #: pdfarranger/pdfarranger.py:1250 msgid "Despite the warnings the document(s) should have no visible issues." msgstr "Uyarılara rağmen belge(ler)de görünür sorun yoktur." #: pdfarranger/pdfarranger.py:979 msgid "Discard changes and close?" msgstr "Değişiklikler atılsın ve kapatılsın mı?" #: pdfarranger/pdfarranger.py:1016 msgid "Discard changes and quit?" msgstr "Değişiklikler atılsın ve çıkılsın mı?" #: pdfarranger/exporter.py:194 msgid "Do not show this dialog again." msgstr "Bu pencereyi yeniden gösterme." #: pdfarranger/pdfarranger.py:970 msgid "Do_n’t Save" msgstr "Kaydet_me" #: pdfarranger/pdfarranger.py:1257 msgid "Don't show warnings when saving again." msgstr "Kaydederken uyarıları yeniden gösterme." #: data/menu.ui:112 data/menu.ui:369 msgid "Dupl_icate" msgstr "_Çoğalt" #: data/menu.ui:52 data/menu.ui:395 msgid "E_xport" msgstr "_Dışa Aktar" #: data/menu.ui:55 data/menu.ui:398 msgid "E_xport Selection to a Single File…" msgstr "Seçimi Tek Dosyaya D_ışa Aktar…" #: data/menu.ui:228 msgid "Edit _Properties" msgstr "_Özellikleri Düzenle" #: pdfarranger/metadata.py:198 msgid "Edit properties" msgstr "Özellikleri düzenle" #: pdfarranger/splitter.py:62 msgid "Equal column width" msgstr "Eşit sütun genişliği" #: pdfarranger/splitter.py:62 msgid "Equal row height" msgstr "Eşit satır yüksekliği" #: data/menu.ui:60 data/menu.ui:403 msgid "Export Selection to _Individual Files…" msgstr "Seçimi _Ayrı Dosyalara Dışa Aktar…" #: data/menu.ui:65 data/menu.ui:408 msgid "Export _All Pages to Individual Files…" msgstr "_Tüm Sayfaları Ayrı Dosyalara Dışa Aktar…" #: pdfarranger/pdfarranger.py:1088 msgid "Export…" msgstr "Dışa Aktar…" #: pdfarranger/core.py:388 pdfarranger/pdfarranger.py:1504 msgid "File is neither pdf nor image" msgstr "Dosya ne pdf ne de resimdir" #: pdfarranger/pdfarranger.py:301 msgid "File(s) to open" msgstr "Açılacak dosya(lar)" #: pdfarranger/config.py:237 msgid "For more options see:" msgstr "" #: pdfarranger/exporter.py:192 msgid "Forms and outlines are lost on saving." msgstr "Kaydedilirken formlar ve konturlar yitirilecek." #: data/menu.ui:221 msgid "Full_screen" msgstr "Tam _Ekran" #: pdfarranger/pdfarranger.py:2562 msgid "GNU General Public License (GPL) Version 3." msgstr "GNU Genel Kamu Lisansı (GPL) Sürüm 3." #: data/menu.ui:160 data/menu.ui:389 msgid "Generate Booklet" msgstr "Kitapçık Oluştur" #: pdfarranger/pageutils.py:236 pdfarranger/pageutils.py:240 #: pdfarranger/pageutils.py:328 msgid "Height" msgstr "Yükseklik" #: pdfarranger/splitter.py:88 msgid "Height in %" msgstr "% olarak yükseklik" #: pdfarranger/pageutils.py:375 msgid "Horizontal" msgstr "" #: pdfarranger/splitter.py:61 msgid "Horizontal Splits" msgstr "Yatay Bölmeler" #: pdfarranger/pageutils.py:476 msgid "Horizontal offset" msgstr "" #: pdfarranger/core.py:377 msgid "Image files are only supported with img2pdf" msgstr "Yalnızca img2pdf ile desteklenen resim dosyaları" #: pdfarranger/core.py:383 msgid "Image format is not supported by img2pdf" msgstr "Resim dosyası, img2pdf tarafından desteklenmiyor" #: data/pdfarranger.ui:58 msgid "Import" msgstr "İçe Aktar" #: pdfarranger/pdfarranger.py:1327 msgid "Import…" msgstr "İçe Aktar…" #: data/menu.ui:156 data/menu.ui:385 msgid "Insert Blan_k Page…" msgstr "B_oş Sayfa Ekle…" #: pdfarranger/pageutils.py:325 msgid "Insert Blank Page" msgstr "Boş Sayfa Ekle" #: pdfarranger/metadata.py:169 msgid "Invalid date format. Input discarded." msgstr "Geçersiz tarih biçimi. Girdi görmezden gelindi." #: pdfarranger/pdfarranger.py:2551 #, python-format msgid "It uses libqpdf %s, pikepdf %s, GTK %s and Python %s." msgstr "libqpdf %s, pikepdf %s, GTK %s ve Python %s kullanmaktadır." #: pdfarranger/metadata.py:44 msgid "Keywords" msgstr "Anahtar sözcükler" #: pdfarranger/config.py:222 msgid "Language" msgstr "Dil" #: pdfarranger/pageutils.py:460 msgid "Layout for the first page in selection" msgstr "" #: pdfarranger/pageutils.py:149 msgid "Left" msgstr "Sol" #: pdfarranger/pageutils.py:377 msgid "Left to Right" msgstr "" #: data/pdfarranger.ui:122 msgid "Main Menu" msgstr "Ana Menü" #: pdfarranger/pdfarranger.py:2557 msgid "Maintainers and contributors" msgstr "Bakımcılar ve katkıcılar" #: pdfarranger/pageutils.py:361 msgid "Margin" msgstr "" #: pdfarranger/pageutils.py:347 msgid "Merge Pages" msgstr "" #: pdfarranger/pageutils.py:412 msgid "Merged page size:" msgstr "" #: pdfarranger/metadata.py:49 msgid "Modified" msgstr "Değiştirilme" #: pdfarranger/pageutils.py:392 msgid "Non-uniform page size - using max size" msgstr "" #: data/pdfarranger.ui:37 msgid "Open" msgstr "Aç" #: pdfarranger/pdfarranger.py:1186 msgid "Open…" msgstr "Aç…" #: pdfarranger/pageutils.py:436 msgid "Overlay" msgstr "" #: pdfarranger/pdfarranger.py:282 msgid "" "PDF Arranger is a small python-gtk application, which helps the user to " "merge or split pdf documents and rotate, crop and rearrange their pages " "using an interactive and intuitive graphical interface. It is a frontend for " "pikepdf." msgstr "" "PDF Arranger, kullanıcının etkileşimli ve sezgisel bir grafiksel arayüz " "kullanarak pdf belgelerini birleştirmesine veya bölmesine ve sayfalarını " "döndürmesine, kırpmasına ve yeniden düzenlemesine yardımcı olan küçük bir " "python-gtk uygulamasıdır. pikepdf için bir ön yüzdür." #: pdfarranger/pdfarranger.py:1498 msgid "PDF document is damaged" msgstr "PDF belgesi hasarlı" #: pdfarranger/pdfarranger.py:499 msgid "PDF files" msgstr "PDF dosyaları" #: pdfarranger/pageutils.py:388 msgid "Page Order" msgstr "" #: pdfarranger/pageutils.py:241 msgid "Page Size" msgstr "Sayfa Boyutu" #: pdfarranger/pdfarranger.py:2585 msgid "Page Size:" msgstr "Sayfa Boyutu:" #: pdfarranger/pageutils.py:230 msgid "Page format" msgstr "Sayfa biçimi" #: pdfarranger/core.py:285 msgid "Password" msgstr "Parola" #: pdfarranger/core.py:263 msgid "Password required" msgstr "Parola gerekli" #: data/menu.ui:277 msgid "Past_e Special" msgstr "Öz_el Yapıştır" #: data/menu.ui:295 msgid "Paste As O_verlay…" msgstr "" #: data/menu.ui:151 data/menu.ui:290 msgid "Paste As _Even Pages" msgstr "_Çift Sayfalar Olarak Yapıştır" #: data/menu.ui:146 data/menu.ui:285 msgid "Paste As _Odd Pages" msgstr "_Tek Sayfalar Olarak Yapıştır" #: data/menu.ui:300 msgid "Paste As _Underlay…" msgstr "" #: data/menu.ui:136 data/menu.ui:272 msgid "Paste _After" msgstr "_Sonrasına Yapıştır" #: data/menu.ui:141 data/menu.ui:280 msgid "Paste _Before" msgstr "_Öncesine Yapıştır" #: pdfarranger/pdfarranger.py:1627 msgid "Pasted data not valid. Aborting paste." msgstr "Yapıştırılan veri geçersiz. Yapıştırılmıyor." #: pdfarranger/pdfarranger.py:1589 msgid "Pikepdf >= 3 is needed for overlay/underlay/merge support." msgstr "" #: data/menu.ui:234 msgid "Pre_ferences" msgstr "_Tercihler" #: pdfarranger/config.py:212 msgid "Preferences" msgstr "Tercihler" #: pdfarranger/pdfarranger.py:293 msgid "Print the version of PDF Arranger and exit" msgstr "PDF Arranger sürümünü yazdır ve çık" #: pdfarranger/exporter.py:457 msgid "Printing…" msgstr "Yazdırılıyor…" #: pdfarranger/metadata.py:45 msgid "Producer" msgstr "Üretici" #: pdfarranger/metadata.py:212 msgid "Property" msgstr "Özellik" #: data/menu.ui:116 data/menu.ui:373 msgid "Re_verse Order" msgstr "Sırayı _Evir" #: pdfarranger/pageutils.py:238 msgid "Relative" msgstr "Göreceli" #: pdfarranger/exporter.py:469 msgid "Rendering Preview…" msgstr "Ön İzleme Oluşturuluyor…" #: pdfarranger/pdfarranger.py:732 msgid "Rendering…" msgstr "Oluşturuluyor…" #: pdfarranger/pdfarranger.py:1132 msgid "Replace" msgstr "Değiştir" #: pdfarranger/pageutils.py:149 msgid "Right" msgstr "Sağ" #: pdfarranger/pageutils.py:378 msgid "Right to Left" msgstr "" #: data/pdfarranger.ui:203 msgid "Rotate Left" msgstr "Sola Döndür" #: data/pdfarranger.ui:227 msgid "Rotate Right" msgstr "Sağa Döndür" #: data/menu.ui:90 data/menu.ui:351 msgid "Rotate _Left" msgstr "So_la Döndür" #: pdfarranger/pageutils.py:364 pdfarranger/splitter.py:60 msgid "Rows" msgstr "Satırlar" #: data/menu.ui:194 data/menu.ui:337 msgid "Same Page _Format" msgstr "Aynı Sayfa _Biçimi" #: data/pdfarranger.ui:78 msgid "Save" msgstr "Kaydet" #: data/pdfarranger.ui:97 msgid "Save As" msgstr "Farklı Kaydet" #: pdfarranger/pdfarranger.py:1088 msgid "Save As…" msgstr "Farklı Kaydet…" #: data/menu.ui:47 msgid "Save _As…" msgstr "_Farklı Kaydet…" #: pdfarranger/pdfarranger.py:988 msgid "Save changes before closing?" msgstr "Kapatmadan önce değişiklikler kaydedilsin mi?" #: pdfarranger/pdfarranger.py:1025 msgid "Save changes before quitting?" msgstr "Çıkmadan önce değişiklikler kaydedilsin mi?" #: pdfarranger/pdfarranger.py:985 msgid "Save changes to “{}” before closing?" msgstr "Kapatmadan önce değişiklikler “{}” dosyasına kaydedilsin mi?" #: pdfarranger/pdfarranger.py:1022 msgid "Save changes to “{}” before quitting?" msgstr "Çıkmadan önce değişiklikler “{}” dosyasına kaydedilsin mi?" #: pdfarranger/pdfarranger.py:1249 msgid "Saving produced some warnings" msgstr "Kaydetme bazı uyarılar üretti" #: pdfarranger/pdfarranger.py:1288 msgid "Saving…" msgstr "Kaydediliyor…" #: pdfarranger/pageutils.py:116 msgid "Scale factor" msgstr "Ölçek çarpanı" #: data/menu.ui:169 data/menu.ui:312 msgid "Select _All" msgstr "_Tümünü Seç" #: data/menu.ui:184 data/menu.ui:327 msgid "Select _Even Pages" msgstr "_Çift Sayfaları Seç" #: data/menu.ui:179 data/menu.ui:322 msgid "Select _Odd Pages" msgstr "_Tek Sayfaları Seç" #: pdfarranger/pdfarranger.py:2580 msgid "Selected pages: " msgstr "Seçili sayfalar: " #: pdfarranger/splitter.py:26 msgid "Split Pages" msgstr "Sayfaları Böl" #: pdfarranger/metadata.py:43 msgid "Subject" msgstr "Konu" #: pdfarranger/pdfarranger.py:512 msgid "Supported image files" msgstr "Desteklenen resim dosyaları" #: pdfarranger/config.py:248 pdfarranger/config.py:256 msgid "System setting" msgstr "Sistem ayarı" #: pdfarranger/core.py:275 msgid "" "The document “{}” is locked and requires a password before it can be opened." msgstr "“{}” belgesi kilitli ve açılmadan önce parola gerekiyor." #: pdfarranger/core.py:274 msgid "The password will be remembered until you close PDF Arranger." msgstr "Parola, siz PDF Arrangerʼi kapatana dek anımsanacak." #: pdfarranger/config.py:230 msgid "Theme" msgstr "Tema" #: pdfarranger/metadata.py:42 msgid "Title" msgstr "Başlık" #: pdfarranger/pageutils.py:149 msgid "Top" msgstr "Üst" #: pdfarranger/pageutils.py:379 msgid "Top to Bottom" msgstr "" #: pdfarranger/pageutils.py:436 msgid "Underlay" msgstr "" #: pdfarranger/core.py:361 pdfarranger/pdfarranger.py:1494 msgid "Unknown file format" msgstr "Bilinmeyen dosya biçimi" #: pdfarranger/metadata.py:212 msgid "Value" msgstr "Değer" #: pdfarranger/pageutils.py:376 msgid "Vertical" msgstr "" #: pdfarranger/splitter.py:61 msgid "Vertical Splits" msgstr "Dikey Bölmeler" #: pdfarranger/pageutils.py:478 msgid "Vertical offset" msgstr "" #: pdfarranger/exporter.py:187 msgid "Warning" msgstr "Uyarı" #: pdfarranger/pageutils.py:235 pdfarranger/pageutils.py:239 #: pdfarranger/pageutils.py:327 msgid "Width" msgstr "Genişlik" #: pdfarranger/splitter.py:88 msgid "Width in %" msgstr "% olarak genişlik" #: pdfarranger/pdfarranger.py:969 msgid "Your changes will be lost if you don’t save them." msgstr "Kaydetmezseniz değişiklikleriniz yitecektir." #: data/pdfarranger.ui:144 msgid "Zoom In" msgstr "Yakınlaştır" #: data/pdfarranger.ui:167 msgid "Zoom Out" msgstr "Uzaklaştır" #: data/menu.ui:217 msgid "Zoom _Fit" msgstr "Yakınlaştırmayı _Sığdır" #: data/menu.ui:209 msgid "Zoom _In" msgstr "_Yakınlaştır" #: data/menu.ui:213 msgid "Zoom _Out" msgstr "_Uzaklaştır" #: data/menu.ui:240 msgid "_About" msgstr "_Hakkında" #: pdfarranger/config.py:216 pdfarranger/pageutils.py:219 #: pdfarranger/pdfarranger.py:961 pdfarranger/pdfarranger.py:970 #: pdfarranger/pdfarranger.py:1094 pdfarranger/pdfarranger.py:1144 msgid "_Cancel" msgstr "_İptal" #: pdfarranger/pdfarranger.py:980 data/menu.ui:246 msgid "_Close" msgstr "_Kapat" #: data/menu.ui:132 data/menu.ui:268 msgid "_Copy" msgstr "K_opyala" #: data/menu.ui:108 data/menu.ui:260 msgid "_Delete" msgstr "_Sil" #: data/menu.ui:174 data/menu.ui:317 msgid "_Deselect All" msgstr "_Hiçbirini Seçme" #: data/menu.ui:87 msgid "_Edit" msgstr "_Düzenle" #: data/menu.ui:30 msgid "_Import" msgstr "İç_e Aktar" #: data/menu.ui:199 data/menu.ui:342 msgid "_Invert Selection" msgstr "Seçimi _Evir" #: data/menu.ui:124 data/menu.ui:381 msgid "_Merge Pages…" msgstr "" #: data/menu.ui:36 msgid "_New Window" msgstr "_Yeni Pencere" #: pdfarranger/config.py:217 pdfarranger/pageutils.py:220 msgid "_OK" msgstr "_Tamam" #: pdfarranger/pdfarranger.py:1143 data/menu.ui:24 msgid "_Open" msgstr "_Aç" #: data/menu.ui:100 data/menu.ui:361 msgid "_Page Format…" msgstr "_Sayfa Biçimi…" #: data/menu.ui:71 msgid "_Print…" msgstr "_Yazdır…" #: pdfarranger/pdfarranger.py:1017 data/menu.ui:252 msgid "_Quit" msgstr "_Çık" #: data/menu.ui:82 msgid "_Redo" msgstr "_Yinele" #: data/menu.ui:95 data/menu.ui:356 msgid "_Rotate Right" msgstr "Sağa Döndü_r" #: pdfarranger/pdfarranger.py:970 pdfarranger/pdfarranger.py:1093 #: data/menu.ui:42 msgid "_Save" msgstr "_Kaydet" #: data/menu.ui:166 data/menu.ui:309 msgid "_Select" msgstr "_Seç" #: data/menu.ui:120 data/menu.ui:377 msgid "_Split Pages…" msgstr "Sayfaları _Böl…" #: data/menu.ui:78 msgid "_Undo" msgstr "_Geri Al" #: data/menu.ui:206 msgid "_View" msgstr "_Görünüm" #: pdfarranger/pageutils.py:139 pdfarranger/pageutils.py:362 #: pdfarranger/pageutils.py:412 msgid "mm" msgstr "mm" #: pdfarranger/core.py:89 msgid "page" msgstr "sayfa" #: pdfarranger/pdfarranger.py:811 msgid "untitled" msgstr "başlıksız" pdfarranger-1.10.1/po/uk.po000066400000000000000000000507121451252235000154660ustar00rootroot00000000000000# Ukraininan translation for pdfarranger. # Copyright (C) 2023 THE pdfarranger COPYRIGHT HOLDER # This file is distributed under the same license as the pdfarranger package. # volkov , 2023. # msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-04-29 22:45+0200\n" "PO-Revision-Date: 2023-05-23 12:35+0300\n" "Last-Translator: volkov \n" "Language-Team: \n" "Language: uk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<12 || n%100>14) ? 1 : 2);\n" "X-Generator: Poedit 3.1.1\n" #: pdfarranger/splitter.py:87 msgid "#Col" msgstr "#Стовпця" #: pdfarranger/splitter.py:87 msgid "#Row" msgstr "#Рядку" #: pdfarranger/pageutils.py:122 pdfarranger/pageutils.py:477 #: pdfarranger/pageutils.py:479 msgid "%" msgstr "%" #: pdfarranger/pageutils.py:170 msgid "% of height" msgstr "% від висоти" #: pdfarranger/pageutils.py:170 msgid "% of width" msgstr "% від ширини" #: pdfarranger/pdfarranger.py:2548 #, python-format msgid "%s is a tool for rearranging and modifying PDF files." msgstr "%s це інструмент для перестановки і редагування PDF файлів." #: pdfarranger/config.py:232 msgid "(Libhandy missing)" msgstr "(Бібліотека Libhandy відсутня)" #: pdfarranger/config.py:224 msgid "(Requires restart)" msgstr "(Потрібно перезавантажити додаток)" #: pdfarranger/pageutils.py:461 msgid "(same offset is applied to all pages)" msgstr "(однаковий зсув було застосовано до усіх сторінок)" #: pdfarranger/pdfarranger.py:1130 #, python-format msgid "A file named \"%s\" already exists. Do you want to replace it?" msgstr "Файл з ім'ям \"%s\" вже існує. Бажаєте перезаписати його?" #: data/menu.ui:189 data/menu.ui:332 msgid "All From _Same File" msgstr "Все із _одного файлу" #: pdfarranger/pdfarranger.py:507 msgid "All files" msgstr "Усі файли" #: pdfarranger/pdfarranger.py:462 msgid "All pages must have the same size." msgstr "Усі сторінки мають бути однакового розміру." #: pdfarranger/pdfarranger.py:495 msgid "All supported files" msgstr "Усі підтримані файлі" #: pdfarranger/pageutils.py:149 msgid "Bottom" msgstr "Знизу" #: pdfarranger/pageutils.py:380 msgid "Bottom to Top" msgstr "Знизу вгору" #: pdfarranger/core.py:386 msgid "Clipboard image" msgstr "Зображення із буферу обміну" #: pdfarranger/pageutils.py:363 pdfarranger/splitter.py:60 msgid "Columns" msgstr "Стовпців" #: pdfarranger/metadata.py:48 msgid "Created" msgstr "Створено" #: pdfarranger/metadata.py:46 msgid "Creator" msgstr "Автор" #: pdfarranger/metadata.py:47 msgid "Creator tool" msgstr "Інструмент створення" #: pdfarranger/pageutils.py:153 msgid "Crop Margins" msgstr "Обрізати межи" #: data/menu.ui:104 data/menu.ui:365 msgid "Crop White Borders" msgstr "Обрізати білі межи" #: pdfarranger/pageutils.py:161 msgid "" "Cropping does not remove any content from the PDF file, it only hides it." msgstr "Обрізання не видаляє нічого із вмісту PDF файлу, воно лише ховає." #: data/menu.ui:128 data/menu.ui:264 msgid "Cu_t" msgstr "Ви_різати" #: pdfarranger/pdfarranger.py:1250 msgid "Despite the warnings the document(s) should have no visible issues." msgstr "" "Не зважаючи на повідомлення, документ(и) не будуть мати помітних проблем." #: pdfarranger/pdfarranger.py:979 msgid "Discard changes and close?" msgstr "Відкинути зміни та зачинити?" #: pdfarranger/pdfarranger.py:1016 msgid "Discard changes and quit?" msgstr "Відкинути зміни та закрити додаток?" #: pdfarranger/exporter.py:194 msgid "Do not show this dialog again." msgstr "Не показувати це діалогове вікно знову." #: pdfarranger/pdfarranger.py:970 msgid "Do_n’t Save" msgstr "_Не зберігати" #: pdfarranger/pdfarranger.py:1257 msgid "Don't show warnings when saving again." msgstr "Не показувати це повідомлення при збереженні знову." #: data/menu.ui:112 data/menu.ui:369 msgid "Dupl_icate" msgstr "_Дублювати" #: data/menu.ui:52 data/menu.ui:395 msgid "E_xport" msgstr "_Експортувати" #: data/menu.ui:55 data/menu.ui:398 msgid "E_xport Selection to a Single File…" msgstr "Експортувати обране в _один файл…" #: data/menu.ui:228 msgid "Edit _Properties" msgstr "Редагувати влас_тивості" #: pdfarranger/metadata.py:198 msgid "Edit properties" msgstr "Редагувати властивості" #: pdfarranger/splitter.py:62 msgid "Equal column width" msgstr "Рівна ширина столбців" #: pdfarranger/splitter.py:62 msgid "Equal row height" msgstr "Рівна висота рядків" #: data/menu.ui:60 data/menu.ui:403 msgid "Export Selection to _Individual Files…" msgstr "Експортувати обране в _індивідуальні файли…" #: data/menu.ui:65 data/menu.ui:408 msgid "Export _All Pages to Individual Files…" msgstr "Експортувати _усі сторінки на індивідуальні файли…" #: pdfarranger/pdfarranger.py:1088 msgid "Export…" msgstr "Експортувати…" #: pdfarranger/core.py:388 pdfarranger/pdfarranger.py:1504 msgid "File is neither pdf nor image" msgstr "Файл не є pdf або зображенням" #: pdfarranger/pdfarranger.py:301 msgid "File(s) to open" msgstr "Файл(и) для відкриття" #: pdfarranger/config.py:237 msgid "For more options see:" msgstr "Додаткові параметри дивіться:" #: pdfarranger/exporter.py:192 msgid "Forms and outlines are lost on saving." msgstr "При збереженні форми та контури втрачаються." #: data/menu.ui:221 msgid "Full_screen" msgstr "Повний _екран" #: pdfarranger/pdfarranger.py:2562 msgid "GNU General Public License (GPL) Version 3." msgstr "GNU General Public License (GPL) Version 3." #: data/menu.ui:160 data/menu.ui:389 msgid "Generate Booklet" msgstr "Створити буклет" #: pdfarranger/pageutils.py:236 pdfarranger/pageutils.py:240 #: pdfarranger/pageutils.py:328 msgid "Height" msgstr "Висота" #: pdfarranger/splitter.py:88 msgid "Height in %" msgstr "Висота у процентах %" #: pdfarranger/pageutils.py:375 msgid "Horizontal" msgstr "Горизонтально" #: pdfarranger/splitter.py:61 msgid "Horizontal Splits" msgstr "Горизонтальні поділки" #: pdfarranger/pageutils.py:476 msgid "Horizontal offset" msgstr "Горизонтальний зсув" #: pdfarranger/core.py:377 msgid "Image files are only supported with img2pdf" msgstr "Файли зображень які підтримуються img2pdf" #: pdfarranger/core.py:383 msgid "Image format is not supported by img2pdf" msgstr "Формат зображення не підтримується img2pdf" #: data/pdfarranger.ui:58 msgid "Import" msgstr "Імпортувати" #: pdfarranger/pdfarranger.py:1327 msgid "Import…" msgstr "Імпортувати…" #: data/menu.ui:156 data/menu.ui:385 msgid "Insert Blan_k Page…" msgstr "Вставити _порожню сторінку…" #: pdfarranger/pageutils.py:325 msgid "Insert Blank Page" msgstr "Вставити порожню сторінку" #: pdfarranger/metadata.py:169 msgid "Invalid date format. Input discarded." msgstr "Не правильний формат даних. Вхідні дані відхилено." #: pdfarranger/pdfarranger.py:2551 #, python-format msgid "It uses libqpdf %s, pikepdf %s, GTK %s and Python %s." msgstr "Цей додаток використовує libqpdf %s, pikepdf %s, GTK %s і Python %s." #: pdfarranger/metadata.py:44 msgid "Keywords" msgstr "Ключові слова" #: pdfarranger/config.py:222 msgid "Language" msgstr "Мова" #: pdfarranger/pageutils.py:460 msgid "Layout for the first page in selection" msgstr "Макет для першої сторінки серед обраних" #: pdfarranger/pageutils.py:149 msgid "Left" msgstr "Зліва" #: pdfarranger/pageutils.py:377 msgid "Left to Right" msgstr "Зліва направо" #: data/pdfarranger.ui:122 msgid "Main Menu" msgstr "Головне меню" #: pdfarranger/pdfarranger.py:2557 msgid "Maintainers and contributors" msgstr "Розробники та спільнота" #: pdfarranger/pageutils.py:361 msgid "Margin" msgstr "Поле" #: pdfarranger/pageutils.py:347 msgid "Merge Pages" msgstr "Об'єднання сторінок" #: pdfarranger/pageutils.py:412 msgid "Merged page size:" msgstr "Розмір об'єднаної сторінки:" #: pdfarranger/metadata.py:49 msgid "Modified" msgstr "Змінено" #: pdfarranger/pageutils.py:392 msgid "Non-uniform page size - using max size" msgstr "Не однаковий розмір сторінки - використовується максімальний розмір" #: data/pdfarranger.ui:37 msgid "Open" msgstr "Відкрити" #: pdfarranger/pdfarranger.py:1186 msgid "Open…" msgstr "Відкрити…" #: pdfarranger/pageutils.py:436 msgid "Overlay" msgstr "Накладка" #: pdfarranger/pdfarranger.py:282 msgid "" "PDF Arranger is a small python-gtk application, which helps the user to " "merge or split pdf documents and rotate, crop and rearrange their pages " "using an interactive and intuitive graphical interface. It is a frontend for " "pikepdf." msgstr "" "PDF Arranger це маленький python-gtk додаток, який допоможе користувачу " "зливати разом або розділяти pdf документи і перегортати, обрізати і " "переставляти місцями сторінки за допомогою інтерактивного і інтуітивного " "графічного інтерфейсу. Це графічна оболонка для pikepdf." #: pdfarranger/pdfarranger.py:1498 msgid "PDF document is damaged" msgstr "Цей PDF документ пошкоджений" #: pdfarranger/pdfarranger.py:499 msgid "PDF files" msgstr "PDF файли" #: pdfarranger/pageutils.py:388 msgid "Page Order" msgstr "Порядок сторінок" #: pdfarranger/pageutils.py:241 msgid "Page Size" msgstr "Розмір сторінки" #: pdfarranger/pdfarranger.py:2585 msgid "Page Size:" msgstr "Розмір сторінки:" #: pdfarranger/pageutils.py:230 msgid "Page format" msgstr "Формат сторінки" #: pdfarranger/core.py:285 msgid "Password" msgstr "Пароль" #: pdfarranger/core.py:263 msgid "Password required" msgstr "Потрібен пароль" #: data/menu.ui:277 msgid "Past_e Special" msgstr "_Особлива вставка" #: data/menu.ui:295 msgid "Paste As O_verlay…" msgstr "Вставити як _накладку…" #: data/menu.ui:151 data/menu.ui:290 msgid "Paste As _Even Pages" msgstr "Вставити як _парні сторінки" #: data/menu.ui:146 data/menu.ui:285 msgid "Paste As _Odd Pages" msgstr "Вставити як _непарні сторінки" #: data/menu.ui:300 msgid "Paste As _Underlay…" msgstr "Вставити як підкладку…" #: data/menu.ui:136 data/menu.ui:272 msgid "Paste _After" msgstr "Вставити піс_ля" #: data/menu.ui:141 data/menu.ui:280 msgid "Paste _Before" msgstr "Вставити _до" #: pdfarranger/pdfarranger.py:1627 msgid "Pasted data not valid. Aborting paste." msgstr "Дані для вставки є не дійсними. Скасування вставки." #: pdfarranger/pdfarranger.py:1589 msgid "Pikepdf >= 3 is needed for overlay/underlay/merge support." msgstr "" "Потрібен Pikepdf версії 3 або вище для підтримки накладок/підкладок/злиття." #: data/menu.ui:234 msgid "Pre_ferences" msgstr "_Налаштування" #: pdfarranger/config.py:212 msgid "Preferences" msgstr "Налаштування" #: pdfarranger/pdfarranger.py:293 msgid "Print the version of PDF Arranger and exit" msgstr "Вивести версію PDF Arranger та вийти" #: pdfarranger/exporter.py:457 msgid "Printing…" msgstr "Друк…" #: pdfarranger/metadata.py:45 msgid "Producer" msgstr "Програма" #: pdfarranger/metadata.py:212 msgid "Property" msgstr "Властивість" #: data/menu.ui:116 data/menu.ui:373 msgid "Re_verse Order" msgstr "_Зворотний порядок" #: pdfarranger/pageutils.py:238 msgid "Relative" msgstr "Відносний" #: pdfarranger/exporter.py:469 msgid "Rendering Preview…" msgstr "Обробка попереднього перегляду…" #: pdfarranger/pdfarranger.py:732 msgid "Rendering…" msgstr "Обробка…" #: pdfarranger/pdfarranger.py:1132 msgid "Replace" msgstr "Замінити" #: pdfarranger/pageutils.py:149 msgid "Right" msgstr "Справа" #: pdfarranger/pageutils.py:378 msgid "Right to Left" msgstr "Справа наліво" #: data/pdfarranger.ui:203 msgid "Rotate Left" msgstr "Перегорнути вліво" #: data/pdfarranger.ui:227 msgid "Rotate Right" msgstr "Перегорнути вправо" #: data/menu.ui:90 data/menu.ui:351 msgid "Rotate _Left" msgstr "Перегорнути в_ліво" #: pdfarranger/pageutils.py:364 pdfarranger/splitter.py:60 msgid "Rows" msgstr "Рядки" #: data/menu.ui:194 data/menu.ui:337 msgid "Same Page _Format" msgstr "Сторінки такого ж _формату" #: data/pdfarranger.ui:78 msgid "Save" msgstr "Зберегти" #: data/pdfarranger.ui:97 msgid "Save As" msgstr "Зберегти як" #: pdfarranger/pdfarranger.py:1088 msgid "Save As…" msgstr "Зберегти як…" #: data/menu.ui:47 msgid "Save _As…" msgstr "Зберегти _як…" #: pdfarranger/pdfarranger.py:988 msgid "Save changes before closing?" msgstr "Зберегти зміни перед тим як закрити?" #: pdfarranger/pdfarranger.py:1025 msgid "Save changes before quitting?" msgstr "Зберегти зміни перед тим як вийти із програми?" #: pdfarranger/pdfarranger.py:985 msgid "Save changes to “{}” before closing?" msgstr "Зберегти зміну у “{}” перед тим як закрити?" #: pdfarranger/pdfarranger.py:1022 msgid "Save changes to “{}” before quitting?" msgstr "Зберегти зміни у “{}” перед тим як вийти із програми?" #: pdfarranger/pdfarranger.py:1249 msgid "Saving produced some warnings" msgstr "Збереження було завершено з деякими попередженнями" #: pdfarranger/pdfarranger.py:1288 msgid "Saving…" msgstr "Збереження…" #: pdfarranger/pageutils.py:116 msgid "Scale factor" msgstr "Масштаб" #: data/menu.ui:169 data/menu.ui:312 msgid "Select _All" msgstr "Обрати _усі" #: data/menu.ui:184 data/menu.ui:327 msgid "Select _Even Pages" msgstr "Обрати _парні сторінки" #: data/menu.ui:179 data/menu.ui:322 msgid "Select _Odd Pages" msgstr "Обрати _непарні сторінки" #: pdfarranger/pdfarranger.py:2580 msgid "Selected pages: " msgstr "Обрані сторінки: " #: pdfarranger/splitter.py:26 msgid "Split Pages" msgstr "Розділити сторінки" #: pdfarranger/metadata.py:43 msgid "Subject" msgstr "Тема" #: pdfarranger/pdfarranger.py:512 msgid "Supported image files" msgstr "Підтримувані файли зображень" #: pdfarranger/config.py:248 pdfarranger/config.py:256 msgid "System setting" msgstr "Системні налаштування" #: pdfarranger/core.py:275 msgid "" "The document “{}” is locked and requires a password before it can be opened." msgstr "" "Документ “{}” заблокований і потребує пароль, перед тим як він зможе буде " "відкритим." #: pdfarranger/core.py:274 msgid "The password will be remembered until you close PDF Arranger." msgstr "Пароль буде запам'ятовано доки ви не зачините PDF Arranger." #: pdfarranger/config.py:230 msgid "Theme" msgstr "Тема" #: pdfarranger/metadata.py:42 msgid "Title" msgstr "Назва" #: pdfarranger/pageutils.py:149 msgid "Top" msgstr "Зверху" #: pdfarranger/pageutils.py:379 msgid "Top to Bottom" msgstr "Зверху вниз" #: pdfarranger/pageutils.py:436 msgid "Underlay" msgstr "Підкладка" #: pdfarranger/core.py:361 pdfarranger/pdfarranger.py:1494 msgid "Unknown file format" msgstr "Невідомий формат файлу" #: pdfarranger/metadata.py:212 msgid "Value" msgstr "Значення" #: pdfarranger/pageutils.py:376 msgid "Vertical" msgstr "Вертикальний" #: pdfarranger/splitter.py:61 msgid "Vertical Splits" msgstr "Вертикальні поділки" #: pdfarranger/pageutils.py:478 msgid "Vertical offset" msgstr "Вертикальний зсув" #: pdfarranger/exporter.py:187 msgid "Warning" msgstr "Увага" #: pdfarranger/pageutils.py:235 pdfarranger/pageutils.py:239 #: pdfarranger/pageutils.py:327 msgid "Width" msgstr "Ширина" #: pdfarranger/splitter.py:88 msgid "Width in %" msgstr "Ширина у %" #: pdfarranger/pdfarranger.py:969 msgid "Your changes will be lost if you don’t save them." msgstr "Ваші зміни будуть втрачені, якщо ви не збережете їх." #: data/pdfarranger.ui:144 msgid "Zoom In" msgstr "Збільшити" #: data/pdfarranger.ui:167 msgid "Zoom Out" msgstr "Зменшити" #: data/menu.ui:217 msgid "Zoom _Fit" msgstr "Сторінка _повністю" #: data/menu.ui:209 msgid "Zoom _In" msgstr "З_більшити" #: data/menu.ui:213 msgid "Zoom _Out" msgstr "З_меншити" #: data/menu.ui:240 msgid "_About" msgstr "Про програ_му" #: pdfarranger/config.py:216 pdfarranger/pageutils.py:219 #: pdfarranger/pdfarranger.py:961 pdfarranger/pdfarranger.py:970 #: pdfarranger/pdfarranger.py:1094 pdfarranger/pdfarranger.py:1144 msgid "_Cancel" msgstr "_Скасувати" #: pdfarranger/pdfarranger.py:980 data/menu.ui:246 msgid "_Close" msgstr "За_крити" #: data/menu.ui:132 data/menu.ui:268 msgid "_Copy" msgstr "_Скопіювати" #: data/menu.ui:108 data/menu.ui:260 msgid "_Delete" msgstr "_Видалити" #: data/menu.ui:174 data/menu.ui:317 msgid "_Deselect All" msgstr "_Скасувати увесь вибір" #: data/menu.ui:87 msgid "_Edit" msgstr "_Редагувати" #: data/menu.ui:30 msgid "_Import" msgstr "_Імпортувати" #: data/menu.ui:199 data/menu.ui:342 msgid "_Invert Selection" msgstr "_Інвертувати обране" #: data/menu.ui:124 data/menu.ui:381 msgid "_Merge Pages…" msgstr "_Об'єднати сторінки…" #: data/menu.ui:36 msgid "_New Window" msgstr "_Нове вікно" #: pdfarranger/config.py:217 pdfarranger/pageutils.py:220 msgid "_OK" msgstr "_Добре" #: pdfarranger/pdfarranger.py:1143 data/menu.ui:24 msgid "_Open" msgstr "_Відкрити" #: data/menu.ui:100 data/menu.ui:361 msgid "_Page Format…" msgstr "_Формат сторінки…" #: data/menu.ui:71 msgid "_Print…" msgstr "_Друк…" #: pdfarranger/pdfarranger.py:1017 data/menu.ui:252 msgid "_Quit" msgstr "Ви_йти" #: data/menu.ui:82 msgid "_Redo" msgstr "_Повторити дію" #: data/menu.ui:95 data/menu.ui:356 msgid "_Rotate Right" msgstr "Гортати в_право" #: pdfarranger/pdfarranger.py:970 pdfarranger/pdfarranger.py:1093 #: data/menu.ui:42 msgid "_Save" msgstr "_Зберегти" #: data/menu.ui:166 data/menu.ui:309 msgid "_Select" msgstr "_Обрати" #: data/menu.ui:120 data/menu.ui:377 msgid "_Split Pages…" msgstr "_Розділити сторінки…" #: data/menu.ui:78 msgid "_Undo" msgstr "_Скасувати дію" #: data/menu.ui:206 msgid "_View" msgstr "Перегля_д" #: pdfarranger/pageutils.py:139 pdfarranger/pageutils.py:362 #: pdfarranger/pageutils.py:412 msgid "mm" msgstr "мм" #: pdfarranger/core.py:89 msgid "page" msgstr "сторінка" #: pdfarranger/pdfarranger.py:811 msgid "untitled" msgstr "без назви" pdfarranger-1.10.1/po/updatepo.sh000077500000000000000000000020461451252235000166640ustar00rootroot00000000000000#!/bin/sh # # pdfarranger - GTK+ based utility for splitting, rearrangement and # modification of PDF documents. # Copyright (C) 2008-2017 Konstantinos Poulios # # pdfarranger 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, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # # Update translation files cd "$(dirname "$0")/.." for po in po/*.po do msgmerge --backup none -U "$po" po/pdfarranger.pot msgattrib --no-obsolete --clear-fuzzy --empty -o "$po" "$po" done pdfarranger-1.10.1/po/zh_CN.po000066400000000000000000000403561451252235000160530ustar00rootroot00000000000000# PDF-Shuffler translation files. # Copyright (C) 2008-2017 Konstantinos Poulios # This file is part of PDF-Shuffler which is released under the GNU General # Public License version 3 or later. # See file COPYING or go to for full license details. # Translators: # Dean Lee , 2011,2014 msgid "" msgstr "" "Project-Id-Version: PDF-Shuffler 0.7\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-04-29 22:45+0200\n" "PO-Revision-Date: 2014-11-05 07:31+0000\n" "Last-Translator: Dean Lee \n" "Language-Team: Chinese (China) (http://www.transifex.com/projects/p/" "pdfshuffler/language/zh_CN/)\n" "Language: zh_CN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0\n" #: pdfarranger/splitter.py:87 msgid "#Col" msgstr "#Col" #: pdfarranger/splitter.py:87 msgid "#Row" msgstr "#Row" #: pdfarranger/pageutils.py:122 pdfarranger/pageutils.py:477 #: pdfarranger/pageutils.py:479 msgid "%" msgstr "%" #: pdfarranger/pageutils.py:170 #, python-format msgid "% of height" msgstr "% 高度" #: pdfarranger/pageutils.py:170 #, python-format msgid "% of width" msgstr "% 宽度" #: pdfarranger/pdfarranger.py:2548 #, python-format msgid "%s is a tool for rearranging and modifying PDF files." msgstr "%s 是用于重新排列和修改 PDF 文件的工具。" #: pdfarranger/config.py:232 msgid "(Libhandy missing)" msgstr "" #: pdfarranger/config.py:224 msgid "(Requires restart)" msgstr "" #: pdfarranger/pageutils.py:461 msgid "(same offset is applied to all pages)" msgstr "" #: pdfarranger/pdfarranger.py:1130 #, python-format msgid "A file named \"%s\" already exists. Do you want to replace it?" msgstr "" #: data/menu.ui:189 data/menu.ui:332 msgid "All From _Same File" msgstr "所有来自同一文件(_S)" #: pdfarranger/pdfarranger.py:507 msgid "All files" msgstr "所有文件" #: pdfarranger/pdfarranger.py:462 msgid "All pages must have the same size." msgstr "所有页面必须具有相同的大小。" #: pdfarranger/pdfarranger.py:495 msgid "All supported files" msgstr "所有支持的文件" #: pdfarranger/pageutils.py:149 msgid "Bottom" msgstr "底部" #: pdfarranger/pageutils.py:380 msgid "Bottom to Top" msgstr "" #: pdfarranger/core.py:386 msgid "Clipboard image" msgstr "剪贴板图像" #: pdfarranger/pageutils.py:363 pdfarranger/splitter.py:60 msgid "Columns" msgstr "列" #: pdfarranger/metadata.py:48 msgid "Created" msgstr "已创建" #: pdfarranger/metadata.py:46 msgid "Creator" msgstr "创建者" #: pdfarranger/metadata.py:47 msgid "Creator tool" msgstr "创建者工具" #: pdfarranger/pageutils.py:153 msgid "Crop Margins" msgstr "裁剪边距" #: data/menu.ui:104 data/menu.ui:365 msgid "Crop White Borders" msgstr "裁剪白色边框" #: pdfarranger/pageutils.py:161 msgid "" "Cropping does not remove any content from the PDF file, it only hides it." msgstr "裁剪不会从 PDF 文件中删除任何内容,只会将其隐藏。" #: data/menu.ui:128 data/menu.ui:264 msgid "Cu_t" msgstr "剪切(_T)" #: pdfarranger/pdfarranger.py:1250 msgid "Despite the warnings the document(s) should have no visible issues." msgstr "尽管有警告,但文档应该没有明显的问题。" #: pdfarranger/pdfarranger.py:979 msgid "Discard changes and close?" msgstr "放弃更改并关闭?" #: pdfarranger/pdfarranger.py:1016 msgid "Discard changes and quit?" msgstr "放弃更改并退出?" #: pdfarranger/exporter.py:194 msgid "Do not show this dialog again." msgstr "不要再显示此对话框。" #: pdfarranger/pdfarranger.py:970 msgid "Do_n’t Save" msgstr "不保存(_N)" #: pdfarranger/pdfarranger.py:1257 msgid "Don't show warnings when saving again." msgstr "再次保存时不显示警告。" #: data/menu.ui:112 data/menu.ui:369 msgid "Dupl_icate" msgstr "重复(_I)" #: data/menu.ui:52 data/menu.ui:395 msgid "E_xport" msgstr "导出(_X)" #: data/menu.ui:55 data/menu.ui:398 msgid "E_xport Selection to a Single File…" msgstr "导出所选到单个文件(_X)..." #: data/menu.ui:228 msgid "Edit _Properties" msgstr "编辑属性(_P)" #: pdfarranger/metadata.py:198 msgid "Edit properties" msgstr "编辑属性" #: pdfarranger/splitter.py:62 msgid "Equal column width" msgstr "列宽相等" #: pdfarranger/splitter.py:62 msgid "Equal row height" msgstr "行高相等" #: data/menu.ui:60 data/menu.ui:403 msgid "Export Selection to _Individual Files…" msgstr "导出所选到个体文件(_I)..." #: data/menu.ui:65 data/menu.ui:408 msgid "Export _All Pages to Individual Files…" msgstr "所有页面导出到单个文件(_A)..." #: pdfarranger/pdfarranger.py:1088 msgid "Export…" msgstr "导出..." #: pdfarranger/core.py:388 pdfarranger/pdfarranger.py:1504 msgid "File is neither pdf nor image" msgstr "文件既不是 PDF 也不是图像" #: pdfarranger/pdfarranger.py:301 msgid "File(s) to open" msgstr "要打开的文件" #: pdfarranger/config.py:237 msgid "For more options see:" msgstr "" #: pdfarranger/exporter.py:192 msgid "Forms and outlines are lost on saving." msgstr "保存时会丢失表格和轮廓。" #: data/menu.ui:221 msgid "Full_screen" msgstr "全屏幕(_C)" #: pdfarranger/pdfarranger.py:2562 msgid "GNU General Public License (GPL) Version 3." msgstr "GNU 通用公共许可证 (GPL) 第 3 版。" #: data/menu.ui:160 data/menu.ui:389 msgid "Generate Booklet" msgstr "生成手册" #: pdfarranger/pageutils.py:236 pdfarranger/pageutils.py:240 #: pdfarranger/pageutils.py:328 msgid "Height" msgstr "高度" #: pdfarranger/splitter.py:88 msgid "Height in %" msgstr "高度 %" #: pdfarranger/pageutils.py:375 msgid "Horizontal" msgstr "" #: pdfarranger/splitter.py:61 msgid "Horizontal Splits" msgstr "水平拆分" #: pdfarranger/pageutils.py:476 msgid "Horizontal offset" msgstr "" #: pdfarranger/core.py:377 msgid "Image files are only supported with img2pdf" msgstr "图像文件仅支持 img2pdf" #: pdfarranger/core.py:383 msgid "Image format is not supported by img2pdf" msgstr "img2pdf 不支持图片格式" #: data/pdfarranger.ui:58 msgid "Import" msgstr "导入" #: pdfarranger/pdfarranger.py:1327 msgid "Import…" msgstr "导入..." #: data/menu.ui:156 data/menu.ui:385 msgid "Insert Blan_k Page…" msgstr "插入空白页面(_K)…" #: pdfarranger/pageutils.py:325 msgid "Insert Blank Page" msgstr "插入空白页面" #: pdfarranger/metadata.py:169 msgid "Invalid date format. Input discarded." msgstr "日期格式无效。 输入已放弃。" #: pdfarranger/pdfarranger.py:2551 #, python-format msgid "It uses libqpdf %s, pikepdf %s, GTK %s and Python %s." msgstr "它使用 libqpdf %s、pikepdf %s、GTK %s 和 Python %s。" #: pdfarranger/metadata.py:44 msgid "Keywords" msgstr "关键词" #: pdfarranger/config.py:222 msgid "Language" msgstr "" #: pdfarranger/pageutils.py:460 msgid "Layout for the first page in selection" msgstr "" #: pdfarranger/pageutils.py:149 msgid "Left" msgstr "左边" #: pdfarranger/pageutils.py:377 msgid "Left to Right" msgstr "" #: data/pdfarranger.ui:122 msgid "Main Menu" msgstr "主菜单" #: pdfarranger/pdfarranger.py:2557 msgid "Maintainers and contributors" msgstr "维护者和贡献者" #: pdfarranger/pageutils.py:361 msgid "Margin" msgstr "" #: pdfarranger/pageutils.py:347 msgid "Merge Pages" msgstr "" #: pdfarranger/pageutils.py:412 msgid "Merged page size:" msgstr "" #: pdfarranger/metadata.py:49 msgid "Modified" msgstr "已修改" #: pdfarranger/pageutils.py:392 msgid "Non-uniform page size - using max size" msgstr "" #: data/pdfarranger.ui:37 msgid "Open" msgstr "打开" #: pdfarranger/pdfarranger.py:1186 msgid "Open…" msgstr "打开..." #: pdfarranger/pageutils.py:436 msgid "Overlay" msgstr "" #: pdfarranger/pdfarranger.py:282 msgid "" "PDF Arranger is a small python-gtk application, which helps the user to " "merge or split pdf documents and rotate, crop and rearrange their pages " "using an interactive and intuitive graphical interface. It is a frontend for " "pikepdf." msgstr "" "PDF Arranger 是一个小型的 python-gtk 应用程序,它可以帮助用户使用交互式和直观" "的图形界面来合并或拆分 pdf 文档以及旋转、裁剪和重新排列他们的页面。 它是 " "pikepdf 的前端。" #: pdfarranger/pdfarranger.py:1498 msgid "PDF document is damaged" msgstr "PDF 文件已损坏" #: pdfarranger/pdfarranger.py:499 msgid "PDF files" msgstr "PDF 文件" #: pdfarranger/pageutils.py:388 msgid "Page Order" msgstr "" #: pdfarranger/pageutils.py:241 msgid "Page Size" msgstr "页面大小" #: pdfarranger/pdfarranger.py:2585 msgid "Page Size:" msgstr "页面大小" #: pdfarranger/pageutils.py:230 msgid "Page format" msgstr "页面格式" #: pdfarranger/core.py:285 msgid "Password" msgstr "密码" #: pdfarranger/core.py:263 msgid "Password required" msgstr "需要密码" #: data/menu.ui:277 msgid "Past_e Special" msgstr "特殊粘贴(_E)" #: data/menu.ui:295 msgid "Paste As O_verlay…" msgstr "" #: data/menu.ui:151 data/menu.ui:290 msgid "Paste As _Even Pages" msgstr "粘贴为偶数页(_F)" #: data/menu.ui:146 data/menu.ui:285 msgid "Paste As _Odd Pages" msgstr "粘贴为奇数页(_O)" #: data/menu.ui:300 msgid "Paste As _Underlay…" msgstr "" #: data/menu.ui:136 data/menu.ui:272 msgid "Paste _After" msgstr "粘贴之后(_A)" #: data/menu.ui:141 data/menu.ui:280 msgid "Paste _Before" msgstr "粘贴之前(_B)" #: pdfarranger/pdfarranger.py:1627 msgid "Pasted data not valid. Aborting paste." msgstr "粘贴的数据无效。 中止粘贴。" #: pdfarranger/pdfarranger.py:1589 msgid "Pikepdf >= 3 is needed for overlay/underlay/merge support." msgstr "" #: data/menu.ui:234 msgid "Pre_ferences" msgstr "" #: pdfarranger/config.py:212 msgid "Preferences" msgstr "" #: pdfarranger/pdfarranger.py:293 msgid "Print the version of PDF Arranger and exit" msgstr "打印 PDF Arranger 版本并退出" #: pdfarranger/exporter.py:457 msgid "Printing…" msgstr "正在打印..." #: pdfarranger/metadata.py:45 msgid "Producer" msgstr "制作者" #: pdfarranger/metadata.py:212 msgid "Property" msgstr "属性" #: data/menu.ui:116 data/menu.ui:373 msgid "Re_verse Order" msgstr "相反顺序(_V)" #: pdfarranger/pageutils.py:238 msgid "Relative" msgstr "相对" #: pdfarranger/exporter.py:469 msgid "Rendering Preview…" msgstr "渲染预览…" #: pdfarranger/pdfarranger.py:732 msgid "Rendering…" msgstr "正在渲染..." #: pdfarranger/pdfarranger.py:1132 msgid "Replace" msgstr "" #: pdfarranger/pageutils.py:149 msgid "Right" msgstr "右边" #: pdfarranger/pageutils.py:378 msgid "Right to Left" msgstr "" #: data/pdfarranger.ui:203 msgid "Rotate Left" msgstr "向左旋转" #: data/pdfarranger.ui:227 msgid "Rotate Right" msgstr "向右旋转" #: data/menu.ui:90 data/menu.ui:351 msgid "Rotate _Left" msgstr "向左旋转(_L)" #: pdfarranger/pageutils.py:364 pdfarranger/splitter.py:60 msgid "Rows" msgstr "行" #: data/menu.ui:194 data/menu.ui:337 msgid "Same Page _Format" msgstr "相同页面格式(_F)" #: data/pdfarranger.ui:78 msgid "Save" msgstr "保存" #: data/pdfarranger.ui:97 msgid "Save As" msgstr "另存为" #: pdfarranger/pdfarranger.py:1088 msgid "Save As…" msgstr "保存为" #: data/menu.ui:47 msgid "Save _As…" msgstr "另存为(_A)..." #: pdfarranger/pdfarranger.py:988 msgid "Save changes before closing?" msgstr "关闭前保存更改?" #: pdfarranger/pdfarranger.py:1025 msgid "Save changes before quitting?" msgstr "退出前保存更改?" #: pdfarranger/pdfarranger.py:985 msgid "Save changes to “{}” before closing?" msgstr "在关闭之前保存对“{}”的更改?" #: pdfarranger/pdfarranger.py:1022 msgid "Save changes to “{}” before quitting?" msgstr "退出前保存对“{}”的更改?" #: pdfarranger/pdfarranger.py:1249 msgid "Saving produced some warnings" msgstr "保存会产生一些警告" #: pdfarranger/pdfarranger.py:1288 msgid "Saving…" msgstr "正在保存..." #: pdfarranger/pageutils.py:116 msgid "Scale factor" msgstr "比例因子" #: data/menu.ui:169 data/menu.ui:312 msgid "Select _All" msgstr "全选(_A)" #: data/menu.ui:184 data/menu.ui:327 msgid "Select _Even Pages" msgstr "选择偶数页面(_E)" #: data/menu.ui:179 data/menu.ui:322 msgid "Select _Odd Pages" msgstr "选择奇数页面(_O)" #: pdfarranger/pdfarranger.py:2580 msgid "Selected pages: " msgstr "所选页面:" #: pdfarranger/splitter.py:26 msgid "Split Pages" msgstr "拆分页面" #: pdfarranger/metadata.py:43 msgid "Subject" msgstr "主题" #: pdfarranger/pdfarranger.py:512 msgid "Supported image files" msgstr "支持的图像文件" #: pdfarranger/config.py:248 pdfarranger/config.py:256 msgid "System setting" msgstr "" #: pdfarranger/core.py:275 msgid "" "The document “{}” is locked and requires a password before it can be opened." msgstr "文档“{}”被锁定,需要密码才能打开。" #: pdfarranger/core.py:274 msgid "The password will be remembered until you close PDF Arranger." msgstr "密码将被记住,直到您关闭 PDF Arranger。" #: pdfarranger/config.py:230 msgid "Theme" msgstr "" #: pdfarranger/metadata.py:42 msgid "Title" msgstr "标题" #: pdfarranger/pageutils.py:149 msgid "Top" msgstr "顶部" #: pdfarranger/pageutils.py:379 msgid "Top to Bottom" msgstr "" #: pdfarranger/pageutils.py:436 msgid "Underlay" msgstr "" #: pdfarranger/core.py:361 pdfarranger/pdfarranger.py:1494 msgid "Unknown file format" msgstr "未知文件格式" #: pdfarranger/metadata.py:212 msgid "Value" msgstr "值" #: pdfarranger/pageutils.py:376 msgid "Vertical" msgstr "" #: pdfarranger/splitter.py:61 msgid "Vertical Splits" msgstr "垂直拆分" #: pdfarranger/pageutils.py:478 msgid "Vertical offset" msgstr "" #: pdfarranger/exporter.py:187 msgid "Warning" msgstr "警告" #: pdfarranger/pageutils.py:235 pdfarranger/pageutils.py:239 #: pdfarranger/pageutils.py:327 msgid "Width" msgstr "宽度" #: pdfarranger/splitter.py:88 msgid "Width in %" msgstr "宽度 %" #: pdfarranger/pdfarranger.py:969 msgid "Your changes will be lost if you don’t save them." msgstr "如果您不保存,您的更改将会丢失。" #: data/pdfarranger.ui:144 msgid "Zoom In" msgstr "放大" #: data/pdfarranger.ui:167 msgid "Zoom Out" msgstr "缩小" #: data/menu.ui:217 msgid "Zoom _Fit" msgstr "缩放适合(_F)" #: data/menu.ui:209 msgid "Zoom _In" msgstr "放大(_I)" #: data/menu.ui:213 msgid "Zoom _Out" msgstr "缩小(_O)" #: data/menu.ui:240 msgid "_About" msgstr "关于(_A)" #: pdfarranger/config.py:216 pdfarranger/pageutils.py:219 #: pdfarranger/pdfarranger.py:961 pdfarranger/pdfarranger.py:970 #: pdfarranger/pdfarranger.py:1094 pdfarranger/pdfarranger.py:1144 msgid "_Cancel" msgstr "取消(_C)" #: pdfarranger/pdfarranger.py:980 data/menu.ui:246 msgid "_Close" msgstr "关闭(_C)" #: data/menu.ui:132 data/menu.ui:268 msgid "_Copy" msgstr "复制(_C)" #: data/menu.ui:108 data/menu.ui:260 msgid "_Delete" msgstr "删除(_D)" #: data/menu.ui:174 data/menu.ui:317 msgid "_Deselect All" msgstr "取消全选(_D)" #: data/menu.ui:87 msgid "_Edit" msgstr "编辑(_E)" #: data/menu.ui:30 msgid "_Import" msgstr "导入(_I)" #: data/menu.ui:199 data/menu.ui:342 msgid "_Invert Selection" msgstr "反向选择(_I)" #: data/menu.ui:124 data/menu.ui:381 msgid "_Merge Pages…" msgstr "" #: data/menu.ui:36 msgid "_New Window" msgstr "新建窗口(_N)" #: pdfarranger/config.py:217 pdfarranger/pageutils.py:220 msgid "_OK" msgstr "" #: pdfarranger/pdfarranger.py:1143 data/menu.ui:24 msgid "_Open" msgstr "打开(_O)" #: data/menu.ui:100 data/menu.ui:361 msgid "_Page Format…" msgstr "页面格式(_P)…" #: data/menu.ui:71 msgid "_Print…" msgstr "打印(_P)" #: pdfarranger/pdfarranger.py:1017 data/menu.ui:252 msgid "_Quit" msgstr "退出(_Q)" #: data/menu.ui:82 msgid "_Redo" msgstr "重做(_R)" #: data/menu.ui:95 data/menu.ui:356 msgid "_Rotate Right" msgstr "向右旋转(_R)" #: pdfarranger/pdfarranger.py:970 pdfarranger/pdfarranger.py:1093 #: data/menu.ui:42 msgid "_Save" msgstr "保存(_S)" #: data/menu.ui:166 data/menu.ui:309 msgid "_Select" msgstr "选择(_S)" #: data/menu.ui:120 data/menu.ui:377 msgid "_Split Pages…" msgstr "拆分页面(_S)…" #: data/menu.ui:78 msgid "_Undo" msgstr "撤销(_U)" #: data/menu.ui:206 msgid "_View" msgstr "查看(_V)" #: pdfarranger/pageutils.py:139 pdfarranger/pageutils.py:362 #: pdfarranger/pageutils.py:412 msgid "mm" msgstr "mm" #: pdfarranger/core.py:89 msgid "page" msgstr "页面" #: pdfarranger/pdfarranger.py:811 msgid "untitled" msgstr "未命名" pdfarranger-1.10.1/po/zh_TW.po000066400000000000000000000332011451252235000160740ustar00rootroot00000000000000# PDF-Shuffler translation files. # Copyright (C) 2008-2017 Konstantinos Poulios # This file is part of PDF-Shuffler which is released under the GNU General # Public License version 3 or later. # See file COPYING or go to for full license details. # Translators: msgid "" msgstr "" "Project-Id-Version: PDF-Shuffler 0.7\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-04-29 22:45+0200\n" "PO-Revision-Date: 2013-11-12 08:38+0800\n" "Last-Translator: Franklin Weng \n" "Language-Team: Chinese Traditional \n" "Language: zh_TW\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: pdfarranger/splitter.py:87 msgid "#Col" msgstr "" #: pdfarranger/splitter.py:87 msgid "#Row" msgstr "" #: pdfarranger/pageutils.py:122 pdfarranger/pageutils.py:477 #: pdfarranger/pageutils.py:479 msgid "%" msgstr "" #: pdfarranger/pageutils.py:170 #, python-format msgid "% of height" msgstr "" #: pdfarranger/pageutils.py:170 #, python-format msgid "% of width" msgstr "" #: pdfarranger/pdfarranger.py:2548 #, python-format msgid "%s is a tool for rearranging and modifying PDF files." msgstr "" #: pdfarranger/config.py:232 msgid "(Libhandy missing)" msgstr "" #: pdfarranger/config.py:224 msgid "(Requires restart)" msgstr "" #: pdfarranger/pageutils.py:461 msgid "(same offset is applied to all pages)" msgstr "" #: pdfarranger/pdfarranger.py:1130 #, python-format msgid "A file named \"%s\" already exists. Do you want to replace it?" msgstr "" #: data/menu.ui:189 data/menu.ui:332 msgid "All From _Same File" msgstr "" #: pdfarranger/pdfarranger.py:507 msgid "All files" msgstr "所有檔案" #: pdfarranger/pdfarranger.py:462 msgid "All pages must have the same size." msgstr "" #: pdfarranger/pdfarranger.py:495 msgid "All supported files" msgstr "" #: pdfarranger/pageutils.py:149 msgid "Bottom" msgstr "底部" #: pdfarranger/pageutils.py:380 msgid "Bottom to Top" msgstr "" #: pdfarranger/core.py:386 msgid "Clipboard image" msgstr "" #: pdfarranger/pageutils.py:363 pdfarranger/splitter.py:60 msgid "Columns" msgstr "" #: pdfarranger/metadata.py:48 msgid "Created" msgstr "" #: pdfarranger/metadata.py:46 msgid "Creator" msgstr "" #: pdfarranger/metadata.py:47 msgid "Creator tool" msgstr "" #: pdfarranger/pageutils.py:153 msgid "Crop Margins" msgstr "裁剪邊緣" #: data/menu.ui:104 data/menu.ui:365 msgid "Crop White Borders" msgstr "" #: pdfarranger/pageutils.py:161 msgid "" "Cropping does not remove any content from the PDF file, it only hides it." msgstr "" #: data/menu.ui:128 data/menu.ui:264 msgid "Cu_t" msgstr "" #: pdfarranger/pdfarranger.py:1250 msgid "Despite the warnings the document(s) should have no visible issues." msgstr "" #: pdfarranger/pdfarranger.py:979 msgid "Discard changes and close?" msgstr "" #: pdfarranger/pdfarranger.py:1016 msgid "Discard changes and quit?" msgstr "" #: pdfarranger/exporter.py:194 msgid "Do not show this dialog again." msgstr "" #: pdfarranger/pdfarranger.py:970 msgid "Do_n’t Save" msgstr "" #: pdfarranger/pdfarranger.py:1257 msgid "Don't show warnings when saving again." msgstr "" #: data/menu.ui:112 data/menu.ui:369 msgid "Dupl_icate" msgstr "" #: data/menu.ui:52 data/menu.ui:395 msgid "E_xport" msgstr "" #: data/menu.ui:55 data/menu.ui:398 msgid "E_xport Selection to a Single File…" msgstr "" #: data/menu.ui:228 msgid "Edit _Properties" msgstr "" #: pdfarranger/metadata.py:198 msgid "Edit properties" msgstr "" #: pdfarranger/splitter.py:62 msgid "Equal column width" msgstr "" #: pdfarranger/splitter.py:62 msgid "Equal row height" msgstr "" #: data/menu.ui:60 data/menu.ui:403 msgid "Export Selection to _Individual Files…" msgstr "" #: data/menu.ui:65 data/menu.ui:408 msgid "Export _All Pages to Individual Files…" msgstr "" #: pdfarranger/pdfarranger.py:1088 msgid "Export…" msgstr "匯出…" #: pdfarranger/core.py:388 pdfarranger/pdfarranger.py:1504 msgid "File is neither pdf nor image" msgstr "" #: pdfarranger/pdfarranger.py:301 msgid "File(s) to open" msgstr "" #: pdfarranger/config.py:237 msgid "For more options see:" msgstr "" #: pdfarranger/exporter.py:192 msgid "Forms and outlines are lost on saving." msgstr "" #: data/menu.ui:221 msgid "Full_screen" msgstr "" #: pdfarranger/pdfarranger.py:2562 msgid "GNU General Public License (GPL) Version 3." msgstr "" #: data/menu.ui:160 data/menu.ui:389 msgid "Generate Booklet" msgstr "" #: pdfarranger/pageutils.py:236 pdfarranger/pageutils.py:240 #: pdfarranger/pageutils.py:328 msgid "Height" msgstr "" #: pdfarranger/splitter.py:88 msgid "Height in %" msgstr "" #: pdfarranger/pageutils.py:375 msgid "Horizontal" msgstr "" #: pdfarranger/splitter.py:61 msgid "Horizontal Splits" msgstr "" #: pdfarranger/pageutils.py:476 msgid "Horizontal offset" msgstr "" #: pdfarranger/core.py:377 msgid "Image files are only supported with img2pdf" msgstr "" #: pdfarranger/core.py:383 msgid "Image format is not supported by img2pdf" msgstr "" #: data/pdfarranger.ui:58 msgid "Import" msgstr "" #: pdfarranger/pdfarranger.py:1327 msgid "Import…" msgstr "匯入…" #: data/menu.ui:156 data/menu.ui:385 msgid "Insert Blan_k Page…" msgstr "" #: pdfarranger/pageutils.py:325 msgid "Insert Blank Page" msgstr "" #: pdfarranger/metadata.py:169 msgid "Invalid date format. Input discarded." msgstr "" #: pdfarranger/pdfarranger.py:2551 #, python-format msgid "It uses libqpdf %s, pikepdf %s, GTK %s and Python %s." msgstr "" #: pdfarranger/metadata.py:44 msgid "Keywords" msgstr "" #: pdfarranger/config.py:222 msgid "Language" msgstr "" #: pdfarranger/pageutils.py:460 msgid "Layout for the first page in selection" msgstr "" #: pdfarranger/pageutils.py:149 msgid "Left" msgstr "左側" #: pdfarranger/pageutils.py:377 msgid "Left to Right" msgstr "" #: data/pdfarranger.ui:122 msgid "Main Menu" msgstr "" #: pdfarranger/pdfarranger.py:2557 msgid "Maintainers and contributors" msgstr "" #: pdfarranger/pageutils.py:361 msgid "Margin" msgstr "" #: pdfarranger/pageutils.py:347 msgid "Merge Pages" msgstr "" #: pdfarranger/pageutils.py:412 msgid "Merged page size:" msgstr "" #: pdfarranger/metadata.py:49 msgid "Modified" msgstr "" #: pdfarranger/pageutils.py:392 msgid "Non-uniform page size - using max size" msgstr "" #: data/pdfarranger.ui:37 msgid "Open" msgstr "" #: pdfarranger/pdfarranger.py:1186 msgid "Open…" msgstr "" #: pdfarranger/pageutils.py:436 msgid "Overlay" msgstr "" #: pdfarranger/pdfarranger.py:282 msgid "" "PDF Arranger is a small python-gtk application, which helps the user to " "merge or split pdf documents and rotate, crop and rearrange their pages " "using an interactive and intuitive graphical interface. It is a frontend for " "pikepdf." msgstr "" #: pdfarranger/pdfarranger.py:1498 msgid "PDF document is damaged" msgstr "" #: pdfarranger/pdfarranger.py:499 msgid "PDF files" msgstr "PDF 檔案" #: pdfarranger/pageutils.py:388 msgid "Page Order" msgstr "" #: pdfarranger/pageutils.py:241 msgid "Page Size" msgstr "" #: pdfarranger/pdfarranger.py:2585 msgid "Page Size:" msgstr "" #: pdfarranger/pageutils.py:230 msgid "Page format" msgstr "" #: pdfarranger/core.py:285 msgid "Password" msgstr "" #: pdfarranger/core.py:263 msgid "Password required" msgstr "" #: data/menu.ui:277 msgid "Past_e Special" msgstr "" #: data/menu.ui:295 msgid "Paste As O_verlay…" msgstr "" #: data/menu.ui:151 data/menu.ui:290 msgid "Paste As _Even Pages" msgstr "" #: data/menu.ui:146 data/menu.ui:285 msgid "Paste As _Odd Pages" msgstr "" #: data/menu.ui:300 msgid "Paste As _Underlay…" msgstr "" #: data/menu.ui:136 data/menu.ui:272 msgid "Paste _After" msgstr "" #: data/menu.ui:141 data/menu.ui:280 msgid "Paste _Before" msgstr "" #: pdfarranger/pdfarranger.py:1627 msgid "Pasted data not valid. Aborting paste." msgstr "" #: pdfarranger/pdfarranger.py:1589 msgid "Pikepdf >= 3 is needed for overlay/underlay/merge support." msgstr "" #: data/menu.ui:234 msgid "Pre_ferences" msgstr "" #: pdfarranger/config.py:212 msgid "Preferences" msgstr "" #: pdfarranger/pdfarranger.py:293 msgid "Print the version of PDF Arranger and exit" msgstr "" #: pdfarranger/exporter.py:457 msgid "Printing…" msgstr "" #: pdfarranger/metadata.py:45 msgid "Producer" msgstr "" #: pdfarranger/metadata.py:212 msgid "Property" msgstr "" #: data/menu.ui:116 data/menu.ui:373 msgid "Re_verse Order" msgstr "" #: pdfarranger/pageutils.py:238 msgid "Relative" msgstr "" #: pdfarranger/exporter.py:469 msgid "Rendering Preview…" msgstr "" #: pdfarranger/pdfarranger.py:732 msgid "Rendering…" msgstr "" #: pdfarranger/pdfarranger.py:1132 msgid "Replace" msgstr "" #: pdfarranger/pageutils.py:149 msgid "Right" msgstr "右側" #: pdfarranger/pageutils.py:378 msgid "Right to Left" msgstr "" #: data/pdfarranger.ui:203 msgid "Rotate Left" msgstr "" #: data/pdfarranger.ui:227 msgid "Rotate Right" msgstr "" #: data/menu.ui:90 data/menu.ui:351 msgid "Rotate _Left" msgstr "向左旋轉(_L)" #: pdfarranger/pageutils.py:364 pdfarranger/splitter.py:60 msgid "Rows" msgstr "" #: data/menu.ui:194 data/menu.ui:337 msgid "Same Page _Format" msgstr "" #: data/pdfarranger.ui:78 msgid "Save" msgstr "儲存" #: data/pdfarranger.ui:97 msgid "Save As" msgstr "" #: pdfarranger/pdfarranger.py:1088 msgid "Save As…" msgstr "" #: data/menu.ui:47 msgid "Save _As…" msgstr "" #: pdfarranger/pdfarranger.py:988 msgid "Save changes before closing?" msgstr "" #: pdfarranger/pdfarranger.py:1025 msgid "Save changes before quitting?" msgstr "" #: pdfarranger/pdfarranger.py:985 msgid "Save changes to “{}” before closing?" msgstr "" #: pdfarranger/pdfarranger.py:1022 msgid "Save changes to “{}” before quitting?" msgstr "" #: pdfarranger/pdfarranger.py:1249 msgid "Saving produced some warnings" msgstr "" #: pdfarranger/pdfarranger.py:1288 msgid "Saving…" msgstr "" #: pdfarranger/pageutils.py:116 msgid "Scale factor" msgstr "" #: data/menu.ui:169 data/menu.ui:312 msgid "Select _All" msgstr "" #: data/menu.ui:184 data/menu.ui:327 msgid "Select _Even Pages" msgstr "" #: data/menu.ui:179 data/menu.ui:322 msgid "Select _Odd Pages" msgstr "" #: pdfarranger/pdfarranger.py:2580 msgid "Selected pages: " msgstr "" #: pdfarranger/splitter.py:26 msgid "Split Pages" msgstr "" #: pdfarranger/metadata.py:43 msgid "Subject" msgstr "" #: pdfarranger/pdfarranger.py:512 msgid "Supported image files" msgstr "" #: pdfarranger/config.py:248 pdfarranger/config.py:256 msgid "System setting" msgstr "" #: pdfarranger/core.py:275 msgid "" "The document “{}” is locked and requires a password before it can be opened." msgstr "" #: pdfarranger/core.py:274 msgid "The password will be remembered until you close PDF Arranger." msgstr "" #: pdfarranger/config.py:230 msgid "Theme" msgstr "" #: pdfarranger/metadata.py:42 msgid "Title" msgstr "" #: pdfarranger/pageutils.py:149 msgid "Top" msgstr "頂部" #: pdfarranger/pageutils.py:379 msgid "Top to Bottom" msgstr "" #: pdfarranger/pageutils.py:436 msgid "Underlay" msgstr "" #: pdfarranger/core.py:361 pdfarranger/pdfarranger.py:1494 msgid "Unknown file format" msgstr "" #: pdfarranger/metadata.py:212 msgid "Value" msgstr "" #: pdfarranger/pageutils.py:376 msgid "Vertical" msgstr "" #: pdfarranger/splitter.py:61 msgid "Vertical Splits" msgstr "" #: pdfarranger/pageutils.py:478 msgid "Vertical offset" msgstr "" #: pdfarranger/exporter.py:187 msgid "Warning" msgstr "" #: pdfarranger/pageutils.py:235 pdfarranger/pageutils.py:239 #: pdfarranger/pageutils.py:327 msgid "Width" msgstr "" #: pdfarranger/splitter.py:88 msgid "Width in %" msgstr "" #: pdfarranger/pdfarranger.py:969 msgid "Your changes will be lost if you don’t save them." msgstr "" #: data/pdfarranger.ui:144 msgid "Zoom In" msgstr "" #: data/pdfarranger.ui:167 msgid "Zoom Out" msgstr "" #: data/menu.ui:217 msgid "Zoom _Fit" msgstr "" #: data/menu.ui:209 msgid "Zoom _In" msgstr "" #: data/menu.ui:213 msgid "Zoom _Out" msgstr "" #: data/menu.ui:240 msgid "_About" msgstr "" #: pdfarranger/config.py:216 pdfarranger/pageutils.py:219 #: pdfarranger/pdfarranger.py:961 pdfarranger/pdfarranger.py:970 #: pdfarranger/pdfarranger.py:1094 pdfarranger/pdfarranger.py:1144 msgid "_Cancel" msgstr "" #: pdfarranger/pdfarranger.py:980 data/menu.ui:246 msgid "_Close" msgstr "" #: data/menu.ui:132 data/menu.ui:268 msgid "_Copy" msgstr "" #: data/menu.ui:108 data/menu.ui:260 msgid "_Delete" msgstr "" #: data/menu.ui:174 data/menu.ui:317 msgid "_Deselect All" msgstr "" #: data/menu.ui:87 msgid "_Edit" msgstr "編輯(_E)" #: data/menu.ui:30 msgid "_Import" msgstr "" #: data/menu.ui:199 data/menu.ui:342 msgid "_Invert Selection" msgstr "" #: data/menu.ui:124 data/menu.ui:381 msgid "_Merge Pages…" msgstr "" #: data/menu.ui:36 msgid "_New Window" msgstr "" #: pdfarranger/config.py:217 pdfarranger/pageutils.py:220 msgid "_OK" msgstr "" #: pdfarranger/pdfarranger.py:1143 data/menu.ui:24 msgid "_Open" msgstr "" #: data/menu.ui:100 data/menu.ui:361 msgid "_Page Format…" msgstr "" #: data/menu.ui:71 msgid "_Print…" msgstr "" #: pdfarranger/pdfarranger.py:1017 data/menu.ui:252 msgid "_Quit" msgstr "" #: data/menu.ui:82 msgid "_Redo" msgstr "" #: data/menu.ui:95 data/menu.ui:356 msgid "_Rotate Right" msgstr "向右旋轉(_R)" #: pdfarranger/pdfarranger.py:970 pdfarranger/pdfarranger.py:1093 #: data/menu.ui:42 msgid "_Save" msgstr "" #: data/menu.ui:166 data/menu.ui:309 msgid "_Select" msgstr "" #: data/menu.ui:120 data/menu.ui:377 msgid "_Split Pages…" msgstr "" #: data/menu.ui:78 msgid "_Undo" msgstr "" #: data/menu.ui:206 msgid "_View" msgstr "" #: pdfarranger/pageutils.py:139 pdfarranger/pageutils.py:362 #: pdfarranger/pageutils.py:412 msgid "mm" msgstr "" #: pdfarranger/core.py:89 msgid "page" msgstr "頁面" #: pdfarranger/pdfarranger.py:811 msgid "untitled" msgstr "" pdfarranger-1.10.1/setup.py000077500000000000000000000076601451252235000156120ustar00rootroot00000000000000#!/usr/bin/env python3 # # pdfarranger - GTK+ based utility for splitting, rearrangement and # modification of PDF documents. # Copyright (C) 2008-2017 Konstantinos Poulios # # 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, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # from setuptools import Command from setuptools import setup # for the time being do not use setuptools.command because: # * setuptools is to old in many distro (ex: Ubuntu 22.04) # * The Fedora package relies on wheel so it would not contains translation and # icons from distutils.command.build import build from os.path import join import glob import os import subprocess data_files = [ ('share/applications', ['data/com.github.jeromerobert.pdfarranger.desktop']), ('share/pdfarranger', ['data/pdfarranger.ui', 'data/menu.ui']), ('share/man/man1', ['doc/pdfarranger.1']), ('share/metainfo', ['data/com.github.jeromerobert.pdfarranger.metainfo.xml']), ] def _dir_to_data_files(src_dir, target_dir): data_files = [] for root, _, files in os.walk(src_dir): tgt = join(target_dir, os.path.relpath(root, src_dir)) if files: data_files.append((tgt, [join(root, f) for f in files])) return data_files def _data_files(command): """Return the data_files of a command""" data_files = command.distribution.data_files if data_files is None: data_files = [] command.distribution.data_files = data_files return data_files class build_i18n(Command): description = "Build gettext .mo files" def initialize_options(self): self.build_base = None def finalize_options(self): self.set_undefined_options("build", ("build_base", "build_base")) def run(self): mo_dir = join(self.build_base, "mo") for filename in glob.glob(join("po", "*.po")): lang = os.path.basename(filename)[:-3] lang_dir = join(self.build_base, "mo", lang, "LC_MESSAGES") os.makedirs(lang_dir, exist_ok=True) subprocess.check_call( ["msgfmt", filename, "-o", join(lang_dir, "pdfarranger.mo")] ) data_files = _data_files(self) data_files += _dir_to_data_files(mo_dir, join("share", "locale")) class build_icons(Command): description = "Ensure icons get installed" def initialize_options(self): pass def finalize_options(self): pass def run(self): src_icons = join("data", "icons") tgt_icons = join("share", "icons") data_files = _data_files(self) data_files += _dir_to_data_files(src_icons, tgt_icons) build.sub_commands += [(x, lambda _: True) for x in ["build_i18n", "build_icons"]] setup( name='pdfarranger', version='1.10.1', author='Jerome Robert', author_email='jeromerobert@gmx.com', description='A simple application for PDF Merging, Rearranging, and Splitting', url='https://github.com/pdfarranger/pdfarranger', license='GNU GPL-3', packages=['pdfarranger'], data_files=data_files, zip_safe=False, cmdclass={ "build_i18n": build_i18n, "build_icons": build_icons, }, entry_points={ 'console_scripts': ['pdfarranger=pdfarranger.pdfarranger:main'] }, install_requires=['pikepdf>=1.17.0','python-dateutil>=2.4.0'], extras_require={ 'image': ['img2pdf>=0.3.4'], }, ) pdfarranger-1.10.1/setup_win32.py000066400000000000000000000150101451252235000166150ustar00rootroot00000000000000VERSION='1.10.1' from cx_Freeze import setup, Executable import os import sys import distutils import shutil import glob import pkg_resources include_files = [ ('data/pdfarranger.ui', 'share/pdfarranger/pdfarranger.ui'), ('data/menu.ui', 'share/pdfarranger/menu.ui'), ('data/icons/hicolor/scalable', 'share/icons/hicolor/scalable'), ('build/mo', 'share/locale'), ] def clean_build(): dirs = os.listdir('build') keep = ['mo', 'lib'] for d in dirs: if d not in keep: shutil.rmtree(os.path.join('build', d)) clean_build() def addfile(relpath, warn_missing=False): f = os.path.join(sys.prefix, relpath) if warn_missing and not os.path.isfile(f): print("{} cannot be found.".format(f), file=sys.stderr) else: include_files.append((f, relpath)) def addlocale(name): langs = os.listdir('build/mo') for path in glob.glob(os.path.join(sys.prefix, "share/locale/*/LC_MESSAGES/{}.mo".format(name))): lang = os.path.split(os.path.split(os.path.split(path)[0])[0])[1] if lang in langs: addfile(os.path.relpath(path, sys.prefix)) addlocale("gtk30") def addicons(): addfile("share/icons/hicolor/index.theme") addfile("share/icons/Adwaita/index.theme") for i in ['places/folder', 'mimetypes/text-x-generic', 'status/image-missing']: addfile(os.path.join('share/icons/Adwaita/16x16/', i + '.png')) icons = [ 'places/user-desktop', 'places/user-home', 'actions/bookmark-new', 'actions/document-open-recent', 'actions/folder-new', 'actions/list-add', 'actions/list-remove', 'actions/media-eject', 'actions/document-save', 'actions/document-save-as', 'actions/document-open', 'actions/insert-image', 'actions/object-rotate-left', 'actions/object-rotate-right', 'actions/open-menu', 'actions/zoom-in', 'actions/zoom-out', 'ui/pan-down', 'ui/pan-end', 'ui/pan-start', 'ui/pan-up', 'ui/window-close', 'ui/window-maximize', 'ui/window-minimize', 'ui/window-restore', 'devices/drive-harddisk', 'devices/drive-optical', 'places/folder-documents', 'places/folder-download', 'places/folder-music', 'places/folder-pictures', 'places/folder-videos', 'places/user-trash', ] for i in icons: addfile(os.path.join('share/icons/Adwaita/scalable/', i + '-symbolic.svg')) required_dlls = [ 'gtk-3-0', 'gdk-3-0', 'epoxy-0', 'gdk_pixbuf-2.0-0', 'pango-1.0-0', 'pangocairo-1.0-0', 'pangoft2-1.0-0', 'pangowin32-1.0-0', 'atk-1.0-0', 'poppler-glib-8', 'xml2-2', 'rsvg-2-2', 'handy-1-0', ] for dll in required_dlls: fn = 'lib' + dll + '.dll' include_files.append((os.path.join(sys.prefix, 'bin', fn), fn)) # Avoid loading wrong dll: Put the dll where it will be searched for first. # (That is the folder from where the dll load request originate) include_files.append((os.path.join(sys.prefix, 'bin', 'zlib1.dll'), os.path.join('lib', 'zlib1.dll'),)) include_files.append((os.path.join(sys.prefix, 'bin', 'libffi-8.dll'), os.path.join('lib', 'libffi-8.dll'),)) required_gi_namespaces = [ "Gtk-3.0", "Gdk-3.0", "cairo-1.0", "Pango-1.0", "GObject-2.0", "GLib-2.0", "Gio-2.0", "GdkPixbuf-2.0", "GModule-2.0", "Atk-1.0", "Poppler-0.18", "HarfBuzz-0.0", "Handy-1", "freetype2-2.0", ] for ns in required_gi_namespaces: addfile("lib/girepository-1.0/{}.typelib".format(ns)) addfile("lib/gdk-pixbuf-2.0/2.10.0/loaders/libpixbufloader-bmp.dll") addfile("lib/gdk-pixbuf-2.0/2.10.0/loaders/libpixbufloader-svg.dll") addfile("lib/gdk-pixbuf-2.0/2.10.0/loaders/libpixbufloader-png.dll") addfile("lib/gdk-pixbuf-2.0/2.10.0/loaders.cache") addfile("share/glib-2.0/schemas/gschemas.compiled") addicons() # Add support for pikepdf.__version__ distrib = pkg_resources.get_distribution('pikepdf') from_path = os.path.join(distrib.egg_info, 'INSTALLER') to_path = os.path.join('lib', os.path.basename(distrib.egg_info), 'INSTALLER') include_files.append((from_path, to_path)) # gspawn-helper is needed for website link in AboutDialog from_path = os.path.join(sys.prefix, 'bin', 'gspawn-win64-helper.exe') to_path = 'gspawn-win64-helper.exe' include_files.append((from_path, to_path)) build_options = dict( packages=['gi', 'packaging', 'pikepdf'], excludes=['tkinter', 'test'], # manually added to the lib folder bin_excludes=['zlib1.dll', 'libffi-8.dll'], include_files=include_files, ) def get_target_name(suffix): return 'pdfarranger-{}-windows-{}'.format(VERSION, suffix) msi_options = dict( target_name=get_target_name('installer.msi'), upgrade_code='{ab1752a6-575c-42e1-a261-b85cb8a6b524}' ) class bdist_zip(distutils.cmd.Command): """ Minimalist command to create a Windows portable .zip distribution """ description = "create a \"zip\" distribution" user_options = [] def initialize_options(self): pass def finalize_options(self): pass def run(self): build_base = self.get_finalized_command('build').build_base build_exe = self.get_finalized_command('build_exe') fullname = self.distribution.get_fullname() build_exe.build_exe = os.path.join(build_base, fullname) build_exe.run() config_ini = os.path.join(build_exe.build_exe, 'config.ini') f = open(config_ini, 'w') f.close() dist_dir = self.get_finalized_command('bdist').dist_dir archname = os.path.join(dist_dir, get_target_name('portable')) self.make_archive(archname, 'zip', root_dir=build_base, base_dir=fullname) shutil.rmtree(build_exe.build_exe) setup(name='pdfarranger', version=VERSION, description='A simple application for PDF Merging, Rearranging, and Splitting', options=dict(build_exe=build_options, bdist_msi=msi_options), cmdclass={'bdist_zip': bdist_zip}, packages=['pdfarranger'], executables=[Executable('pdfarranger/__main__.py', base='Win32GUI' if sys.platform == 'win32' else None, targetName='pdfarranger.exe', icon='data/pdfarranger.ico', shortcutName='PDF Arranger', shortcutDir='StartMenuFolder' )]) pdfarranger-1.10.1/tests/000077500000000000000000000000001451252235000152265ustar00rootroot00000000000000pdfarranger-1.10.1/tests/1x1.jpg000066400000000000000000000005761451252235000163510ustar00rootroot00000000000000JFIFExifMM*bj(2ri2022:05:08 18:19:1202100100C       ?Tpdfarranger-1.10.1/tests/test.pdf000066400000000000000000000007361451252235000167060ustar00rootroot00000000000000%PDF-1.4 % 1 0 obj << /Pages 2 0 R /Type /Catalog >> endobj 2 0 obj << /Count 2 /Kids [ 3 0 R 4 0 R ] /Type /Pages >> endobj 3 0 obj << /Contents 5 0 R /Type /Page >> endobj 4 0 obj << /Contents 6 0 R /Type /Page >> endobj 5 0 obj << /Length 52 >> stream 1 0 0 rg 530 180 m 70 180 l 300 580 l h 530 180 m B endstream endobj 6 0 obj << /Length 52 >> stream 0 1 0 rg 530 180 m 70 180 l 300 580 l h 530 180 m B endstream endobj xref trailer << /Root 1 0 R >> startxref 0 %%EOF pdfarranger-1.10.1/tests/test.py000066400000000000000000000500451451252235000165630ustar00rootroot00000000000000import os import subprocess import sys import unittest import time import tempfile import shutil """ Those tests are using Dogtail https://gitlab.com/dogtail/dogtail Other tools using dogtail where you can get example on how to use it: * https://gitlab.gnome.org/GNOME/gnome-boxes * https://gitlab.gnome.org/GNOME/gnome-software * https://gitlab.gnome.org/GNOME/gnome-characters * https://gitlab.gnome.org/GNOME/eog * https://github.com/kirienko/gourmet * https://github.com/virt-manager/virt-manager * https://gitlab.gnome.org/GNOME/gnome-weather/ * http://threedepict.sourceforge.net/ * https://salsa.debian.org/pkg-privacy-team/onioncircuits/-/tree/master/debian/tests Example of Dogtail using a filechooser: filechooser = app.child(roleName='file chooser') treeview = filechooser.child(roleName='table', name='Files') treeview.keyCombo('L') treeview.typeText('qpdf-manual.pdf') filechooser.button('Open').click() You may need to run the following commands to run those tests in your current session instead of Xvfb: * /usr/libexec/at-spi-bus-launcher --launch-immediately * setxkbmap -v fr * gsettings set org.gnome.desktop.interface toolkit-accessibility true Tests need to be run with default window size (i.e rm ~/.config/pdfarranger/config.ini) Some tips: * Use to print widget tree (names and roles) self._app().dump() """ def group(title): if "GITHUB_ACTIONS" in os.environ: print("::group::" + title) def endgroup(): if "GITHUB_ACTIONS" in os.environ: print("::endgroup::") def check_img2pdf(version): try: import img2pdf v = [int(x) for x in img2pdf.__version__.split(".")] r = v >= version except Exception: r = False return r class XvfbManager: """Base class for running offscreen tests""" def __init__(self, display=":99"): self.display = display env = os.environ.copy() env["DISPLAY"] = display self.xvfb_proc = None self.dbus_proc = None self.xvfb_proc = subprocess.Popen(["Xvfb", self.display]) cmd = ["dbus-daemon", "--print-address=1", "--session"] self.dbus_proc = subprocess.Popen( cmd, stdout=subprocess.PIPE, text=True, env=env ) self.dbus_addr = self.dbus_proc.stdout.readline().strip() self.dbus_proc.stdout.close() os.environ["DISPLAY"] = display os.environ["DBUS_SESSION_BUS_ADDRESS"] = self.dbus_addr def kill(self): self.dbus_proc.kill() self.dbus_proc.wait() self.xvfb_proc.kill() self.xvfb_proc.wait() class DogtailManager: def __init__(self): self.xvfb = None if "DISPLAY" not in os.environ: self.xvfb = XvfbManager() os.environ["LC_MESSAGES"] = "C" os.environ["GTK_MODULES"] = "gail:atk-bridge" cmd = "gsettings set org.gnome.desktop.interface toolkit-accessibility true" subprocess.check_call(cmd.split()) # dogtail must be imported after setting DBUS_SESSION_BUS_ADDRESS from dogtail.config import config config.debugSleep = False # long duration at startup config.searchBackoffDuration = 1 config.actionDelay = 0.01 config.runInterval = 0.01 config.defaultDelay = 0.1 config.debugSearching = False config.searchCutoffCount = 30 config.runTimeout = 1 config.searchShowingOnly = True config.typingDelay = 0.05 def kill(self): if self.xvfb is not None: self.xvfb.kill() # dogtail does not support change of X11 server so it must be a singleton dogtail_manager = DogtailManager() class PdfArrangerManager: def __init__(self, args=None): self.process = None args = [] if args is None else args cmd = [sys.executable, "-u", "-X", "tracemalloc"] if "PDFARRANGER_COVERAGE" in os.environ: cmd = cmd + ["-m", "coverage", "run", "--concurrency=thread,multiprocessing", "-a"] self.process = subprocess.Popen(cmd + ["-m", "pdfarranger"] + args) def kill(self): self.process.kill() self.process.wait() class PdfArrangerTest(unittest.TestCase): LAST=False def _start(self, args=None): from dogtail.config import config config.searchBackoffDuration = 1 self.__class__.pdfarranger = PdfArrangerManager(args) # check that process is actually running self.assertIsNone(self._process().poll()) self._app() # Now let's go faster config.searchBackoffDuration = 0.1 def _app(self): # Cannot import at top level because of DBUS_SESSION_BUS_ADDRESS from dogtail.tree import root a = root.application("__main__.py") self.assertFalse(a.dead) return a def _mainmenu(self, action): mainmenu = self._app().child(roleName="toggle button", name="Menu") self._wait_cond(lambda: mainmenu.sensitive) mainmenu.click() if not isinstance(action, str): for submenu in action[:-1]: mainmenu.menu(submenu).point() action = action[-1] mainmenu.menuItem(action).click() def _wait_cond(self, cond): c = 0 while not cond(): time.sleep(0.1) self.assertLess(c, 30) c += 1 def _is_saving(self): app = self._app() from dogtail import predicate allstatusbar = app.findChildren(predicate.GenericPredicate(roleName="status bar"), showingOnly=False) statusbar = allstatusbar[0] return statusbar.name.startswith("Saving") def _wait_saving(self): # When saving the main window is made unresponsive. When saving end # it's made responsive again. We must be sure that it's responsive # before continuing test else clicks may fail. self._wait_cond(lambda: not self._is_saving()) def _status_text(self): app = self._app() from dogtail import predicate allstatusbar = app.findChildren(predicate.GenericPredicate(roleName="status bar"), showingOnly=False) # If we have multiple status bar, consider the last one as the one who display the selection statusbar = allstatusbar[-1] return statusbar.name def _assert_selected(self, selection): self.assertTrue(self._status_text().startswith("Selected pages: " + selection)) def _assert_page_size(self, width, height, pageid=None): if pageid is not None: self._icons()[pageid].click() self._wait_cond(lambda: self._status_text().startswith(f"Selected pages: {pageid+1}")) label = " {:.1f}mm \u00D7 {:.1f}mm".format(width, height) self.assertTrue(self._status_text().endswith("Page Size:" + label)) def _icons(self): """Return the list of page icons""" from dogtail import predicate viewport = self._app().child(roleName="layered pane") return viewport.findChildren(predicate.GenericPredicate(roleName="icon"), showingOnly=False) def _popupmenu(self, page, action): """Run an action on a give page using the popup menu""" self._icons()[page].click(button=3) popupmenu = self._app().child(roleName="window") if not isinstance(action, str): for submenu in action[:-1]: popupmenu.menu(submenu).point() action = action[-1] button = popupmenu.menuItem(action) self._wait_cond(lambda: button.sensitive) button.click() def _process(self): return self.__class__.pdfarranger.process def _import_file(self, filename): """Try to import a file with a file chooser and return that file chooser object""" self._mainmenu("Import") filechooser = self._app().child(roleName='file chooser') treeview = filechooser.child(roleName="table", name="Files") treeview.keyCombo("L") treeview.typeText(os.path.abspath(filename)) ob = filechooser.button("Open") self._wait_cond(lambda: ob.sensitive) ob.click() return filechooser def _save_as_chooser(self, filebasename, expected=None): """ Fill and validate a Save As file chooser. The file chooser is supposed to be already open. """ if expected is None: expected = [filebasename] filechooser = self._app().child(roleName="file chooser") tmp = self.__class__.tmp filename = os.path.join(tmp, filebasename) filechooser.child(roleName="text").text = filename saveb = filechooser.button("Save") self._wait_cond(lambda: saveb.sensitive) filechooser.button("Save").click() # Check files have been created for e in expected: self._wait_cond(lambda: os.path.isfile(os.path.join(tmp, e))) self._wait_cond(lambda: filechooser.dead) self._wait_saving() def _scale_selected(self, scale): app = self._app() app.keyCombo("C") dialog = app.child(roleName="dialog") from dogtail import rawinput rawinput.keyCombo("Tab") rawinput.typeText(str(scale)) dialog.child(name="OK").click() self._wait_cond(lambda: dialog.dead) def _quit_without_saving(self): self._app().child(roleName="layered pane").keyCombo("q") dialog = self._app().child(roleName="alert") dialog.child(name="Don’t Save").click() self._process().wait(timeout=22) @classmethod def setUpClass(cls): cls.pdfarranger = None cls.tmp = tempfile.mkdtemp() def setUp(self): group("Running " + self.id()) def tearDown(self): endgroup() @classmethod def tearDownClass(cls): if cls.pdfarranger: cls.pdfarranger.kill() if cls.tmp: shutil.rmtree(cls.tmp) if cls.LAST: dogtail_manager.kill() class TestBatch1(PdfArrangerTest): def test_01_import_img(self): self._start(["data/screenshot.png"]) def test_02_properties(self): self._mainmenu("Edit Properties") dialog = self._app().child(roleName="dialog") creatorlab = dialog.child(roleName="table cell", name="Creator") creatorid = creatorlab.parent.children.index(creatorlab) + 1 creatorval = creatorlab.parent.children[creatorid] creatorval.keyCombo("enter") from dogtail import rawinput rawinput.typeText('["Frodo", "Sam"]') dialog.child(name="OK").click() self._mainmenu("Edit Properties") dialog = self._app().child(roleName="dialog") rawinput.keyCombo("enter") rawinput.typeText('Memories') rawinput.keyCombo("enter") # FIXME: depending on where the test is ran the previous enter close # the dialog or do not close it. try: dialog.child(name="OK").click() except Exception: print("'Edit Properties dialog' closed by 'enter'.") self._wait_cond(lambda: dialog.dead) def test_03_zoom(self): app = self._app() zoomoutb = app.child(roleName="push button", description="Zoom Out") zoominb = app.child(roleName="push button", description="Zoom In") # maximum dezoom whatever the initial zoom level for _ in range(10): zoomoutb.click() for _ in range(3): zoominb.click() def test_04_rotate_undo(self): app = self._app() self._assert_selected("") app.keyCombo("a") # select all self._assert_selected("1") app.keyCombo("Left") # rotate left app.keyCombo("z") # undo app.keyCombo("y") # redo app.keyCombo("a") app.keyCombo("Right") # rotate right app.keyCombo("Right") # rotate right def test_05_duplicate(self): self._popupmenu(0, "Duplicate") app = self._app() self.assertEqual(len(self._icons()), 2) app.keyCombo("a") app.keyCombo("c") for __ in range(3): app.keyCombo("v") self.assertEqual(len(self._icons()), 8) app.keyCombo("Right") app.keyCombo("Left") app.keyCombo("Down") self._assert_selected("5") app.keyCombo("Up") self._assert_selected("2") def test_06_page_format(self): self._popupmenu(0, ["Select", "Select Odd Pages"]) self._assert_selected("1, 3, 5, 7") self._popupmenu(0, "Page Format…") dialog = self._app().child(roleName="dialog") croppanel = dialog.child(name="Crop Margins") from dogtail import predicate cropbuttons = croppanel.findChildren(predicate.GenericPredicate(roleName="spin button")) for i in range(4): cropbuttons[i].click() cropbuttons[i].text = str((i+1)*4) scalebutton = dialog.child(roleName="spin button") scalebutton.click() scalebutton.text = "120" dialog.child(name="OK").click() # TODO: find the condition which could replace this ugly sleep time.sleep(0.5) self._wait_cond(lambda: dialog.dead) def test_07_split_page(self): lp = self._app().child(roleName="layered pane") lp.grabFocus() lbefore = len(self._icons()) self._popupmenu(0, ["Select", "Select Even Pages"]) self._assert_selected("2, 4, 6, 8") self._mainmenu(["Edit", "Split Pages…"]) dialog = self._app().child(roleName="dialog") dialog.child(name="OK").click() self._wait_cond(lambda: dialog.dead) self.assertEqual(len(self._icons()), lbefore + 4) def test_08_zoom_pages(self): self._app().child(roleName="layered pane").keyCombo("Home") self._assert_selected("1") self._app().keyCombo("f") for __ in range(2): self._app().keyCombo("minus") # Zoom level is now 0 and that's what will be saved to config.ini and # used by next batches def test_09_save_as(self): self._mainmenu("Save") self._save_as_chooser("foobar.pdf") def test_10_reverse(self): self._popupmenu(0, ["Select", "Same Page Format"]) self._assert_selected("1, 4, 7, 10") self._popupmenu(0, ["Select", "All From Same File"]) self._assert_selected("1-12") self._popupmenu(0, "Reverse Order") def test_11_quit(self): self._mainmenu("Quit") dialog = self._app().child(roleName="alert") dialog.child(name="Cancel").click() self._app().keyCombo("s") self._wait_saving() self._app().keyCombo("q") # check that process actually exit self._process().wait(timeout=22) class TestBatch2(PdfArrangerTest): def test_01_open_empty(self): self._start() def test_02_import(self): filechooser = self._import_file("tests/test.pdf") self._wait_cond(lambda: filechooser.dead) self.assertEqual(len(self._icons()), 2) def test_03_cropborder(self): self._popupmenu(0, "Crop White Borders") def test_04_export(self): self._mainmenu(["Export", "Export All Pages to Individual Files…"]) self._save_as_chooser( "alltosingle.pdf", ["alltosingle.pdf", "alltosingle-002.pdf"] ) def test_05_clear(self): self._popupmenu(1, "Delete") self.assertEqual(len(self._icons()), 1) def test_06_about(self): self._mainmenu("About") dialog = self._app().child(roleName="dialog") dialog.child(name="Close").click() self._wait_cond(lambda: dialog.dead) def test_07_quit(self): self._app().child(roleName="layered pane").keyCombo("q") dialog = self._app().child(roleName="alert") dialog.child(name="Don’t Save").click() # check that process actually exit self._process().wait(timeout=22) class TestBatch3(PdfArrangerTest): """Test encryption""" def test_01_open_encrypted(self): filename = os.path.join(self.__class__.tmp, "other_encrypted.pdf") shutil.copyfile("tests/test_encrypted.pdf", filename) self._start([filename]) dialog = self._app().child(roleName="dialog") passfield = dialog.child(roleName="password text") passfield.text = "foobar" dialog.child(name="OK").click() self._wait_cond(lambda: dialog.dead) def test_02_import_wrong_pass(self): filechooser = self._import_file("tests/test_encrypted.pdf") dialog = self._app().child(roleName="dialog") passfield = dialog.child(roleName="password text") passfield.text = "wrong" dialog.child(name="OK").click() dialog = self._app().child(roleName="dialog") dialog.child(name="Cancel").click() self._wait_cond(lambda: dialog.dead) self._wait_cond(lambda: filechooser.dead) self.assertEqual(len(self._icons()), 2) def test_03_quit(self): app = self._app() app.keyCombo("z") # undo app.keyCombo("y") # redo self._app().child(roleName="layered pane").keyCombo("q") dialog = self._app().child(roleName="alert") dialog.child(name="Save").click() filechooser = self._app().child(roleName="file chooser") filechooser.button("Save").click() dialog = self._app().child(roleName="alert") dialog.child(name="Replace").click() # check that process actually exit self._process().wait(timeout=22) class TestBatch4(PdfArrangerTest): """Check the size of duplicated and scaled pages""" def test_01_import_pdf(self): self._start(["tests/test.pdf"]) def test_02_duplicate(self): app = self._app() app.keyCombo("Down") self._popupmenu(0, ["Duplicate"]) app.keyCombo("Right") def test_03_scale(self): self._scale_selected(200) self._app().keyCombo("Left") # rotate left self._assert_selected("2") self._assert_page_size(558.8, 431.8) def test_04_export(self): app = self._app() app.keyCombo("a") # select all self._mainmenu(["Export", "Export Selection to a Single File…"]) self._save_as_chooser("scaled.pdf") self._popupmenu(1, "Delete") def test_05_import(self): filename = os.path.join(self.__class__.tmp, "scaled.pdf") filechooser = self._import_file(filename) self._wait_cond(lambda: filechooser.dead) self.assertEqual(len(self._icons()), 3) app = self._app() self._app().child(roleName="layered pane").grabFocus() app.keyCombo("Right") app.keyCombo("Right") self._assert_selected("2") self._assert_page_size(558.8, 431.8) self._quit_without_saving() class TestBatch5(PdfArrangerTest): """Test booklet and blank pages""" # Kill X11 after that batch LAST = True def test_01_import_pdf(self): self._start(["tests/test.pdf"]) def test_02_blank_page(self): self._popupmenu(0, ["Select", "Select All"]) self._popupmenu(0, ["Crop White Borders"]) self._scale_selected(150) self._popupmenu(0, ["Insert Blank Page…"]) dialog = self._app().child(roleName="dialog") dialog.child(name="OK").click() self._wait_cond(lambda: len(self._icons()) == 3) def test_03_booklet(self): self._popupmenu(0, ["Select", "Select All"]) self._popupmenu(0, ["Generate Booklet"]) self._wait_cond(lambda: len(self._icons()) == 2) self._assert_page_size(489, 212.2, 0) self._assert_page_size(489, 212.2, 1) def test_04_crop_white_border(self): self._popupmenu(0, ["Select", "Select All"]) self._popupmenu(0, ["Crop White Borders"]) self._assert_page_size(244.1, 211.8, 0) self._assert_page_size(244.1, 211.8, 1) def test_05_buggy_exif(self): """Test img2pdf import with buggy EXIF rotation""" if not check_img2pdf([0,4,2]): print("Ignoring test_05_buggy_exif, img2pdf too old") return filechooser = self._import_file("tests/1x1.jpg") self._wait_cond(lambda: filechooser.dead) self.assertEqual(len(self._icons()), 3) def test_06_quit(self): self._quit_without_saving() pdfarranger-1.10.1/tests/test_encrypted.pdf000066400000000000000000000026061451252235000207610ustar00rootroot00000000000000%PDF-1.7 % 1 0 obj << /Extensions << /ADBE << /BaseVersion /1.7 /ExtensionLevel 8 >> >> /Pages 2 0 R /Type /Catalog >> endobj 2 0 obj << /Count 2 /Kids [ 3 0 R 4 0 R ] /Type /Pages >> endobj 3 0 obj << /Contents 5 0 R /Type /Page >> endobj 4 0 obj << /Contents 6 0 R /Type /Page >> endobj 5 0 obj << /Length 64 /Filter /FlateDecode >> stream 豛6XhGUo"q@W9Mƺ_ 6g:W/Vކ!5>%R܌endstream endobj 6 0 obj << /Length 64 /Filter /FlateDecode >> stream w֫CmxcX Z#>BE(Wcjs0mڲKendstream endobj 7 0 obj << /CF << /StdCF << /AuthEvent /DocOpen /CFM /AESV3 /Length 32 >> >> /Filter /Standard /Length 256 /O /OE <95b96b443d5904d8f8535c7acadf0f563888bd8adcb29f5643ceb78b55869b96> /P -4 /Perms <606cd50283a513d2eb3361835f9654c3> /R 6 /StmF /StdCF /StrF /StdCF /U <9cbd901891869871f3886351b409eedb35a116e3ac1f5cb4753be9eee48046d6e13c499f08e5e3cfc6912c870a573467> /UE <17c74e54ab1cf4eb4f4d41f1e6aa4bb4ccdabcfa32a585e3fe1d20fdaf5cb13b> /V 5 >> endobj xref 0 8 0000000000 65535 f 0000000015 00000 n 0000000130 00000 n 0000000195 00000 n 0000000244 00000 n 0000000293 00000 n 0000000427 00000 n 0000000561 00000 n trailer << /Root 1 0 R /ID [<5c10f271db390a18d2d37ba4379bb02f><5c10f271db390a18d2d37ba4379bb02f>] /Encrypt 7 0 R >> startxref 1108 %%EOF