pax_global_header00006660000000000000000000000064144075745140014525gustar00rootroot0000000000000052 comment=c196af0a45fa97ef2555f9504c61ac0b76e63147 gfeeds-2.2.0/000077500000000000000000000000001440757451400127635ustar00rootroot00000000000000gfeeds-2.2.0/.gitignore000066400000000000000000000015171440757451400147570ustar00rootroot00000000000000/build __pycache__ *.tar.* *.zip *.glade\~ *.glade\# *.o .deps /**/*.swp /*.bak /*.gcda /*.gcno /*.o /*.orig /*.rej /*.tab.c /*~ /.*.sw[nop] /.dirstamp /.gitignore /ChangeLog /GPATH /GRTAGS /GSYMS /GTAGS /ID /INSTALL /Makefile /Makefile.in /TAGS /aclocal.m4 /autom4te.cache /build-aux /config /config.cache /config.h /config.h.in /config.log /config.lt /config.status /config.status.lineno /configure /configure.lineno /gtk-doc.m4 /gtk-doc.make /intltool-extract.in /intltool-merge.in /intltool-update.in /libtool /po/*.gmo /po/*.header /po/*.mo /po/*.sed /po/*.sin /po/.intltool-merge-cache /po/Makefile /po/Makefile.in /po/Makefile.in.in /po/Makefile.in.in~ /po/Makevars.template /po/POTFILES /po/Rules-quot /po/grant.pot /po/stamp-it /so_locations /stamp-h1 /tags /builddir /buildflatpak .buildconfig /__venv */.pytest_cache .flatpak-builder/* gfeeds-2.2.0/.gitlab-ci.yml000066400000000000000000000012141440757451400154150ustar00rootroot00000000000000include: 'https://gitlab.gnome.org/GNOME/citemplates/raw/master/flatpak/flatpak_ci_initiative.yml' flake8: image: python:3.10 script: - pip install flake8 - flake8 gfeeds flatpak: variables: MANIFEST_PATH: "dist/flatpak/org.gabmus.gfeeds.json" MESON_ARGS: "-Dprofile=Devel" FLATPAK_MODULE: "gfeeds" RUNTIME_REPO: "https://flathub.org/repo/flathub.flatpakrepo" APP_ID: "org.gabmus.gfeeds" BUNDLE: "gfeeds.flatpak" image: 'quay.io/gnome_infrastructure/gnome-runtime-images:gnome-43' extends: .flatpak rules: - if: $CI_COMMIT_REF_NAME == $CI_DEFAULT_BRANCH gfeeds-2.2.0/LICENSE000066400000000000000000001045141440757451400137750ustar00rootroot00000000000000 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 . gfeeds-2.2.0/README.md000066400000000000000000000031671440757451400142510ustar00rootroot00000000000000# Feeds An RSS/Atom feed reader for GNOME. ![screenshot](https://gitlab.gnome.org/World/gfeeds/-/raw/website/static/screenshots/mainwindow.png) [![Download on Flathub](https://raw.githubusercontent.com/flatpak-design-team/flathub-mockups/master/assets/download-button/download.svg?sanitize=true)](https://flathub.org/apps/details/org.gabmus.gfeeds) ## Dependencies - python 3.9 - Gtk4 - [libadwaita](https://gitlab.gnome.org/GNOME/libadwaita) - [python-syndom](https://gitlab.com/gabmus/syndication-domination) - [python-readability-lxml](https://github.com/buriy/python-readability) - [python-pygments](https://github.com/pygments/pygments) - [python-pillow](https://github.com/python-pillow/Pillow) - [python-beautifulsoup4](https://pypi.org/project/beautifulsoup4/) - [python-humanize](https://github.com/jmoiron/humanize) - [python-requests](https://github.com/psf/requests) - [python-html5lib](https://github.com/html5lib/html5lib-python) ## Build and run from source **Note**: If you're looking to install the app for regular use, [download it from Flathub](https://flathub.org/apps/details/org.gabmus.gfeeds) or from your distribution repositories. These instructions are only for developers and package maintainers. ```bash git clone https://gitlab.gnome.org/World/gfeeds cd gfeeds mkdir build cd build meson .. -Dprefix="$PWD/build/mprefix" ninja ninja install ninja run ``` ## Hacking You might want to check your code with [flake8](https://github.com/pycqa/flake8) before opening a merge request. ```bash flake8 gfeeds ``` gfeeds-2.2.0/bin/000077500000000000000000000000001440757451400135335ustar00rootroot00000000000000gfeeds-2.2.0/bin/gfeeds.in000077500000000000000000000045311440757451400153260ustar00rootroot00000000000000#!@PYTHON@ # @projectname@ # # Copyright (C) 2019 @authorfullname@ <@authoremail@> # # 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 . import os import sys import signal import gettext import locale sys.path.insert(1, '@pythondir@') # compositing causes issues for webkit in some website with nvidia drivers # os.environ['WEBKIT_DISABLE_COMPOSITING_MODE'] = '1' # os.environ['GTK_DEBUG'] = 'interactive' VERSION = '@VERSION@' pkgdatadir = '@pkgdatadir@' localedir = '@localedir@' builddir = os.environ.get('MESON_BUILD_ROOT') if builddir: pkgdatadir = os.path.join(builddir, 'data') os.environ['GSETTINGS_SCHEMA_DIR'] = pkgdatadir sys.dont_write_bytecode = True sys.path.insert(1, os.environ['MESON_SOURCE_ROOT']) signal.signal(signal.SIGINT, signal.SIG_DFL) # Why both locale and gettext? # gettext works for the python part # but not for the glade/xml files # they need locale # don't ask me, it's effin weird # I copied this from uberwriter try: locale.bindtextdomain('gfeeds', localedir) locale.textdomain('gfeeds') except AttributeError as e: # Python built without gettext support doesn't have bindtextdomain() # and textdomain() print("Couldn't bind the gettext translation domain. Some translations" " won't work. Error: \n{}".format(e)) gettext.textdomain('gfeeds') gettext.bindtextdomain('gfeeds', localedir) if __name__ == '__main__': import gi gi.require_version('Gtk', '4.0') gi.require_version('Gdk', '4.0') gi.require_version('Adw', '1') gi.require_version('WebKit', '6.0') from gi.repository import Gio, GObject, WebKit GObject.type_ensure(WebKit.WebView) resource = Gio.Resource.load(os.path.join(pkgdatadir, '@appid@.gresource')) resource._register() from gfeeds import __main__ __main__.main() gfeeds-2.2.0/bin/meson.build000066400000000000000000000014341440757451400156770ustar00rootroot00000000000000conf = configuration_data() conf.set('VERSION', meson.project_version()) conf.set('localedir', join_paths(prefix, get_option('localedir'))) conf.set('pkgdatadir', pkgdatadir) conf.set('PYTHON', py_installation.full_path()) conf.set('pythondir', join_paths(prefix, pythondir)) conf.set('localedir', join_paths(prefix, localedir)) conf.set('projectname', meson.project_name()) conf.set('authorfullname', authorfullname) conf.set('authoremail', authoremail) conf.set('appid', '.'.join([domain, author, meson.project_name()])) configure_file( input: meson.project_name() + '.in', output: meson.project_name(), configuration: conf, install_dir: get_option('bindir') ) myprogram = join_paths(meson.project_build_root(), 'bin', meson.project_name()) run_target('run', command: [myprogram] ) gfeeds-2.2.0/build.sh000077500000000000000000000001431440757451400144170ustar00rootroot00000000000000#!/bin/bash rm -rf build mkdir build cd build meson .. meson configure -Dprefix=$PWD/build/testdirgfeeds-2.2.0/data/000077500000000000000000000000001440757451400136745ustar00rootroot00000000000000gfeeds-2.2.0/data/icons/000077500000000000000000000000001440757451400150075ustar00rootroot00000000000000gfeeds-2.2.0/data/icons/org.gabmus.gfeeds-symbolic.svg000066400000000000000000000213511440757451400226510ustar00rootroot00000000000000 image/svg+xml gfeeds-2.2.0/data/icons/org.gabmus.gfeeds.svg000066400000000000000000000101611440757451400210270ustar00rootroot00000000000000 gfeeds-2.2.0/data/icons/scalable/000077500000000000000000000000001440757451400165555ustar00rootroot00000000000000gfeeds-2.2.0/data/icons/scalable/status/000077500000000000000000000000001440757451400201005ustar00rootroot00000000000000gfeeds-2.2.0/data/icons/scalable/status/ephy-reader-mode-symbolic.svg000066400000000000000000000147431440757451400256000ustar00rootroot00000000000000 image/svg+xml Gnome Symbolic Icon Theme Gnome Symbolic Icon Theme gfeeds-2.2.0/data/icons/scalable/status/globe-alt-symbolic.svg000066400000000000000000000113411440757451400243060ustar00rootroot00000000000000 image/svg+xml Gnome Symbolic Icon Theme Gnome Symbolic Icon Theme gfeeds-2.2.0/data/icons/scalable/status/tag-symbolic.svg000066400000000000000000000004331440757451400232130ustar00rootroot00000000000000 gfeeds-2.2.0/data/icons/scalable/status/webview-filler-symbolic.svg000066400000000000000000000046661440757451400253770ustar00rootroot00000000000000 gfeeds-2.2.0/data/meson.build000066400000000000000000000103211440757451400160330ustar00rootroot00000000000000app_id = '.'.join([ domain, author, meson.project_name() ]) app_id_aspath = '/'.join([ domain, author, meson.project_name() ]) desktop_conf = configuration_data() desktop_conf.set('bindir', join_paths(prefix, bindir)) desktop_conf.set('prettyname', prettyname) # .desktop comment now hardcoded for better i18n support #desktop_conf.set('description', description) desktop_conf.set('appid', app_id) desktop_conf.set('projectname', meson.project_name()) desktop_file = configure_file( input: app_id + '.desktop.in', output: app_id + '.desktop.i18n.in', configuration: desktop_conf ) i18n.merge_file( input: desktop_file, output: app_id + '.desktop', po_dir: '../po', type: 'desktop', install: true, install_dir: join_paths(datadir, 'applications') ) dbus_conf = configuration_data() dbus_conf.set('bindir', join_paths(prefix, bindir)) dbus_conf.set('appid', app_id) dbus_conf.set('projectname', meson.project_name()) configure_file( input: app_id + '.service.in', output: app_id + '.service', configuration: dbus_conf, install_dir: join_paths(datadir, 'dbus-1/services') ) gschema_conf = configuration_data() gschema_conf.set('apppath', app_id_aspath) gschema_conf.set('appid', app_id) gschema_conf.set('projectname', meson.project_name()) gschema_configured = configure_file( input: app_id + '.gschema.xml.in', output: app_id + '.gschema.xml', configuration: gschema_conf ) # validate gschema glib_compile_schemas = find_program('glib-compile-schemas', required: true) if glib_compile_schemas.found() test( 'validate-gschema', glib_compile_schemas, args: [ '--strict', '--dry-run', meson.current_build_dir() ] ) endif install_data( gschema_configured, install_dir: join_paths(datadir, 'glib-2.0/schemas') ) icondir = join_paths(datadir, 'icons/hicolor') install_data( 'icons/'+app_id+'.svg', install_dir: join_paths(icondir, 'scalable/apps') ) install_data( 'icons/'+app_id+'-symbolic.svg', install_dir: join_paths(icondir, 'symbolic/apps') ) subdir('ui') blueprints = custom_target('blueprints', input: files( 'ui/main_leaflet.blp', 'ui/manage_feeds_headerbar.blp', 'ui/manage_feeds_listbox_row.blp', 'ui/manage_tags_content.blp', 'ui/manage_tags_listbox_row.blp', 'ui/add_feed_popover.blp', 'ui/empty_state.blp', 'ui/left_headerbar.blp', 'ui/right_headerbar.blp', 'ui/scrolled_label.blp', 'ui/shortcutsWindow.blp', 'ui/sidebar_listbox_row.blp', 'ui/webview.blp', 'ui/filter_view.blp', ), output: '.', command: [find_program('blueprint-compiler'), 'batch-compile', '@OUTPUT@', '@CURRENT_SOURCE_DIR@', '@INPUT@'] ) app_resources = gnome.compile_resources(app_id, app_id + '.gresource.xml', gresource_bundle: true, dependencies: [configure_file( input: 'ui/aboutdialog.ui.in', output: 'aboutdialog.ui', configuration: glade_conf ), blueprints], install: true, install_dir: pkgdatadir ) app_settings = gnome.compile_schemas() #appdata_conf = configuration_data() #appdata_conf.set('authorfullname', authorfullname) #appdata_conf.set('gitrepo', gitrepo) #appdata_conf.set('website', website) #appdata_conf.set('authoremail', authoremail) #appdata_conf.set('prettyname', prettyname) #appdata_conf.set('appid', app_id) #appdata_conf.set('prettylicense', prettylicense) # #configure_file( # input: appdata_file, # output: app_id + '.appdata.xml.', # configuration: appdata_conf, # install: true, # install_dir: join_paths(datadir, 'metainfo') #) # TODO figure it out, fails because Purism::form_factor is repeated, but that's correct # ascli_exe = find_program('appstreamcli', required: false) # if ascli_exe.found() # test( # 'validate metainfo file', # ascli_exe, # args: [ # 'validate', # #'--no-net', # #'--pedantic', # 'data/' + app_id + '.appdata.xml' # ] # ) # endif i18n.merge_file( input: app_id + '.appdata.xml.in', output: app_id + '.appdata.xml', po_dir: '../po', install: true, install_dir: join_paths(datadir, 'metainfo') ) gfeeds-2.2.0/data/org.gabmus.gfeeds.appdata.xml.in000066400000000000000000000462051440757451400217430ustar00rootroot00000000000000 org.gabmus.gfeeds Feeds Gabriele Musco News reader for GNOME CC0-1.0 GPL-3.0+

Feeds is a minimal RSS/Atom feed reader built with speed and simplicity in mind.

It offers a simple user interface that only shows the latest news from your subscriptions.

Articles are shown in a web view by default, with javascript disabled for a faster and less intrusive user experience. There's also a reader mode included, built from the one GNOME Web/Epiphany uses.

Feeds can be imported and exported via OPML.

org.gabmus.gfeeds.desktop https://gitlab.gnome.org/World/gfeeds/raw/website/static/screenshots/mainwindow.png https://gitlab.gnome.org/World/gfeeds/raw/website/static/screenshots/add_feed.png https://gitlab.gnome.org/World/gfeeds/raw/website/static/screenshots/import_export.png https://gitlab.gnome.org/World/gfeeds/raw/website/static/screenshots/filter.png https://gitlab.gnome.org/World/gfeeds/raw/website/static/screenshots/reader.png https://gitlab.gnome.org/World/gfeeds/raw/website/static/screenshots/rss_content.png https://gitlab.gnome.org/World/gfeeds/raw/website/static/screenshots/webview.png https://gitlab.gnome.org/World/gfeeds/raw/website/static/screenshots/preferences.png https://gitlab.gnome.org/World/gfeeds/raw/website/static/screenshots/light_dark.png https://gfeeds.gabmus.org https://gitlab.gnome.org/World/gfeeds/-/issues https://gitlab.gnome.org/World/gfeeds/-/tree/master/po https://liberapay.com/gabmus/donate gabmus@disroot.org
  • Article author in reader mode
  • Updated WebKit to API version 6.0
  • Improved configuration management
  • Refactoring around GObject property binding
  • Removed top/bottom margin in reader mode
  • Catch text decoding errors
  • Fix divide by zero issue when adding the first feed
  • Reader mode color scheme can adapt to system theme
  • Fix high CPU usage in web view
  • New message dialog
  • Can open articles in browser from right click menu
  • Added a progress bar to show loading state
  • Small UI improvements
  • Fixes for thumbnail extraction
  • Fix OPML export edge cases
  • Various improvements and bug fixes
  • Links in the web view show a preview of the destination URL
  • Stability improvements related to article thumbnails
  • Reworked dialog windows
  • Fixes for non-unicode character encodings
  • Fixes for importing OPML
  • Various bug fixes and improvements
  • Code refactoring
  • Flatpak dependency fixes
  • Flatpak dependency fixes
  • Brand new look powered by GTK4 and Libadwaita
  • Articles can have thumbnails
  • New advertisement blocking feature
  • Human friendly article date and time
  • Less intrusive feed error notification
  • Customizable reader mode fonts
  • Empty feeds can be hidden
  • New lightning fast C++ powered backend for feed parsing
  • Experimental article list implementation using GtkListView
  • Removed saved articles feature
  • Fixed view mode button
  • Option to open YouTube links with an external media player
  • Saved articles are no longer stored inside the cache directory, avoiding accidental deletion
  • Feed icons improvements for high DPI screens
  • UI improvements on phones
  • Switched to the new libhandy Avatar widget
  • Added Dutch translation courtesy of Heimen Stoffels
  • Fixed searchbar
  • New tags feature! You can now categorize your feeds by creating custom tags
  • RSS links can now be opened directly in Feeds to be imported
  • Mark as read now only marks the currently visible feeds
  • Added support for the latest version of libhandy
  • Improved message dialogs
  • Performance improvements when importing OPML files
  • Removed option to disable client side decoration
  • Don't remove feeds automatically if they have errors, instead ask the user what to do
  • Updated Italian translation
  • Updated French translation
  • Bug fixes
  • Updated version number
  • Updated Italian translation
  • You can now add some feeds by just using the website URL
  • New generated placeholder icon for feeds without one
  • Improved reader mode
  • Swipe left on your touchscreen to move back from an article
  • Code blocks in articles now have syntax highlighting
  • Added French translation
  • Removed the colored border left of the articles
  • More keyboard shortcuts
  • Added option to refresh articles on startup
  • Updated to the GNOME 3.36 runtime
  • Various improvements and bug fixes
  • Added loading progress bar
  • Added Spanish translation
  • Various UI improvements
  • Performance improvements
  • Various bug fixes
  • Load cached articles on startup
  • Added new view mode menu
  • Various UI improvements
  • Performance improvements
  • Various bug fixes
  • Added Brazilian Portuguese translation
  • Added Russian translation
  • Option to ellipsize article titles for a more compact view
  • Added a search function
  • Updated dependencies
  • Various UI improvements
  • Various bug fixes
  • Errors with feeds are now shown in the UI
  • Big UI overhaul
  • Updated translations
  • Various bug fixes
  • OPML file association
  • Changed left headerbar button order
  • Optimization for updating feeds
  • Redesigned right click/longpress menu
  • Option to show/hide read articles
  • Reworked suggestion bar
  • Changed name to Feeds
  • Improved CPU utilization
  • Various bug fixes
  • New right click or longpress menu for articles
  • You can now save articles offline
  • Initial suggestion to add feeds is now less intrusive
  • Read articles are now greyed out
  • Various bug fixes
  • Concurrent feeds refresh, with customizable thread count
  • Added German translation (thanks @Etamuk)
  • Fix bugs in reader mode
  • Minor bug fix
  • Improved date and time parsing and display
  • Reader mode can now work on websites without an article tag
  • Slight improvements to the icon
  • New feature to filter articles by feed
  • Improved favicon download
  • Fixed refresh duplicating articles
  • Added option to disable client side decoration
  • Brought primary menu in line with GNOME HIG
  • Added placeholder icon for feeds without an icon
  • Migrated some widgets to Glade templates
  • Option to use reader mode by default
  • Option to show article content from the feed
  • Various bug fixes
  • Fixed labels alignment
  • Changed app name to Feeds
  • Added separators for the two sections of the app
  • Using links as feed titles when there is no title
  • Added preference for maximum article age
  • Added zoom keyboard shortcuts
  • Added preference to enable JavaScript
  • Fix window control positions when they are on the left
  • Feeds for websites without favicons will now work
  • Fixed bug with adding new feeds
  • Switched to native file chooser
  • Added empty state initial screen for sidebar
  • Added italian translation
  • First release
none none none none none none none none none none none none none none none none none none none none none none none none none none none workstation mobile
gfeeds-2.2.0/data/org.gabmus.gfeeds.desktop.in000066400000000000000000000013641440757451400212000ustar00rootroot00000000000000[Desktop Entry] Version=1.0 Type=Application # Translators: Do NOT translate or transliterate this text (this is a variable that will be replaced with the app name)! Name=@prettyname@ Comment=News reader for GNOME Categories=Network;Feed;GTK;GNOME; # Translators: Do NOT translate or transliterate this text (this is an icon file name)! Icon=@appid@ Exec=@bindir@/@projectname@ %u Terminal=false StartupNotify=true MimeType=application/xml;text/xml;text/x-opml; # Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! Keywords=rss;reader;feed;news; # Translators: Do NOT translate or transliterate this text (these are enum types)! X-Purism-FormFactor=Workstation;Mobile; gfeeds-2.2.0/data/org.gabmus.gfeeds.gresource.xml000066400000000000000000000035051440757451400217160ustar00rootroot00000000000000 org.gabmus.gfeeds.service.desktop ui/reader_mode_style.css aboutdialog.ui ui/add_feed_popover.ui ui/empty_state.ui ui/main_leaflet.ui ui/left_headerbar.ui ui/right_headerbar.ui ui/manage_feeds_listbox_row.ui ui/manage_feeds_headerbar.ui ui/shortcutsWindow.ui ui/sidebar_listbox_row.ui ui/scrolled_label.ui ui/webview.ui ui/manage_tags_content.ui ui/manage_tags_listbox_row.ui ui/filter_view.ui ui/gtk_style.css icons/org.gabmus.gfeeds.svg icons/org.gabmus.gfeeds-symbolic.svg icons/scalable/status/ephy-reader-mode-symbolic.svg icons/scalable/status/globe-alt-symbolic.svg icons/scalable/status/tag-symbolic.svg icons/scalable/status/webview-filler-symbolic.svg gfeeds-2.2.0/data/org.gabmus.gfeeds.gschema.xml.in000066400000000000000000000136161440757451400217400ustar00rootroot00000000000000 '{}' Feeds JSON (URL, tags, last modified) false Enable dark mode 'auto' Reader mode theme true Show new articles first 650 Window height 350 Window width 30 Maximum article age in days false Enable JavaScript in Web/Reader view 2 Maximum number of threads to use when loading feeds '[]' Feed items that have been read true Whether read items should be shown or hidden true Whether empty feeds (containing no unread items) should be shown or hidden true Whether to show the full article title or ellipsize it to fit one row 'webview' How to show articles (web view, reader mode, feed content) true Whether to open links from the article view in the default browser or in the app true Whether to show the full feed name or to ellipsize it to fit one row false Whether the feeds should be refreshed for new items on startup '[]' List of tags used to categorize feeds true Whether to open YouTube links in a designated media player app 'mpv' Media player to use to open YouTube videos true Whether to show feed item thumbnails false Whether to use the experimental Gtk.ListView implementation for the feed item list false Whether to automatically refresh for new feed items at a certain interval true Show a notification when new unread articles are available 300 Time interval between automatic refreshes, in seconds true Whether to block advertisements in the article view 0.0 Date and time of the last update of the ad block list, as python timestamp 1.0 Zoom level of the article view false Use system font for article view headings true Use system font for article view content 'DejaVu Serif' Custom font to use for article view headings 'Cantarell' Custom font to use for article view content 'DejaVu Sans Mono' Custom font to use for article view code blocks gfeeds-2.2.0/data/org.gabmus.gfeeds.service.desktop000066400000000000000000000004151440757451400222260ustar00rootroot00000000000000[Desktop Entry] Name=Feeds # TODO: We could include the full path here but Meson requires # newer GLib to generate files for GResource TryExec=gfeeds Exec=gfeeds --gapplication-service Type=Application NoDisplay=true Name[en_US]=org.gabmus.gfeeds.service.desktop gfeeds-2.2.0/data/org.gabmus.gfeeds.service.in000066400000000000000000000001201440757451400211540ustar00rootroot00000000000000[D-BUS Service] Name=@appid@ Exec=@bindir@/@projectname@ --gapplication-service gfeeds-2.2.0/data/ui/000077500000000000000000000000001440757451400143115ustar00rootroot00000000000000gfeeds-2.2.0/data/ui/aboutdialog.ui.in000066400000000000000000000012171440757451400175500ustar00rootroot00000000000000 @prettyname@ @VERSION@ @authorfullname@, et al. @PACKAGE_URL@ @CONTRIBUTORS@ translator-credits @APPID@ gpl-3-0 gfeeds-2.2.0/data/ui/add_feed_popover.blp000066400000000000000000000021051440757451400202730ustar00rootroot00000000000000using Gtk 4.0; template AddFeedPopover : Gtk.Popover { autohide: true; Gtk.Box container_box { width-request: 290; orientation: vertical; spacing: 6; Gtk.Label { styles ['dim-label'] label: _("Enter feed address to add"); xalign: 0.0; } Gtk.Box { spacing: 6; orientation: horizontal; Gtk.Entry url_entry { placeholder-text: 'https://…'; input-purpose: url; hexpand: true; activate => on_url_entry_activate(); changed => on_url_entry_changed(); } Gtk.Button confirm_btn { styles ['suggested-action'] label: _("Add"); clicked => on_confirm_btn_clicked(); } } Gtk.Revealer already_subscribed_revealer { Gtk.Label { label: _("You're already subscribed to that feed!"); wrap: true; xalign: 0.0; } } } } gfeeds-2.2.0/data/ui/empty_state.blp000066400000000000000000000015751440757451400173560ustar00rootroot00000000000000using Gtk 4.0; using Adw 1; template EmptyState : Adw.Bin { Adw.StatusPage { styles ['navigation-sidebar'] title: _("Let's get started"); icon-name: 'org.gabmus.gfeeds-symbolic'; Grid { halign: center; row-spacing: 12; column-spacing: 12; Image { layout { row: 0; column: 0; } icon-name: 'list-add-symbolic'; } Image { layout { row: 1; column: 0; } icon-name: 'open-menu-symbolic'; } Label { layout { row: 0; column: 1; } label: _("Add new feeds via URL"); xalign: 0.0; } Label { layout { row: 1; column: 1; } label: _("Import an OPML file"); xalign: 0.0; } } } } gfeeds-2.2.0/data/ui/filter_view.blp000066400000000000000000000015441440757451400173330ustar00rootroot00000000000000using Gtk 4.0; using Adw 1; template FilterView : Adw.Bin { styles ['background'] ScrolledWindow { hscrollbar-policy: never; hexpand: false; vexpand: true; width-request: 290; Box { orientation: vertical; ListBox all_listbox { styles ['navigation-sidebar'] selection-mode: single; row-activated => on_all_row_activated(); } Separator { orientation: horizontal; margin-start: 6; margin-end: 6; } ListBox tags_listbox { styles ['navigation-sidebar'] selection-mode: single; row-activated => on_tags_row_activated(); } Separator { orientation: horizontal; margin-start: 6; margin-end: 6; } Adw.Bin feeds_listbox_bin {} } } } gfeeds-2.2.0/data/ui/gtk_style.css000066400000000000000000000005071440757451400170320ustar00rootroot00000000000000@define-color unread-count #c0bfbc; /* Palette Light 4 */ .unread-count { padding: 3px 12px; border-radius: 12px; background-color: @unread-count; color: @theme_bg_color; min-width: 6px; font-weight: bold; font-size: 0.7em; } .link-preview-osd { padding: 3px; border-radius: 0 6px 0 0; } gfeeds-2.2.0/data/ui/left_headerbar.blp000066400000000000000000000033461440757451400177450ustar00rootroot00000000000000using Gtk 4.0; using Adw 1; menu generalMenu { section { item (_("_Show Read Articles"), 'app.show_read_items') item (_("Mark All as Read"), 'app.set_all_read') item (_("Mark All as _Unread"), 'app.set_all_unread') } section { item (_("Show _Empty Feeds"), 'app.show_empty_feeds') item (_("_Manage Feeds"), 'app.manage_feeds') item (_("_Import OPML"), 'app.import_opml') item (_("E_xport OPML"), 'app.export_opml') } section { item (_("P_references"), 'app.settings') item (_("_Keyboard Shortcuts"), 'app.shortcuts') item (_("_About Feeds"), 'app.about') } } template LeftHeaderbar : WindowHandle { vexpand: false; hexpand: true; Adw.HeaderBar left_headerbar { [title] Adw.Bin {} ToggleButton filter_btn { tooltip-text: _("Filter"); icon-name: 'sidebar-show-symbolic'; } MenuButton add_btn { tooltip-text: _("Add Feed"); icon-name: 'list-add-symbolic'; } [end] MenuButton menu_btn { tooltip-text: _("Menu"); icon-name: 'open-menu-symbolic'; menu-model: generalMenu; } [end] Button refresh_btn { tooltip-text: _("Refresh"); icon-name: 'view-refresh-symbolic'; clicked => on_refresh_btn_clicked(); } [end] ToggleButton search_btn { tooltip-text: _("Search"); icon-name: 'system-search-symbolic'; } [end] Button errors_btn { tooltip-text: _("There Are Errors"); icon-name: 'dialog-warning-symbolic'; visible: false; clicked => show_errors_dialog(); } } } gfeeds-2.2.0/data/ui/main_leaflet.blp000066400000000000000000000050671440757451400174400ustar00rootroot00000000000000using Gtk 4.0; using Adw 1; template MainLeaflet : Adw.Bin { Adw.Leaflet leaflet { homogeneous: false; can-navigate-back: true; transition-type: over; visible-child: left_box; notify::folded => on_leaflet_folded(); Adw.LeafletPage left_page { child: Gtk.Box left_box { hexpand: false; orientation: vertical; width-request: 360; height-request: 100; .LeftHeaderbar left_headerbar { searchbar: searchbar; } SearchBar searchbar { hexpand: false; show-close-button: false; search-mode-enabled: false; child: SearchEntry searchbar_entry {}; key-capture-widget: searchbar_entry; } InfoBar connection_bar { message-type: info; revealed: false; Box { orientation: horizontal; spacing: 6; margin-top: 6; margin-bottom: 6; halign: center; hexpand: true; Image { icon-name: 'network-offline-symbolic'; } Label { label: _("Offline"); wrap: true; xalign: 0.0; } } } Adw.Flap filter_flap { flap-position: start; fold-policy: always; modal: true; reveal-flap: false; swipe-to-open: true; swipe-to-close: true; [flap] .FilterView filter_view {} [content] .StackWithEmptyState sidebar_stack { main-widget: .GFeedsSidebar sidebar { }; } } }; } Adw.LeafletPage { navigatable: false; child: Gtk.Separator {}; } Adw.LeafletPage right_page { child: Gtk.Box right_box { orientation: vertical; .RightHeaderbar right_headerbar { webview: webview; go_back => on_back_btn_clicked(); } .GFeedsWebView webview {} }; } } } gfeeds-2.2.0/data/ui/manage_feeds_headerbar.blp000066400000000000000000000012321440757451400214010ustar00rootroot00000000000000using Gtk 4.0; using Adw 1; template ManageFeedsHeaderbar : Gtk.HeaderBar { show-title-buttons: true; [title] Adw.WindowTitle { title: _("Manage Feeds"); } Gtk.ToggleButton tags_btn { icon-name: 'tag-symbolic'; tooltip-text: _("Manage Tags for Selected Feeds"); sensitive: false; } Gtk.Button select_all_btn { icon-name: 'edit-select-all-symbolic'; tooltip-text: _("Select/Unselect All"); } [end] Gtk.Button delete_btn { styles ['destructive-action'] icon-name: 'user-trash-symbolic'; tooltip-text: _("Delete Selected Feeds"); sensitive: false; } } gfeeds-2.2.0/data/ui/manage_feeds_listbox_row.blp000066400000000000000000000020301440757451400220340ustar00rootroot00000000000000using Gtk 4.0; Box hbox { spacing: 6; orientation: horizontal; Box icon_container { width-request: 32; height-request: 32; halign: center; valign: start; margin-start: 6; margin-end: 6; margin-top: 6; margin-bottom: 6; } Box vbox { spacing: 6; orientation: vertical; margin-start: 6; margin-end: 6; margin-top: 6; margin-bottom: 6; hexpand: true; vexpand: true; valign: center; Label title_label { xalign: 0.0; wrap: true; } Label description_label { styles ['dim-label', 'caption'] xalign: 0.0; wrap: true; } } Box count_box { orientation: horizontal; margin-end: 6; hexpand: true; vexpand: true; halign: end; valign: center; width-request: 24; Label count_label { styles ['unread-count'] } } CheckButton check { margin-start: 6; margin-end: 12; } } gfeeds-2.2.0/data/ui/manage_tags_content.blp000066400000000000000000000027451440757451400210200ustar00rootroot00000000000000using Gtk 4.0; using Adw 1; template ManageTagsContent : Adw.Bin { styles ['background'] Box { spacing: 6; orientation: vertical; margin-start: 6; margin-end: 6; margin-top: 6; margin-bottom: 6; width-request: 280; Box { spacing: 6; orientation: horizontal; hexpand: false; Entry tags_entry { placeholder-text: _("New tag name…"); hexpand: true; changed => on_tags_entry_changed(); activate => on_submit_add_tag(); } Button add_tag_btn { styles ['suggested-action'] tooltip-text: _("Add Tag"); icon-name: 'list-add-symbolic'; clicked => on_submit_add_tag(); } } Separator { orientation: horizontal; } ScrolledWindow { hscrollbar-policy: never; vexpand: true; Viewport { ListBox tags_listbox { styles ['navigation-sidebar'] selection-mode: none; row-activated => on_tags_listbox_row_activated(); [placeholder] Adw.StatusPage { title: _("There are no tags yet"); description: _("Add some using the entry above"); icon-name: 'tag-symbolic'; } } } } } } gfeeds-2.2.0/data/ui/manage_tags_listbox_row.blp000066400000000000000000000010021440757451400217020ustar00rootroot00000000000000using Gtk 4.0; template ManageTagsListboxRow : ListBoxRow { Box main_box { spacing: 6; orientation: horizontal; margin-start: 12; margin-end: 12; margin-top: 12; margin-bottom: 12; Label label { xalign: 0.0; hexpand: true; } CheckButton checkbox {} Button delete_btn { styles ['destructive-action'] margin-start: 12; icon-name: 'user-trash-symbolic'; clicked => on_delete_btn_clicked(); } } } gfeeds-2.2.0/data/ui/meson.build000066400000000000000000000013561440757451400164600ustar00rootroot00000000000000glade_conf = configuration_data() glade_conf.set('PACKAGE_URL', website) glade_conf.set('DATA_DIR', pkgdatadir) glade_conf.set('LOCALE_DIR', join_paths(get_option('prefix'), get_option('datadir'), 'locale')) glade_conf.set('APPID', app_id) # this is for development version # glade_conf.set('VERSION', ''.join([run_command(['git', 'describe', '--long', '--tags']).stdout(), get_option('profile')])) glade_conf.set('VERSION', meson.project_version()) glade_conf.set('CONTRIBUTORS', contributors) glade_conf.set('authorfullname', authorfullname) glade_conf.set('prettyname', prettyname) # this has been moved to /data/meson.build #configure_file( # input: 'aboutdialog.glade.in', # output: 'aboutdialog.glade', # configuration: glade_conf #) gfeeds-2.2.0/data/ui/reader_mode_style.css000066400000000000000000000102001440757451400205020ustar00rootroot00000000000000/* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this file, * You can obtain one at http://mozilla.org/MPL/2.0/. * * Alternatively, the contents of this file may be used under the terms * of the GNU General Public License Version 3, as described below: * * This file is free software: you may copy, redistribute 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 file is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General * Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. * * Changes * - replace Firefox specific css extensions with WebKit css extensions * - append FeedView css selectors * * - Adjusted for Epiphany (Removing footer) * * Notes: * * - WCAG 2.0 level AA recommends at least 4.5 for normal text, 3 for large * text. See: https://marijohannessen.github.io/color-contrast-checker/ * * - The @font-face rules try to use locally installed copies of the fonts, * and fallback to the bundled versions. As per W3C recommendation, the * rules include both full font names and PostScript names to assure * proper matching across platforms and installed font formats. See: * https://www.w3.org/TR/css-fonts-3/#font-face-rule */ body { font-family: gfeeds-reader-sans, sans-serif; } body.sans { font-family: gfeeds-reader-sans, sans-serif; } body.serif { font-family: gfeeds-reader-serif, serif; } body { line-height: 1.45; text-rendering: optimizeLegibility; } body.light { /* Contrast ratio: 10.49 */ color: #333333; background: #efefee; } body.dark { color: #efefef; background: #181818; } h1, h2, h3, h4, h5, h6 { /* Contrast ratio: 4.77 */ font-weight: bold; color: #555555; font-family: gfeeds-reader-serif, serif; } body.serif h1, body.serif h2, body.serif h3, body.serif h4, body.serif h5, body.serif h6 { font-family: gfeeds-reader-sans, sans-serif; } body.dark h1, body.dark h2, body.dark h3, body.dark h4, body.dark h5, body.dark h6 { color: #999999 !important; } tt, code, pre { font-family: gfeeds-reader-mono, monospace; } hr { border: 1px solid #efefef; } picture img { border-radius: 3px; } h1 { font-size: 1.6em; } h2 { font-size: 1.2em; } h3 { font-size: 1em; } a { text-decoration: underline; font-weight: normal; } a, a:visited, a:hover, a:active { color: #0095dd; } * { max-width: 100%; height: auto; } p, code, pre, blockquote, ul, ol, li, figure, .wp-caption { margin: 0 0 30px 0; } p > img:only-child, p > a:only-child > img:only-child, .wp-caption img, figure img { display: block; } .caption, .wp-caption-text, figcaption { font-size: 0.9em; font-style: italic; } code, pre { white-space: pre-wrap; } blockquote { padding: 0; -webkit-padding-start: 16px; } ul, ol { padding: 0; } ul { -webkit-padding-start: 30px; list-style: disc; } ol { -webkit-padding-start: 30px; list-style: decimal; } /* Hide elements with common "hidden" class names */ .visually-hidden, .visuallyhidden, .hidden, .invisible, .sr-only { display: none; } article { overflow-y: hidden; margin: 20px auto; width: 640px; font-size: 18px; word-wrap: break-word; } mark { padding: 2px; margin: -2px; border-radius: 3px; background: #d7d7d8; } body.dark mark { background: #282828; color: #efefef; } div.highlight { border: 3px solid rgba(69, 76, 82, 0.25); background: rgba(64, 68, 70, 0.05); margin: 0.4em 0em 1.4em 0em; padding: 0; } div.highlight pre { padding: 0.8em ; margin: 0; } body.dark, body.dark table, body.dark tbody, body.dark tr, body.dark td { background-color: #181818; } body.dark, body.dark article, body.dark p, body.dark table, body.dark tr, body.dark td { color: #efefef !important; } gfeeds-2.2.0/data/ui/right_headerbar.blp000066400000000000000000000057011440757451400201250ustar00rootroot00000000000000using Gtk 4.0; using Adw 1; menu webviewMenu { section { item { custom: zoom; } } section { item (_("Open in _Browser"), 'app.open_externally') item (_("Open in External Media _Player"), 'app.open_media_player') item (_("_Copy Article Link"), 'app.copy_link') } } menu viewModeMenu { section { label: _("View Mode"); item { label: _("Web View"); action: 'app.view_mode_change'; target: 'webview'; } item { label: _("Reader Mode"); action: 'app.view_mode_change'; target: 'reader'; } item { label: _("Feed Content"); action: 'app.view_mode_change'; target: 'feedcont'; } } } PopoverMenu extra_popover { menu-model: webviewMenu; [zoom] Box { hexpand: true; halign: center; spacing: 12; Button zoom_out_btn { styles ['flat', 'circular'] icon-name: 'zoom-out-symbolic'; tooltip-text: _("Zoom Out"); clicked => on_zoom_out_btn_clicked(); } Button zoom_reset_btn { styles ['flat'] label: '100%'; width-request: 80; tooltip-text: _("Reset Zoom"); clicked => on_zoom_reset_btn_clicked(); } Button zoom_in_btn { styles ['flat', 'circular'] icon-name: 'zoom-in-symbolic'; tooltip-text: _("Zoom In"); clicked => on_zoom_in_btn_clicked(); } } } template RightHeaderbar : WindowHandle { vexpand: false; hexpand: true; Adw.HeaderBar right_headerbar { hexpand: true; [title] Adw.Squeezer title_squeezer { hexpand: true; ScrolledWindow right_title_container { hexpand: true; vscrollbar-policy: never; hscrollbar-policy: never; width-request: 100; Viewport { hexpand: true; Label title_label { styles ['title'] halign: center; hexpand: true; justify: center; ellipsize: end; single-line-mode: true; } } } Label {} } Button back_btn { visible: false; tooltip-text: _("Back to Articles"); icon-name: 'go-previous-symbolic'; clicked => on_back_btn_clicked(); } MenuButton view_mode_menu_btn { sensitive: false; tooltip-text: _("View Mode"); always-show-arrow: true; menu-model: viewModeMenu; } [end] MenuButton extra_menu_btn { sensitive: false; icon-name: 'view-more-symbolic'; popover: extra_popover; } } } gfeeds-2.2.0/data/ui/scrolled_label.blp000066400000000000000000000004641440757451400177620ustar00rootroot00000000000000using Gtk 4.0; ScrolledWindow scrolled_win { height-request: 300; hscrollbar-policy: never; hexpand: true; vexpand: true; Viewport { Label label { margin-start: 12; margin-end: 12; margin-bottom: 20; wrap: true; wrap-mode: char; } } } gfeeds-2.2.0/data/ui/shortcutsWindow.blp000066400000000000000000000043541440757451400202440ustar00rootroot00000000000000using Gtk 4.0; ShortcutsWindow shortcuts-gfeeds { modal: true; section-name: 'shortcuts'; ShortcutsSection { visible: true; ShortcutsGroup { title: _("General"); ShortcutsShortcut { accelerator: 'question'; title: _("Open Keyboard Shortcuts"); } ShortcutsShortcut { accelerator: 'F10'; title: _("Open Menu"); } ShortcutsShortcut { accelerator: 'comma'; title: _("Open Preferences"); } ShortcutsShortcut { accelerator: 'T'; title: _("Open Filter"); } ShortcutsShortcut { accelerator: 'Q'; title: _("Quit"); } } ShortcutsGroup { title: _("Article List"); ShortcutsShortcut { accelerator: 'R'; title: _("Refresh"); } ShortcutsShortcut { accelerator: 'F'; title: _("Search"); } ShortcutsShortcut { accelerator: 'J'; title: _("Next"); } ShortcutsShortcut { accelerator: 'K'; title: _("Previous"); } ShortcutsShortcut { accelerator: 'H'; title: _("Show/Hide Read Articles"); } ShortcutsShortcut { accelerator: 'M'; title: _("Mark All Read"); } } ShortcutsGroup { title: _("Article"); ShortcutsShortcut { accelerator: 'plus'; title: _("Zoom In"); } ShortcutsShortcut { accelerator: 'minus'; title: _("Zoom Out"); } ShortcutsShortcut { accelerator: 'equal'; title: _("Reset Zoom"); } ShortcutsShortcut { accelerator: 'o'; title: _("Open in Browser"); } } } } gfeeds-2.2.0/data/ui/sidebar_listbox_row.blp000066400000000000000000000027651440757451400210660ustar00rootroot00000000000000using Gtk 4.0; menu row_menu { section { item(_("Mark as Read/Unread"), 'row.read_unread') item(_("Open in Browser"), 'row.open_in_browser') } } template SidebarRow : Box { spacing: 6; orientation: vertical; margin-top: 12; margin-bottom: 12; Box { orientation: horizontal; spacing: 6; Box icon_container { width-request: 32; height-request: 32; halign: center; valign: start; margin-start: 6; margin-end: 6; margin-top: 6; margin-bottom: 6; } Label title_label { styles ['heading'] wrap: true; wrap-mode: word_char; hexpand: true; xalign: 0.0; } } Box { spacing: 6; orientation: vertical; vexpand: true; Box picture_view_container { hexpand: true; halign: center; visible: false; } Box { spacing: 6; Label origin_label { styles ['dim-label', 'caption'] hexpand: true; wrap: true; wrap-mode: word_char; ellipsize: end; xalign: 0.0; } [end] Label date_label { styles ['dim-label', 'caption'] halign: end; justify: right; wrap: true; xalign: 1.0; } } } PopoverMenu popover { menu-model: row_menu; } } gfeeds-2.2.0/data/ui/webview.blp000066400000000000000000000030351440757451400164610ustar00rootroot00000000000000using Gtk 4.0; using WebKit 6.0; using Adw 1; template GFeedsWebView : Stack { width-request: 360; height-request: 400; hexpand: true; vexpand: true; transition-type: crossfade; visible-child: filler_view; Adw.StatusPage filler_view { hexpand: true; vexpand: true; title: _("Select an article"); icon-name: 'webview-filler-symbolic'; } Overlay main_view { hexpand: true; vexpand: true; [overlay] Revealer loading_bar_revealer { vexpand: false; valign: start; transition-type: crossfade; reveal-child: true; ProgressBar loading_bar { styles ['osd'] hexpand: true; vexpand: false; } } [overlay] Revealer link_preview_revealer { vexpand: false; hexpand: false; valign: end; halign: start; reveal-child: false; transition-type: crossfade; Label link_preview_label { styles ['osd', 'link-preview-osd'] halign: start; vexpand: true; ellipsize: end; wrap: false; } } Adw.ToastOverlay toast_overlay { hexpand: true; vexpand: true; WebKit.WebView webkitview { hexpand: true; vexpand: true; load-changed => on_load_changed(); decide-policy => on_decide_policy(); mouse-target-changed => on_mouse_target_changed(); } } } } gfeeds-2.2.0/dist/000077500000000000000000000000001440757451400137265ustar00rootroot00000000000000gfeeds-2.2.0/dist/flatpak/000077500000000000000000000000001440757451400153505ustar00rootroot00000000000000gfeeds-2.2.0/dist/flatpak/org.gabmus.gfeeds.json000066400000000000000000000151151440757451400215460ustar00rootroot00000000000000{ "app-id": "org.gabmus.gfeeds", "command": "gfeeds", "runtime": "org.gnome.Platform", "runtime-version": "44", "sdk": "org.gnome.Sdk", "finish-args": [ "--device=dri", "--share=ipc", "--socket=fallback-x11", "--share=network", "--socket=wayland", "--socket=pulseaudio", "--talk-name=org.freedesktop.Flatpak", "--filesystem=xdg-data/fonts", "--persist=xdg-data/fonts", "--filesystem=xdg-config/fontconfig", "--persist=xdg-config/fontconfig" ], "cleanup": [ "/lib/python3.10/site-packages/_pytest", "/lib/python3.10/site-packages/pytest*", "/bin/pytest", "/bin/py.test" ], "modules": [ "python-deps.json", { "name": "python-lxml", "buildsystem": "simple", "build-commands": [ "python3 setup.py build --with-cython", "python3 setup.py install --prefix=/app --root=/" ], "sources": [ { "type": "archive", "url": "https://github.com/lxml/lxml/releases/download/lxml-4.9.2/lxml-4.9.2.tar.gz", "sha256": "d3fe33ffef3637e053cce7aa0bf26ad0943911c808e27962ba1202198e21a212" } ] }, { "name": "blueprint-compiler", "buildsystem": "meson", "sources": [ { "type": "archive", "url": "https://gitlab.gnome.org/jwestman/blueprint-compiler/-/archive/v0.6.0/blueprint-compiler-v0.6.0.tar.gz", "sha256": "c9e3652b66803c1de6a24b71f4fa4638b32260b4b04b93c2f3d958e1ce2a175e" } ] }, { "name": "python-pygments", "buildsystem": "simple", "build-commands": [ "python3 setup.py install --prefix=/app --root=/" ], "sources": [ { "type": "archive", "url": "https://github.com/pygments/pygments/archive/refs/tags/2.14.0.tar.gz", "sha256": "7cb39366ee4418e8d0fbe16cba940c1a7bb01361c9ac81abaedc90e05806d469" } ] }, { "name": "python-syndom", "buildsystem": "meson", "config-opts": [ "-DTO_JSON_BINARY=false", "-DPYTHON_BINDINGS=true", "-DHTML_SUPPORT=true" ], "sources": [ { "type": "git", "url": "https://gitlab.com/gabmus/syndication-domination", "commit": "75920321062d682437f3fb0319dad227d8b18f6c" } ], "modules": [ { "name": "boost", "buildsystem": "simple", "sources": [ { "type": "archive", "url": "https://downloads.sourceforge.net/boost/boost/1.80.0/boost_1_80_0.tar.bz2", "sha256": "1e19565d82e43bc59209a168f5ac899d3ba471d55c7610c677d4ccf2c9c500c0" } ], "build-commands": [ "./bootstrap.sh --prefix=/app --with-libraries=locale,filesystem,system,date_time,regex,program_options", "./b2 headers", "./b2 -j$FLATPAK_BUILDER_N_JOBS install variant=release cxxstd=17 --layout=system" ] }, { "name": "pybind11", "buildsystem": "cmake", "config-opts": [ "-DBUILD_TESTING=false" ], "sources": [ { "type": "archive", "url": "https://github.com/pybind/pybind11/archive/refs/tags/v2.10.3.tar.gz", "sha256": "5d8c4c5dda428d3a944ba3d2a5212cb988c2fae4670d58075a5a49075a6ca315" } ] }, { "name": "python-pybind11", "buildsystem": "simple", "build-commands": [ "python3 setup.py build", "python3 setup.py install --prefix=/app --root=/" ], "sources": [ { "type": "archive", "url": "https://github.com/pybind/pybind11/archive/refs/tags/v2.10.3.tar.gz", "sha256": "5d8c4c5dda428d3a944ba3d2a5212cb988c2fae4670d58075a5a49075a6ca315" } ] }, { "name": "pugixml", "buildsystem": "cmake", "sources": [ { "type": "git", "url": "https://github.com/zeux/pugixml", "tag": "v1.13" } ] }, { "name": "tidy", "buildsystem": "cmake", "sources": [ { "type": "git", "url": "https://github.com/htacg/tidy-html5", "tag": "5.8.0" } ] }, { "name": "fmt", "buildsystem": "cmake", "config-opts": [ "-DCMAKE_POSITION_INDEPENDENT_CODE=ON" ], "sources": [ { "type": "archive", "url": "https://github.com/fmtlib/fmt/archive/refs/tags/9.1.0.tar.gz", "sha256": "5dea48d1fcddc3ec571ce2058e13910a0d4a6bab4cc09a809d8b1dd1c88ae6f2" } ] } ] }, { "name": "gfeeds", "buildsystem": "meson", "config-opts": [ "--buildtype=release" ], "sources": [ { "type": "git", "url": "https://gitlab.gnome.org/World/gfeeds", "tag": "2.2.0" } ] } ] }gfeeds-2.2.0/dist/flatpak/python-deps.json000066400000000000000000000201021440757451400205100ustar00rootroot00000000000000{ "name": "poetry-deps", "buildsystem": "simple", "build-commands": [ "pip3 install --no-index --find-links=\"file://${PWD}\" --prefix=${FLATPAK_DEST} attrs beautifulsoup4 certifi chardet charset-normalizer colorama cssselect exceptiongroup humanize idna iniconfig lxml packaging pillow pluggy pygments pytest python-dateutil python-magic pytz readability-lxml requests six soupsieve tomli urllib3" ], "sources": [ { "type": "file", "url": "https://files.pythonhosted.org/packages/fb/6e/6f83bf616d2becdf333a1640f1d463fef3150e2e926b7010cb0f81c95e88/attrs-22.2.0-py3-none-any.whl", "sha256": "29e95c7f6778868dbd49170f98f8818f78f3dc5e0e37c0b1f474e3561b240836" }, { "type": "file", "url": "https://files.pythonhosted.org/packages/ee/a7/06b189a2e280e351adcef25df532af3c59442123187e228b960ab3238687/beautifulsoup4-4.12.0-py3-none-any.whl", "sha256": "2130a5ad7f513200fae61a17abb5e338ca980fa28c439c0571014bc0217e9591" }, { "type": "file", "url": "https://files.pythonhosted.org/packages/71/4c/3db2b8021bd6f2f0ceb0e088d6b2d49147671f25832fb17970e9b583d742/certifi-2022.12.7-py3-none-any.whl", "sha256": "4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18" }, { "type": "file", "url": "https://files.pythonhosted.org/packages/74/8f/8fc49109009e8d2169d94d72e6b1f4cd45c13d147ba7d6170fb41f22b08f/chardet-5.1.0-py3-none-any.whl", "sha256": "362777fb014af596ad31334fde1e8c327dfdb076e1960d1694662d46a6917ab9" }, { "type": "file", "url": "https://files.pythonhosted.org/packages/ef/81/14b3b8f01ddaddad6cdec97f2f599aa2fa466bd5ee9af99b08b7713ccd29/charset_normalizer-3.1.0-py3-none-any.whl", "sha256": "3d9098b479e78c85080c98e1e35ff40b4a31d8953102bb0fd7d1b6f8a2111a3d" }, { "type": "file", "url": "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", "sha256": "4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6" }, { "type": "file", "url": "https://files.pythonhosted.org/packages/06/a9/2da08717a6862c48f1d61ef957a7bba171e7eefa6c0aa0ceb96a140c2a6b/cssselect-1.2.0-py2.py3-none-any.whl", "sha256": "da1885f0c10b60c03ed5eccbb6b68d6eff248d91976fcde348f395d54c9fd35e" }, { "type": "file", "url": "https://files.pythonhosted.org/packages/61/97/17ed81b7a8d24d8f69b62c0db37abbd8c0042d4b3fc429c73dab986e7483/exceptiongroup-1.1.1-py3-none-any.whl", "sha256": "232c37c63e4f682982c8b6459f33a8981039e5fb8756b2074364e5055c498c9e" }, { "type": "file", "url": "https://files.pythonhosted.org/packages/22/2b/30e8725481b071ca53984742a443f944f9c74fb72f509a40b746912645e1/humanize-4.6.0-py3-none-any.whl", "sha256": "401201aca462749773f02920139f302450cb548b70489b9b4b92be39fe3c3c50" }, { "type": "file", "url": "https://files.pythonhosted.org/packages/fc/34/3030de6f1370931b9dbb4dad48f6ab1015ab1d32447850b9fc94e60097be/idna-3.4-py3-none-any.whl", "sha256": "90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2" }, { "type": "file", "url": "https://files.pythonhosted.org/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl", "sha256": "b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374" }, { "type": "file", "url": "https://files.pythonhosted.org/packages/06/5a/e11cad7b79f2cf3dd2ff8f81fa8ca667e7591d3d8451768589996b65dec1/lxml-4.9.2.tar.gz", "sha256": "2455cfaeb7ac70338b3257f41e21f0724f4b5b0c0e7702da67ee6c3640835b67" }, { "type": "file", "url": "https://files.pythonhosted.org/packages/ed/35/a31aed2993e398f6b09a790a181a7927eb14610ee8bbf02dc14d31677f1c/packaging-23.0-py3-none-any.whl", "sha256": "714ac14496c3e68c99c29b00845f7a2b85f3bb6f1078fd9f72fd20f0570002b2" }, { "type": "file", "url": "https://files.pythonhosted.org/packages/bc/07/830784e061fb94d67649f3e438ff63cfb902dec6d48ac75aeaaac7c7c30e/Pillow-9.4.0.tar.gz", "sha256": "a1c2d7780448eb93fbcc3789bf3916aa5720d942e37945f4056680317f1cd23e" }, { "type": "file", "url": "https://files.pythonhosted.org/packages/9e/01/f38e2ff29715251cf25532b9082a1589ab7e4f571ced434f98d0139336dc/pluggy-1.0.0-py2.py3-none-any.whl", "sha256": "74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3" }, { "type": "file", "url": "https://files.pythonhosted.org/packages/0b/42/d9d95cc461f098f204cd20c85642ae40fbff81f74c300341b8d0e0df14e0/Pygments-2.14.0-py3-none-any.whl", "sha256": "fa7bd7bd2771287c0de303af8bfdfc731f51bd2c6a47ab69d117138893b82717" }, { "type": "file", "url": "https://files.pythonhosted.org/packages/b2/68/5321b5793bd506961bd40bdbdd0674e7de4fb873ee7cab33dd27283ad513/pytest-7.2.2-py3-none-any.whl", "sha256": "130328f552dcfac0b1cec75c12e3f005619dc5f874f0a06e8ff7263f0ee6225e" }, { "type": "file", "url": "https://files.pythonhosted.org/packages/36/7a/87837f39d0296e723bb9b62bbb257d0355c7f6128853c78955f57342a56d/python_dateutil-2.8.2-py2.py3-none-any.whl", "sha256": "961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9" }, { "type": "file", "url": "https://files.pythonhosted.org/packages/6c/73/9f872cb81fc5c3bb48f7227872c28975f998f3e7c2b1c16e95e6432bbb90/python_magic-0.4.27-py2.py3-none-any.whl", "sha256": "c212960ad306f700aa0d01e5d7a325d20548ff97eb9920dcd29513174f0294d3" }, { "type": "file", "url": "https://files.pythonhosted.org/packages/2e/09/fbd3c46dce130958ee8e0090f910f1fe39e502cc5ba0aadca1e8a2b932e5/pytz-2022.7.1-py2.py3-none-any.whl", "sha256": "78f4f37d8198e0627c5f1143240bb0206b8691d8d7ac6d78fee88b78733f8c4a" }, { "type": "file", "url": "https://files.pythonhosted.org/packages/39/a6/cfe22aaa19ac69b97d127043a76a5bbcb0ef24f3a0b22793c46608190caa/readability_lxml-0.8.1-py3-none-any.whl", "sha256": "e0d366a21b1bd6cca17de71a4e6ea16fcfaa8b0a5b4004e39e2c7eff884e6305" }, { "type": "file", "url": "https://files.pythonhosted.org/packages/d2/f4/274d1dbe96b41cf4e0efb70cbced278ffd61b5c7bb70338b62af94ccb25b/requests-2.28.2-py3-none-any.whl", "sha256": "64299f4909223da747622c030b781c0d7811e359c37124b4bd368fb8c6518baa" }, { "type": "file", "url": "https://files.pythonhosted.org/packages/d9/5a/e7c31adbe875f2abbb91bd84cf2dc52d792b5a01506781dbcf25c91daf11/six-1.16.0-py2.py3-none-any.whl", "sha256": "8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" }, { "type": "file", "url": "https://files.pythonhosted.org/packages/d2/70/2c92d7bc961ba43b7b21032b7622144de5f97dec14b62226533f6940798e/soupsieve-2.4-py3-none-any.whl", "sha256": "49e5368c2cda80ee7e84da9dbe3e110b70a4575f196efb74e51b94549d921955" }, { "type": "file", "url": "https://files.pythonhosted.org/packages/97/75/10a9ebee3fd790d20926a90a2547f0bf78f371b2f13aa822c759680ca7b9/tomli-2.0.1-py3-none-any.whl", "sha256": "939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc" }, { "type": "file", "url": "https://files.pythonhosted.org/packages/7b/f5/890a0baca17a61c1f92f72b81d3c31523c99bec609e60c292ea55b387ae8/urllib3-1.26.15-py2.py3-none-any.whl", "sha256": "aa751d169e23c7479ce47a0cb0da579e3ede798f994f5816a74e4f4500dcea42" } ] }gfeeds-2.2.0/gfeeds/000077500000000000000000000000001440757451400142205ustar00rootroot00000000000000gfeeds-2.2.0/gfeeds/__main__.py000066400000000000000000000272741440757451400163260ustar00rootroot00000000000000from posixpath import expanduser import sys import argparse from gettext import gettext as _ from os.path import isfile from gi.repository import Gtk, Gdk, Gio, GLib, Adw from gfeeds.confManager import ConfManager from gfeeds.feeds_manager import FeedsManager from gfeeds.app_window import GFeedsAppWindow from gfeeds.preferences_window import show_preferences_window from gfeeds.util.opml_generator import feeds_list_to_opml from gfeeds.util.opml_parser import opml_to_rss_list from gfeeds.opml_file_chooser import ( GFeedsOpmlFileChooserDialog, GFeedsOpmlSavePathChooserDialog ) from gfeeds.manage_feeds_window import GFeedsManageFeedsWindow from gfeeds.scrolled_dialog import ScrolledDialogResponse, ScrolledDialog from gfeeds.shortcuts_window import show_shortcuts_window from gfeeds.util.rss_link_from_file import get_feed_link_from_file from gfeeds.base_app import BaseApp, AppAction from xml.sax.saxutils import escape class GFeedsApplication(BaseApp): def __init__(self): self.confman = ConfManager() super().__init__( app_id='org.gabmus.gfeeds', app_name='Feeds', app_actions=[ AppAction( name='show_read_items', func=self.show_read_items, accel='h', stateful=True, state_type=AppAction.StateType.BOOL, state_default=self.confman.nconf.show_read_items ), AppAction( name='show_empty_feeds', func=self.show_empty_feeds, stateful=True, state_type=AppAction.StateType.BOOL, state_default=self.confman.nconf.show_empty_feeds ), AppAction( name='view_mode_change', func=self.view_mode_change, stateful=True, state_type=AppAction.StateType.RADIO, state_default=self.confman.nconf.default_view ), AppAction( name='set_all_read', func=self.set_all_read, accel='m' ), AppAction( name='set_all_unread', func=self.set_all_unread ), AppAction( name='manage_feeds', func=self.manage_feeds ), AppAction( name='import_opml', func=self.import_opml ), AppAction( name='export_opml', func=self.export_opml ), AppAction( name='settings', func=lambda *__: show_preferences_window(self.window), accel='comma' ), AppAction( name='shortcuts', func=lambda *__: show_shortcuts_window(self.window), accel='question' ), AppAction( name='about', func=self.show_about_dialog ), AppAction( name='quit', func=self.on_destroy_window, accel='q' ), AppAction( name='open_externally', func=self.open_externally, accel='o' ), AppAction( name='open_media_player', func=self.open_media_player ), AppAction( name='copy_link', func=self.copy_link ) ], flags=Gio.ApplicationFlags.HANDLES_COMMAND_LINE, css_resource='/org/gabmus/gfeeds/ui/gtk_style.css' ) self.feedman = FeedsManager() def do_startup(self): super().do_startup() self.window = GFeedsAppWindow(self) self.window.connect('close-request', self.on_destroy_window) self.add_window(self.window) self.feedman.refresh( get_cached=not self.confman.nconf.refresh_on_startup, is_startup=True ) def open_media_player(self, *__): self.window.leaflet.webview.action_open_media_player() def open_externally(self, *__): self.window.leaflet.webview.open_externally() def copy_link(self, *__): Gdk.Display.get_default().get_clipboard().set( self.window.leaflet.webview.uri ) self.window.leaflet.webview.show_notif() def view_mode_change( self, action: Gio.SimpleAction, target: GLib.Variant, *__ ): action.change_state(target) target_s = str(target).strip("'") if target_s not in ['webview', 'reader', 'feedcont']: target_s = 'webview' self.window.leaflet.on_view_mode_change(target_s) self.confman.nconf.default_view = target_s def show_read_items(self, action: Gio.SimpleAction, *__): action.change_state( GLib.Variant.new_boolean(not action.get_state().get_boolean()) ) self.confman.nconf.show_read_items = action.get_state().get_boolean() self.confman.emit('gfeeds_show_read_changed') def show_empty_feeds(self, action: Gio.SimpleAction, *__): action.change_state( GLib.Variant.new_boolean(not action.get_state().get_boolean()) ) self.confman.nconf.show_empty_feeds = \ action.get_state().get_boolean() self.confman.emit('gfeeds_show_empty_feeds_changed') def set_all_read(self, *__): self.window.leaflet.sidebar.listview_sw.set_all_read_state(True) def set_all_unread(self, *__): self.window.leaflet.sidebar.listview_sw.set_all_read_state(False) def manage_feeds(self, *__): mf_win = GFeedsManageFeedsWindow( self.window ) mf_win.present() def import_opml(self, *__): dialog = GFeedsOpmlFileChooserDialog(self.window) def on_response(__, res): if res == Gtk.ResponseType.ACCEPT: self.feedman.import_opml(dialog.get_file().get_path()) dialog.connect('response', on_response) dialog.show() def export_opml(self, *__): dialog = GFeedsOpmlSavePathChooserDialog(self.window) def on_response(__, res): if res == Gtk.ResponseType.ACCEPT: save_path = dialog.get_file().get_path() if not save_path.lower().endswith('.opml'): save_path += '.opml' opml_out = feeds_list_to_opml( self.feedman.feed_store.sort_store ) with open(save_path, 'w') as fd: fd.write(opml_out) dialog.connect('response', on_response) dialog.show() def show_about_dialog(self, *__): about_builder = Gtk.Builder.new_from_resource( '/org/gabmus/gfeeds/aboutdialog.ui' ) dialog = about_builder.get_object('aboutdialog') dialog.set_modal(True) dialog.set_transient_for(self.window) dialog.present() def on_destroy_window(self, *__): self.window.on_destroy() self.quit() def do_activate(self): super().do_activate() self.window.present() # self.feedman.refresh(get_cached=True) if self.args: if self.args.argurl: abspath = self.args.argurl.strip() if abspath.lower().startswith('file:///'): abspath = self.args.argurl.removeprefix('file://') if isfile(expanduser(abspath)): if abspath.lower().endswith('.opml'): def on_cancel(_dialog, __): _dialog.close() def on_import(_dialog, __): _dialog.close() self.feedman.import_opml(abspath) dialog = ScrolledDialog( parent=self.window, title=_('Do you want to import these feeds?'), body=escape('\n'.join([ f.feed for f in opml_to_rss_list(abspath) ])), responses=[ ScrolledDialogResponse( 'cancel', _('_Cancel'), on_cancel ), ScrolledDialogResponse( 'import', _('_Import'), on_import, Adw.ResponseAppearance.SUGGESTED ) ] ) dialog.present() else: # why no check for extension here? # some websites have feeds without extension # dumb but that's what it is self.args.argurl = get_feed_link_from_file( abspath ) or '' if ( self.args.argurl.lower().startswith('http://') or self.args.argurl.lower().startswith('https://') ): def on_import(_dialog, __): _dialog.close() self.feedman.add_feed(argurl) def on_cancel(_dialog, __): _dialog.close() dialog = ScrolledDialog( parent=self.window, title=_('Do you want to import this feed?'), body=escape(self.args.argurl), responses=[ ScrolledDialogResponse( 'cancel', _('_Cancel'), on_cancel ), ScrolledDialogResponse( 'import', _('_Import'), on_import, Adw.ResponseAppearance.SUGGESTED ) ] ) argurl = self.args.argurl dialog.present() else: print('This file is not supported') self.args = None def do_command_line(self, args: Gio.ApplicationCommandLine): """ GTK.Application command line handler called if Gio.ApplicationFlags.HANDLES_COMMAND_LINE is set. must call the self.do_activate() to get the application up and running. """ # call the default commandline handler # not required anymore? # Gtk.Application.do_command_line(self, args) # make a command line parser parser = argparse.ArgumentParser() parser.add_argument( 'argurl', metavar=_('url'), type=str, nargs='?', help=_('opml file local url or rss remote url to import') ) # parse the command line stored in args, # but skip the first element (the filename) self.args = parser.parse_args(args.get_arguments()[1:]) # call the main program do_activate() to start up the app self.do_activate() return 0 def main(): application = GFeedsApplication() try: ret = application.run(sys.argv) except SystemExit as e: ret = e.code sys.exit(ret) if __name__ == '__main__': main() gfeeds-2.2.0/gfeeds/accel_manager.py000066400000000000000000000043321440757451400173350ustar00rootroot00000000000000from typing import Callable, List from gi.repository import Gtk class Accelerator: def __init__(self, combo: str, cb: Callable): self.combo = combo self.cb = cb def add_accelerators( window: Gtk.Window, shortcuts_l: List[Accelerator] ) -> Gtk.ShortcutController: shortcut_controller = Gtk.ShortcutController() shortcut_controller.set_scope(Gtk.ShortcutScope.GLOBAL) for s in shortcuts_l: __add_accelerator( shortcut_controller, s.combo, s.cb ) window.add_controller(shortcut_controller) return shortcut_controller def __add_accelerator( controller: Gtk.ShortcutController, shortcut: str, callback: Callable ): if shortcut: # res is bool, don't know what it is _, key, mod = Gtk.accelerator_parse(shortcut) gshcut = Gtk.Shortcut( trigger=Gtk.KeyvalTrigger(keyval=key, modifiers=mod), action=Gtk.CallbackAction.new(callback) ) controller.add_shortcut(gshcut) def add_mouse_button_accel( widget: Gtk.Widget, function: Callable, propagation: Gtk.PropagationPhase = Gtk.PropagationPhase.BUBBLE ) -> Gtk.GestureClick: '''Adds an accelerator for mouse btn press for widget to function. NOTE: this returns the Gtk.Gesture, you need to keep this around or it won't work. Assign it to some random variable and don't let it go out of scope''' gesture = Gtk.GestureClick.new() gesture.set_button(0) gesture.set_propagation_phase(propagation) gesture.connect('pressed', function) widget.add_controller(gesture) return gesture def add_longpress_accel( widget: Gtk.Widget, function: Callable, propagation: Gtk.PropagationPhase = Gtk.PropagationPhase.BUBBLE ) -> Gtk.GestureLongPress: '''Adds an accelerator for mouse btn press for widget to function. NOTE: this returns the Gtk.Gesture, you need to keep this around or it won't work. Assign it to some random variable and don't let it go out of scope''' gesture = Gtk.GestureLongPress.new() gesture.set_propagation_phase(propagation) gesture.set_touch_only(False) gesture.connect('pressed', function) widget.add_controller(gesture) return gesture gfeeds-2.2.0/gfeeds/app_window.py000066400000000000000000000054261440757451400167500ustar00rootroot00000000000000from gi.repository import Gio from gfeeds.main_leaflet import MainLeaflet from gfeeds.confManager import ConfManager from gfeeds.feeds_manager import FeedsManager from gfeeds.base_app import BaseWindow, AppShortcut from datetime import datetime class GFeedsAppWindow(BaseWindow): def __init__(self, application): self.confman = ConfManager() self.feedman = FeedsManager() self.app = application self.leaflet = MainLeaflet() super().__init__( app_name='Feeds', icon_name='org.gabmus.gfeeds', shortcuts=[ AppShortcut( 'F10', lambda *_: self.leaflet.left_headerbar.menu_btn.popup() ), AppShortcut( 'r', self.feedman.refresh ), AppShortcut( 'f', lambda *_: self.leaflet.left_headerbar.search_btn.set_active( not self.leaflet.left_headerbar.search_btn.get_active() ) ), AppShortcut( 'j', self.leaflet.sidebar.select_next_article ), AppShortcut( 'k', self.leaflet.sidebar.select_prev_article ), AppShortcut( 'plus', self.leaflet.webview.key_zoom_in ), AppShortcut( 'minus', self.leaflet.webview.key_zoom_out ), AppShortcut( 'equal', self.leaflet.webview.key_zoom_reset ), AppShortcut( 't', lambda *_: self.leaflet.filter_flap.set_reveal_flap( not self.leaflet.filter_flap.get_reveal_flap() ) ) ] ) self.append(self.leaflet) self.confman.conf.gs.bind( 'dark-mode', self, 'dark_mode', Gio.SettingsBindFlags.DEFAULT ) self.dark_mode = self.confman.nconf.dark_mode def present(self): super().present_with_time(int(datetime.now().timestamp())) self.set_default_size( self.confman.nconf.window_width, self.confman.nconf.window_height ) def emit_destroy(self, *_): self.emit('destroy') def on_destroy(self, *_): self.leaflet.sidebar.listview_sw.shutdown_thread_pool() self.confman.nconf.window_width = self.get_width() self.confman.nconf.window_height = self.get_height() self.feedman.cleanup_read_items() self.confman.save_article_thumb_cache() gfeeds-2.2.0/gfeeds/articles_listmodel.py000066400000000000000000000114701440757451400204570ustar00rootroot00000000000000from typing import List from gi.repository import Gtk, Gio from gfeeds.feed_item import FeedItem from gfeeds.confManager import ConfManager from typing import Optional class ArticlesListModel(Gtk.SortListModel): def __init__(self): self.selected_feeds = [] self.selected_article = None self.__search_term = '' # this is a chain: list_store contains the raw data, # filter_store filters it and sort_store sorts it, then the listview # is fed the last link in the chain via the selection object self.filter = Gtk.CustomFilter() self.filter.set_filter_func(self._filter_func) self.sorter = Gtk.CustomSorter() self.sorter.set_sort_func(self._sort_func) self.list_store = Gio.ListStore(item_type=FeedItem) self.filter_store = Gtk.FilterListModel( model=self.list_store, filter=self.filter ) self.confman = ConfManager() super().__init__(model=self.filter_store, sorter=self.sorter) self.confman.connect( 'gfeeds_show_read_changed', lambda *_: self.invalidate_filter() ) self.confman.connect( 'gfeeds_new_first_changed', lambda *_: self.invalidate_sort() ) self.confman.connect( 'gfeeds_filter_changed', self._change_filter ) def set_all_read_state(self, state: bool): for feed_item in self.list_store: if not feed_item: continue if self.__filter_by_feed_and_search(feed_item): feed_item.read = state if not self.confman.nconf.show_read_items and not state: self.invalidate_filter() def _change_filter(self, caller, n_filter): if n_filter is None: self.selected_feeds = [] elif isinstance(n_filter, list): n_filter = n_filter[0] # filter by tag self.selected_feeds = [ f for f in self.confman.nconf.feeds.keys() if 'tags' in self.confman.nconf.feeds[f].keys() and n_filter in self.confman.nconf.feeds[f]['tags'] ] else: self.selected_feeds = [n_filter.rss_link] self.invalidate_filter() def set_selected_article(self, n_selected: Optional[FeedItem]): self.selected_article = n_selected self.invalidate_filter() def _filter_func(self, item: FeedItem, *_) -> bool: res = self.__filter_by_feed_and_search(item) if not self.confman.nconf.show_read_items: res = res and ( item == self.selected_article or not item.read ) return res def __filter_by_feed_and_search(self, item: FeedItem) -> bool: res = True if len(self.selected_feeds) > 0: res = item.parent_feed.rss_link in self.selected_feeds if self.__search_term: res = res and ( self.__search_term in item.title.lower() ) return res def _sort_func(self, item1: FeedItem, item2: FeedItem, *_) -> int: # item1 first -> -1 # item2 first -> +1 # equal (unused) -> 0 if self.confman.nconf.new_first: return ( -1 if item1.pub_date > item2.pub_date # type: ignore else 1 ) return ( -1 if item1.pub_date < item2.pub_date # type: ignore else 1 ) def invalidate_filter(self): self.filter.set_filter_func(self._filter_func) def invalidate_sort(self): self.sorter.set_sort_func(self._sort_func) def empty(self): self.list_store.remove_all() def add_new_items(self, feeditems_l): # self.parent_stack.set_main_visible(True) for i in feeditems_l: self.list_store.append(i) def populate(self, feeditems_l): self.empty() # TODO: review this API, doesn't make too much sense self.add_new_items(feeditems_l) def all_items_changed(self): for item in self.list_store: item.emit('changed', '') def remove_items(self, to_remove_l: List[FeedItem]): to_rm_ids = [i.identifier for i in to_remove_l] to_rm_indices = [] for idx, item in enumerate(self.list_store): if len(to_rm_ids) <= 0: break if not item: continue if item.identifier in to_rm_ids: to_rm_ids.remove(item.identifier) to_rm_indices.append(idx) for idx in sorted(to_rm_indices, reverse=True): self.list_store.remove(idx) def set_search_term(self, term): self.__search_term = term.strip().lower() self.invalidate_filter() def set_selected_feeds(self, n_feeds_l: List[str]): self.selected_feeds = n_feeds_l self.invalidate_filter() gfeeds-2.2.0/gfeeds/articles_listview.py000066400000000000000000000136551440757451400203400ustar00rootroot00000000000000from typing import Any, Callable, Literal, Optional from gi.repository import Gtk from concurrent.futures import ThreadPoolExecutor from gfeeds.feeds_manager import FeedsManager from gfeeds.feed_item import FeedItem from gfeeds.sidebar_row import SidebarRow class CommonListScrolledWin(Gtk.ScrolledWindow): def __init__(self): super().__init__( hscrollbar_policy=Gtk.PolicyType.NEVER, vscrollbar_policy=Gtk.PolicyType.AUTOMATIC ) self.feedman = FeedsManager() self.articles_store = self.feedman.article_store self.fetch_image_thread_pool = ThreadPoolExecutor( max_workers=self.articles_store.confman.nconf.max_refresh_threads ) # API bindings self.empty = self.articles_store.empty self.populate = self.articles_store.populate self.selected_feeds = self.articles_store.selected_feeds self.invalidate_filter = self.articles_store.invalidate_filter self.invalidate_sort = self.articles_store.invalidate_sort self.set_search_term = self.articles_store.set_search_term self.set_selected_feeds = self.articles_store.set_selected_feeds self.selected_feeds = self.articles_store.selected_feeds self.add_new_items = self.articles_store.add_new_items self.remove_items = self.articles_store.remove_items self.set_all_read_state = self.articles_store.set_all_read_state self.all_items_changed = self.articles_store.all_items_changed def shutdown_thread_pool(self): self.fetch_image_thread_pool.shutdown(wait=False, cancel_futures=True) def __del__(self): self.shutdown_thread_pool() class ArticlesListView(CommonListScrolledWin): def __init__(self): super().__init__() # listview and factory self.factory = Gtk.SignalListItemFactory() self.factory.connect('setup', self._on_setup_listitem) self.factory.connect('bind', self._on_bind_listitem) self.selection = Gtk.SingleSelection.new(self.articles_store) self.selection.set_autoselect(False) self.list_view = Gtk.ListView.new(self.selection, self.factory) self.list_view.set_vscroll_policy(Gtk.ScrollablePolicy.NATURAL) self.list_view.get_style_context().add_class('navigation-sidebar') self.set_child(self.list_view) self.selection.connect('notify::selected-item', self.on_activate) def connect_activate(self, func): self.selection.connect( 'notify::selected-item', lambda *_: func(self.selection.get_selected_item()) ) def get_selected(self) -> int: return self.selection.get_selected() def get_selected_item(self) -> FeedItem: return self.articles_store[self.get_selected()] def select_row(self, index): self.selection.select_item(index, True) # for both select next and prev; increment can be +1 or -1 def __select_successive(self, increment: Literal[1, -1]): index = self.get_selected() if increment == -1 and index == 0: return if index == Gtk.INVALID_LIST_POSITION: index = -1 * increment # so that 0 is selected self.select_row(index + increment) def select_next(self, *_): self.__select_successive(1) def select_prev(self, *_): self.__select_successive(-1) def on_activate(self, *_): feed_item = self.selection.get_selected_item() if not feed_item: return feed_item.read = True def _on_setup_listitem( self, _: Gtk.ListItemFactory, list_item: Gtk.ListItem ): row_w = SidebarRow(self.fetch_image_thread_pool) list_item.set_child(row_w) # otherwise row gets garbage collected list_item.row_w = row_w # type: ignore def _on_bind_listitem( self, _: Gtk.ListItemFactory, list_item: Gtk.ListItem ): row_w: SidebarRow = list_item.get_child() # type: ignore feed_item: FeedItem = list_item.get_item() # type: ignore row_w.set_feed_item(feed_item) class ArticlesListBox(CommonListScrolledWin): def __init__(self): super().__init__() self.listbox = Gtk.ListBox( vexpand=True, selection_mode=Gtk.SelectionMode.SINGLE, activate_on_single_click=True ) self.listbox.get_style_context().add_class('navigation-sidebar') self.listbox.bind_model(self.articles_store, self._create_row, None) self.set_child(self.listbox) def connect_activate(self, func: Callable[[Optional[FeedItem]], Any]): self.listbox.connect( 'row-activated', lambda _, row, *__: func(row.get_child().feed_item) if row else func(None) ) def _create_row( self, feed_item: FeedItem, *_ ) -> Gtk.Widget: row_w = SidebarRow(self.fetch_image_thread_pool) row_w.set_feed_item(feed_item) return row_w def get_selected_item(self): row = self.listbox.get_selected_row() if row: return row.get_child() return None def get_selected_index(self) -> int: row = self.listbox.get_selected_row() if not row: return -1 index = row.get_index() if index is None: return 0 return index # for both select next and prev; increment can be +1 or -1 def __select_successive(self, increment: Literal[1, -1]): index = self.get_selected_index() if increment == -1 and index == 0: return if index < 0: index = -1 * increment # so that 0 is selected target = self.listbox.get_row_at_index(index + increment) if not target: return self.listbox.select_row(target) target.activate() def select_next(self, *_): self.__select_successive(1) def select_prev(self, *_): self.__select_successive(-1) gfeeds-2.2.0/gfeeds/base_app.py000066400000000000000000000104661440757451400163530ustar00rootroot00000000000000from gi.repository import Adw, GObject, Gtk, GLib, Gio, Gdk from typing import Callable, Optional, List, Any from enum import Enum, auto class AppAction: class StateType(Enum): BOOL = auto() RADIO = auto() def __init__( self, name: str, func: Callable, accel: Optional[str] = None, stateful: bool = False, state_type: Optional[StateType] = None, state_default: Any = None ): self.name = name self.func = func self.accel = accel self.stateful = stateful self.state_type = state_type self.state_default = state_default assert not self.stateful or self.state_default is not None def get_action(self): action = None if self.stateful: parameter_type = None variant = None if self.state_type == AppAction.StateType.BOOL: variant = GLib.Variant.new_boolean(self.state_default) elif self.state_type == AppAction.StateType.RADIO: parameter_type = GLib.VariantType.new('s') variant = GLib.Variant('s', self.state_default) action = Gio.SimpleAction.new_stateful( self.name, parameter_type, variant ) else: action = Gio.SimpleAction.new(self.name, None) action.connect('activate', self.func) return action class BaseApp(Adw.Application): def __init__( self, app_id: str, app_name: str, app_actions: List[AppAction] = [], flags: Gio.ApplicationFlags = Gio.ApplicationFlags.FLAGS_NONE, css_resource: Optional[str] = None ): self.app_actions = app_actions self.css_resource = css_resource super().__init__(application_id=app_id, flags=flags) GLib.set_application_name(app_name) GLib.set_prgname(app_id) def do_startup(self): Adw.Application.do_startup(self) for a in self.app_actions: action = a.get_action() self.add_action(action) if a.accel is not None: self.set_accels_for_action(f'app.{a.name}', [a.accel]) def load_css(self): if self.css_resource is None: return provider = Gtk.CssProvider() provider.load_from_resource(self.css_resource) Gtk.StyleContext.add_provider_for_display( Gdk.Display.get_default(), provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION ) def do_activate(self): self.load_css() class AppShortcut: def __init__(self, keystroke: str, callback: Callable): self.keystroke = keystroke self.callback = callback def bind(self, win: 'BaseWindow'): _, key, mod = Gtk.accelerator_parse(self.keystroke) trigger = Gtk.KeyvalTrigger.new(key, mod) cb = Gtk.CallbackAction.new(self.callback) shortcut = Gtk.Shortcut.new(trigger, cb) win.shortcut_controller.add_shortcut(shortcut) @classmethod def create_controller(cls, widget: Gtk.Widget): sc = Gtk.ShortcutController() sc.set_scope(Gtk.ShortcutScope.GLOBAL) widget.add_controller(sc) return sc class BaseWindow(Adw.ApplicationWindow): shortcut_controller: Gtk.ShortcutController __dark_mode = False def __init__( self, app_name: str, icon_name: str, shortcuts: List[AppShortcut] = [] ): super().__init__() self.set_title(app_name) self.set_icon_name(icon_name) self.shortcut_controller = AppShortcut.create_controller(self) for shortcut in shortcuts: shortcut.bind(self) self.main_box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL) self.set_content(self.main_box) self.append = self.main_box.append self.prepend = self.main_box.prepend self.remove = self.main_box.remove @GObject.Property(type=bool, default=False) def dark_mode(self) -> bool: return self.__dark_mode @dark_mode.setter def dark_mode(self, nval: bool): self.__dark_mode = nval Adw.StyleManager.get_default().set_color_scheme( Adw.ColorScheme.FORCE_DARK if nval else Adw.ColorScheme.DEFAULT ) gfeeds-2.2.0/gfeeds/base_preferences.py000066400000000000000000000232621440757451400200720ustar00rootroot00000000000000from gfeeds.confManager import ConfManager from gi.repository import Gtk, Adw, Gio, GObject from typing import Optional, Union, List, Callable class MActionRow(Adw.ActionRow): def __init__(self, title: str, subtitle: Optional[str] = None, **kwargs): self.title = title self.subtitle = subtitle super().__init__( title=self.title, title_lines=0, subtitle_lines=0, **kwargs ) if self.subtitle: self.set_subtitle(self.subtitle) class PreferencesButtonRow(MActionRow): """ A preferences row with a button title: the title shown button_label: a label to show inside the button onclick: the function that will be called when the button is pressed subtitle: an optional subtitle to be shown button_style_class: the style class of the button. Common options: `suggested-action`, `destructive-action` signal: an optional signal to let ConfManager emit when the button is pressed """ def __init__( self, title: str, button_label: str, onclick: Callable, subtitle: Optional[str] = None, button_style_class: Optional[str] = None, signal: Optional[str] = None ): super().__init__(title, subtitle) self.button_label = button_label self.confman = ConfManager() self.signal = signal self.onclick = onclick self.button = Gtk.Button( label=self.button_label, valign=Gtk.Align.CENTER ) if button_style_class: self.button.get_style_context().add_class(button_style_class) self.button.connect('clicked', self.on_button_clicked) self.add_suffix(self.button) def on_button_clicked(self, btn): self.onclick(self.confman) if self.signal: self.confman.emit(self.signal) class PreferencesEntryRow(MActionRow): """ A preferences row with an entry title: the title shown conf_key: the key of the configuration dictionary/json in ConfManager subtitle: an optional subtitle to be shown onchange: an optional function that will be called when the entry changes signal: an optional signal to let ConfManager emit when the entry changes """ def __init__( self, title: str, conf_key: str, subtitle: Optional[str] = None, onchange: Optional[Callable] = None, signal: Optional[str] = None ): super().__init__(title, subtitle) self.conf_key = conf_key self.confman = ConfManager() self.signal = signal self.onchange = onchange self.entry = Gtk.Entry(valign=Gtk.Align.CENTER) self.entry.set_text(self.confman.conf[self.conf_key]) self.entry.connect('changed', self.on_entry_changed) self.add_suffix(self.entry) def on_entry_changed(self, *_): self.confman.conf[self.conf_key] = self.entry.get_text().strip() if self.onchange is not None: self.onchange(self.confman) if self.signal: self.confman.emit(self.signal) class PreferencesSpinButtonRow(MActionRow): """ A preferences row with a spin button title: the title shown min_v: minimum num value max_v: maximum num value conf_key: the key of the configuration dictionary/json in ConfManager subtitle: an optional subtitle to be shown signal: an optional signal to let ConfManager emit when the value changes """ def __init__( self, title: str, min_v: int, max_v: int, conf_key: str, subtitle: Optional[str] = None, signal: Optional[str] = None ): super().__init__(title, subtitle) self.confman = ConfManager() self.signal = signal self.conf_key = conf_key self.adjustment = Gtk.Adjustment.new( self.confman.conf[self.conf_key], # initial value min_v, # minimum value max_v, # maximum value 1, # step increment 10, # page increment (page up, page down? large steps anyway) 0 ) self.spin_button = Gtk.SpinButton( adjustment=self.adjustment, valign=Gtk.Align.CENTER ) self.spin_button.connect('value-changed', self.on_value_changed) self.add_suffix(self.spin_button) def on_value_changed(self, *_): self.confman.conf[self.conf_key] = self.spin_button.get_value_as_int() if self.signal: self.confman.emit(self.signal, self.confman.conf[self.conf_key]) class PreferencesComboRow(Adw.ComboRow): """ A preferences row with a combo box title: the title shown values: a list of acceptable values value_names: a list of user facing names for the values provided above conf_key: the key of the configuration dictionary/json in ConfManager subtitle: an optional subtitle to be shown signal: an optional signal to let ConfManager emit when the value changes """ class ItemWrapper(GObject.Object): def __init__(self, name: str, value: str): super().__init__() self.name = name self.value = value def __init__( self, title: str, values: List[str], value_names: List[str], conf_key: str, subtitle: Optional[str] = None, signal: Optional[str] = None ): self.confman = ConfManager() self.signal = signal self.conf_key = conf_key self.list_store = Gio.ListStore( item_type=PreferencesComboRow.ItemWrapper ) self.items_l = list() for name, value in zip(value_names, values): i = PreferencesComboRow.ItemWrapper(name, value) self.items_l.append(i) self.list_store.append(i) self.factory = Gtk.SignalListItemFactory() self.factory.connect('setup', self._on_setup_listitem) self.factory.connect('bind', self._on_bind_listitem) self.title = title self.subtitle = subtitle super().__init__( model=self.list_store, factory=self.factory, title=title ) if self.subtitle: self.set_subtitle(self.subtitle) self.set_selected(values.index(self.confman.conf[self.conf_key])) self.connect('notify::selected-item', self.on_selection_changed) def _on_setup_listitem( self, factory: Gtk.ListItemFactory, list_item: Gtk.ListItem ): label = Gtk.Label() list_item.set_child(label) list_item.row_w = label def _on_bind_listitem( self, factory: Gtk.ListItemFactory, list_item: Gtk.ListItem ): label = list_item.get_child() label.set_text(list_item.get_item().name) def on_selection_changed(self, *args): value = self.get_selected_item().value if value is not None: self.confman.conf[self.conf_key] = value if self.signal: self.confman.emit(self.signal) class PreferencesToggleRow(MActionRow): """ A preferences row with a toggle title: the title shown conf_key: the key of the configuration dictionary/json in ConfManager subtitle: an optional subtitle to be shown signal: an optional signal to let ConfManager emit when the configuration is set """ def __init__( self, title: str, conf_key: str, subtitle: Optional[str] = None, signal: Optional[str] = None ): super().__init__(title, subtitle) self.confman = ConfManager() self.conf_key = conf_key self.signal = signal self.toggle = Gtk.Switch(valign=Gtk.Align.CENTER) self.toggle.set_active(self.confman.conf[self.conf_key]) self.toggle.connect('state-set', self.on_toggle_state_set) self.add_suffix(self.toggle) self.set_activatable_widget(self.toggle) def on_toggle_state_set(self, toggle, state): self.confman.conf[self.conf_key] = state if self.signal is not None: self.confman.emit(self.signal) class PreferencesFontChooserRow(MActionRow): """ A preference row with a font chooser button """ def __init__( self, title: str, conf_key: str, subtitle: Optional[str] = None, signal: Optional[str] = None ): super().__init__(title, subtitle) self.confman = ConfManager() self.conf_key = conf_key self.signal = signal self.font_btn = Gtk.FontButton( title=self.title, modal=True, use_size=False, use_font=True, font=self.confman.conf[self.conf_key], valign=Gtk.Align.CENTER, level=Gtk.FontChooserLevel.FAMILY ) self.font_btn.connect('font-set', self.on_font_set) self.add_suffix(self.font_btn) self.set_activatable_widget(self.font_btn) def on_font_set(self, *args): n_font = ' '.join(self.font_btn.get_font().split(' ')[:-1]).strip() self.confman.conf[self.conf_key] = n_font if self.signal: self.confman.emit(self.signal) class MPreferencesGroup(Adw.PreferencesGroup): def __init__( self, title: str, rows: List[Union[MActionRow, PreferencesComboRow, Adw.ActionRow]] ): self.title = title self.rows = rows super().__init__(title=self.title) for row in self.rows: self.add(row) class MPreferencesPage(Adw.PreferencesPage): def __init__( self, title: str, pref_groups: List[MPreferencesGroup], icon_name: Optional[str] = None ): self.title = title self.icon_name = icon_name self.pref_groups = pref_groups super().__init__(title=self.title) if self.icon_name: self.set_icon_name(self.icon_name) for group in self.pref_groups: self.add(group) gfeeds-2.2.0/gfeeds/confManager.py000066400000000000000000000112411440757451400170110ustar00rootroot00000000000000from pathlib import Path from os.path import isfile import json from datetime import timedelta from gi.repository import GObject from gfeeds.conf_mapper import ConfMapper from gfeeds.gsettings_wrapper import GsettingsWrapper from gfeeds.signal_helper import signal_tuple from gfeeds.util.paths import ( ARTICLE_THUMB_CACHE_PATH, CACHE_HOME, CACHE_PATH, CONF_DIR, THUMBS_CACHE_PATH ) from gfeeds.util.singleton import Singleton class ConfManagerSignaler(GObject.Object): __gsignals__ = { 'gfeeds_new_first_changed': signal_tuple(), 'gfeeds_repopulation_required': signal_tuple(), 'gfeeds_webview_settings_changed': signal_tuple(), 'gfeeds_show_read_changed': signal_tuple(), 'gfeeds_full_article_title_changed': signal_tuple(), 'gfeeds_show_empty_feeds_changed': signal_tuple(), 'gfeeds_full_feed_name_changed': signal_tuple(), 'dark_mode_changed': signal_tuple(), 'show_thumbnails_changed': signal_tuple(), 'on_apply_adblock_changed': signal_tuple(), 'on_refresh_blocklist': signal_tuple(), # Signals down here don't have to do with the config 'gfeeds_filter_changed': signal_tuple(params=(GObject.TYPE_PYOBJECT,)), 'gfeeds_tags_append': signal_tuple(params=(str,)), 'gfeeds_tags_pop': signal_tuple(params=(str,)), } def json_to_gsettings(gw: GsettingsWrapper, path: Path): conf = dict() if path.is_file(): try: with open(path) as fd: conf = json.loads(fd.read()) except Exception: return else: return for k in conf.keys(): if k == 'windowsize': gw['window_width'] = conf[k]['width'] gw['window_height'] = conf[k]['height'] continue try: gw[k] = conf[k] except KeyError: print(f'json_to_gsettings: skipping unsupported key {k}') path.unlink() class ConfManager(metaclass=Singleton): def __init__(self): self.signaler = ConfManagerSignaler() self.emit = self.signaler.emit self.connect = self.signaler.connect self.is_flatpak = isfile('/.flatpak-info') self.conf_dir = CONF_DIR self.cache_home = CACHE_HOME self.cache_path = CACHE_PATH self.thumbs_cache_path = THUMBS_CACHE_PATH for p in [ self.conf_dir, self.cache_path, self.thumbs_cache_path, ]: if not p.is_dir(): p.mkdir(parents=True) self.legacy_conf_path = self.conf_dir.joinpath( 'org.gabmus.gfeeds.json' ) self.gsettings_conf = GsettingsWrapper('org.gabmus.gfeeds') self.conf = self.gsettings_conf self.nconf = ConfMapper(self.gsettings_conf) json_to_gsettings(self.gsettings_conf, self.legacy_conf_path) self.article_thumb_cache_path = ARTICLE_THUMB_CACHE_PATH if not self.article_thumb_cache_path.is_file(): self.article_thumb_cache = dict() self.save_article_thumb_cache() else: with open(self.article_thumb_cache_path, 'r') as fd: self.article_thumb_cache = json.loads(fd.read()) def save_article_thumb_cache(self): with open(self.article_thumb_cache_path, 'w') as fd: fd.write(json.dumps(self.article_thumb_cache)) @property def max_article_age(self) -> timedelta: return timedelta(days=self.nconf.max_article_age_days) def add_tag(self, tag: str, target_feeds=[]): tags = self.nconf.tags lowercase_tags = [t.lower() for t in tags] if tag.lower() not in lowercase_tags: tags.append(tag) self.nconf.tags = tags self.emit('gfeeds_tags_append', tag) feeds = self.nconf.feeds for feed in target_feeds: if 'tags' not in feeds[feed].keys(): feeds[feed]['tags'] = [] if tag not in feeds[feed]['tags']: feeds[feed]['tags'].append(tag) self.nconf.feeds = feeds def delete_tag(self, tag: str): tags = self.nconf.tags while tag in tags: tags.remove(tag) self.emit('gfeeds_tags_pop', tag) self.nconf.tags = tags self.remove_tag(tag, self.nconf.feeds.keys()) def remove_tag(self, tag: str, target_feeds: list): feeds: dict = self.nconf.feeds for feed in target_feeds: if 'tags' not in feeds[feed].keys(): continue if tag in feeds[feed]['tags']: feeds[feed].remove(tag) self.nconf.feeds = feeds # TODO: legacy; remove def save_conf(self, *_): pass gfeeds-2.2.0/gfeeds/conf_mapper.py000066400000000000000000000204351440757451400170670ustar00rootroot00000000000000from typing import Dict, List, Literal, cast from gfeeds.gsettings_wrapper import GSETTINGS_TYPES, GsettingsWrapper class ConfMapper: def __init__(self, gsw: GsettingsWrapper): self.gsw = gsw @property def feeds(self) -> Dict[ str, Dict[Literal['tags', 'last-modified'], List[str] | str] ]: return cast(dict, self.gsw.get('feeds')) @feeds.setter def feeds(self, nval: dict): self.set('feeds', nval) @property def dark_mode(self) -> bool: return cast(bool, self.gsw.raw_get('dark-mode')) @dark_mode.setter def dark_mode(self, nval: bool): self.set('dark_mode', nval) @property def reader_theme(self) -> Literal['auto', 'light', 'dark']: return cast( Literal['auto', 'light', 'dark'], self.gsw.raw_get('reader-theme') ) @reader_theme.setter def reader_theme(self, nval: Literal['auto', 'light', 'dark']): self.set('reader_theme', nval) @property def new_first(self) -> bool: return cast(bool, self.gsw.raw_get('new-first')) @new_first.setter def new_first(self, nval: bool): self.set('new_first', nval) @property def window_height(self) -> int: return cast(int, self.gsw.raw_get('window-height')) @window_height.setter def window_height(self, nval: int): self.set('window_height', nval) @property def window_width(self) -> int: return cast(int, self.gsw.raw_get('window-width')) @window_width.setter def window_width(self, nval: int): self.set('window_width', nval) @property def max_article_age_days(self) -> int: return cast(int, self.gsw.raw_get('max-article-age-days')) @max_article_age_days.setter def max_article_age_days(self, nval: int): self.set('max_article_age_days', nval) @property def enable_js(self) -> bool: return cast(bool, self.gsw.raw_get('enable-js')) @enable_js.setter def enable_js(self, nval: bool): self.set('enable_js', nval) @property def max_refresh_threads(self) -> int: return cast(int, self.gsw.raw_get('max-refresh-threads')) @max_refresh_threads.setter def max_refresh_threads(self, nval: int): self.set('max_refresh_threads', nval) @property def read_items(self) -> List[str]: return cast(List[str], self.gsw.raw_get('read-items')) @read_items.setter def read_items(self, nval: List[str]): self.set('read_items', nval) @property def show_read_items(self) -> bool: return cast(bool, self.gsw.raw_get('show-read-items')) @show_read_items.setter def show_read_items(self, nval: bool): self.set('show_read_items', nval) @property def show_empty_feeds(self) -> bool: return cast(bool, self.gsw.raw_get('show-empty-feeds')) @show_empty_feeds.setter def show_empty_feeds(self, nval: bool): self.set('show_empty_feeds', nval) @property def full_article_title(self) -> bool: return cast(bool, self.gsw.raw_get('full-article-title')) @full_article_title.setter def full_article_title(self, nval: bool): self.set('full_article_title', nval) @property def default_view(self) -> Literal['webview', 'reader', 'feedcont']: return cast( Literal['webview', 'reader', 'feedcont'], self.gsw.raw_get('default-view') ) @default_view.setter def default_view(self, nval: Literal['webview', 'reader', 'feedcont']): self.set('default_view', nval) @property def open_links_externally(self) -> bool: return cast(bool, self.gsw.raw_get('open-links-externally')) @open_links_externally.setter def open_links_externally(self, nval: bool): self.set('open_links_externally', nval) @property def full_feed_name(self) -> bool: return cast(bool, self.gsw.raw_get('full-feed-name')) @full_feed_name.setter def full_feed_name(self, nval: bool): self.set('full_feed_name', nval) @property def refresh_on_startup(self) -> bool: return cast(bool, self.gsw.raw_get('refresh-on-startup')) @refresh_on_startup.setter def refresh_on_startup(self, nval: bool): self.set('refresh_on_startup', nval) @property def tags(self) -> List[str]: return cast(List[str], self.gsw.raw_get('tags')) @tags.setter def tags(self, nval: List[str]): self.set('tags', nval) @property def open_youtube_externally(self) -> bool: return cast(bool, self.gsw.raw_get('open-youtube-externally')) @open_youtube_externally.setter def open_youtube_externally(self, nval: bool): self.set('open_youtube_externally', nval) @property def media_player(self) -> str: return cast(str, self.gsw.raw_get('media-player')) @media_player.setter def media_player(self, nval: str): self.set('media_player', nval) @property def show_thumbnails(self) -> bool: return cast(bool, self.gsw.raw_get('show-thumbnails')) @show_thumbnails.setter def show_thumbnails(self, nval: bool): self.set('show_thumbnails', nval) @property def use_experimental_listview(self) -> bool: return cast(bool, self.gsw.raw_get('use-experimental-listview')) @use_experimental_listview.setter def use_experimental_listview(self, nval: bool): self.set('use_experimental_listview', nval) @property def auto_refresh_enabled(self) -> bool: return cast(bool, self.gsw.raw_get('auto-refresh-enabled')) @auto_refresh_enabled.setter def auto_refresh_enabled(self, nval: bool): self.set('auto_refresh_enabled', nval) @property def notify_new_articles(self) -> bool: return cast(bool, self.gsw.raw_get('notify-new-articles')) @notify_new_articles.setter def notify_new_articles(self, nval: bool): self.set('notify_new_articles', nval) @property def auto_refresh_time_seconds(self) -> int: return cast(int, self.gsw.raw_get('auto-refresh-time-seconds')) @auto_refresh_time_seconds.setter def auto_refresh_time_seconds(self, nval: int): self.set('auto_refresh_time_seconds', nval) @property def enable_adblock(self) -> bool: return cast(bool, self.gsw.raw_get('enable-adblock')) @enable_adblock.setter def enable_adblock(self, nval: bool): self.set('enable_adblock', nval) @property def blocklist_last_update(self) -> float: return cast(float, self.gsw.raw_get('blocklist-last-update')) @blocklist_last_update.setter def blocklist_last_update(self, nval: float): self.set('blocklist_last_update', nval) @property def webview_zoom(self) -> float: return cast(float, self.gsw.raw_get('webview-zoom')) @webview_zoom.setter def webview_zoom(self, nval: float): self.set('webview_zoom', nval) @property def font_use_system_for_titles(self) -> bool: return cast(bool, self.gsw.raw_get('font-use-system-for-titles')) @font_use_system_for_titles.setter def font_use_system_for_titles(self, nval: bool): self.set('font_use_system_for_titles', nval) @property def font_use_system_for_paragraphs(self) -> bool: return cast(bool, self.gsw.raw_get('font-use-system-for-paragraphs')) @font_use_system_for_paragraphs.setter def font_use_system_for_paragraphs(self, nval: bool): self.set('font_use_system_for_paragraphs', nval) @property def font_titles_custom(self) -> str: return cast(str, self.gsw.raw_get('font-titles-custom')) @font_titles_custom.setter def font_titles_custom(self, nval: str): self.set('font_titles_custom', nval) @property def font_paragraphs_custom(self) -> str: return cast(str, self.gsw.raw_get('font-paragraphs-custom')) @font_paragraphs_custom.setter def font_paragraphs_custom(self, nval: str): self.set('font_paragraphs_custom', nval) @property def font_monospace_custom(self) -> str: return cast(str, self.gsw.raw_get('font-monospace-custom')) @font_monospace_custom.setter def font_monospace_custom(self, nval: str): self.set('font_monospace_custom', nval) def set(self, key: str, val: GSETTINGS_TYPES): self.gsw.set(key, val) gfeeds-2.2.0/gfeeds/feed.py000066400000000000000000000114421440757451400154770ustar00rootroot00000000000000from typing import List, Optional from gi.repository import GObject, GLib from datetime import datetime from gfeeds.confManager import ConfManager from gfeeds.feed_item import FeedItem import pytz import gfeeds.feeds_manager as feeds_manager from syndom import Feed as SynDomFeed, FeedItem as SynDomFeedItem class Feed(GObject.Object): __gsignals__ = { 'empty_changed': ( GObject.SignalFlags.RUN_FIRST, None, () ) } __title = '' __link = '' __description = '' __image_url = '' __unread_count = 0 rss_link = '' tags = list() items = dict() sd_feed = None favicon_path = '' init_time = None def __init__( self, rss_link: str, title: str, link: str, description: str, image_url: Optional[str], favicon_path: Optional[str], sd_feed: SynDomFeed, raw_entries: List[SynDomFeedItem] ): super().__init__() self.confman = ConfManager() self.feedman = feeds_manager.FeedsManager() self.tag_store = self.feedman.tag_store self.__unread_count = 0 self.tags = list() self.items = dict() self.update( rss_link, title, link, description, image_url, favicon_path, sd_feed, raw_entries ) def update( self, rss_link: str, title: str, link: str, description: str, image_url: Optional[str], favicon_path: Optional[str], sd_feed: SynDomFeed, raw_entries: List[SynDomFeedItem] ): self.rss_link = rss_link self.__title = title self.__link = link self.__description = description self.__image_url = image_url self.favicon_path = favicon_path self.sd_feed = sd_feed unread_count = 0 self.init_time = pytz.UTC.localize(datetime.utcnow()) for entry in raw_entries: n_item = FeedItem(entry, self) uid = self.rss_link + n_item.identifier item_age = self.init_time - n_item.pub_date # type: ignore valid_age = item_age <= self.confman.max_article_age if uid in self.items: if not valid_age: del self.items[uid] else: if valid_age: self.items[uid] = n_item if valid_age and not n_item.read: unread_count += 1 if not valid_age and n_item.read: read_items: List[str] = \ self.confman.nconf.read_items # type: ignore read_items.remove(n_item.identifier) self.confman.nconf.read_items = read_items if self.rss_link in self.confman.nconf.feeds: # type: ignore feed_conf = (self.get_conf_dict() or dict()) for tag_name in feed_conf.get('tags', []): tag_obj = self.tag_store.get_tag(tag_name) if tag_obj is not None and tag_obj not in self.tags: self.tags.append(tag_obj) # Set property, trigger signal (avoiding excess signals during init) if unread_count != self.__unread_count: def do(): self.unread_count = unread_count GLib.idle_add(do) def get_conf_dict(self) -> Optional[dict]: return self.confman.nconf.feeds.get( # type: ignore self.rss_link, None ) @GObject.Property(type=str) def title(self) -> str: # type: ignore return self.__title @GObject.Property(type=str) def link(self) -> str: # type: ignore return self.__link @GObject.Property(type=str) def description(self) -> str: # type: ignore return self.__description @GObject.Property(type=str) def image_url(self) -> Optional[str]: # type: ignore return self.__image_url @image_url.setter def image_url(self, n_image_url: Optional[str]): self.__image_url = n_image_url @GObject.Property(type=int, default=0) def unread_count(self) -> int: # type: ignore return self.__unread_count @unread_count.setter def unread_count(self, v: int): prev = self.__unread_count self.__unread_count = v if self.__unread_count == 0 and prev > 0: self.emit('empty_changed') elif self.__unread_count > 0 and prev == 0: self.emit('empty_changed') change = self.__unread_count - prev for tag in self.tags: tag.increment_unread_count(change) def __repr__(self): return f'Feed Object `{self.__title}`; {len(self.items)} items' def to_dict(self) -> dict: return { 'title': self.title, 'link': self.link, 'description': self.description, 'image_url': self.image_url, 'rss_link': self.rss_link, 'favicon_path': self.favicon_path, } gfeeds-2.2.0/gfeeds/feed_item.py000066400000000000000000000106351440757451400165200ustar00rootroot00000000000000from gettext import gettext as _ from typing import TYPE_CHECKING, List, Optional from bs4 import BeautifulSoup from gi.repository import GObject, GLib from dateutil.tz import gettz from datetime import datetime, timezone from dateutil.parser import parse as dateparse from gfeeds.util.get_thumb import get_thumb from gfeeds.confManager import ConfManager import pytz if TYPE_CHECKING: from gfeeds.feed import Feed class FeedItem(GObject.Object): __gsignals__ = { 'changed': ( GObject.SignalFlags.RUN_FIRST, None, (str,) ) } def __init__(self, sd_item, parent_feed: 'Feed'): self.confman = ConfManager() self.parent_feed = parent_feed self.__sd_item = sd_item title = self.__sd_item.get_title() self.__title = ( BeautifulSoup(title, features='lxml').text if title and ' str: # type: ignore return self.__title @GObject.Property() def pub_date(self) -> datetime: # type: ignore return self.__pub_date @GObject.Property(type=str) def link(self) -> str: # type: ignore return self.__link @GObject.Property(type=bool, default=False) def read(self) -> bool: # type: ignore return self.__read @read.setter def read(self, n_read: bool): self.__set_read(n_read) @GObject.Property(type=str) def image_url(self) -> str: # type: ignore return self.__image_url @GObject.Property(type=str) def author_url(self) -> str: # type: ignore return self.__author_url @GObject.Property(type=str) def author_name(self) -> str: # type: ignore return self.__author_name @image_url.setter def image_url(self, n_image_url: str): self.__image_url = n_image_url def set_thumb_from_link(self) -> Optional[str]: image_url = get_thumb(self.__link) def cb(url): self.image_url = url GLib.idle_add(cb, image_url) return image_url def __set_read(self, read): if read == self.__read: return self.parent_feed.unread_count += -1 if read else 1 read_items: List[str] = self.confman.nconf.read_items # type: ignore if read and self.identifier not in read_items: read_items.append(self.identifier) elif not read and self.identifier in read_items: read_items.remove(self.identifier) self.confman.nconf.read_items = read_items self.__read = read def __repr__(self): return 'FeedItem Object `{0}` from Feed {1}'.format( self.__title, self.parent_feed.title ) def to_dict(self) -> dict: return { 'title': self.title, 'link': self.link, 'identifier': self.identifier, 'pub_date': self.pub_date, 'image_url': self.image_url, 'content': self.content, 'parent_feed': self.parent_feed.to_dict(), } gfeeds-2.2.0/gfeeds/feed_parser.py000066400000000000000000000101421440757451400170470ustar00rootroot00000000000000from pathlib import Path from typing import List, Optional from gettext import gettext as _ from gfeeds.util.get_favicon import get_favicon from os.path import isfile from gfeeds.util.paths import THUMBS_CACHE_PATH from gfeeds.util.sha import shasum # from bs4 import UnicodeDammit # TODO: reimplement it! from syndom import Feed as SynDomFeed, FeedItem as SynDomFeedItem class FeedParserRes: def __init__( self, is_null: bool = False, error: Optional[str] = None, sd_feed: SynDomFeed = None, rss_link: Optional[str] = None, title: Optional[str] = None, link: Optional[str] = None, description: Optional[str] = None, image_url: Optional[str] = None, favicon_path: Optional[str] = None, raw_entries: List[SynDomFeedItem] = [] ): self.is_null = is_null self.error = error self.sd_feed = sd_feed self.rss_link = rss_link or '' self.title = title or '' self.link = link or '' self.description = description or '' self.image_url = image_url self.favicon_path = favicon_path self.raw_entries = raw_entries @property def feed_identifier(self) -> str: assert self.rss_link assert self.title return self.rss_link + self.title def parse_feed( feedpath: Optional[Path], rss_link_: Optional[str] = None, failed: bool = False, error: Optional[str] = None ) -> FeedParserRes: if failed: print(error) return FeedParserRes(is_null=True, error=(error or '')) sd_feed = None try: sd_feed = SynDomFeed(str(feedpath)) except Exception: print('Error parsing feed (caught); will try extracting from HTML') if sd_feed is None: return FeedParserRes( is_null=True, error=_( 'Errors while parsing feed `{0}`, URL: `{1}`' ).format(feedpath, rss_link_) ) try: title = sd_feed.get_title() raw_entries = sd_feed.get_items() link = sd_feed.get_url() rss_link = rss_link_ or sd_feed.get_rss_url() image_url = sd_feed.get_img_url() description = sd_feed.get_description() except UnicodeDecodeError: return FeedParserRes( is_null=True, error=_( 'Error decoding unicode data from feed `{0}`, URL: `{1}`' ).format(feedpath, rss_link_) ) except Exception: return FeedParserRes( is_null=True, error=_( 'Error extracting data from feed `{0}`, URL: `{1}`' ).format(feedpath, rss_link_) ) if not title and len(raw_entries) == 0: # if these conditions are met, there's reason to believe # this is not an rss/atom feed return FeedParserRes( is_null=False, error=_( '`{0}` may not be an RSS or Atom feed' ).format(rss_link_) ) if not title: title = rss_link favicon_path: Optional[str] = str(THUMBS_CACHE_PATH.joinpath( shasum(rss_link+'v2')+'.png' )) if not isfile(favicon_path): if image_url: try: get_favicon(image_url, favicon_path, direct=True) except Exception: print('Invalid image url for feed `{0}` ({1})'.format( rss_link, image_url )) image_url = None if not image_url: try: get_favicon(rss_link, favicon_path) if not isfile(favicon_path): get_favicon( link or raw_entries[0].uri, favicon_path ) except Exception: print(f'No favicon for feed `{rss_link}`') favicon_path = None return FeedParserRes( is_null=False, error=None, sd_feed=sd_feed, rss_link=rss_link, title=title, link=link, description=description, image_url=image_url, favicon_path=favicon_path, raw_entries=raw_entries ) gfeeds-2.2.0/gfeeds/feed_store.py000066400000000000000000000050761440757451400167210ustar00rootroot00000000000000from gi.repository import GObject, Gtk, Gio from typing import Optional from gfeeds.confManager import ConfManager from gfeeds.feed import Feed class FeedStore(Gtk.FilterListModel): __gsignals__ = { 'item-removed': ( GObject.SignalFlags.RUN_LAST, None, (GObject.TYPE_PYOBJECT,) ) } def __init__(self): self.sorter = Gtk.CustomSorter() self.sorter.set_sort_func(self._sort_func) self.filter = Gtk.CustomFilter() self.filter.set_filter_func(self._filter_func) self.list_store = Gio.ListStore(item_type=Feed) self.sort_store = Gtk.SortListModel( model=self.list_store, sorter=self.sorter ) self.confman = ConfManager() self.confman.connect( 'gfeeds_show_empty_feeds_changed', lambda *_: self.invalidate_filter() ) # Hiding read articles can result in empty feeds which should # be hidden self.confman.connect( 'gfeeds_show_read_changed', lambda *_: self.invalidate_filter() ) super().__init__(model=self.sort_store, filter=self.filter) def _sort_func(self, feed1: Feed, feed2: Feed, *_) -> int: return -1 if feed1.title.lower() < feed2.title.lower() else 1 def invalidate_sort(self): self.sorter.set_sort_func(self._sort_func) def _filter_func(self, feed: Feed, *_) -> bool: res = True if not self.confman.nconf.show_empty_feeds: if self.confman.nconf.show_read_items: res = res and len(feed.items) > 0 else: res = res and feed.unread_count > 0 return res def invalidate_filter(self): self.filter.set_filter_func(self._filter_func) def empty(self): return self.list_store.remove_all() def add_feed(self, n_feed: Feed): self.list_store.append(n_feed) n_feed.connect( 'empty_changed', lambda *_: self.invalidate_filter() ) def remove_by_index(self, index: int): self.emit('item-removed', self.list_store[index]) self.list_store.remove(index) def remove_feed(self, to_rm: Feed): for i, feed in enumerate(self.list_store): if feed.title == to_rm.title and feed.rss_link == to_rm.rss_link: self.remove_by_index(i) return def get_feed(self, identifier: str) -> Optional[Feed]: for f in self.list_store: if f.rss_link + f.title == identifier: return f return None gfeeds-2.2.0/gfeeds/feeds_manager.py000066400000000000000000000263001440757451400173530ustar00rootroot00000000000000from pathlib import Path from threading import Thread, Event from gettext import gettext as _ from typing import Iterable, List, Union, cast from gi.repository import GLib, GObject from gfeeds.articles_listmodel import ArticlesListModel from gfeeds.util.opml_parser import opml_to_rss_list from gfeeds.util.singleton import Singleton from gfeeds.confManager import ConfManager from gfeeds.feed import Feed from gfeeds.feed_parser import parse_feed from gfeeds.util.download_manager import ( download_feed, extract_feed_url_from_html ) from gfeeds.tag_store import TagStore from gfeeds.util.test_connection import is_online from gfeeds.util.thread_pool import ThreadPool from gfeeds.feed_store import FeedStore from gfeeds.signal_helper import signal_tuple import pytz from datetime import datetime class FeedsManagerSignaler(GObject.Object): __gsignals__ = { 'feedmanager_refresh_start': signal_tuple(params=(str,)), 'feedmanager_refresh_end': signal_tuple(params=(str,)), 'feedmanager_online_changed': signal_tuple(params=(bool,)), 'feedmanager_feeds_loaded_changed': signal_tuple(params=(float,)), } class FeedsManager(metaclass=Singleton): def __init__(self): self.confman = ConfManager() self.confman.connect( 'gfeeds_repopulation_required', self.refresh ) self.signaler = FeedsManagerSignaler() self.emit = self.signaler.emit self.connect = self.signaler.connect self.feed_store = FeedStore() self.tag_store = TagStore() self.article_store = ArticlesListModel() self.errors = [] self.problematic_feeds = [] self.new_items_num = 0 # for the notification, resets on refresh self.is_refreshing = False self.__auto_refresh_event = Event() self.auto_refresh_thread = None self.connect( 'feedmanager_refresh_end', self.on_refresh_end ) self.__feeds_loaded = 0 def on_refresh_end(self, *__): # new articles notified in app_window self.start_auto_refresh() def __increment_new_items_num(self): # dumb thing to have in a function, it's because it's to be called # from the main thread and lambdas apparently can't do it self.new_items_num += 1 def _add_feed_async_worker( self, uri: str, refresh: bool = False, get_cached: bool = False ): self.__tick_feeds_loaded() if not refresh: if not (uri.startswith('http://') or uri.startswith('https://')): uri = 'http://' + uri if uri in self.confman.nconf.feeds.keys(): print(_('Feed {0} exists already, skipping').format(uri)) GLib.idle_add( self.emit, 'feedmanager_refresh_end', '' ) return feeds = self.confman.nconf.feeds feeds[uri] = {} self.confman.nconf.feeds = feeds download_res = download_feed(uri, get_cached=get_cached) if get_cached and download_res.feedpath == 'not_cached': return assert not isinstance(download_res.feedpath, str) parser_res = parse_feed( feedpath=download_res.feedpath, rss_link_=download_res.rss_link, failed=download_res.failed, error=download_res.error ) if parser_res.is_null: feed_uri_from_html = extract_feed_url_from_html(uri) if feed_uri_from_html is not None: feeds = self.confman.nconf.feeds if uri in feeds.keys(): feeds.pop(uri) self.confman.nconf.feeds = feeds self._add_feed_async_worker(feed_uri_from_html, refresh) return self.errors.append(parser_res.error) self.problematic_feeds.append(uri) else: n_feed = self.feed_store.get_feed( parser_res.feed_identifier ) if n_feed is None: n_feed = Feed( rss_link=parser_res.rss_link, title=parser_res.title, link=parser_res.link, description=parser_res.description, image_url=parser_res.image_url, favicon_path=parser_res.favicon_path, sd_feed=parser_res.sd_feed, raw_entries=parser_res.raw_entries ) GLib.idle_add( self.feed_store.add_feed, n_feed, priority=GLib.PRIORITY_LOW ) else: n_feed.update( rss_link=parser_res.rss_link, title=parser_res.title, link=parser_res.link, description=parser_res.description, image_url=parser_res.image_url, favicon_path=parser_res.favicon_path, sd_feed=parser_res.sd_feed, raw_entries=parser_res.raw_entries ) for fi in n_feed.items.values(): if ( n_feed.rss_link+fi.identifier not in [ ofi.parent_feed.rss_link+ofi.identifier for ofi in self.article_store.list_store if ofi ] ): GLib.idle_add( self.article_store.add_new_items, [fi], priority=GLib.PRIORITY_LOW ) if not get_cached: GLib.idle_add(self.__increment_new_items_num) if not refresh: GLib.idle_add( self.emit, 'feedmanager_refresh_end', '' ) def refresh( self, *__, get_cached: bool = False, is_startup: bool = False ): self.__feeds_loaded = 0 self.is_refreshing = True self.emit( 'feedmanager_refresh_start', 'startup' if is_startup else '' ) self.errors = [] self.problematic_feeds = [] self.new_items_num = 0 def cb(res): _get_cached = get_cached if res: self.emit('feedmanager_online_changed', True) else: self.emit('feedmanager_online_changed', False) _get_cached = True # self.emit('feedmanager_refresh_end', '') # return self.continue_refresh(_get_cached) is_online(cb) def __signal_refresh_end(self): self.emit('feedmanager_refresh_end', '') self.is_refreshing = False def continue_refresh(self, get_cached): self.trim_feeds_items_by_age() tp = ThreadPool( self.confman.nconf.max_refresh_threads, self._add_feed_async_worker, [ (f_link, True, get_cached) for f_link in self.confman.nconf.feeds.keys() ], self.__signal_refresh_end, tuple() ) tp.start() def trim_feeds_items_by_age(self): now = pytz.UTC.localize(datetime.utcnow()) to_rm = [] for item in cast(Iterable, self.article_store.list_store): item_age = now - item.pub_date if item_age > self.confman.max_article_age: to_rm.append(item) self.article_store.remove_items(to_rm) def start_auto_refresh(self): if self.auto_refresh_thread is not None: if self.auto_refresh_thread.is_alive(): self.__auto_refresh_event.set() self.auto_refresh_thread.join() self.__auto_refresh_event.clear() if self.confman.nconf.auto_refresh_enabled: self.auto_refresh_thread = Thread( target=self._auto_refresh_worker, daemon=True ).start() def _auto_refresh_worker(self): if not self.confman.nconf.auto_refresh_enabled: self.__auto_refresh_event.clear() return # when event.wait returns True the flag has been manually set, so in # case, it means a manual refresh occurred, so we can terminate the # auto-refresh for now if self.__auto_refresh_event.wait( self.confman.nconf.auto_refresh_time_seconds ): self.__auto_refresh_event.clear() return # if False, the timeout has been reached, so we do the auto refresh self.__auto_refresh_event.clear() GLib.idle_add(self.refresh) def add_feed(self, uri: str, is_new: bool = False) -> bool: if is_new and uri in self.confman.nconf.feeds.keys(): return False self.emit('feedmanager_refresh_start', '') self.errors = [] t = Thread( target=self._add_feed_async_worker, args=(uri,), daemon=True ) t.start() return True def delete_feeds(self, targets: Union[List[Feed], Feed], *_): if not isinstance(targets, list): if isinstance(targets, Feed): targets = [targets] else: raise TypeError('delete_feed: targets must be list or Feed') articles_to_rm = [] n_selected_feeds = self.article_store.selected_feeds.copy() feeds = self.confman.nconf.feeds for to_rm in targets: articles_to_rm.extend(to_rm.items.values()) if to_rm.rss_link in n_selected_feeds: n_selected_feeds.remove(to_rm.rss_link) self.feed_store.remove_feed(to_rm) feeds.pop( to_rm.rss_link ) self.confman.nconf.feeds = feeds self.article_store.set_selected_feeds(n_selected_feeds) self.article_store.remove_items(articles_to_rm) def import_opml(self, opml_path: Union[str, Path]): def af(p: Union[str, Path]): n_feeds_urls_l = opml_to_rss_list(p) for tag in [t for f in n_feeds_urls_l for t in f.tags]: GLib.idle_add(self.tag_store.add_tag, tag) feeds = self.confman.nconf.feeds for f in n_feeds_urls_l: url = f.feed if url not in feeds.keys(): feeds[url] = {'tags': f.tags} self.confman.nconf.feeds = feeds GLib.idle_add(self.refresh) Thread( target=af, args=(opml_path,), daemon=True ).start() def __tick_feeds_loaded(self): self.__feeds_loaded += 1 self.emit( 'feedmanager_feeds_loaded_changed', self.__feeds_loaded / max( len(self.confman.nconf.feeds), 1 ) ) def cleanup_read_items(self): if self.is_refreshing: return avail_feed_ids = [ fi.identifier for fi in cast( Iterable, self.article_store.list_store ) ] clean_read_items = [ item for item in self.confman.nconf.read_items if item in avail_feed_ids ] self.confman.nconf.read_items = clean_read_items gfeeds-2.2.0/gfeeds/feeds_view.py000066400000000000000000000136751440757451400167260ustar00rootroot00000000000000from gettext import gettext as _ from gi.repository import GObject, Gtk, Pango from gfeeds.confManager import ConfManager from gfeeds.feeds_manager import FeedsManager from gfeeds.feed import Feed from gfeeds.simple_avatar import SimpleAvatar class FeedsViewAllListboxRow(Gtk.ListBoxRow): def __init__(self): super().__init__() self.label = Gtk.Label( label=_('All feeds'), margin_top=12, margin_bottom=12 ) self.set_child(self.label) class FeedsViewListboxRow(Gtk.ListBoxRow): def __init__(self, feed, description=True, count=True): super().__init__() self.confman = ConfManager() self.feed = feed self.title = feed.title self.builder = Gtk.Builder.new_from_resource( '/org/gabmus/gfeeds/ui/manage_feeds_listbox_row.ui' ) self.hbox = self.builder.get_object('hbox') self.checkbox = self.builder.get_object('check') self.checkbox.set_visible(False) self.icon_container = self.builder.get_object('icon_container') self.icon = SimpleAvatar() self.icon.set_image( self.feed.title, self.feed.favicon_path ) self.icon_container.append(self.icon) self.name_label = self.builder.get_object('title_label') self.name_label.set_text(self.feed.title) self.confman.connect( 'gfeeds_full_feed_name_changed', self.on_full_feed_name_changed ) self.desc_label = self.builder.get_object('description_label') self.desc_label.set_visible(description) if description: self.desc_label.set_text(self.feed.description) else: self.name_label.set_ellipsize(Pango.EllipsizeMode.END) count_box = self.builder.get_object('count_box') self.count_label = self.builder.get_object('count_label') if count: if self.feed.unread_count == 0: self.count_label.set_visible(False) else: self.count_label.set_text(str(self.feed.unread_count)) def transform_to(binding, value, user_data=None): return value > 0 self.feed.bind_property( 'unread-count', self.count_label, 'visible', GObject.BindingFlags.DEFAULT, None, transform_to ) self.feed.bind_property( 'unread-count', self.count_label, 'label', GObject.BindingFlags.DEFAULT ) else: count_box.set_visible(False) self.set_child(self.hbox) self.on_full_feed_name_changed() def on_full_feed_name_changed(self, *args): self.name_label.set_ellipsize( Pango.EllipsizeMode.NONE if self.confman.nconf.full_feed_name else Pango.EllipsizeMode.END ) def __repr__(self): return f'' class FeedsViewTagListboxRow(Gtk.ListBoxRow): def __init__(self, tag): super().__init__() self.tag = tag self.title = tag.name self.builder = Gtk.Builder.new_from_resource( '/org/gabmus/gfeeds/ui/manage_feeds_listbox_row.ui' ) self.hbox = self.builder.get_object('hbox') self.checkbox = self.builder.get_object('check') self.checkbox.set_visible(False) self.icon_container = self.builder.get_object('icon_container') self.icon = Gtk.Image( icon_name='tag-symbolic', pixel_size=24, halign=Gtk.Align.CENTER, valign=Gtk.Align.CENTER, margin_start=4, margin_end=4 ) self.icon_container.append(self.icon) self.name_label = self.builder.get_object('title_label') self.name_label.set_text(tag.name.capitalize()) self.desc_label = self.builder.get_object('description_label') self.desc_label.set_visible(False) self.set_child(self.hbox) self.count_label = self.builder.get_object('count_label') if self.tag.unread_count > 0: self.count_label.set_text(str(self.tag.unread_count)) else: self.count_label.set_visible(False) def transform_to(binding, value, user_data=None): return value > 0 self.tag.bind_property( 'unread-count', self.count_label, 'visible', GObject.BindingFlags.DEFAULT, None, transform_to ) self.tag.bind_property( 'unread-count', self.count_label, 'label', GObject.BindingFlags.DEFAULT ) def __repr__(self): return f'' class FeedsViewListbox(Gtk.ListBox): __gtype_name__ = 'FeedsViewListbox' def __init__( self, description=True, selection_mode=Gtk.SelectionMode.SINGLE, row_class=FeedsViewListboxRow, do_filter=True ): super().__init__(selection_mode=selection_mode) self.get_style_context().add_class('navigation-sidebar') self.get_style_context().add_class('background') self.description = description self.feedman = FeedsManager() self.confman = ConfManager() self.row_class = row_class self.bind_model( self.feedman.feed_store if do_filter else self.feedman.feed_store.sort_store, self.__create_feed_row, None ) def __create_feed_row(self, feed: Feed, *__) -> Gtk.ListBoxRow: row = self.row_class(feed, description=self.description) return row class FeedsViewScrolledWindow(Gtk.ScrolledWindow): def __init__(self, description=True): super().__init__( hscrollbar_policy=Gtk.PolicyType.NEVER, vscrollbar_policy=Gtk.PolicyType.AUTOMATIC, hexpand=False, vexpand=True, width_request=250 ) self.listbox = FeedsViewListbox(description) self.all_row = FeedsViewAllListboxRow() self.set_child(self.listbox) gfeeds-2.2.0/gfeeds/filter_view.py000066400000000000000000000042261440757451400171150ustar00rootroot00000000000000from gi.repository import Gtk, Adw from gfeeds.confManager import ConfManager from gfeeds.feeds_manager import FeedsManager from gfeeds.feeds_view import ( FeedsViewAllListboxRow, FeedsViewListbox, FeedsViewTagListboxRow ) from gfeeds.tag_store import TagObj @Gtk.Template(resource_path='/org/gabmus/gfeeds/ui/filter_view.ui') class FilterView(Adw.Bin): __gtype_name__ = 'FilterView' all_listbox = Gtk.Template.Child() tags_listbox = Gtk.Template.Child() feeds_listbox_bin = Gtk.Template.Child() def __init__(self): super().__init__() self.feedman = FeedsManager() self.confman = ConfManager() self.feeds_listbox = FeedsViewListbox(False) self.feeds_listbox.connect( 'row-activated', self.on_feeds_row_activated ) self.feeds_listbox.connect( 'row-selected', self.on_feed_row_selected ) self.feeds_listbox_bin.set_child(self.feeds_listbox) self.all_listbox_row = FeedsViewAllListboxRow() self.all_listbox.append(self.all_listbox_row) self.all_listbox.select_row(self.all_listbox_row) self.tags_listbox.bind_model( self.feedman.tag_store, self.__create_tag_row, None ) def __create_tag_row(self, tag: TagObj, *args) -> FeedsViewTagListboxRow: row = FeedsViewTagListboxRow(tag) return row @Gtk.Template.Callback() def on_all_row_activated(self, *_): for lb in (self.tags_listbox, self.feeds_listbox): lb.select_row(None) self.confman.emit('gfeeds_filter_changed', None) @Gtk.Template.Callback() def on_tags_row_activated(self, _, row): for lb in (self.all_listbox, self.feeds_listbox): lb.select_row(None) self.confman.emit('gfeeds_filter_changed', [row.title]) def on_feeds_row_activated(self, _, row): for lb in (self.all_listbox, self.tags_listbox): lb.select_row(None) self.confman.emit('gfeeds_filter_changed', row.feed) def on_feed_row_selected(self, _, row): if not row and not self.tags_listbox.get_selected_row(): self.all_listbox.select_row(self.all_listbox_row) gfeeds-2.2.0/gfeeds/get_children.py000066400000000000000000000012261440757451400172220ustar00rootroot00000000000000from gi.repository import Gtk def __is_valid_true(_: Gtk.Widget): return True def __is_valid_listbox(c: Gtk.Widget): return isinstance(c, Gtk.ListBoxRow) def get_children(container): is_valid = __is_valid_true first_child = container.get_first_child() if first_child is None: return [] if isinstance(container, Gtk.ListBox): is_valid = __is_valid_listbox res = [] if is_valid(first_child): res.append(first_child) child = first_child.get_next_sibling() while child is not None: if is_valid(child): res.append(child) child = child.get_next_sibling() return res gfeeds-2.2.0/gfeeds/gsettings_wrapper.py000066400000000000000000000066161440757451400203520ustar00rootroot00000000000000import json from typing import Callable, Dict, Union from gi.repository import GLib, Gio from datetime import datetime class CustomJSONEncoder(json.JSONEncoder): def default(self, o): if isinstance(o, datetime): return o.isoformat() return super().default(o) class CustomJSONDecoder(json.JSONDecoder): def __init__(self, *args, **kwargs): super().__init__(*args, object_hook=self.obj_hook, **kwargs) def obj_hook(self, jdict): for (key, value) in jdict.items(): if isinstance(value, str) and '-' in value and ':' in value: try: jdict[key] = datetime.fromisoformat(value) except Exception: pass return jdict def __convert_string_variant(v: GLib.Variant) -> Union[str, dict, list]: res = v.get_string() if ( (res.startswith('{') and res.endswith('}')) or (res.startswith('[') and res.endswith(']')) ): return json.loads(res, cls=CustomJSONDecoder) return res GSETTINGS_TYPES = Union[str, int, float, bool, dict, list] VARIANT_CONVERTERS: Dict[str, Callable[[GLib.Variant], GSETTINGS_TYPES]] = { 's': __convert_string_variant, 'i': lambda v: int(v.get_int32()), 'd': lambda v: float(v.get_double()), 'b': lambda v: v.get_boolean(), } class GsettingsWrapper: def __init__(self, package: str): self.package = package if self.package not in Gio.Settings.list_schemas(): raise KeyError( f'GsettingsWrapper: Schema {self.package} not installed' ) self.gs: Gio.Settings = Gio.Settings.new(self.package) self.__keys = self.gs.keys() @property def keys(self): return self.__keys def convert_and_check_key(self, key: str) -> str: key = key.replace('_', '-') if key not in self.__keys: raise KeyError( f'GsettingsWrapper: key `{key}` not found in schema' ) return key def get(self, key: str) -> GSETTINGS_TYPES: key = self.convert_and_check_key(key) return self.raw_get(key) def raw_get(self, key: str) -> GSETTINGS_TYPES: v = self.gs.get_value(key) converter = VARIANT_CONVERTERS.get(v.get_type_string(), None) if converter is None: return self.__type_err() return converter(v) def set(self, key: str, value: GSETTINGS_TYPES): key = self.convert_and_check_key(key) match value: case str(value): self.gs.set_string(key, value) case dict(value) | list(value): self.set(key, json.dumps(value, cls=CustomJSONEncoder)) case bool(value): self.gs.set_boolean(key, value) case int(value): self.gs.set_int(key, value) case float(value): self.gs.set_double(key, value) case _: return self.__type_err() def __type_err(self): raise TypeError( 'GsettingsWrapper: Type not supported' ) def __getitem__(self, key: str) -> GSETTINGS_TYPES: return self.get(key) def __setitem__(self, key: str, value: GSETTINGS_TYPES): self.set(key, value) def to_json_str(self) -> str: return json.dumps({ k: self.get(k) for k in self.__keys }, indent=4, cls=CustomJSONEncoder) gfeeds-2.2.0/gfeeds/headerbar.py000066400000000000000000000155651440757451400165230ustar00rootroot00000000000000from gettext import gettext as _ from typing import Dict, Optional from gi.repository import Adw, GObject, Gtk from gfeeds.confManager import ConfManager from gfeeds.feeds_manager import FeedsManager from xml.sax.saxutils import escape from gfeeds.scrolled_dialog import ScrolledDialogResponse, ScrolledDialog from gfeeds.webview import GFeedsWebView VIEW_MODE_ICONS = { 'webview': 'globe-alt-symbolic', 'reader': 'ephy-reader-mode-symbolic', 'feedcont': 'application-rss+xml-symbolic' } @Gtk.Template(resource_path='/org/gabmus/gfeeds/ui/add_feed_popover.ui') class AddFeedPopover(Gtk.Popover): __gtype_name__ = 'AddFeedPopover' confirm_btn = Gtk.Template.Child() url_entry = Gtk.Template.Child() already_subscribed_revealer = Gtk.Template.Child() def __init__(self, relative_to): super().__init__() self.confman = ConfManager() self.feedman = FeedsManager() relative_to.set_popover(self) @Gtk.Template.Callback() def on_url_entry_changed(self, *__): self.already_subscribed_revealer.set_reveal_child(False) @Gtk.Template.Callback() def on_url_entry_activate(self, *__): if self.confirm_btn.get_sensitive(): self.on_confirm_btn_clicked(self.confirm_btn) @Gtk.Template.Callback() def on_confirm_btn_clicked(self, __): url = self.url_entry.get_text().strip() if not url: return feed_is_new = self.feedman.add_feed(url, True) if feed_is_new: self.popdown() self.already_subscribed_revealer.set_reveal_child(False) else: self.already_subscribed_revealer.set_reveal_child(True) @Gtk.Template(resource_path='/org/gabmus/gfeeds/ui/right_headerbar.ui') class RightHeaderbar(Gtk.WindowHandle): __gtype_name__ = 'RightHeaderbar' __gsignals__ = { 'go_back': ( GObject.SignalFlags.RUN_LAST, None, (str,) ) } right_headerbar = Gtk.Template.Child() view_mode_menu_btn = Gtk.Template.Child() extra_menu_btn = Gtk.Template.Child() zoom_in_btn = Gtk.Template.Child() zoom_out_btn = Gtk.Template.Child() zoom_reset_btn = Gtk.Template.Child() title_squeezer = Gtk.Template.Child() right_title_container = Gtk.Template.Child() title_label = Gtk.Template.Child() back_btn = Gtk.Template.Child() def __init__(self, webview: Optional[GFeedsWebView] = None): super().__init__() self.confman = ConfManager() self.webview = webview self.set_view_mode_icon(self.confman.nconf.default_view) self.on_zoom_changed(None, self.confman.nconf.webview_zoom) @GObject.Property(type=GFeedsWebView, default=None, nick='webview') def webview(self) -> GFeedsWebView: # type: ignore return self.__webview @webview.setter def webview(self, wv: GFeedsWebView): self.__webview = wv if wv is None: return self.__webview.connect('gfeeds_webview_load_start', self.on_load_start) self.__webview.connect('zoom_changed', self.on_zoom_changed) @Gtk.Template.Callback() def on_zoom_in_btn_clicked(self, *__): if self.webview is None: return self.webview.key_zoom_in() @Gtk.Template.Callback() def on_zoom_out_btn_clicked(self, *__): if self.webview is None: return self.webview.key_zoom_out() @Gtk.Template.Callback() def on_zoom_reset_btn_clicked(self, *__): if self.webview is None: return self.webview.key_zoom_reset() @Gtk.Template.Callback() def on_back_btn_clicked(self, *__): self.emit('go_back', '') def on_zoom_changed(self, __, n_zoom: float): self.zoom_reset_btn.set_label(f'{round(n_zoom*100)}%') def set_view_mode_icon(self, mode): self.view_mode_menu_btn.set_icon_name( VIEW_MODE_ICONS[mode] ) def on_view_mode_change(self, target): self.set_view_mode_icon(target) def set_article_title(self, title): self.title_label.set_text(title) def on_load_start(self, *_): self.view_mode_menu_btn.set_sensitive(True) @Gtk.Template(resource_path='/org/gabmus/gfeeds/ui/left_headerbar.ui') class LeftHeaderbar(Gtk.WindowHandle): __gtype_name__ = 'LeftHeaderbar' left_headerbar = Gtk.Template.Child() menu_btn = Gtk.Template.Child() filter_btn = Gtk.Template.Child() add_btn = Gtk.Template.Child() refresh_btn = Gtk.Template.Child() search_btn = Gtk.Template.Child() errors_btn = Gtk.Template.Child() def __init__(self, searchbar: Optional[Gtk.SearchBar] = None): super().__init__() self.confman = ConfManager() self.feedman = FeedsManager() self.searchbar = searchbar self.add_popover = AddFeedPopover(self.add_btn) self.add_btn.set_popover(self.add_popover) self.feedman.connect( 'feedmanager_refresh_start', self.on_new_feed_add_start ) self.feedman.connect( 'feedmanager_refresh_end', self.on_new_feed_add_end ) self.on_new_feed_add_start() @GObject.Property( type=Gtk.SearchBar, default=None, nick='searchbar' ) def searchbar(self) -> Gtk.SearchBar: # type: ignore return self.__searchbar @searchbar.setter def searchbar(self, sb: Gtk.SearchBar): self.__searchbar = sb @Gtk.Template.Callback() def on_refresh_btn_clicked(self, *__): self.feedman.refresh() @Gtk.Template.Callback() def show_errors_dialog(self, *__): def on_remove(d: ScrolledDialog, _): d.close() feeds: Dict[str, dict] = self.confman.nconf.feeds for pf in self.feedman.problematic_feeds: if pf in feeds.keys(): feeds.pop(pf) self.confman.nconf.feeds = feeds self.errors_btn.set_visible(False) def on_keep(d: ScrolledDialog, _): d.close() self.errors_btn.set_visible(True) dialog = ScrolledDialog( self.get_root(), # type: ignore _( 'There were problems with some feeds.' ' Do you want to remove them?' ), escape('\n'.join(self.feedman.errors)), [ ScrolledDialogResponse('keep', _('_Keep'), on_keep), ScrolledDialogResponse( 'remove', _('_Remove'), on_remove, Adw.ResponseAppearance.DESTRUCTIVE ) ] ) dialog.present() def on_new_feed_add_start(self, *_): self.refresh_btn.set_sensitive(False) self.add_popover.confirm_btn.set_sensitive(False) def on_new_feed_add_end(self, *_): self.refresh_btn.set_sensitive(True) self.add_popover.confirm_btn.set_sensitive(True) self.add_popover.url_entry.set_text('') gfeeds-2.2.0/gfeeds/main_leaflet.py000066400000000000000000000134041440757451400172140ustar00rootroot00000000000000from gettext import ngettext from functools import reduce from typing import Optional from gfeeds.filter_view import FilterView from gfeeds.feed_item import FeedItem from gfeeds.stack_with_empty_state import StackWithEmptyState from operator import or_ from subprocess import Popen from gi.repository import GObject, Gtk, Adw, Gio from gfeeds.sidebar import GFeedsSidebar from gfeeds.webview import GFeedsWebView from gfeeds.headerbar import LeftHeaderbar, RightHeaderbar from gfeeds.confManager import ConfManager from gfeeds.feeds_manager import FeedsManager @Gtk.Template(resource_path='/org/gabmus/gfeeds/ui/main_leaflet.ui') class MainLeaflet(Adw.Bin): __gtype_name__ = 'MainLeaflet' left_box = Gtk.Template.Child() right_box = Gtk.Template.Child() leaflet = Gtk.Template.Child() connection_bar: Gtk.InfoBar = Gtk.Template.Child() left_headerbar: LeftHeaderbar = Gtk.Template.Child() filter_view: FilterView = Gtk.Template.Child() searchbar: Gtk.SearchBar = Gtk.Template.Child() searchbar_entry: Gtk.SearchEntry = Gtk.Template.Child() filter_flap: Adw.Flap = Gtk.Template.Child() sidebar_stack: StackWithEmptyState = Gtk.Template.Child() sidebar: GFeedsSidebar = Gtk.Template.Child() webview: GFeedsWebView = Gtk.Template.Child() right_headerbar: RightHeaderbar = Gtk.Template.Child() def __init__(self): super().__init__() self.confman = ConfManager() self.feedman = FeedsManager() self.sidebar.listview_sw.connect_activate( self.on_sidebar_row_activated ) self.filter_flap.bind_property( 'reveal-flap', self.left_headerbar.filter_btn, 'active', GObject.BindingFlags.BIDIRECTIONAL ) self.confman.connect( 'gfeeds_filter_changed', self.on_filter_changed ) self.searchbar_entry.connect( 'changed', lambda entry: self.sidebar.set_search(entry.get_text()) ) self.searchbar.bind_property( 'search-mode-enabled', self.left_headerbar.search_btn, 'active', GObject.BindingFlags.BIDIRECTIONAL ) self.feedman.connect( 'feedmanager_refresh_end', self.on_refresh_end ) self.feedman.connect( 'feedmanager_online_changed', lambda _, value: self.connection_bar.set_revealed(not value) ) self.on_leaflet_folded() def on_filter_changed(self, *_): self.left_headerbar.filter_btn.set_active(False) # reset vertical scroll position to 0 adjustment = self.sidebar.listview_sw.get_vadjustment() adjustment.set_value(0) self.sidebar.listview_sw.set_vadjustment(adjustment) @Gtk.Template.Callback() def on_leaflet_folded(self, *_): rh = self.right_headerbar.right_headerbar lh = self.left_headerbar.left_headerbar if self.leaflet.get_folded(): self.right_headerbar.back_btn.set_visible(True) rh.set_show_start_title_buttons(True) rh.set_show_end_title_buttons(True) lh.set_show_start_title_buttons(True) lh.set_show_end_title_buttons(True) else: self.right_headerbar.back_btn.set_visible(False) rh.set_show_start_title_buttons(False) rh.set_show_end_title_buttons(True) lh.set_show_start_title_buttons(True) lh.set_show_end_title_buttons(False) @Gtk.Template.Callback() def on_back_btn_clicked(self, *_): self.leaflet.set_visible_child(self.left_box) self.on_leaflet_folded() def on_view_mode_change(self, target): self.right_headerbar.on_view_mode_change(target) self.webview.change_view_mode(target) def on_refresh_end(self, *_): self.left_headerbar.errors_btn.set_visible( len(self.feedman.errors) > 0 ) self.sidebar.listview_sw.all_items_changed() self.sidebar.loading_revealer.set_running(False) if ( self.confman.nconf.notify_new_articles and not self.get_root().is_active() and # window is not focused self.feedman.new_items_num > 0 ): notif_text = ngettext( '{0} new article', '{0} new articles', self.feedman.new_items_num ).format(self.feedman.new_items_num) notif = Gio.Notification.new(notif_text) notif.set_icon(Gio.ThemedIcon.new( 'org.gabmus.gfeeds-symbolic' )) self.get_root().app.send_notification('new_articles', notif) def on_sidebar_row_activated(self, feed_item: Optional[FeedItem]): self.feedman.article_store.set_selected_article(feed_item) if not feed_item: return feed_item.read = True if ( self.confman.nconf.open_youtube_externally and reduce(or_, [ f'://{pfx}' in feed_item.link # type: ignore for pfx in [ p + 'youtube.com' for p in ('', 'www.', 'm.') ] ]) ): cmd_parts = [ self.confman.nconf.media_player, f'"{feed_item.link}"' ] if self.confman.is_flatpak: cmd_parts.insert(0, 'flatpak-spawn --host') cmd = ' '.join(cmd_parts) Popen(cmd, shell=True) return self.webview.load_feeditem(feed_item) self.right_headerbar.set_article_title( feed_item.title ) self.right_headerbar.extra_menu_btn.set_sensitive(True) self.leaflet.set_visible_child(self.right_box) self.on_leaflet_folded() self.sidebar.listview_sw.invalidate_filter() feed_item.emit('changed', '') gfeeds-2.2.0/gfeeds/manage_feeds_window.py000066400000000000000000000266571440757451400205770ustar00rootroot00000000000000from gettext import gettext as _ from gfeeds.accel_manager import add_accelerators, Accelerator from gi.repository import Gtk, GObject, Adw from xml.sax.saxutils import escape from gfeeds.confManager import ConfManager from gfeeds.feeds_manager import FeedsManager from gfeeds.feeds_view import ( FeedsViewListbox, FeedsViewListboxRow ) from gfeeds.scrolled_dialog import ScrolledDialogResponse, ScrolledDialog from gfeeds.get_children import get_children from gfeeds.tag_store import TagObj @Gtk.Template(resource_path='/org/gabmus/gfeeds/ui/manage_tags_listbox_row.ui') class ManageTagsListboxRow(Gtk.ListBoxRow): __gtype_name__ = 'ManageTagsListboxRow' label = Gtk.Template.Child() checkbox = Gtk.Template.Child() delete_btn = Gtk.Template.Child() __gsignals__ = { 'tag_deleted': ( GObject.SignalFlags.RUN_FIRST, None, (str,) # tag deleted ), } def __init__(self, tag, active=True): super().__init__() self.tag = tag self.checkbox.set_active(active) self.label.set_text(self.tag) self.checkbox_handler_id = self.checkbox.connect( 'toggled', self.on_checkbox_toggled ) @Gtk.Template.Callback() def on_delete_btn_clicked(self, *args): self.emit('tag_deleted', self.tag) def on_checkbox_toggled(self, checkbox): with checkbox.handler_block(self.checkbox_handler_id): checkbox.set_inconsistent(False) checkbox.set_active(not checkbox.get_active()) self.emit('activate') @Gtk.Template(resource_path='/org/gabmus/gfeeds/ui/manage_tags_content.ui') class ManageTagsContent(Adw.Bin): __gtype_name__ = 'ManageTagsContent' add_tag_btn = Gtk.Template.Child() tags_entry = Gtk.Template.Child() tags_listbox = Gtk.Template.Child() __gsignals__ = { 'new_tag_added': ( GObject.SignalFlags.RUN_FIRST, None, (str,) # tag added ), # removed or deleted? # removed: removed from selected feeds # deleted: deleted from the whole app 'tag_removed': ( GObject.SignalFlags.RUN_FIRST, None, (str,) # tag removed ), 'tag_deleted': ( GObject.SignalFlags.RUN_FIRST, None, (str,) # tag deleted ), } def __init__(self, flap, window): super().__init__() self.confman = ConfManager() self.feedman = FeedsManager() self.flap = flap self.window = window self.tags_listbox.bind_model( self.feedman.tag_store.sort_store, self.__create_tag_row, None ) @Gtk.Template.Callback() def on_submit_add_tag(self, *_): n_tag = self.tags_entry.get_text().strip() if not n_tag: return self.emit('new_tag_added', n_tag) self.tags_entry.set_text('') def __create_tag_row(self, tag: TagObj, *_) -> ManageTagsListboxRow: row = ManageTagsListboxRow(tag.name, True) row.connect('tag_deleted', self.on_tag_deleted) return row @Gtk.Template.Callback() def on_tags_listbox_row_activated(self, _, row): with row.checkbox.handler_block(row.checkbox_handler_id): row.checkbox.set_inconsistent(False) row.checkbox.set_active(not row.checkbox.get_active()) if row.checkbox.get_active(): self.emit('new_tag_added', row.tag) else: self.emit('tag_removed', row.tag) def tags_listbox_get_row_by_tag(self, tag): for row in get_children(self.tags_listbox): if row.tag == tag: return row return None @Gtk.Template.Callback() def on_tags_entry_changed(self, *_): self.add_tag_btn.set_sensitive( self.tags_entry.get_text().strip() != '' ) def on_tag_deleted(self, caller, tag): self.feedman.tag_store.remove_tag(tag) self.emit('tag_deleted', tag) def set_reveal(self, reveal: bool): if not reveal: return self.flap.set_reveal_flap(False) self.add_tag_btn.set_sensitive(False) self.tags_entry.set_text('') selected_feeds = [f.rss_link for f in self.window.get_selected_feeds()] for tag in self.confman.nconf.tags: all_have_tag = True some_have_tag = False for feed in selected_feeds: if ( 'tags' in self.confman.nconf.feeds[feed].keys() and tag in self.confman.nconf.feeds[feed]['tags'] ): some_have_tag = True else: all_have_tag = False t_row = self.tags_listbox_get_row_by_tag(tag) if t_row is not None: with t_row.checkbox.handler_block(t_row.checkbox_handler_id): t_row.checkbox.set_inconsistent(False) if some_have_tag and not all_have_tag: t_row.checkbox.set_inconsistent(True) elif all_have_tag: t_row.checkbox.set_active(True) else: t_row.checkbox.set_active(False) self.flap.set_reveal_flap(True) @Gtk.Template(resource_path='/org/gabmus/gfeeds/ui/manage_feeds_headerbar.ui') class ManageFeedsHeaderbar(Gtk.HeaderBar): __gtype_name__ = 'ManageFeedsHeaderbar' tags_btn = Gtk.Template.Child() select_all_btn = Gtk.Template.Child() delete_btn = Gtk.Template.Child() def __init__(self, flap): super().__init__() self.confman = ConfManager() self.flap = flap def set_actions_sensitive(self, state): for w in (self.delete_btn, self.tags_btn): w.set_sensitive(state) self.flap.set_swipe_to_open(state) class ManageFeedsListboxRow(FeedsViewListboxRow): def __init__(self, feed, **kwargs): super().__init__(feed, count=False, **kwargs) self.checkbox.set_visible(True) self.checkbox_handler_id = self.checkbox.connect( 'toggled', self.on_checkbox_toggled ) def on_checkbox_toggled(self, checkbox): with checkbox.handler_block(self.checkbox_handler_id): checkbox.set_active(not checkbox.get_active()) self.emit('activate') class ManageFeedsListbox(FeedsViewListbox): def __init__(self): super().__init__( selection_mode=Gtk.SelectionMode.NONE, row_class=ManageFeedsListboxRow, do_filter=False ) self.connect('row-activated', self.on_row_activated) def on_row_activated(self, _, row): with row.checkbox.handler_block(row.checkbox_handler_id): row.checkbox.set_active(not row.checkbox.get_active()) class ManageFeedsScrolledWindow(Gtk.ScrolledWindow): def __init__(self): super().__init__( vexpand=True, hscrollbar_policy=Gtk.PolicyType.NEVER, vscrollbar_policy=Gtk.PolicyType.AUTOMATIC, width_request=360, height_request=500 ) self.listbox = ManageFeedsListbox() self.set_child(self.listbox) class GFeedsManageFeedsWindow(Adw.Window): def __init__(self, appwindow, **kwargs): super().__init__( modal=True, transient_for=appwindow, **kwargs ) self.appwindow = appwindow self.confman = ConfManager() self.feedman = FeedsManager() self.main_box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL) self.scrolled_window = ManageFeedsScrolledWindow() self.listbox = self.scrolled_window.listbox self.flap = Adw.Flap( flap_position=Gtk.PackType.START, fold_policy=Adw.FlapFoldPolicy.ALWAYS, modal=True, reveal_flap=False, swipe_to_open=True, swipe_to_close=True ) self.tags_flap = ManageTagsContent(self.flap, self) self.flap.set_content(self.scrolled_window) self.flap.set_flap(self.tags_flap) self.headerbar = ManageFeedsHeaderbar(self.flap) self.flap.bind_property( 'reveal-flap', self.headerbar.tags_btn, 'active', GObject.BindingFlags.BIDIRECTIONAL ) self.headerbar.delete_btn.connect( 'clicked', self.on_delete_clicked ) self.headerbar.select_all_btn.connect( 'clicked', self.on_select_all_clicked ) self.listbox.connect('row-activated', self.on_row_activated) self.set_title(_('Manage Feeds')) self.window_handle = Gtk.WindowHandle() self.window_handle.set_child(self.headerbar) self.main_box.append(self.window_handle) self.window_handle.set_vexpand(False) self.main_box.append(self.flap) self.set_content(self.main_box) self.__auto_shortcut_controller = add_accelerators( self, [Accelerator('Escape', lambda *_: self.close())] ) self.tags_flap.connect( 'new_tag_added', self.on_new_tag_added ) self.tags_flap.connect( 'tag_removed', self.on_tag_removed ) def on_new_tag_added(self, _, tag): self.feedman.tag_store.add_tag( tag, self.get_selected_feeds() ) # TODO if tag is currently selected invalidate filter def on_tag_removed(self, _, tag_name): self.confman.remove_tag( tag_name, [feed.rss_link for feed in self.get_selected_feeds()] ) # TODO if tag is currently selected invalidate filter tag = self.feedman.tag_store.get_tag(tag_name) if tag is not None: for feed in self.get_selected_feeds(): if tag in feed.tags: feed.tags.remove(tag) tag.unread_count -= feed.unread_count def get_selected_feeds(self): return [ row.feed for row in get_children(self.listbox) if row.checkbox.get_active() ] def on_delete_clicked(self, *__): selected_feeds = self.get_selected_feeds() def on_delete(_dialog, res): _dialog.close() self.feedman.delete_feeds(selected_feeds) self.headerbar.set_actions_sensitive(False) def on_cancel(_dialog, res): _dialog.close() dialog = ScrolledDialog( parent=self, title=_('Do you want to delete these feeds?'), body='\n'.join([escape(f.title) for f in selected_feeds]), responses=[ ScrolledDialogResponse('cancel', _('_Cancel'), on_cancel), ScrolledDialogResponse( 'delete', _('_Delete'), on_delete, Adw.ResponseAppearance.DESTRUCTIVE ) ] ) dialog.present() def on_select_all_clicked(self, *_): unselect = True for row in get_children(self.listbox): if not row.checkbox.get_active(): unselect = False row.emit('activate') if unselect: for row in get_children(self.listbox): row.emit('activate') def on_row_activated(self, listbox, _): for row in get_children(listbox): if row.checkbox.get_active(): self.headerbar.set_actions_sensitive(True) return self.headerbar.set_actions_sensitive(False) gfeeds-2.2.0/gfeeds/opml_file_chooser.py000066400000000000000000000017421440757451400202660ustar00rootroot00000000000000from gettext import gettext as _ from gi.repository import Gtk def get_xml_filter(): filter = Gtk.FileFilter() filter.set_name(_('XML files')) filter.add_mime_type('text/xml') return filter def GFeedsOpmlFileChooserDialog(parent_window): return Gtk.FileChooserNative( title=_('Choose an OPML file to import'), transient_for=parent_window, modal=True, action=Gtk.FileChooserAction.OPEN, accept_label=_('Open'), cancel_label=_('Cancel'), filter=get_xml_filter() ) def GFeedsOpmlSavePathChooserDialog(parent_window): dialog = Gtk.FileChooserNative( title=_('Choose where to save the exported OPML file'), transient_for=parent_window, modal=True, action=Gtk.FileChooserAction.SAVE, accept_label=_('Save'), cancel_label=_('Cancel'), create_folders=True, filter=get_xml_filter() ) dialog.set_current_name('GFeeds.opml') return dialog gfeeds-2.2.0/gfeeds/picture_view.py000066400000000000000000000045061440757451400173040ustar00rootroot00000000000000from gi.repository import Gtk, Gdk, Gio, GLib from gfeeds.confManager import ConfManager from threading import Thread from math import ceil class PictureView(Gtk.Widget): def __init__(self, path): super().__init__( overflow=Gtk.Overflow.HIDDEN, vexpand=True, hexpand=True, # valign=Gtk.Align.CENTER ) self.get_style_context().add_class('card') self.confman = ConfManager() self.texture = None self.set_file(path) def set_file(self, path): self.path = path if self.path is None: self.texture = None return gio_file = Gio.File.new_for_path(self.path) def af(): try: self.texture = Gdk.Texture.new_from_file(gio_file) except Exception: print( f'PictureView: Error creating texture for `{self.path}`' ) self.texture = None GLib.idle_add(cb) def cb(): if self.texture is None: return # 270 is the pic natural width with leaflet unfolded cw, ch = self.texture.compute_concrete_size( 270, 0, 1200, 1200 ) self.set_size_request(-1, ceil(ch)) self.queue_draw() self.queue_resize() Thread(target=af, daemon=True).start() def do_get_request_mode(self, *args): return Gtk.SizeRequestMode.HEIGHT_FOR_WIDTH def do_snapshot(self, snapshot): if self.texture is None: return width = self.get_width() height = width / self.texture.get_intrinsic_aspect_ratio() self.texture.snapshot( snapshot, width, height ) def do_measure(self, orientation, for_size): if orientation == Gtk.Orientation.VERTICAL: # get height if for_size == -1: return (0, 0, -1, -1) if not self.texture: return (0, 0, -1, -1) cw, ch = self.texture.compute_concrete_size( for_size, 0, 1200, 1200 ) ch = max(min(ceil(ch), 1200), 1) return (0, ch, -1, -1) else: # get width if for_size == -1: return (0, 1200, -1, -1) return (0, 1200, -1, -1) gfeeds-2.2.0/gfeeds/preferences_window.py000066400000000000000000000261011440757451400204620ustar00rootroot00000000000000from gettext import gettext as _ from os import remove, listdir from os.path import isfile, abspath, join from gi.repository import Gdk, Gtk, Adw from gfeeds.confManager import ConfManager from gfeeds.base_preferences import ( MPreferencesPage, MPreferencesGroup, PreferencesButtonRow, PreferencesComboRow, PreferencesSpinButtonRow, PreferencesToggleRow, PreferencesEntryRow, PreferencesFontChooserRow ) from typing import Optional from gfeeds.scrolled_dialog import ScrolledDialogResponse, ScrolledDialog from gfeeds.util.paths import CACHE_PATH, THUMBS_CACHE_PATH def show_preferences_window(parent_win, *args): settings_win = PreferencesWindow(parent_win) settings_win.present() class GeneralPreferencesPage(MPreferencesPage): def __init__(self): super().__init__( title=_('General'), icon_name='preferences-other-symbolic', pref_groups=[ MPreferencesGroup( title=_('General preferences'), rows=[ PreferencesToggleRow( title=_('Show newer articles first'), conf_key='new_first', signal='gfeeds_new_first_changed' ), PreferencesToggleRow( title=_('Open links in your browser'), conf_key='open_links_externally' ), PreferencesToggleRow( title=_('Use external video player for YouTube'), subtitle=_( 'Requires youtube-dl and a compatible ' 'video player' ), conf_key='open_youtube_externally' ), PreferencesEntryRow( title=_('Preferred video player'), conf_key='media_player' ), PreferencesSpinButtonRow( title=_('Maximum article age'), subtitle=_('In days'), min_v=1, max_v=9999, conf_key='max_article_age_days' ) ] ), MPreferencesGroup( title=_('Refresh preferences'), rows=[ PreferencesToggleRow( title=_('Refresh articles on startup'), conf_key='refresh_on_startup' ), PreferencesToggleRow( title=_('New articles notification'), conf_key='notify_new_articles' ), PreferencesToggleRow( title=_('Enable auto-refresh'), conf_key='auto_refresh_enabled' ), PreferencesSpinButtonRow( title=_('Auto-refresh interval'), subtitle=_('In seconds'), min_v=60, max_v=86400, # 1 min to 24 hours conf_key='auto_refresh_time_seconds' ) ] ), MPreferencesGroup( title=_('Cache'), rows=[ PreferencesButtonRow( title=_('Clear caches'), button_label=_('Clear'), onclick=self.clear_caches, button_style_class='destructive-action', signal='gfeeds_repopulation_required' ) ] ) ] ) def clear_caches(self, confman, *args): for p in [ CACHE_PATH, THUMBS_CACHE_PATH, ]: files = [ abspath(join(p, f)) for f in listdir(p) ] for f in files: if isfile(f): remove(f) class AppearancePreferencesPage(MPreferencesPage): def __init__(self): super().__init__( title=_('Appearance'), icon_name='applications-graphics-symbolic', pref_groups=[ MPreferencesGroup( title=_('Appearance preferences'), rows=[ PreferencesToggleRow( title=_('Dark mode'), conf_key='dark_mode', signal='dark_mode_changed' ), PreferencesComboRow( title=_('Reader mode theme'), conf_key='reader_theme', values=['auto', 'light', 'dark'], value_names=[ _('Automatic'), _('Light'), _('Dark') ] ), PreferencesToggleRow( title=_('Show article thumbnails'), conf_key='show_thumbnails', signal='show_thumbnails_changed' ), PreferencesToggleRow( title=_('Show full articles titles'), conf_key='full_article_title', signal='gfeeds_full_article_title_changed' ), PreferencesToggleRow( title=_('Show full feeds names'), conf_key='full_feed_name', signal='gfeeds_full_feed_name_changed' ) ] ), MPreferencesGroup( title=_('Font preferences'), rows=[ PreferencesToggleRow( title=_('Use system font for titles'), conf_key='font_use_system_for_titles' ), PreferencesToggleRow( title=_('Use system font for paragraphs'), conf_key='font_use_system_for_paragraphs' ), PreferencesFontChooserRow( title=_('Custom title font'), conf_key='font_titles_custom' ), PreferencesFontChooserRow( title=_('Custom paragraph font'), conf_key='font_paragraphs_custom' ), PreferencesFontChooserRow( title=_('Custom monospace font'), conf_key='font_monospace_custom' ), ] ) ] ) class PrivacyPreferencesPage(MPreferencesPage): def __init__(self): super().__init__( title=_('Privacy'), icon_name='preferences-system-privacy-symbolic', pref_groups=[ MPreferencesGroup( title=_('Privacy preferences'), rows=[ PreferencesToggleRow( title=_('Enable JavaScript'), conf_key='enable_js', signal='gfeeds_webview_settings_changed' ), PreferencesToggleRow( title=_('Try to block advertisements'), conf_key='enable_adblock', subtitle=_('Requires app restart'), signal='on_apply_adblock_changed' ), PreferencesButtonRow( title=_('Update advertisement blocking list'), subtitle=_('Updates automatically every 10 days'), button_label=_('Update'), onclick=lambda *args: None, signal='on_refresh_blocklist' ) ] ) ] ) class AdvancedPreferencesPage(MPreferencesPage): def __init__(self): super().__init__( title=_('Advanced'), icon_name='system-run-symbolic', pref_groups=[ MPreferencesGroup( title=_('Advanced preferences'), rows=[ PreferencesSpinButtonRow( title=_('Maximum refresh threads'), subtitle=_( 'How many threads to use for feeds refresh' ), min_v=1, max_v=32, conf_key='max_refresh_threads', ), PreferencesToggleRow( title=_( 'Experimental GtkListView for articles list' ), subtitle=_('Requires app restart'), conf_key='use_experimental_listview' ) ] ), MPreferencesGroup( title=_('Troubleshooting'), rows=[ PreferencesButtonRow( title=_('Export Configuration as JSON'), subtitle=_('Attach this when reporting bugs'), button_label=_('Export'), onclick=self.on_export_conf_as_json ) ] ) ] ) def on_export_conf_as_json(self, confman: ConfManager): conf_json = confman.conf.to_json_str() dialog = ScrolledDialog( parent=self.get_root(), # type: ignore title=_('Feeds Configuration'), body=conf_json, responses=[ ScrolledDialogResponse( 'close', _('_Close'), lambda d, _: d.close() ), ScrolledDialogResponse( 'copy', _('Cop_y'), lambda _, __: Gdk.Display.get_default().get_clipboard().set( conf_json ) ) ] ) dialog.present() class PreferencesWindow(Adw.PreferencesWindow): def __init__(self, parent_win: Optional[Gtk.Window]): super().__init__(default_width=360, default_height=600) if parent_win: self.set_transient_for(parent_win) self.set_modal(True) self.confman = ConfManager() self.pages = [ GeneralPreferencesPage(), PrivacyPreferencesPage(), AppearancePreferencesPage(), AdvancedPreferencesPage() ] for p in self.pages: self.add(p) gfeeds-2.2.0/gfeeds/scrolled_dialog.py000066400000000000000000000035501440757451400177230ustar00rootroot00000000000000from typing import Callable, Optional, List from gi.repository import Gtk, Adw class ScrolledDialogResponse: def __init__( self, name: str, label: str, callback: Optional[Callable] = None, appearance: Optional[Adw.ResponseAppearance] = None, ): self.name = name self.label = label self.callback = callback self.appearance = appearance class ScrolledDialog(Adw.MessageDialog): def __init__( self, parent: Gtk.Window, title: str, body: str, responses: List[ScrolledDialogResponse] ): self.__parent = parent self.__title = title self.__body = body self.__responses = responses super().__init__( transient_for=self.__parent, heading=self.__title, extra_child=Gtk.ScrolledWindow( css_classes=['card'], hscrollbar_policy=Gtk.PolicyType.NEVER, width_request=270, height_request=270, margin_start=12, margin_end=12, child=Gtk.Label( wrap=True, xalign=0.0, margin_top=12, margin_bottom=12, margin_start=12, margin_end=12, label=self.__body ) ) ) for r in self.__responses: self.add_response(r.name, r.label) if r.appearance is not None: self.set_response_appearance(r.name, r.appearance) self.connect('response', self.on_response) def on_response(self, dialog: 'ScrolledDialog', res: str): for r in self.__responses: if r.name == res: if r.callback is not None: r.callback(dialog, res) return gfeeds-2.2.0/gfeeds/shortcuts_window.py000066400000000000000000000004451440757451400202220ustar00rootroot00000000000000from gi.repository import Gtk def show_shortcuts_window(parent_win, *args): shortcuts_win = Gtk.Builder.new_from_resource( '/org/gabmus/gfeeds/ui/shortcutsWindow.ui' ).get_object('shortcuts-gfeeds') shortcuts_win.set_transient_for(parent_win) shortcuts_win.present() gfeeds-2.2.0/gfeeds/sidebar.py000066400000000000000000000045531440757451400162120ustar00rootroot00000000000000from gi.repository import Gtk from gfeeds.confManager import ConfManager from gfeeds.feeds_manager import FeedsManager from gfeeds.articles_listview import ArticlesListView, ArticlesListBox class LoadingRevealer(Gtk.Revealer): def __init__(self): super().__init__( transition_type=Gtk.RevealerTransitionType.CROSSFADE, reveal_child=False, vexpand=False, hexpand=True, valign=Gtk.Align.START, halign=Gtk.Align.FILL ) self.progress_bar = Gtk.ProgressBar(hexpand=True, vexpand=False) self.progress_bar.get_style_context().add_class('osd') self.set_child(self.progress_bar) def set_running(self, state: bool): self.set_reveal_child(state) def set_progress(self, progress: float): '''progress: float between 0.0 and 1.0''' self.progress_bar.set_fraction(progress) class GFeedsSidebar(Gtk.Overlay): __gtype_name__ = 'GFeedsSidebar' def __init__(self): super().__init__() self.confman = ConfManager() self.feedman = FeedsManager() self.listview_sw = ( ArticlesListView() if self.confman.nconf.use_experimental_listview else ArticlesListBox() ) self.empty = self.listview_sw.empty self.populate = self.listview_sw.populate self.loading_revealer = LoadingRevealer() self.set_child(self.listview_sw) self.add_overlay(self.loading_revealer) self.feedman.connect( 'feedmanager_refresh_start', self.on_refresh_start ) self.feedman.connect( 'feedmanager_refresh_end', self.on_refresh_end ) self.feedman.connect( 'feedmanager_feeds_loaded_changed', self.on_feeds_loaded_changed ) def on_feeds_loaded_changed(self, _, progress: float): self.loading_revealer.set_progress(progress) def on_refresh_start(self, *_): self.loading_revealer.set_running(True) def on_refresh_end(self, *_): self.listview_sw.all_items_changed() self.loading_revealer.set_running(False) def set_search(self, search_term): self.listview_sw.set_search_term(search_term) def select_next_article(self, *_): self.listview_sw.select_next() def select_prev_article(self, *_): self.listview_sw.select_prev() gfeeds-2.2.0/gfeeds/sidebar_row.py000066400000000000000000000203761440757451400171020ustar00rootroot00000000000000from math import ceil from os.path import isfile from typing import List from gfeeds.feed_item import FeedItem from gfeeds.util.paths import THUMBS_CACHE_PATH from gfeeds.util.sha import shasum from gfeeds.util.download_manager import download_raw from gi.repository import Gio, Gtk, GLib, Pango, GObject from gfeeds.confManager import ConfManager from gfeeds.simple_avatar import SimpleAvatar from gfeeds.util.relative_day_formatter import humanize_datetime from gfeeds.accel_manager import add_mouse_button_accel, add_longpress_accel @Gtk.Template(resource_path='/org/gabmus/gfeeds/ui/sidebar_listbox_row.ui') class SidebarRow(Gtk.Box): __gtype_name__ = 'SidebarRow' title_label: Gtk.Label = Gtk.Template.Child() origin_label: Gtk.Label = Gtk.Template.Child() icon_container = Gtk.Template.Child() date_label: Gtk.Label = Gtk.Template.Child() picture_view_container = Gtk.Template.Child() popover: Gtk.PopoverMenu = Gtk.Template.Child() __dim = False def __init__(self, fetch_image_thread_pool): super().__init__() self.fetch_image_thread_pool = fetch_image_thread_pool self.feed_item = None self.signal_ids = list() self.prop_bindings: List[GObject.Binding] = list() self.confman = ConfManager() self.confman.connect( 'gfeeds_full_article_title_changed', self.on_full_article_title_changed ) self.on_full_article_title_changed() self.confman.connect( 'gfeeds_full_feed_name_changed', self.on_full_feed_name_changed ) self.on_full_feed_name_changed() self.icon = SimpleAvatar() self.icon_container.append(self.icon) self.picture_view = Gtk.Picture( overflow=Gtk.Overflow.HIDDEN, halign=Gtk.Align.CENTER, hexpand=True ) self.picture_view.get_style_context().add_class('card') self.picture_view_container.append(self.picture_view) # picture_view_container is visible=False on init self.confman.connect('show_thumbnails_changed', self.set_article_image) # longpress & right click self.longpress = add_longpress_accel( self, lambda *_: self.popover.popup() ) self.rightclick = add_mouse_button_accel( self, lambda gesture, *_: self.popover.popup() if gesture.get_current_button() == 3 # 3 is right click else None ) self.action_group = Gio.SimpleActionGroup() for act_name, fun in [ ('read_unread', self.action_read_unread), ('open_in_browser', self.action_open_in_browser) ]: act = Gio.SimpleAction.new(act_name, None) act.connect('activate', fun) self.action_group.add_action(act) self.insert_action_group('row', self.action_group) def set_feed_item(self, feed_item: FeedItem): if not feed_item or self.feed_item == feed_item: return if self.feed_item is not None: for sig_id in self.signal_ids: self.feed_item.disconnect(sig_id) for binding in self.prop_bindings: binding.unbind() self.signal_ids = list() self.prop_bindings = list() self.feed_item = feed_item self.prop_bindings.append( self.feed_item.bind_property( 'read', self, 'dim', GObject.BindingFlags.DEFAULT ) ) self.dim = self.feed_item.read self.signal_ids.append( self.feed_item.connect('changed', self.on_feed_item_changed) ) self.origin_label.set_text(self.feed_item.parent_feed.title) self.title_label.set_text(self.feed_item.title) self.icon.set_image( self.feed_item.parent_feed.title, self.feed_item.parent_feed.favicon_path ) self.set_article_image() self.set_read() self.on_feed_item_changed() def action_read_unread(self, *__): self.popover.popdown() if not self.feed_item: return self.set_read(not self.feed_item.read) def action_open_in_browser(self, *__): self.popover.popdown() if not self.feed_item: return Gio.AppInfo.launch_default_for_uri( self.feed_item.link ) def on_feed_item_changed(self, *_): if self.feed_item is None: return self.date_label.set_text(humanize_datetime(self.feed_item.pub_date)) def set_article_image(self, *_): if not self.confman.nconf.show_thumbnails or self.feed_item is None: self.picture_view_container.set_visible(False) return def cb(img): if img is None: self.picture_view_container.set_visible(False) else: self.picture_view_container.set_visible(True) self.picture_view.set_filename(img) paintable = self.picture_view.get_paintable() # this happens presumably when the image isn't supported, like # for webp files if not paintable: self.picture_view_container.set_visible(False) return _, ch = paintable.compute_concrete_size(320, 0, 1200, 1200) self.picture_view.set_size_request(-1, min(200, ceil(ch))) self.picture_view_container.set_visible(True) def af(): if self.feed_item is None: return dest = None if ( self.feed_item.identifier in self.confman.article_thumb_cache.keys() ): dest = self.confman.article_thumb_cache[ self.feed_item.identifier ] if not isfile(dest): download_raw(self.feed_item.image_url, dest) GLib.idle_add(cb, dest if dest and isfile(dest) else None) return else: try: img_url = self.feed_item.image_url if not img_url: img_url = self.feed_item.set_thumb_from_link() if not img_url: raise Exception() # yes, the file extension is ignored entirely # this shouldn't matter anyway and pictures get set # correctly dest = str(THUMBS_CACHE_PATH.joinpath( shasum(img_url) )) if not isfile(dest): download_raw(img_url, dest) self.confman.article_thumb_cache[ self.feed_item.identifier ] = dest self.confman.save_article_thumb_cache() except Exception: pass if dest and isfile(dest): GLib.idle_add(cb, dest) return else: self.confman.article_thumb_cache[ self.feed_item.identifier ] = '' self.confman.save_article_thumb_cache() GLib.idle_add(cb, None) self.fetch_image_thread_pool.submit(af) def on_full_article_title_changed(self, *_): self.title_label.set_ellipsize( Pango.EllipsizeMode.NONE if self.confman.nconf.full_article_title else Pango.EllipsizeMode.END ) def on_full_feed_name_changed(self, *_): self.origin_label.set_ellipsize( Pango.EllipsizeMode.NONE if self.confman.nconf.full_feed_name else Pango.EllipsizeMode.END ) def set_read(self, read=None): if self.feed_item is None: return if read is not None: self.feed_item.read = read @GObject.Property(type=bool, default=False) def dim(self) -> bool: return self.__dim @dim.setter def dim(self, state: bool): self.__dim = state for w in ( self.title_label, self.icon, ): if state: w.get_style_context().add_class('dim-label') else: w.get_style_context().remove_class('dim-label') gfeeds-2.2.0/gfeeds/signal_helper.py000066400000000000000000000011341440757451400174050ustar00rootroot00000000000000from typing import Literal, Tuple, Type from gi.repository import GObject SignalReturnType = ( Literal[ GObject.TYPE_INT, GObject.TYPE_BOOLEAN, GObject.TYPE_VARIANT, GObject.TYPE_FLOAT, GObject.TYPE_DOUBLE, GObject.TYPE_STRING, GObject.TYPE_NONE, GObject.TYPE_PYOBJECT, ] | None ) def signal_tuple( flag: GObject.SignalFlags = GObject.SignalFlags.RUN_LAST, ret: SignalReturnType = None, params: Tuple[Type] = tuple(), ) -> Tuple[GObject.SignalFlags, SignalReturnType, Tuple[Type]]: return (flag, ret, params) gfeeds-2.2.0/gfeeds/simple_avatar.py000066400000000000000000000042061440757451400174230ustar00rootroot00000000000000from gi.repository import Adw, GLib, Gdk, Gio from threading import Thread from pathlib import Path from os.path import isfile from PIL import Image from typing import Union from gfeeds.util.paths import THUMBS_CACHE_PATH def make_thumb(path, width: int, height: int = 1000) -> Union[str, None]: if not path: return None if not isinstance(path, Path): path = Path(path) dest = THUMBS_CACHE_PATH.joinpath(f'{width}x{height}_{path.name}_v2') if dest.is_file(): return str(dest) try: with Image.open(path) as thumb: thumb = Image.open(path) thumb.resize((width, height)).save(dest, 'PNG') # thumb.thumbnail((width, height), Image.ANTIALIAS) # thumb.save(dest, 'PNG') return str(dest) except IOError: print(f'Error creating thumbnail for image `{path}`') return None _textures_cache = dict() class SimpleAvatar(Adw.Bin): def __init__(self): super().__init__() self.avatar = Adw.Avatar(size=32, show_initials=True) self.set_child(self.avatar) def set_image(self, title, image=None): self.avatar.set_text(title) if not image: return if not isfile(image): _textures_cache[image] = None def cb(texture, add_to_cache=False): if add_to_cache: _textures_cache[image] = texture self.avatar.set_custom_image(texture) if image in _textures_cache.keys(): cached = _textures_cache[image] if not cached: return GLib.idle_add(cb, cached) return def af(): gio_file = Gio.File.new_for_path(image) try: texture = Gdk.Texture.new_from_file(gio_file) except Exception: print( 'SimpleAvatar: ' 'Error creating texture for `{0}` (title `{1}`)'.format( image, title ) ) texture = None GLib.idle_add(cb, texture, True) Thread(target=af, daemon=True).start() gfeeds-2.2.0/gfeeds/stack_with_empty_state.py000066400000000000000000000035261440757451400213560ustar00rootroot00000000000000from typing import Optional from gi.repository import GObject, Gtk, Adw from gfeeds.feeds_manager import FeedsManager from gfeeds.confManager import ConfManager @Gtk.Template(resource_path='/org/gabmus/gfeeds/ui/empty_state.ui') class EmptyState(Adw.Bin): __gtype_name__ = 'EmptyState' def __init__(self): super().__init__() class StackWithEmptyState(Gtk.Stack): __gtype_name__ = 'StackWithEmptyState' def __init__(self, main_widget: Optional[Gtk.Widget] = None): super().__init__( vexpand=True, hexpand=True, transition_type=Gtk.StackTransitionType.CROSSFADE ) self.__main_widget = main_widget self.feedman = FeedsManager() self.confman = ConfManager() self.empty_state = EmptyState() if self.main_widget is not None: self.add_named(self.main_widget, 'main_widget') self.add_named(self.empty_state, 'empty_state') self.set_visible_child( self.main_widget if len(self.confman.nconf.feeds) > 0 and self.main_widget is not None else self.empty_state ) self.feedman.feed_store.connect( 'items-changed', self.on_feed_store_items_changed ) @GObject.Property(type=Gtk.Widget, default=None, nick='main-widget') def main_widget(self) -> Optional[Gtk.Widget]: return self.__main_widget @main_widget.setter def main_widget(self, w: Gtk.Widget): self.__main_widget = w self.add_named(self.__main_widget, 'main_widget') def on_feed_store_items_changed(self, *args): if len(self.feedman.feed_store) == 0: self.set_visible_child(self.empty_state) else: self.set_visible_child(self.main_widget) def on_feeds_append(self, *args): self.set_visible_child(self.main_widget) gfeeds-2.2.0/gfeeds/tag_store.py000066400000000000000000000077441440757451400165750ustar00rootroot00000000000000from typing import List, Union from gi.repository import GObject, Gtk, Gio from gfeeds.confManager import ConfManager from gfeeds.feed import Feed class TagObj(GObject.Object): __gsignals__ = { 'empty_changed': ( GObject.SignalFlags.RUN_FIRST, GObject.TYPE_NONE, () ) } def __init__(self, name: str): super().__init__() self.name = name self.__unread_count = 0 @GObject.Property(type=int) def unread_count(self) -> int: # type: ignore return self.__unread_count @unread_count.setter def unread_count(self, c: int): self.__unread_count = c def increment_unread_count(self, v: int): prev = self.unread_count self.unread_count += v if self.__unread_count == 0 and prev > 0: self.emit('empty_changed') elif self.__unread_count > 0 and prev == 0: self.emit('empty_changed') class TagStore(Gtk.FilterListModel): __gsignals__ = { 'item-removed': ( GObject.SignalFlags.RUN_LAST, None, (GObject.TYPE_PYOBJECT,) ) } def __init__(self): self.sorter = Gtk.CustomSorter() self.sorter.set_sort_func(self._sort_func) self.filter = Gtk.CustomFilter() self.filter.set_filter_func(self._filter_func) self.list_store = Gio.ListStore(item_type=TagObj) self.sort_store = Gtk.SortListModel( model=self.list_store, sorter=self.sorter ) self.confman = ConfManager() self.confman.connect( 'gfeeds_show_empty_feeds_changed', lambda *_: self.invalidate_filter() ) # Hiding read articles can result in empty feeds which should # be hidden self.confman.connect( 'gfeeds_show_read_changed', lambda *_: self.invalidate_filter() ) super().__init__(model=self.sort_store, filter=self.filter) self.populate() def populate(self): self.empty() for tag in self.confman.nconf.tags: n_tag = TagObj(tag) self.list_store.append(n_tag) n_tag.connect( 'empty_changed', lambda *_: self.invalidate_filter() ) def _sort_func(self, t1: TagObj, t2: TagObj, *_) -> int: return -1 if t1.name.lower() < t2.name.lower() else 1 def empty(self): return self.list_store.remove_all() def add_tag( self, n_tag_: Union[TagObj, str], target_feeds: List[Feed] = [] ): n_tag = TagObj(n_tag_) if isinstance(n_tag_, str) else n_tag_ existing_tag = self.get_tag(n_tag.name) if existing_tag: n_tag = existing_tag else: self.list_store.append(n_tag) target_feed_urls = [] for feed in target_feeds: target_feed_urls.append(feed.rss_link) if n_tag not in feed.tags: feed.tags.append(n_tag) n_tag.unread_count += feed.unread_count n_tag.connect( 'empty_changed', lambda *_: self.invalidate_filter() ) self.confman.add_tag(n_tag.name, target_feed_urls) def remove_by_index(self, index: int): to_rm = self.list_store[index] self.emit('item-removed', to_rm) self.list_store.remove(index) self.confman.delete_tag(to_rm.name) def remove_tag(self, tag: str): for i, tag_o in enumerate(self.list_store): if tag == tag_o.name: self.remove_by_index(i) return def _filter_func(self, item: TagObj, *_) -> bool: if not self.confman.nconf.show_empty_feeds and \ not self.confman.nconf.show_read_items: return item.unread_count > 0 return True def invalidate_filter(self): self.filter.set_filter_func(self._filter_func) def get_tag(self, tag: str): for t in self.list_store: if t.name == tag: return t return None gfeeds-2.2.0/gfeeds/util/000077500000000000000000000000001440757451400151755ustar00rootroot00000000000000gfeeds-2.2.0/gfeeds/util/build_reader_html.py000066400000000000000000000101141440757451400212110ustar00rootroot00000000000000from gettext import gettext from typing import List, Tuple, Union from gfeeds.feed_item import FeedItem from gfeeds.util.readability_wrapper import RDoc import pygments import pygments.lexers from lxml.html import ( fromstring as html_fromstring, tostring as html_tostring, HtmlElement ) from pygments.formatters import HtmlFormatter from gfeeds.util.reader_mode_style import get_css # Thanks to Eloi Rivard (azmeuk) for the contribution on the media block def _build_media_text(title: str, content: str) -> str: return '''

{0}: {1}

'''.format(title, content.replace("\n", "
")) def _build_media_link(title: str, content: str, link: str): return _build_media_text( title, f'{content}' ) # thumbnails aren't supposed to be links, images can be? # funnily enough, using `#` as a link opens the main content url # that's because the webkitview sets the base url to the feed item link def _build_media_img(title, imgurl, link='#') -> str: return _build_media_link( title, f'
', link ) def build_syntax_highlight(root: HtmlElement) -> Tuple[str, HtmlElement]: syntax_highlight_css = '' code_nodes: List[HtmlElement] = root.xpath( '//pre/code' ) lexer = None for code_node in code_nodes: classes = code_node.attrib.get('class', '').split(' ') for klass in classes: try: lexer = pygments.lexers.get_lexer_by_name( klass.replace('language-', ''), stripall=True, ) break except pygments.util.ClassNotFound: pass code_text = code_node.text_content() if not code_text: continue if lexer is None: try: lexer = pygments.lexers.guess_lexer(code_text) except pygments.util.ClassNotFound: continue formatter = HtmlFormatter(style='solarized-dark', linenos=False) if not syntax_highlight_css: syntax_highlight_css = formatter.get_style_defs() newtext = pygments.highlight(code_text, lexer, formatter) newhtml = html_fromstring(newtext) pre_node = code_node.getparent() pre_node.getparent().replace(pre_node, newhtml) return syntax_highlight_css, root def build_syntax_highlight_from_raw_html( raw_html: Union[str, bytes] ) -> Tuple[str, HtmlElement]: return build_syntax_highlight( html_fromstring( raw_html if isinstance(raw_html, str) else raw_html.decode() ) ) def build_reader_html( og_html, feed_item: FeedItem, dark_mode: bool = False ) -> str: doc = RDoc(og_html) content = doc.summary(html_partial=True) syntax_highlight_css, root = build_syntax_highlight_from_raw_html(content) content = html_tostring( root, encoding='utf-8' ) author_html = '' if feed_item.author_name: if feed_item.author_url: author_html = gettext('Author: {1}').format( feed_item.author_url, feed_item.author_name ) else: author_html = gettext('Author: {0}'.format(feed_item.author_name)) if not isinstance(content, str): content = content.decode() return f''' {doc.short_title() or feed_item.title}

{doc.short_title() or feed_item.title}

{author_html}

{ f'
' if feed_item.image_url and feed_item.image_url not in content else '' } {content}
''' gfeeds-2.2.0/gfeeds/util/create_full_url.py000066400000000000000000000006211440757451400207150ustar00rootroot00000000000000from urllib.parse import urlparse def create_full_url(link: str, path: str) -> str: # already full if path.startswith('https://') or path.startswith('http://'): return path # absolute if path.startswith('/'): parsed = urlparse(link) return f'{parsed.scheme}://{parsed.netloc}{path}' # relative return link + ('' if link.endswith('/') else '/') + path gfeeds-2.2.0/gfeeds/util/download_manager.py000066400000000000000000000117301440757451400210520ustar00rootroot00000000000000from gettext import gettext as _ from os.path import isfile from pathlib import Path import requests from gfeeds.confManager import ConfManager from gfeeds.util.create_full_url import create_full_url from gfeeds.util.paths import CACHE_PATH from gfeeds.util.sha import shasum from syndom import Html from typing import Literal, Optional, Union from gfeeds.util.to_unicode import to_unicode, bytes_to_unicode GET_HEADERS = { 'User-Agent': 'gfeeds/1.0', 'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate' } TIMEOUT = 30 class DownloadError(Exception): def __init__(self, code, *args): self.download_error_code = code # will return the content of a file if it's a file url def download_text(link: str) -> str: if link[:8] == 'file:///': with open(link[7:]) as fd: toret = fd.read() return toret res = requests.get(link, headers=GET_HEADERS, timeout=TIMEOUT) if 200 <= res.status_code <= 299: return bytes_to_unicode(res.content, enc=res.encoding) else: raise DownloadError( res.status_code, f'response code {res.status_code}' ) def download_raw(link: str, dest: str) -> None: res = requests.get(link, headers=GET_HEADERS, timeout=TIMEOUT) if res.status_code == 200: with open(dest, 'wb') as fd: for chunk in res.iter_content(1024): fd.write(chunk) else: raise requests.HTTPError( f'response code {res.status_code} for url `{link}`' ) def extract_feed_url_from_html(link: str) -> Optional[str]: dest = str( CACHE_PATH.joinpath(shasum(link)+'.html') ) try: if not isfile(dest): download_raw(link, dest) sd_html = Html(dest) res: str = sd_html.rss_url if not res: return None res = create_full_url(link, res) return res except Exception: print('Error extracting feed from HTML') return None class DownloadFeedResponse: def __init__( self, feedpath: Optional[Union[Path, Literal['not_cached']]], rss_link: Optional[str], failed: bool, error: Optional[str] ): self.feedpath = feedpath self.rss_link = rss_link self.failed = failed self.error = error def download_feed( link: str, get_cached: bool = False ) -> DownloadFeedResponse: confman = ConfManager() dest_path: Path = CACHE_PATH.joinpath(shasum(link)+'.rss') if get_cached: return DownloadFeedResponse( dest_path if isfile(dest_path) else 'not_cached', link, not isfile(dest_path), None ) headers = GET_HEADERS.copy() if ( 'last-modified' in confman.nconf.feeds[link].keys() and isfile(dest_path) ): headers['If-Modified-Since'] = \ confman.nconf.feeds[link]['last-modified'] try: res = requests.get( link, headers=headers, allow_redirects=True, timeout=TIMEOUT ) except requests.exceptions.ConnectTimeout: return DownloadFeedResponse( None, link, True, _('`{0}`: connection timed out').format(link) ) except Exception: import traceback traceback.print_exc() return DownloadFeedResponse( None, link, True, _('`{0}` might not be a valid address').format(link) ) if 'last-modified' in res.headers.keys(): # TODO fix when switching to non-json feeds in gsettings feeds: dict = confman.nconf.feeds feeds[link]['last-modified'] = res.headers['last-modified'] confman.nconf.feeds = feeds def handle_200(): if ( 'last-modified' not in res.headers.keys() and 'last-modified' in confman.nconf.feeds[link].keys() ): feeds: dict = confman.nconf.feeds feeds[link].pop('last-modified') confman.nconf.feeds = feeds with open(dest_path, 'wb') as fd: fd.write(res.content) # res.text is str, res.content is bytes to_unicode(dest_path) return DownloadFeedResponse( dest_path, link, False, None ) def handle_304(): return DownloadFeedResponse( dest_path, link, False, None ) def handle_301_302(): n_link = res.headers.get('location', link) feeds: dict = confman.nconf.feeds feeds[n_link] = feeds[link] feeds.pop(link) confman.nconf.feeds = feeds return download_feed(n_link) def handle_everything_else(): return DownloadFeedResponse( None, link, True, _('Error downloading `{0}`, code `{1}`').format( link, res.status_code ) ) handlers = { 200: handle_200, 304: handle_304, 301: handle_301_302, 302: handle_301_302 } return handlers.get(res.status_code, handle_everything_else)() gfeeds-2.2.0/gfeeds/util/get_favicon.py000066400000000000000000000033621440757451400200370ustar00rootroot00000000000000from gettext import gettext as _ from PIL import Image from os.path import isfile from os import remove, replace from gfeeds.util.create_full_url import create_full_url from gfeeds.util.download_manager import download_raw from gfeeds.util.paths import CACHE_PATH from gfeeds.util.sha import shasum from syndom import Html from magic import Magic # for mime types mime = Magic(mime=True) def get_favicon(link: str, favicon_path: str, direct: bool = False): ''' If `link` is the direct url to download the favicon, pass `direct=True` ''' favicon_path_orig = favicon_path + '.original' if direct: download_raw(link, favicon_path_orig) else: try: page_dest = str( CACHE_PATH.joinpath(shasum(link)+'.html') ) if not isfile(page_dest): download_raw(link, page_dest) sd_html = Html(page_dest) url = sd_html.icon_url if not url: return except Exception: return p = url if '?' in p: p = p.split('?')[0] target = create_full_url(link, url) try: download_raw(target, favicon_path_orig) except Exception: try: download_raw(target, favicon_path_orig) except Exception: print( _('Error downloading favicon for `{0}`').format(link) ) return if mime.from_file(favicon_path_orig) == 'image/svg+xml': replace(favicon_path_orig, favicon_path) return toconv = Image.open(favicon_path_orig) toconv.convert(mode='RGBA') toconv.save(favicon_path, format='PNG') toconv.close() remove(favicon_path_orig) gfeeds-2.2.0/gfeeds/util/get_thumb.py000066400000000000000000000011461440757451400175270ustar00rootroot00000000000000from syndom import Html from gfeeds.util.create_full_url import create_full_url from gfeeds.util.download_manager import download_raw from gfeeds.util.paths import CACHE_PATH from gfeeds.util.sha import shasum from os.path import isfile def get_thumb(link): dest = str( CACHE_PATH.joinpath(shasum(link)+'.html') ) try: if not isfile(dest): download_raw(link, dest) sd_html = Html(dest) except Exception: print('Error parsing HTML') return None res = sd_html.img_url if not res: return None return create_full_url(link, res) gfeeds-2.2.0/gfeeds/util/opml_generator.py000066400000000000000000000020751440757451400205700ustar00rootroot00000000000000from typing import Iterable, TYPE_CHECKING from xml.sax.saxutils import quoteattr if TYPE_CHECKING: from gfeeds.feed import Feed OPML_PREFIX = ''' Subscriptions ''' OPML_SUFFIX = ''' ''' def __outline( title: str, text: str, xml_url: str, html_url: str, category: str ) -> str: return ( '' ) def feeds_list_to_opml(feeds: Iterable['Feed']): opml_out = OPML_PREFIX for f in feeds: categories = (f.get_conf_dict() or dict()).get('tags', []) categories = ','.join(categories) opml_out += ' ' + __outline( f.title, f.description, f.rss_link, f.link, # type: ignore categories ) + '\n' opml_out += OPML_SUFFIX return opml_out gfeeds-2.2.0/gfeeds/util/opml_parser.py000066400000000000000000000023751440757451400201010ustar00rootroot00000000000000from functools import reduce from operator import and_ from pathlib import Path from gettext import gettext as _ from syndom import Opml from typing import List, Union class FeedImportData: def __init__(self, feed: str, tags: List[str]): self.feed = feed self.tags = tags def __eq__(self, other) -> bool: if not isinstance(other, FeedImportData): return False return ( self.feed == other.feed and len(self.tags) == len(other.tags) and reduce(and_, [ t in other.tags for t in self.tags ], True) ) def opml_to_rss_list( opml_path: Union[str, Path] ) -> List[FeedImportData]: if isinstance(opml_path, str): opml_path = Path(opml_path) res = [] if not opml_path.is_file(): print(_('Error: OPML path provided does not exist')) return res try: sd_opml = Opml(str(opml_path), True) res = [ FeedImportData(item.get_feed_url(), item.get_categories()) for item in sd_opml.get_items() ] except Exception: import traceback traceback.print_exc() print(_('Error parsing OPML file `{0}`').format(opml_path)) return res # type: ignore gfeeds-2.2.0/gfeeds/util/paths.py000066400000000000000000000011101440757451400166570ustar00rootroot00000000000000from os import environ from pathlib import Path IS_FLATPAK = Path('/.flatpak-info').is_file() CONF_DIR = Path( environ.get('XDG_CONFIG_HOME') or f'{environ.get("HOME")}/.config' ) CACHE_HOME = Path( environ.get('XDG_CACHE_HOME') or f'{environ.get("HOME")}/.cache' ) CACHE_PATH = CACHE_HOME.joinpath('org.gabmus.gfeeds') THUMBS_CACHE_PATH = CACHE_PATH.joinpath('thumbnails') ARTICLE_THUMB_CACHE_PATH = THUMBS_CACHE_PATH.joinpath( 'article_thumb_cache.json' ) for p in [ THUMBS_CACHE_PATH, CONF_DIR ]: if not p.is_dir(): p.mkdir(parents=True) gfeeds-2.2.0/gfeeds/util/readability_wrapper.py000066400000000000000000000060461440757451400216060ustar00rootroot00000000000000# flake8: noqa from readability.readability import * # THIS IS A HUGE HACK! # readability-lxml has a bug where for some reason non-block tags inside # paragraphs are given their own paragraph, basically breaking the formatting # apparently the bug is caused by the transform_misused_divs_into_paragraphs # method, that I replaced with an empty one. I also needed the parser to # care about the now not replaced divs, so I needed to copy the whole # score_paragraphs method to also search among divs # # If you happen to know what's wrong, please fix it either here or, even # better, upstream. I'm sick of this library, but I couldn't find replacements # and the code is a mess I don't want to deal with. This hack is the result # of days of hitting my head on the wall and being sick and tired of having # to deal with it. class RDoc(Document): def transform_misused_divs_into_paragraphs(self): pass def score_paragraphs(self): MIN_LEN = self.min_text_length candidates = {} ordered = [] for elem in self.tags(self._html(), "p", "pre", "td", "div"): parent_node = elem.getparent() if parent_node is None: continue grand_parent_node = parent_node.getparent() inner_text = clean(elem.text_content() or "") inner_text_len = len(inner_text) # If this paragraph is less than 25 characters # don't even count it. if inner_text_len < MIN_LEN: continue if parent_node not in candidates: candidates[parent_node] = self.score_node(parent_node) ordered.append(parent_node) if grand_parent_node is not None and grand_parent_node not in\ candidates: candidates[grand_parent_node] = self.score_node( grand_parent_node ) ordered.append(grand_parent_node) content_score = 1 content_score += len(inner_text.split(",")) content_score += min((inner_text_len / 100), 3) # if elem not in candidates: # candidates[elem] = self.score_node(elem) # WTF? candidates[elem]['content_score'] += content_score candidates[parent_node]["content_score"] += content_score if grand_parent_node is not None: candidates[grand_parent_node]["content_score"] +=\ content_score / 2.0 # Scale the final candidates score based on link density. Good content # should have a relatively small link density (5% or less) and be # mostly unaffected by this operation. for elem in ordered: candidate = candidates[elem] ld = self.get_link_density(elem) score = candidate["content_score"] log.debug( "Branch %6.3f %s link density %.3f -> %6.3f" % (score, describe(elem), ld, score * (1 - ld)) ) candidate["content_score"] *= 1 - ld return candidates gfeeds-2.2.0/gfeeds/util/reader_mode_style.py000066400000000000000000000026631440757451400212440ustar00rootroot00000000000000from gfeeds.confManager import ConfManager from gi.repository import Gio, Gtk settings = Gtk.Settings.get_default() confman = ConfManager() def get_gtk_font(): ss = settings.get_property('gtk-font-name').split(' ') ss.pop(-1) return ' '.join(ss).strip() def get_css(): gtk_font = get_gtk_font() sans_font = gtk_font serif_font = gtk_font mono_font = confman.nconf.font_monospace_custom if not confman.nconf.font_use_system_for_titles: serif_font = confman.nconf.font_titles_custom if not confman.nconf.font_use_system_for_paragraphs: sans_font = confman.nconf.font_paragraphs_custom css = '' for typ, var in zip( ('sans', 'serif', 'mono'), (sans_font, serif_font, mono_font) ): for variant, weight, style in zip( ('', ' Italic', ' Bold', ' Bold Italic'), ('normal', 'normal', 'bold', 'bold'), ('normal', 'italic', 'normal', 'italic') ): css += f''' @font-face {{ font-family: gfeeds-reader-{typ}; src: local('{var}{variant}'); font-weight: {weight}; font-style: {style}; font-display: block; }}''' css += Gio.resources_lookup_data( '/org/gabmus/gfeeds/ui/reader_mode_style.css', Gio.ResourceLookupFlags.NONE ).get_data().decode() return css gfeeds-2.2.0/gfeeds/util/relative_day_formatter.py000066400000000000000000000011101440757451400222730ustar00rootroot00000000000000from datetime import datetime, timezone from os import environ import humanize time_locale = environ.get( 'LC_TIME', environ.get('LC_ALL', 'en_US') ).split('.')[0] try: humanize.i18n.activate(time_locale) except Exception: if not time_locale.startswith('en_'): print(f'Time localization unavailable for locale `{time_locale}`') THREE_DAYS = 60*60*24*3 def humanize_datetime(dt): delta = datetime.now(timezone.utc) - dt if delta.total_seconds() <= THREE_DAYS: return humanize.naturaltime(delta) else: return humanize.naturaldate(dt) gfeeds-2.2.0/gfeeds/util/rss_link_from_file.py000066400000000000000000000014661440757451400214240ustar00rootroot00000000000000from gfeeds.util.download_manager import extract_feed_url_from_html from typing import Optional from os.path import isfile from syndom import Feed as SynDomFeed def get_feed_link_from_file(feed_path: str) -> Optional[str]: if not isfile(feed_path): return None try: sd_feed = SynDomFeed(str(feed_path)) except Exception: import traceback traceback.print_exc() print(f'Error parsing feed `{feed_path}`') return None res = sd_feed.get_rss_url() if res: return res url = sd_feed.get_url() if url: return extract_feed_url_from_html(url) items = sd_feed.get_items() if len(items) <= 0: return None item_url = items[0].get_url() if item_url: return extract_feed_url_from_html(item_url) return None gfeeds-2.2.0/gfeeds/util/sha.py000066400000000000000000000001331440757451400163170ustar00rootroot00000000000000from hashlib import sha1 def shasum(txt: str): return sha1(txt.encode()).hexdigest() gfeeds-2.2.0/gfeeds/util/singleton.py000066400000000000000000000003301440757451400175450ustar00rootroot00000000000000class Singleton(type): instance = None def __call__(cls, *args, **kwargs): if not cls.instance: cls.instance = super(Singleton, cls).__call__(*args, **kwargs) return cls.instance gfeeds-2.2.0/gfeeds/util/test_connection.py000066400000000000000000000010731440757451400207460ustar00rootroot00000000000000from typing import Any, Callable from gi.repository import Gio __HOSTNAME = 'gnome.org' def is_online(callback: Callable[[bool], Any]): def __async_cb(src, a_res, data): res = False try: res = Gio.NetworkMonitor.get_default().can_reach_finish(a_res) except Exception: import traceback traceback.print_exc() pass callback(res) Gio.NetworkMonitor.get_default().can_reach_async( Gio.NetworkAddress(hostname=__HOSTNAME), None, __async_cb, None ) gfeeds-2.2.0/gfeeds/util/thread_pool.py000066400000000000000000000032371440757451400200540ustar00rootroot00000000000000import threading from typing import Any, Callable, Iterable, List from gi.repository import GLib class ThreadPool: def __init__( self, max_threads: int, worker_func: Callable, worker_func_args_l: Iterable[Iterable[Any]], final_callback: Callable, final_callback_args: Iterable[Any] ): self.worker_func = worker_func self.worker_func_args_l = worker_func_args_l self.max_threads = max_threads self.final_callback = final_callback self.final_callback_args = final_callback_args self.waiting_threads: List[threading.Thread] = [] self.running_threads: List[threading.Thread] = [] for args_tuple in self.worker_func_args_l: self.waiting_threads.append( threading.Thread( group=None, target=self._pool_worker, name=None, args=(*args_tuple,), daemon=True ) ) def _pool_worker(self, *args): self.worker_func(*args) GLib.idle_add(self._rearrange_pool, threading.current_thread()) def _rearrange_pool(self, t): self.running_threads.remove(t) self.start() def start(self): while ( len(self.running_threads) < self.max_threads and len(self.waiting_threads) > 0 ): t = self.waiting_threads.pop(0) t.start() self.running_threads.append(t) if len(self.running_threads) == 0 and len(self.waiting_threads) == 0: self.final_callback(*self.final_callback_args) gfeeds-2.2.0/gfeeds/util/to_unicode.py000066400000000000000000000032741440757451400177050ustar00rootroot00000000000000from pathlib import Path from typing import Optional, Union import traceback def bytes_to_unicode(b: bytes, enc: Optional[str] = None) -> str: if enc is not None: enc = enc.lower().strip() if enc == 'utf-8': return b.decode() return b.decode(enc).encode('utf-8').decode() return b.decode().encode('utf-8').decode() def to_unicode(path: Union[Path, str]): try: if isinstance(path, str): path = Path(path) if not path.is_file(): print(f'Error: path {path} is not a file') return except Exception: print(f'Error converting string {path} to Path') traceback.print_exc() return try: head = '' with open(path, 'rb') as fd: while not head: head = fd.readline().decode().strip() if 'encoding=' not in head: return enc = head[head.index('encoding=')+9:] quote = {'"': '"', "'": "'"}.get(enc[0], '') if quote: enc = enc[1:] enc = enc[:enc.index(quote)] else: ends = [] for candidate in ' ?>': if candidate in enc: ends.append(enc.index(candidate)) if len(ends) > 0: enc = enc[:min(ends)] enc = enc.lower() if enc == 'utf-8': return with open(path, 'rb') as fd: encfeed = fd.read() unicodefeed = encfeed.decode(encoding=enc).encode('utf-8') with open(path, 'wb') as fd: fd.write(unicodefeed) except Exception: print(f'Error converting encoding to unicode for file {path}') traceback.print_exc() gfeeds-2.2.0/gfeeds/webview.py000066400000000000000000000310771440757451400162520ustar00rootroot00000000000000from gettext import gettext as _ from threading import Thread from gi.repository import Gtk, GLib, WebKit, GObject, Gio, Adw from gfeeds.util.build_reader_html import build_reader_html from gfeeds.confManager import ConfManager from gfeeds.util.download_manager import DownloadError, download_text from functools import reduce from operator import or_ from subprocess import Popen from datetime import datetime from typing import Optional, cast from gfeeds.feed_item import FeedItem from gfeeds.util.paths import CACHE_PATH, IS_FLATPAK @Gtk.Template(resource_path='/org/gabmus/gfeeds/ui/webview.ui') class GFeedsWebView(Gtk.Stack): __gtype_name__ = 'GFeedsWebView' webkitview = cast(WebKit.WebView, Gtk.Template.Child()) loading_bar_revealer = cast(Gtk.Revealer, Gtk.Template.Child()) loading_bar = cast(Gtk.ProgressBar, Gtk.Template.Child()) main_view = cast(Gtk.Overlay, Gtk.Template.Child()) toast_overlay = cast(Adw.ToastOverlay, Gtk.Template.Child()) link_preview_revealer = cast(Gtk.Revealer, Gtk.Template.Child()) link_preview_label = cast(Gtk.Label, Gtk.Template.Child()) __gsignals__ = { 'gfeeds_webview_load_start': ( GObject.SignalFlags.RUN_FIRST, None, (str,) ), 'zoom_changed': ( GObject.SignalFlags.RUN_FIRST, None, (float,) ) } def __init__(self): super().__init__() self.confman = ConfManager() self.webkitview_settings = WebKit.Settings() self.apply_webview_settings() self.confman.connect( 'gfeeds_webview_settings_changed', self.apply_webview_settings ) self.confman.connect( 'on_apply_adblock_changed', lambda *args: self.on_apply_adblock_changed(False) ) self.confman.connect( 'on_refresh_blocklist', lambda *args: self.on_apply_adblock_changed(True) ) self.content_manager = self.webkitview.get_user_content_manager() self.user_content_filter_store = WebKit.UserContentFilterStore.new( str(CACHE_PATH.joinpath( 'webkit_user_content_filter_store' )) ) if self.confman.nconf.enable_adblock: self.apply_adblock() self.webkitview.set_zoom_level(self.confman.nconf.webview_zoom) self.new_page_loaded = False self.uri = '' self.feeditem = None self.html = None @Gtk.Template.Callback() def on_mouse_target_changed(self, webkitview, hit_test_result, modifiers): if hit_test_result: if hit_test_result.context_is_link(): self.link_preview_revealer.set_visible(True) self.link_preview_revealer.set_reveal_child(True) self.link_preview_label.set_text( hit_test_result.get_link_uri() ) return self.link_preview_revealer.set_visible(False) self.link_preview_revealer.set_reveal_child(False) def action_open_media_player(self): self.open_url_in_media_player( self.feeditem.link if self.feeditem else None ) def on_apply_adblock_changed(self, refresh: bool): self.apply_adblock( refresh=refresh, remove=not self.confman.nconf.enable_adblock ) def apply_adblock(self, refresh: bool = False, remove: bool = False): refresh = refresh or ( datetime.fromtimestamp( self.confman.nconf.blocklist_last_update ) - datetime.now() ).days >= 10 if refresh or remove: self.content_manager.remove_filter_by_id('blocklist') if remove: return def apply_filter(filter: WebKit.UserContentFilter): self.content_manager.add_filter(filter) def save_blocklist_cb(caller, res, *args): try: filter = self.user_content_filter_store.save_finish(res) apply_filter(filter) except GLib.Error: print('Error saving blocklist') def download_blocklist_cb(blocklist: str): self.user_content_filter_store.save( 'blocklist', GLib.Bytes.new(blocklist.encode()), None, save_blocklist_cb ) def download_blocklist(): res = download_text( 'https://easylist-downloads.adblockplus.org/' 'easylist_min_content_blocker.json' ) now = datetime.now() print(f'Downloaded updated blocklist at {now}') self.confman.nconf.blocklist_last_update = now.timestamp() GLib.idle_add(download_blocklist_cb, res) def filter_load_cb(caller, res, *args): try: filter = self.user_content_filter_store.load_finish(res) apply_filter(filter) print('Loaded stored blocklist') except GLib.Error: print('blocklist store not found, downloading...') Thread(target=download_blocklist, daemon=True).start() if refresh: Thread(target=download_blocklist, daemon=True).start() else: self.user_content_filter_store.load( 'blocklist', None, filter_load_cb, None ) def change_view_mode(self, target): if target == 'webview': # if uri is empty force rss content if not self.uri: if not self.feeditem: return return self.load_feeditem(self.feeditem, force_feedcont=True) self.webkitview.load_uri(self.uri) elif target == 'reader': Thread( target=self._load_reader_async, args=(self.load_reader,), daemon=True ).start() elif target == 'feedcont': self.set_enable_rss_content(True) def apply_webview_settings(self, *args): self.webkitview_settings.set_enable_javascript( self.confman.nconf.enable_js ) self.webkitview_settings.set_enable_smooth_scrolling(True) self.webkitview_settings.set_enable_page_cache(True) self.webkitview.set_settings(self.webkitview_settings) def key_zoom_in(self, *args): self.webkitview.set_zoom_level( self.webkitview.get_zoom_level()+0.10 ) self.on_zoom_changed() def key_zoom_out(self, *args): self.webkitview.set_zoom_level( self.webkitview.get_zoom_level()-0.10 ) self.on_zoom_changed() def key_zoom_reset(self, *args): self.webkitview.set_zoom_level(1.0) self.on_zoom_changed() def on_zoom_changed(self): zoom = self.webkitview.get_zoom_level() self.emit('zoom_changed', zoom) self.confman.nconf.webview_zoom = zoom def show_notif(self, *args): toast = Adw.Toast(title=_('Link copied to clipboard!')) self.toast_overlay.add_toast(toast) def set_enable_rss_content(self, state=True, feeditem=None): if feeditem: self.feeditem = feeditem if state: self.load_rss_content(self.feeditem) else: self.new_page_loaded = True self.load_feeditem( self.feeditem, False ) def load_rss_content(self, feeditem): self.set_visible_child(self.main_view) self.feeditem = feeditem self.uri = feeditem.link content = feeditem.content if not content: content = '

'+_( 'Feed content not available for this article' )+'

' self.html = '
{0}
'.format( content if '') ) self.load_reader() def _load_reader_async(self, callback=None, *args): # if uri is empty force rss content if not self.uri: if not self.feeditem: return return self.load_feeditem(self.feeditem, force_feedcont=True) try: self.html = download_text(self.uri) except DownloadError as err: self.html = ( f'

{_("Error downloading content.")}

' f'

{_("Error code:")} {err.download_error_code}

' ) if callback: GLib.idle_add(callback) def load_feeditem( self, feeditem: FeedItem, trigger_on_load_start: Optional[bool] = True, force_feedcont: Optional[bool] = False ): self.webkitview.stop_loading() uri = feeditem.link self.feeditem = feeditem self.uri = uri self.set_visible_child(self.main_view) target = self.confman.nconf.default_view # if uri is empty, fallback to rss content if not uri or force_feedcont: target = 'feedcont' if target == 'reader': Thread( target=self._load_reader_async, args=(self.load_reader,), daemon=True ).start() if trigger_on_load_start: self.on_load_start() elif target == 'feedcont': self.on_load_start() self.set_enable_rss_content(True, feeditem) else: self.webkitview.load_uri(uri) if trigger_on_load_start: self.on_load_start() def open_externally(self, *args): if self.uri: Gio.AppInfo.launch_default_for_uri( self.uri ) def on_load_start(self, *args): self.new_page_loaded = True self.emit('gfeeds_webview_load_start', '') @Gtk.Template.Callback() def on_load_changed(self, webview, event): if event != WebKit.LoadEvent.FINISHED: self.loading_bar_revealer.set_reveal_child(True) if event == WebKit.LoadEvent.STARTED: self.loading_bar.set_fraction(.25) elif event == WebKit.LoadEvent.REDIRECTED: self.loading_bar.set_fraction(.50) elif event == WebKit.LoadEvent.COMMITTED: self.loading_bar.set_fraction(.75) elif event == WebKit.LoadEvent.FINISHED: self.loading_bar.set_fraction(1.0) # waits 1 seconds async then hides the loading bar GLib.timeout_add_seconds( 1, self.loading_bar_revealer.set_reveal_child, False ) self.new_page_loaded = False resource = webview.get_main_resource() if resource: resource.get_data(None, self._get_data_cb, None) def load_reader(self): if not self.feeditem: return dark = False if self.confman.nconf.reader_theme == 'auto': dark = Adw.StyleManager.get_default().get_dark() else: dark = self.confman.nconf.reader_theme == 'dark' self.webkitview.load_html(build_reader_html( self.html, self.feeditem, dark, ), self.uri) def _get_data_cb(self, resource, result, __=None): self.html = resource.get_data_finish(result) def open_url_in_media_player(self, url: Optional[str]): if not url: return cmd_parts = [ self.confman.nconf.media_player, f"'{url}'" ] if IS_FLATPAK: cmd_parts.insert(0, 'flatpak-spawn --host') cmd = ' '.join(cmd_parts) Popen(cmd, shell=True) @Gtk.Template.Callback() def on_decide_policy(self, webView, decision, decisionType): if ( decisionType in ( WebKit.PolicyDecisionType.NAVIGATION_ACTION, WebKit.PolicyDecisionType.NEW_WINDOW_ACTION ) and decision.get_navigation_action().get_mouse_button() != 0 ): uri = decision.get_navigation_action().get_request().get_uri() if ( self.confman.nconf.open_youtube_externally and reduce(or_, [ f'://{pfx}' in uri for pfx in [ p + 'youtube.com' for p in ('', 'www.', 'm.') ] ]) ): decision.ignore() self.open_url_in_media_player(uri) else: if not self.confman.nconf.open_links_externally: return False decision.ignore() Gio.AppInfo.launch_default_for_uri(uri) return True return False gfeeds-2.2.0/meson.build000066400000000000000000000042631440757451400151320ustar00rootroot00000000000000project('gfeeds', version: '2.2.0', meson_version: '>= 0.58.0', license: 'GPL3' ) description = 'News reader for GNOME' prettyname = 'Feeds' prettylicense = 'GPL-3.0+' author = 'gabmus' authorfullname = 'Gabriele Musco' authoremail = 'emaildigabry@gmail.com' domain = 'org' # app_id built as: domain.author.project_name gitrepo = 'https://gitlab.com/'+author+'/'+meson.project_name() website = 'http://'+meson.project_name()+'.'+author+'.org' # NOTE: if you contributed, feel free to add your name and email address here contributors = '\n'.join([ 'Gabriele Musco (GabMus) <emaildigabry@gmail.com>', 'Adrien Plazas (aplazas) <kekun.plazas@laposte.net>', 'Christopher Davis (BrainBlasted) <brainblasted@disroot.org>', 'Ivan Kupalov (charlag) <charlag@tuta.io>', 'Ignacio Losiggio (iglosiggio) <iglosiggio@dc.uba.ar>', 'Éloi Rivard (azmeuk)' ]) message('Looking for dependencies') dependency('glib-2.0') dependency('gobject-introspection-1.0', version: '>=1.35.9') dependency('gtk4', version :'>=4.3.1') dependency('libadwaita-1', version :'>=1.2.alpha') i18n = import('i18n') python = import('python') py_installation = python.find_installation('python3') if not py_installation.found() error('No valid python3 binary found') endif gnome = import('gnome') prefix = get_option('prefix') # should be /usr bindir = get_option('bindir') # should be bin datadir = get_option('datadir') # should be /usr/share pkgdatadir = join_paths(prefix, datadir, meson.project_name()) pythondir = py_installation.get_install_dir() localedir = join_paths(prefix, get_option('localedir')) install_subdir(meson.project_name(), install_dir: pythondir) subdir('data') subdir('bin') subdir('po') # tests pytest_exe = find_program('pytest', required: false) if pytest_exe.found() test( 'pytest', pytest_exe, args: [meson.project_source_root() + '/test'], suite: 'pytest', env: [ 'GSETTINGS_SCHEMA_DIR="@0@:${GSETTINGS_SCHEMA_DIR}"'.format( join_paths(datadir, 'glib-2.0/schemas') ) ] ) endif gnome.post_install( glib_compile_schemas: true, gtk_update_icon_cache: true ) gfeeds-2.2.0/misc/000077500000000000000000000000001440757451400137165ustar00rootroot00000000000000gfeeds-2.2.0/misc/matrix-room-icon.png000066400000000000000000000203241440757451400176310ustar00rootroot00000000000000‰PNG  IHDR\r¨fbKGDÿÿÿ ½§“ IDATxœíÝy|Tõ½ÿñ×çÌ$™°Ã.ÈâRë‚VêN7H\~嶯’µ.½½¿ÛÛV«moêÒV[ooû»ÞVmEHpjëšEÐ^Kµ(ˆkUE$,a‡l3çóûƒÅ`f’Ìdf¾³|žG†9ÛÌ÷“ï9ç{¾G0YMçM-¦u×ÔƒxCðýˆ )-JQJ ÷m2`ß Þû¾ß ´îû~ë¾=·€4¢4‚6"ÒˆêfèIä÷ÿ‡UÀ³¨<É6È7j[\Ê'ùüƒ—6ZS>åÐrà\>¹øf¶ e!hZð„Ìxrë@¹Î @Šè— $¾ÑJ”sÏu¦,ãK@çôçËeÏ|ì:P.²DúÀ% ·^Š0 dÖè“Å^™‡ß:Of,lt(WXH;i<¾w-P »Î“ãZ'¢÷PU¿Pu(›YHκp(Az5p„ëi§]³äN袉A>*ª¹8ÆuyÑ_rhó\9gqØušLe 9Ócìß¾Œp+p”ë<¦„5¨üŒ¢>ió#®ãd+í¨"T—_Œè-À ®ó˜dÒ·Áû9+O­‘™3}×i2…€}´zrÈíÀ8×YL*érÄ»I*j¸N’ ò¾èÜ ŽD·¡LuŤ‘ð,È¿KEí[®£¸”·@gM)!Øô]oE®ó'Ú~KaøG2íÙí®Ã¸w@anùÕ¨þè:ÉA¿KEýýùvë0¯ €Þ_~8½8Ïu“‘þ\#•uÿp$]ò¢ì»Ÿÿ¯ ·aâšÎ5wPÔ÷§2m~k—kg¹œ/ûÔùv[ÏÄgèÕRYÿªë ©”³@gÎô8|É¿ÜAöͧg2C¸¢¾·äê ¢œ,:çüÃ@5ÈY®³˜ ,A2ý©U®£$[ÎMX¡sʦ"ÁåÖøMÒ(§ãG–iMY…ë(É–3=3©7âÝ LwÅä´Ùì)øº\÷Ä×A’!' €VO>äQàx×YL^XAD¾$WÔ®t¤§²þ@ç”]ò2ÖøMúŒ# ¯juù×Az*k{ª5å7‚þ”(d&+)è¬<ýûÙú„aV€}çû—¸Îb ÊcàO—ª»]G‰WÖ­ž< ¼'@Ç»ÎbL;¯!r±TÔ~ä:H<²ªèý“% O£\g1&Šu Ieýk®ƒtWÖœ;kMÙyäE¬ñ›Ìu(È_öN.“²¢hÍäËQjþ®³Ó…¾ iMù¥®ƒtGÆ­)¿•jl~“= Q«sʾê:HW2ºhMÙ×QýžÓ˜(÷jMù7]éLÆ6,­.¿ å.28£1]T¥Õe?v$–Œl\ZSv èÏ]ç0&IfêœÉ?q"šŒ» ¨5åÿê­®s“tÊ÷¥ªîg®c´—Q@kÊÿ Õ߸ÎaLÊˆÞ õwºŽ±_ÆSvÂ}dP&cR@¹N*jïu2¤±í½Ï/Õdè5 c’,‚Èt©¨}Øuç@«Ë&õؼ}&¿´áë…2£þY—!œ­)?õ_)q™ÃGv Þ©xúuWœ€½OõÉll¿Ég¼¶Óäò…\ÞÉ9·Þ}I/àOXã7ùNM¤ð)3ÉÉ kÒ^tæL^mœšîc“™t<"5:sfÚÛcú{‡¿4›ÉǘO‘)¾ä?Ò~ÔtLk&]Œza·ûŒ‰ÆG¹DªêžN×ÓVtîGâ{/Ûc:µ•ˆœœ®)ÇÓò›XçLê|Ô¿1]@@Ýw¡<åÒÓïnÐãÒr,c²ß8z…ÿ;Jù)€Ö”U T§ú8Æäå2©ª{(•‡HiÐ'$ì½ HåqŒÉMº /p¢LúƒT!e§:s¦GØ›ƒ5~c$%ø~µÎ›HÕRw `ìß¾LLÙþÉ_ uçwRµó”œèÜIãñ½%ØL¾Æ$C¾œ*3j—%{ÇIï袉A|ï¬ñ“,x:KïŸô6•üS€ŠnNJú~Éo'ÐkPÒ§Oê)€Î¾ð(<9PœÌých'•õï'k‡Ië¨"xþo±ÆoLªƒÜ«š¼_ÜÉ;˜[~5pnÒögŒ‰f"5“¯HÖÎ’RItÖ”‚Í?cL§6R>J¦=»½§;JN Ðôc¬ñ“.ƒi &eî€÷ôIGñV`·ýŒI§V|ïx™ñô»=ÙIÏ{ùO¬ñ“n…xþ/zº“õtöäóñ䙞†0Æ$H)“ªºúD7O¸°÷¶Ÿü2Ñí1I ü´'·?¨™<8!áí1Éps˦$ºqB`ßã‰3=¨1&©nItJñÄzÍ;.ùlBÛc’K9–#^ššÈ¦qŸ;輩Zv¾ |&‘cRâ]F4+ç,dzQü=€–UXã7&ÓźÐ?Ç»Q\`ïÕF¹!ÞƒcÒ@¹1Þ;ñõj&_×6Ƙt9ž¹åijA|@åú¸Ö7Ƥ—j\m´ÛÝ­ž|Ȳx¶1Æ8àyŸ“éO/ïÖªÝÞ©z7bߘÌçG¾ÕÝU»Õ uÖ…C úbý“ ZQ¤T-ØØÕŠÝëü+±ÆoL¶(D¼ÝY±Ë Š \ÕóLƘ4ºº;·»îÌ-;8"‰Œ1is\ø…®VêºøzMRâcÒË÷»l»vtöy¥x뀢¤…2ƤK3^`¸Ljk¬:ïxÁ˰ÆoL¶ áû>%ØÕ)@Bc2…NëliÌS­ž< d-²w“cR.B íP¹|á†h ;ëLÿ1Ù.€_ðåX ƒ±·“N»ùj}sˆ–)ùì9ô<†‚â¾®#åµ¶¦ìjXɶwQ¼î††š]GÊ<Ê4à¢-Šz  5å#Pý€T¼>þFFÿ/Öø3˜x£.ø:ÛNº–°ï:N&ñ/޾ ¥,¥q²LÈ) >þ<×1L7 wë‡_â:F†Ñ¨mºÃ)€Î›ZHËÎF OÊ3eõÍ!†^õˆýæÏ2êGØpßWìšÀ'vRÔw L›ßÚþÃŽ?ÕM;ÎÂÿ­‡k? ‰ éг\ÇÈ$}iÙyƧ?ìø“íIyZâd‰þŸ9Ûu“ ’£Ïq!³HǶíW›ÿ·Ó{ðh×L‚zã:BfQíP œ7„ˆÍúÛ^Aq¿.×Ù¾ö ¶,¼“¡4PÜÉÈ ÓsMaØ Ãpîõôyl§ëöTYã83ipû™‚îD‚Ò)Ëm_ûgn`LÐ:at`=g®gûÚ7]ÇÉ6‚Êéí?øÔ)€œ™Î4¹`ËÂ;éShs¥¦[ŸBaËsÿé:FöñnãÅ @œ†Òà:BÞâwØfº½è¼©Å'¦?Ov³n¿;½lšÚDŒ×YCûÿðI m÷É@¡‹DƘ´)¢ xüþ?|R|=ÅIcLz©žºÿÛv×ôYŒ1i7nÿ7Áhš$ª¨u{üØi:8~ÿ7€Þ=¾8ÚYcL:«‹&aÿ)@ï!GcÉE¬+> öUëþ“_އý@´óAÕÆ˜£ÇÁþàëX§YŒ1éåËX8pPì¹Icò‰èh8p Àh‡QŒ1é7 ¨s&õ9“»2ý>|»q ~¤ ?ÜÆ®†÷iÙ¾¶›hݼ Ù±ŽÂæ )ÜM0`O>戡:kb(ˆ/£ tþ–`“¼@^ €’QÑo µ5íàã7ÑüÁKôÞöCB-iNh’H†Fñd”ë$&;÷cøÉ_„“¿À¶V°eé<Ùú*%!uœÎÄOÇÞÉ;BMŽ ·ì!XÔ+¡mKF£dÔ8"m-¬ý냽÷(ƒCmINhRh˜‡È@×)Œ;›ß~¡Çû1òì+xå#¬y)[šmõì =”R×1ŒCKï¦eç–¤ìÊ 0òì+èW1U}ΠÕ^Ï•á´4R vþ–¯††šÙ:¯’u¥§Rr\EýáGÂôêO¨ÿà„ö õf씲uõ2ÞÌ0{;O†’Ò ¨õòÜ€"Ÿ»–Àß–ôùÎØAZЇS0â$}6}âxO€1Ÿ#\9—U|±þ»INm’ 4Ø5€TÊâùúA_vÿ.|ø.|øë›C´ ?“ŸÿJ·ŠA°¨c/ÿ5kŸ¿ŸÁ«´×vg–A Äu “=†…šaËBüúgYJŸÓ®aàÑ]O&=òì+Ø0`8}_ù•Mæ™1d€„º\ϘOñDÜÀÀ¥·²fVU·^Ò1dÜ$š&ü˜í-vÛ9CyØD ¦‡Fl¢xá·YõÈ ·ìétÝÒ#O#|ÖLöØpL`À$GaÐclÓR«/cëêe®[zä)ìÿmšÛì6¡[ZŠ\Ç0î¬;ü $¢×à1øáVZw6²çÃWÑë)jÙÄ!²-®sö!¡Vv?wkª`äªb¯7îÖnßÀÈæöü/aUÄzyíÐÓ/íøá‰“|ëGÚØüÞËìxg!}7ÿA¡p—ûì] ×šYÕøc§ü0æz#¿PÁªuË~+¡ì¦ÇìÀtÎ 0ðè3;åG ºúq6Œû´v=tDÆîú+«‰]F}é6>nNìYÓcEöf»TËðùüH^ »}|aȸI0n›Þz¶¿þšá¡Î/úmZÊê'ï`ÌÅ7F]( Ñ{òÍ´,ü¶pÀZ]‡0îìøèí„¶tÌY »jkJÏïrÌÿè­‹Xûüý1—÷y,ëúŸs¹I™+ynËÿÞ“ð¶â]~=;Nÿ[Zbw&E`ЪÙ²riÌu»ðF67[‡4ÍZ<À¦uÉccu%«æþ_¶®^ŽNìwÁÀÏœIhÊoYß\sPGÛ¢[hkÚuy°¨ÍŸ½<¡ã›„µ±@Þ«+áÅï±»%B…ìÑBZŠ!ƒŽáã&ÑoÄg»ÜG¯Ò.½‡†‡¯ahŒ§ÿ†„ZYõÄ­Œv{Ô凞~)Þ~ئKiµSs@ï¢%E†‡š#2zsý›îý >??Òùð½¢¾é;å×lnÄ\ç°¦×ØºêÕ¨ËÄóh=rJþ&.-`k›N(ÞÍakbÓ¬©l|}a§ëöxÞÄÑãÂ`0 ìZ|gÌí0ÆN ˆIªØê:…ÉCB- ZþKV=òƒN{‡q Ã/޹|dá6½¹8ê2/PÀöÒÏ÷4ªéKe³Í šB©ž Íã D`lÓ+¬©¾–—ÝsBÑÃÎÿW>ºïF„vE]¾ûåûtìĨËJOž†.z ±ŸËÔÙì6ºÎa²Ïè`=øõ˜=ñn퓬¨&_=§}þ~KÔe}—²wBÚŽ?}Ž˜Ë^LèïbºK=;Ès;Z…¦/ÜÌØ/þ€¢¾Oé 8ôôKéÙ>l=¤Ã¶"\v‘Öè7“~挘„…Âl]ýZôíŽ>“¦®<4=áK£¬wøã«Ò|òõ”yZ§ëö.aè¥w±©¹ãƒCƒBm|ôÂý1·mvFÌeÛßþb/PÀ&¿cÁ1I$ÚàáÉ×9Œ;0ŠÁǟ׭u {—Ðzìô¨ËB«cßípÜä˜Ë´aEÌeáÞѯ˜d‘Õ…}VcoÉ[¡c.‰kýa'ÿSÔ ƒCŠ[i|÷oQ·)u<ÛZ¢îéݺ1æ±¼’‘qe3qQÂÍeÚü&­.Û$öÓ¹ Ÿ`À§Äµ¾,d+%ôa[‡eÛß~–Ò£¢ŸJl ¢„†ŸRØŠnÅ vœ—&4øØW<Ó}ëåÊÅûß⨫Ýf1®÷‹{›ˆ}É@ã;1·ñûDïή†•Q—•Ø)@ ­½‚€îýƒÉ?{?Š{›‚¶èôöÕí1· ”Œˆ¹¬uWôQEýì¥U)´öñ¢—`“ó¶¼õ\\ë7oßÈТÝQ—õ Æ~> ÷Èq1—‹ûGý|îv®ŸH[ M[?æã¿?Æê9×0äõÿ¢oa×ÃEbÍ1èÇ* PRaëÃWÓ°¬–psôë &™äM™6?Ð~ÖÀ‰nå°TÏЕ8Æ! 5ÃÇÚûïû"ÎSñýs ¶û@»c¿ù›½_&Õ ¿l÷¿Ö³ëÆä…O.ú·+þK.¢cÒÍ?0fû“°Õ{»hL®k!Üz`Zæ@¾QÛtþbwcL¶û»\¹øÀÙƒ/ï¨Ø,Æä4=¨\<µ`L.S¯“àûVŒÉ]J˜ƒ&m8èu¬Rµ`£Ö”½‰rlzså° ŸÀä•rUíA3,tâ¡8¹bŒI‰(m»cêÒÆ“fÒ¡mw,…}ÿDŸñÁ“­vдñ¯Ÿþ°Ció[Ei‰”lîzwvÛ‹í»OxV®{¥Ãd 1óèØU0Ñma®#ä­A›5¸û¢·éèÀ<DÁ»9È€s¯gW«Íªžn;Z`PÙ÷]ÇÈ>ê?mAÔ 3ž\t8_0õy,‘ îdMd8{bO‰g’dO¬öGâ]ò[ú í:NvPž—Êú¨o Fû‘y¨NHY¨,ÑÖ´£Ë©³û<–þ3þ¦Dù­0¦›ë¶îÞFÇ· ä#kIì©Úd>ÐýÙ"sÔîk\G0 Ú½Ñ^wD@µ0f+Ÿnþ’’HYdë[ ]G0 Úöv|Sžç&yNªÄ|ÿZ“=IÌ®C¾(^÷êÛõÐl£~„âóþ÷¨>ÜÙâÎ €ß:ˆ=›cjæÃ…¿sÃÄéƒgîbh(ïç·i"ˆÙý‡. €ÌXØü9©‘²ÐÐu±aÅ3®c˜nÚ°bÃ×?å:FÐù2ý©­­Ñõ|¯*÷&-O–* z”¼úKÖ,øï¸Þ¢cÒKýkêÀWï¤0ho~ßÕ ÑßñÔŽ*BMù?@LN¦ìÖТéг(9úú ›ÐÛuMò´5í`WÃJ¶¿³˜Ðºç­Ûÿ‰w©¨;Z„NG©Å°ª5zÊÏ’—-{ 5Cãxqë((ìû"ä6Kf‘{»jüÐÝW>xm³çfLvhE#sº³b· €\¾pÐéícL†èìÞ{Ý¿Râó èºKaŒqLõ¿º»j· €Ì¨[`ÃâŒÉluRYÿZwWŽï^‰êqÇ1ƤðËøV“V—-Nˆw;cLÊ­ ¢îÄî\ýß/þѯâÞÆ“z¢·ÇÓø!‘PØ·øGÜÛcRé] ûÅ}§.î ÓæG@n‰w;cL )?ØÛ6ã“Ø€é•§>¬Hh[cL’ɬ:í‘„¶LôZSþTç'º½1&I|"3êKdÓÄ €"ÔL~äÄD÷aŒé)y…ŠÚ“ã½ø·_ÂÏLŠ ˆÜèöƘdˆ|/ÑÆ=(RQ·x¢'û0Æ$HxT*ôh¦šžÏš‘oö¶1éÕŠD¾ÛÓô¸Èµ+ÿ×Óýcâ Ü)ÓŸy¯§»IμI­…7 IÙ—1¦ ²äçÉØSR €|õñ ö¢6cÒAýïHEíŽdì*áÛ€Ÿ¦Š0·lÊùÉÚ§1æS”ETÖד+ÿí%mêTß¿ج}c²_®IVã‡$©Z°Úž0&ED´ï¢{Ò$òôMw‚¼’ôý“×t9‡¶ü:Ù{Mzs‡Á¿›Eؘdi®ØÛ¶’+%¯O‘ÊúWAg¦b߯äÕÆ3Ï_Ž19Eõ^©¨MùÛ¸Òóåpó×€WÓr,c²ž.'ÔïßÓq¤”^hOç^8 ß(M×1É:Êð?¿wP]ꥧÈô§?ÿ2 î™KÉ>¢ÓÓÕø!`ßì%6Tؘh”He}]:™ÖÀÊÓnAIhScr—rUí&4p °ÕUcœR¶ð/tÕøÁaª§ÞF埰Y…MþiÃcš\¾à—!œ©ª}‘ØíA“?"ˆ\¾ï½N9/RQû0ÂWßucRLA¿¶oˆ¼sQ¤¢n6ªßpØ”R®—Êú߻ޱ_Æ©ª¿ åÛ®s“Â÷¤ªîW®c´—Q@ªê~…êÍ®s“d?‘Šôô銳q]Ñêò›@3î̘¸‰üX*j3ò—ZÆ3ùkˆÜEöTŒéý–TÖ'}6ßdÉè ÕåÓAï‚®³‡è5RY?ËuÎd|КòKQºÎbL7´ R‘)·ú:“@kÊÏDõÏÀ@×YŒéÄVàKRY·ØuîÈš Õ“ïiÐ#]g1&ŠÕ{Çö»Þ¬º¸&•õïž¼è:‹1Q^ÞûT_ö4~Ȳ —?±™=“€?¹ÎbÌ^ò¡¾]>Õ—¨¬:hO¡¦üFÐÛ€€ë<&/)è¬<ýû2sfV>Ç’µ`?;ù|yì:‹É+(Ó¥ª®ÞužÈú NIØ{8Ùu“–¡þ—Ó9{oªdÝ5€hä²k)ê{6HFº09@õ^ÂÍgäBã‡é´§Õ“¿ŒÊ=öBR“dÛ‘ʺ]I¦œ+pà”`0Ñu“”ExR%µ¹Ž’l9Y`ÿ]‚Éß¹Blncåi7gëUþ®älØOg—Oœä:‹É*KA¯–Êú×\I¥œ¸Ø™Q»Œͧ‚~Øå:ÉxM ߥ¨ïi¹Þø!zíéÜ‹Æâû¿½Àu“‘žÇ÷®•O¿ë:HºäU€×®ïg C\ç1¡ä&©¬ã:Hºå]ØOçLêxßnB®ó'Ú~ òC©¨Ýá:Œ y[öÓêÉG òS”©®³˜4RyŸoʵ+]Gq)ï À~:{òùxr;v· ×-Eå&©ª}ÎuL`àSö‚;€Ï¹Îb’HxŸŸPY÷G¯áÎTV¢PE¨.¿Ñ[q®ó˜žÐ·Áû9E}æÊ´ùöþÉO±Ð 75@ëÎËP¾ƒ‚,£Ë~Áû§?”«£ø’Á @7露 7!zöï–É^Dåv*kŸ´®~×ì9N:»lž^òÏØ3™¢xñ§_w&›XHνh¾?ø7Ðã\çÉSï‚܇FfIÕ‚®Ãd#+I s'Ç÷®¦½]çÉq-Ñ{¨ª_hÝüž±DŸô t{ç"°ÉJ“#‚°Õ‡ ÿQ®üó6×r…€ÑÙç•â^„2Ñ2ì݆ñò% ó –+Ÿnp(YH}ð‚ᄃƒ–ç}]gÊP;ž©Cý'¥²~½ë@¹Î @šéÝã è3pê•¡Z†/x ´¤Ž=›^”ë^is(ŸXpLkÊûñOÁ“ g¢L wŸN ƒ¼†è‹øü/aY,WÕnr*ŸYÈ0:kbˆ@èó§°·wp image/svg+xml gfeeds-2.2.0/new_release.sh000077500000000000000000000030721440757451400156150ustar00rootroot00000000000000#!/bin/bash if [ -z "$2" ]; then echo "Usage: $0 VERSION_NUMBER \"CHANGELOG_LINE1;CHANGELOG_LINE2;...\"" exit fi AUTHOR='gabmus' PROJECT_NAME=$(grep "project('" meson.build | sed "s/project('//;s/',//") n_version="$1" changelog="$2" sed -i "s/ version: '.*',/ version: '$n_version',/" meson.build MANIFEST_PATH="dist/flatpak/org.$AUTHOR.$PROJECT_NAME.json" TARGET_MODULE="$PROJECT_NAME" python3 -c " import json manifest = None with open('$MANIFEST_PATH') as fd: manifest = json.loads(fd.read()) for i, module in enumerate(manifest['modules']): if isinstance(module, dict) and module['name'] == '$TARGET_MODULE': manifest['modules'][i]['sources'][0]['tag'] = '$n_version' break with open('$MANIFEST_PATH', 'w') as fd: fd.write(json.dumps(manifest, indent=4, sort_keys=False)) " RELEASE_DATE=$(date +%Y-%m-%d) release_text=$(python3 -c " def mprint(t): print(t, end='\\\\n') mprint(' ') mprint(' ') mprint('
    ') for line in '$changelog'.split(';'): mprint('
  • '+line.strip()+'
  • ') mprint('
') mprint('
') mprint('
') ") APPDATA_PATH="data/org.$AUTHOR.$PROJECT_NAME.appdata.xml.in" target_line=$(sed -n "/~ ~" $APPDATA_PATH gfeeds-2.2.0/po/000077500000000000000000000000001440757451400134015ustar00rootroot00000000000000gfeeds-2.2.0/po/LINGUAS000066400000000000000000000002001440757451400144160ustar00rootroot00000000000000# Please keep this list alphabetically sorted ca cs da de es eu fa fi fr fur he hu id it ko nl pl pt_BR ru sl sr sv tr uk zh_CN gfeeds-2.2.0/po/POTFILES.in000066400000000000000000000013571440757451400151640ustar00rootroot00000000000000data/org.gabmus.gfeeds.appdata.xml.in data/org.gabmus.gfeeds.desktop.in data/ui/aboutdialog.ui.in data/ui/add_feed_popover.blp data/ui/empty_state.blp data/ui/left_headerbar.blp data/ui/main_leaflet.blp data/ui/manage_feeds_headerbar.blp data/ui/manage_tags_content.blp data/ui/right_headerbar.blp data/ui/shortcutsWindow.blp data/ui/sidebar_listbox_row.blp data/ui/webview.blp gfeeds/feed_item.py gfeeds/feed_parser.py gfeeds/feeds_manager.py gfeeds/feeds_view.py gfeeds/headerbar.py gfeeds/main_leaflet.py gfeeds/__main__.py gfeeds/manage_feeds_window.py gfeeds/opml_file_chooser.py gfeeds/preferences_window.py gfeeds/util/build_reader_html.py gfeeds/util/download_manager.py gfeeds/util/get_favicon.py gfeeds/util/opml_parser.py gfeeds/webview.py gfeeds-2.2.0/po/README.md000066400000000000000000000040551440757451400146640ustar00rootroot00000000000000# Contribute translations using Damned Lies This app can be translated using GNOME's Damned Lies website. - Visit [the Damned Lies website](https://l10n.gnome.org/) and create an account. - Visit [the Damned Lies page for this project](https://l10n.gnome.org/module/gfeeds/) and choose the language you want to translate to. - If your language is not listed, open an issue on the project's [issue tracker](https://gitlab.gnome.org/World/gfeeds/-/issues) asking to add it. - On the page, submit a _Reserve for translation_ action, so that others will not work on a new translation when you're already working on one. - Download the latest PO file from the language page using the download button (not the POT file). - Edit your translation by opening the PO file with a translation editor like [Lokalize](https://apps.kde.org/lokalize/) or [Gtranslator](https://flathub.org/apps/details/org.gnome.Gtranslator). - Save your edited PO file, then go back to the language page. - Submit an _Upload new translation_ action, attaching your edited PO file. - Interact with the language theme, reading their comments and making changes until your translation gets approved and merged into the repository. ## Manually adding translation **NOTE: this method is considered legacy, always prefer using Damned Lies istead** First, run the script `update_potfiles.sh` like this, where `LANGUAGE` is the language code that you want to add or update (`it`: italian, `fr`: french, `es`: spanish...): ```bash cd po ./update_potfiles.sh LANGUAGE ``` It will ask for an email, provide yours if you want and it will be used to credit you. It's historically been used to report issues in the translation for a specific language, but nowadays with issue systems and easier bug reporting than ever it's not really necessary. Finally edit the `.po` file that was just created with the language code you used. You can use a normal text editor or a simpler tool like **lokalize** or **poedit** (you can probably find both in your distribution's repositories). If you need any help, feel free to open an issue. gfeeds-2.2.0/po/ca.po000066400000000000000000000557021440757451400143350ustar00rootroot00000000000000# Catalan translations for gfeeds package. # Copyright (C) 2021 THE gfeeds'S COPYRIGHT HOLDER # This file is distributed under the same license as the gfeeds package. # Ãcar , 2021. # msgid "" msgstr "" "Project-Id-Version: gfeeds 0.16.2\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-03-16 03:10+0100\n" "PO-Revision-Date: 2021-03-16 03:55+0100\n" "Last-Translator: car \n" "Language-Team: Catalan \n" "Language: ca\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.4.1\n" #: ../gfeeds/manage_feeds_window.py:210 ../gfeeds/manage_feeds_window.py:325 msgid "Manage Feeds" msgstr "Gestiona els canals" #: ../gfeeds/manage_feeds_window.py:217 msgid "Select/Unselect all" msgstr "Selecciona/Desselecciona tots" #: ../gfeeds/manage_feeds_window.py:223 msgid "Delete selected feeds" msgstr "Suprimeix els canals seleccionats" #: ../gfeeds/manage_feeds_window.py:230 msgid "Manage tags for selected feeds" msgstr "Gestiona les etiquetes pel canals seleccionats" #: ../gfeeds/manage_feeds_window.py:296 msgid "Do you want to delete these feeds?" msgstr "Vols suprimir aquests canals?" #: ../gfeeds/__main__.py:295 msgid "url" msgstr "url" #: ../gfeeds/__main__.py:298 msgid "opml file local url or rss remote url to import" msgstr "URL del fitxer local OPML o URL remota del RSS per importar" #: ../gfeeds/opml_manager.py:42 msgid "Error: OPML path provided does not exist" msgstr "Error: el camí de l'OPML proporcionat no existeix" #: ../gfeeds/opml_manager.py:51 #, python-brace-format msgid "Error parsing OPML file `{0}`" msgstr "Error analitzant el fitxer OPML `{0}`" #: ../gfeeds/headerbar.py:162 msgid "Add new feed" msgstr "Afegeix un canal nou" #: ../gfeeds/rss_parser.py:61 #, python-brace-format msgid "Error: unable to parse datetime {0} for feeditem {1}" msgstr "" "Error: no s'han pogut analitzar la data i la hora {0} per l'element {1}" #: ../gfeeds/rss_parser.py:169 #, python-brace-format msgid "Errors while parsing feed `{0}`" msgstr "Error en analitzar el canal `{0}`" #: ../gfeeds/rss_parser.py:209 #, python-brace-format msgid "`{0}` may not be an RSS or Atom feed" msgstr "`{0}` podria no ser un canal RSS o Atom" #: ../gfeeds/opml_file_chooser.py:7 msgid "Choose an OPML file to import" msgstr "Escull un fitxer OPML a importar" #: ../gfeeds/opml_file_chooser.py:14 ../gfeeds/opml_file_chooser.py:31 msgid "XML files" msgstr "Fitxers XML" #: ../gfeeds/opml_file_chooser.py:22 msgid "Choose where to save the exported OPML file" msgstr "Escull on desar els fitxers OPML exportats" #: ../gfeeds/sidebar_row_popover.py:47 ../gfeeds/sidebar_row_popover.py:92 msgid "Mark as unread" msgstr "Marca com a no llegit" #: ../gfeeds/sidebar_row_popover.py:55 ../gfeeds/sidebar_row_popover.py:82 msgid "Mark as read" msgstr "Marca com a llegit" #: ../gfeeds/webview.py:74 msgid "Web View" msgstr "Vista web" #: ../gfeeds/webview.py:75 #, fuzzy msgid "Filler View" msgstr "Vista farcida" #: ../gfeeds/webview.py:136 msgid "RSS content or summary not available for this article" msgstr "El contingut o resum RSS no està disponible per a aquest article" #: ../gfeeds/get_favicon.py:70 #, python-brace-format msgid "Error downloading favicon for `{0}`" msgstr "S'ha produït un error en baixar el favicon per a `{0}`" #: ../gfeeds/suggestion_bar.py:39 msgid "There are some errors" msgstr "Hi ha alguns errors" #: ../gfeeds/suggestion_bar.py:48 msgid "Show" msgstr "Mostra" #: ../gfeeds/suggestion_bar.py:49 msgid "Ignore" msgstr "Ignora" #: ../gfeeds/suggestion_bar.py:72 msgid "There were problems with some feeds. Do you want to remove them?" msgstr "Han ocorregut problemes amb alguns canals. Vols eliminar-los?" #: ../gfeeds/suggestion_bar.py:92 msgid "You are offline" msgstr "Estàs fora de línia" #: ../gfeeds/feeds_manager.py:75 #, python-brace-format msgid "Feed {0} exists already, skipping" msgstr "El canal {0} ja existeix, se salta" #: ../gfeeds/confirm_add_dialog.py:16 msgid "Do you want to import these feeds?" msgstr "Vols importar aquests canals?" #: ../gfeeds/confirm_add_dialog.py:17 msgid "Do you want to import this feed?" msgstr "Vols importar aquest canal?" #: ../gfeeds/sidebar.py:181 msgid "Feed" msgstr "Canal" #: ../gfeeds/sidebar.py:187 msgid "Saved" msgstr "Desat" #: ../gfeeds/settings_window.py:179 msgid "General" msgstr "General" #: ../gfeeds/settings_window.py:183 msgid "General Settings" msgstr "Paràmetres generals" #: ../gfeeds/settings_window.py:186 msgid "Refresh articles on startup" msgstr "Refresca els articles en iniciar" #: ../gfeeds/settings_window.py:191 msgid "Show newer articles first" msgstr "Mostra primer els articles més nous" #: ../gfeeds/settings_window.py:196 msgid "Open links in your browser" msgstr "Obre els enllaços al teu navegador" #: ../gfeeds/settings_window.py:201 msgid "Open YouTube links via your video player" msgstr "Obre els enllaços de YouTube a través del teu reproductor de vídeo" #: ../gfeeds/settings_window.py:204 msgid "Great when paired with youtube-dl enabled players" msgstr "Bo quan es combina amb reproductors amb youtube-dl" #: ../gfeeds/settings_window.py:218 msgid "Preferred media player" msgstr "Reproductor multimèdia preferit" #: ../gfeeds/settings_window.py:222 msgid "Maximum article age" msgstr "Edat màxima dels articles" #: ../gfeeds/settings_window.py:226 msgid "In days" msgstr "En dies" #: ../gfeeds/settings_window.py:232 msgid "Cache" msgstr "Memòria cau" #: ../gfeeds/settings_window.py:235 msgid "Clear all caches" msgstr "Neteja totes les memòries cau" #: ../gfeeds/settings_window.py:236 msgid "Clear caches" msgstr "Neteja les memòries cau" #: ../gfeeds/settings_window.py:274 msgid "View" msgstr "Visualitza" #: ../gfeeds/settings_window.py:278 msgid "View Settings" msgstr "Paràmetres de visualització" #: ../gfeeds/settings_window.py:281 msgid "Show full articles titles" msgstr "Mostra els títols complets dels articles" #: ../gfeeds/settings_window.py:286 msgid "Show full feeds names" msgstr "Mostra els noms complets dels canals" #: ../gfeeds/settings_window.py:291 msgid "Use dark theme for reader mode" msgstr "Usa el tema fosc pel mode de lectura" #: ../gfeeds/settings_window.py:296 msgid "Enable JavaScript" msgstr "Activa el JavaScript" #: ../gfeeds/settings_window.py:312 msgid "Advanced" msgstr "Avançat" #: ../gfeeds/settings_window.py:316 msgid "Advanced Settings" msgstr "Paràmetres avançats" #: ../gfeeds/settings_window.py:319 msgid "Maximum refresh threads" msgstr "Màxim nombre de fils per refrescar" #: ../gfeeds/settings_window.py:324 msgid "How many threads to refresh feeds" msgstr "Quants fils per refrescar els canals" #: ../gfeeds/spinner_button.py:16 msgid "Refresh feeds" msgstr "Refresca els canals" #: ../gfeeds/download_manager.py:87 #, python-brace-format msgid "`{0}`: connection timed out" msgstr "`{0}`: la connexió ha excedit el temps d'espera" #: ../gfeeds/download_manager.py:89 #, python-brace-format msgid "`{0}` is not an URL" msgstr "`{0}` no és una URL" #: ../gfeeds/download_manager.py:114 #, python-brace-format msgid "Error downloading `{0}`, code `{1}`" msgstr "Error descarregant `{0}`, codi `{1}`" #: ../gfeeds/build_reader_html.py:98 msgid "Thumbnail" msgstr "Miniatura" #: ../gfeeds/feeds_view.py:18 msgid "All feeds" msgstr "Tots els canals" #: ../data/ui/article_right_click_popover_content.glade:48 msgid "Save article" msgstr "Desa l'article" #: ../data/ui/webview_with_notification.glade:51 msgid "Link copied to clipboard!" msgstr "Enllaç copiat al porta-retalls!" #: ../data/ui/webview_filler.glade:42 msgid "Select an article" msgstr "Selecciona un article" #: ../data/ui/manage_tags_listbox_row_content.glade:18 #: ../data/ui/scrolled_label.glade:21 msgid "label" msgstr "etiqueta" #: ../data/ui/spinner_button.glade:23 msgid "page0" msgstr "pàgina0" #: ../data/ui/spinner_button.glade:34 msgid "page1" msgstr "pàgina1" #: ../data/ui/add_feed_box.glade:20 msgid "Enter feed address to add" msgstr "Entra l'adreça del canal a afegir" #: ../data/ui/add_feed_box.glade:41 msgid "https://..." msgstr "https://..." #: ../data/ui/add_feed_box.glade:61 msgid "Add" msgstr "Afegeix" #: ../data/ui/add_feed_box.glade:91 msgid "You're already subscribed to that feed!" msgstr "Ja estàs subscrit a aquest canal!" #: ../data/ui/headerbar.glade:34 msgid "Menu" msgstr "Menú" #: ../data/ui/headerbar.glade:66 msgid "Search" msgstr "Cerca" #: ../data/ui/headerbar.glade:86 msgid "Filter by feed" msgstr "Filtra per canal" #: ../data/ui/headerbar.glade:118 msgid "Back to articles" msgstr "Torna als articles" #: ../data/ui/headerbar.glade:134 msgid "Open externally" msgstr "Obre externament" #: ../data/ui/headerbar.glade:154 msgid "Change view mode" msgstr "Canvia el mode de visualització" #: ../data/ui/headerbar.glade:196 msgid "Share" msgstr "Comparteix" #: ../data/ui/menu.xml:6 msgid "Show read articles" msgstr "Mostra els articles llegits" #: ../data/ui/menu.xml:10 msgid "Mark all as read" msgstr "Marca tot com a llegit" #: ../data/ui/menu.xml:14 msgid "Mark all as unread" msgstr "Marca tot com a no llegit" #: ../data/ui/menu.xml:24 msgid "Import OPML" msgstr "Importa OPML" #: ../data/ui/menu.xml:28 msgid "Export OPML" msgstr "Exporta OPML" #: ../data/ui/menu.xml:34 msgid "Preferences" msgstr "Paràmetres" #: ../data/ui/menu.xml:38 msgid "Keyboard Shortcuts" msgstr "Dreceres de teclat" #: ../data/ui/menu.xml:42 msgid "About Feeds" msgstr "Quant a Feeds" #: ../data/ui/manage_tags_popover_content.glade:24 msgid "New tag name..." msgstr "Nom d'etiqueta nou" #: ../data/ui/manage_tags_popover_content.glade:37 msgid "Add tag" msgstr "Afegeix una etiqueta" #: ../data/ui/manage_tags_popover_content.glade:112 msgid "There are no tags yet" msgstr "Encara no hi ha etiquetes" #: ../data/ui/manage_tags_popover_content.glade:128 msgid "Add some using the entry above" msgstr "Afegeix-ne algunes usant l'entrada de més amunt" #: ../data/ui/empty_state.glade:42 msgid "Let's get started" msgstr "Comencem" #: ../data/ui/empty_state.glade:88 msgid "Add new feeds via URL" msgstr "Afegeix nous canals via URL" #: ../data/ui/empty_state.glade:100 msgid "Import an OPML file" msgstr "Importa un fitxer OPML" #: ../data/ui/extra_popover_menu.glade:18 msgid "View mode" msgstr "Mode de visualització" #: ../data/ui/extra_popover_menu.glade:52 msgid "Reader Mode" msgstr "Mode de lectura" #: ../data/ui/extra_popover_menu.glade:67 msgid "RSS Content" msgstr "Contingut RSS" #: ../data/ui/shortcutsWindow.xml:13 msgid "Open Keyboard Shortcuts" msgstr "Obre les dreceres de teclat" #: ../data/ui/shortcutsWindow.xml:19 msgid "Open Menu" msgstr "Obre el menú" #: ../data/ui/shortcutsWindow.xml:25 msgid "Open Preferences" msgstr "Obre les preferències" #: ../data/ui/shortcutsWindow.xml:31 msgid "Quit" msgstr "Surt" #: ../data/ui/shortcutsWindow.xml:37 msgid "Refresh articles" msgstr "Refresca els articles" #: ../data/ui/shortcutsWindow.xml:43 msgid "Search articles" msgstr "Cerca articles" #: ../data/ui/shortcutsWindow.xml:49 msgid "Next article" msgstr "Article següent" #: ../data/ui/shortcutsWindow.xml:55 msgid "Previous article" msgstr "Article anterior" #: ../data/ui/shortcutsWindow.xml:61 msgid "Show/Hide read articles" msgstr "Mostra/Amaga els articles llegits" #: ../data/ui/shortcutsWindow.xml:67 msgid "Zoom in" msgstr "Amplia" #: ../data/ui/shortcutsWindow.xml:73 msgid "Zoom out" msgstr "Allunya" #: ../data/ui/shortcutsWindow.xml:79 msgid "Reset zoom" msgstr "Reinicia el zoom" #: ../data/org.gabmus.gfeeds.desktop.in:5 msgid "@prettyname@" msgstr "" #: ../data/org.gabmus.gfeeds.desktop.in:6 msgid "News reader for GNOME" msgstr "Lector de notícies per al GNOME" #: ../data/org.gabmus.gfeeds.desktop.in:13 msgid "rss;reader;feed;news;" msgstr "rss;lector;canal;notícies;" #: ../data/org.gabmus.gfeeds.appdata.xml.in:4 msgid "Feeds" msgstr "Canals" #: ../data/org.gabmus.gfeeds.appdata.xml.in:5 msgid "Gabriele Musco" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:15 msgid "" "Feeds is a minimal RSS/Atom feed reader built with speed and simplicity in " "mind." msgstr "" "Canals és un lector de canals RSS/Atom minimalista construït amb la " "velocitat i la senzillesa en ment." #: ../data/org.gabmus.gfeeds.appdata.xml.in:16 msgid "" "It offers a simple user interface that only shows the latest news from your " "subscriptions." msgstr "" "Ofereix una interfície d'usuari simple que només mostra les últimes " "notícies de les teves subscripcions." #: ../data/org.gabmus.gfeeds.appdata.xml.in:17 msgid "" "Articles are shown in a web view by default, with javascript disabled for a " "faster and less intrusive user experience. There's also a reader mode " "included, built from the one GNOME Web/Epiphany uses." msgstr "" "Per defecte, els articles es mostren en una vista web, amb JavaScript " "inhabilitat per a una experiència d'usuari més ràpida i menys intrusiva. " "També hi ha un mode de lectura inclòs, construït a partir de l'utilitzat " "per GNOME Web/Epiphany." #: ../data/org.gabmus.gfeeds.appdata.xml.in:18 msgid "Feeds can be imported and exported via OPML." msgstr "Canals pot ser importat i exportat via OPML." #: ../data/org.gabmus.gfeeds.appdata.xml.in:59 msgid "Fixed view mode button" msgstr "Botó de mode de visualització fixa" #: ../data/org.gabmus.gfeeds.appdata.xml.in:60 msgid "Option to open YouTube links with an external media player" msgstr "" "Opció per obrir enllaços de YouTube amb un reproductor multimèdia extern" #: ../data/org.gabmus.gfeeds.appdata.xml.in:61 msgid "" "Saved articles are no longer stored inside the cache directory, avoiding " "accidental deletion" msgstr "" "Els articles desats ja no s'emmagatzemen dins del directori de memòria cau, " "evitant així la supressió accidental" #: ../data/org.gabmus.gfeeds.appdata.xml.in:69 msgid "Feed icons improvements for high DPI screens" msgstr "Millores en les icones dels canals per pantalles amb una DPI alta" #: ../data/org.gabmus.gfeeds.appdata.xml.in:77 msgid "UI improvements on phones" msgstr "Millores de UI en telèfons" #: ../data/org.gabmus.gfeeds.appdata.xml.in:85 msgid "Switched to the new libhandy Avatar widget" msgstr "S'ha canviat al nou giny d'avatars de libhandy" #: ../data/org.gabmus.gfeeds.appdata.xml.in:86 msgid "Added Dutch translation courtesy of Heimen Stoffels" msgstr "Afegida la traducció holandesa gràcies a Heiman Stoffels" #: ../data/org.gabmus.gfeeds.appdata.xml.in:93 msgid "Fixed searchbar" msgstr "S'ha arreglat la barra de cerca" #: ../data/org.gabmus.gfeeds.appdata.xml.in:101 msgid "" "New tags feature! You can now categorize your feeds by creating custom tags" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:102 msgid "RSS links can now be opened directly in Feeds to be imported" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:103 msgid "Mark as read now only marks the currently visible feeds" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:104 msgid "Added support for the latest version of libhandy" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:105 msgid "Improved message dialogs" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:106 msgid "Performance improvements when importing OPML files" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:107 msgid "Removed option to disable client side decoration" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:114 msgid "" "Don't remove feeds automatically if they have errors, instead ask the user " "what to do" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:115 #: ../data/org.gabmus.gfeeds.appdata.xml.in:137 msgid "Updated Italian translation" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:122 msgid "Updated French translation" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:129 msgid "Bug fixes" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:136 msgid "Updated version number" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:144 msgid "You can now add some feeds by just using the website URL" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:145 msgid "New generated placeholder icon for feeds without one" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:146 msgid "Improved reader mode" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:147 msgid "Swipe left on your touchscreen to move back from an article" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:148 msgid "Code blocks in articles now have syntax highlighting" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:149 msgid "Added French translation" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:150 msgid "Removed the colored border left of the articles" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:151 msgid "More keyboard shortcuts" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:152 msgid "Added option to refresh articles on startup" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:153 msgid "Updated to the GNOME 3.36 runtime" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:154 msgid "Various improvements and bug fixes" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:161 msgid "Added loading progress bar" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:162 msgid "Added Spanish translation" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:163 #: ../data/org.gabmus.gfeeds.appdata.xml.in:174 #: ../data/org.gabmus.gfeeds.appdata.xml.in:188 msgid "Various UI improvements" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:164 #: ../data/org.gabmus.gfeeds.appdata.xml.in:175 msgid "Performance improvements" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:165 #: ../data/org.gabmus.gfeeds.appdata.xml.in:176 #: ../data/org.gabmus.gfeeds.appdata.xml.in:189 #: ../data/org.gabmus.gfeeds.appdata.xml.in:199 #: ../data/org.gabmus.gfeeds.appdata.xml.in:214 #: ../data/org.gabmus.gfeeds.appdata.xml.in:225 #: ../data/org.gabmus.gfeeds.appdata.xml.in:278 msgid "Various bug fixes" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:172 msgid "Load cached articles on startup" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:173 msgid "Added new view mode menu" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:177 msgid "Added Brazilian Portuguese translation" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:178 msgid "Added Russian translation" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:185 msgid "Option to ellipsize article titles for a more compact view" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:186 msgid "Added a search function" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:187 msgid "Updated dependencies" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:196 msgid "Errors with feeds are now shown in the UI" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:197 msgid "Big UI overhaul" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:198 msgid "Updated translations" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:206 msgid "OPML file association" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:207 msgid "Changed left headerbar button order" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:208 msgid "Optimization for updating feeds" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:209 msgid "Redesigned right click/longpress menu" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:210 msgid "Option to show/hide read articles" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:211 msgid "Reworked suggestion bar" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:212 msgid "Changed name to Feeds" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:213 msgid "Improved CPU utilization" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:221 msgid "New right click or longpress menu for articles" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:222 msgid "You can now save articles offline" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:223 msgid "Initial suggestion to add feeds is now less intrusive" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:224 msgid "Read articles are now greyed out" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:232 msgid "Concurrent feeds refresh, with customizable thread count" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:233 msgid "Added German translation (thanks @Etamuk)" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:240 msgid "Fix bugs in reader mode" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:247 msgid "Minor bug fix" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:254 msgid "Improved date and time parsing and display" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:255 msgid "Reader mode can now work on websites without an article tag" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:256 msgid "Slight improvements to the icon" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:257 msgid "New feature to filter articles by feed" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:264 msgid "Improved favicon download" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:265 msgid "Fixed refresh duplicating articles" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:272 msgid "Added option to disable client side decoration" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:273 msgid "Brought primary menu in line with GNOME HIG" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:274 msgid "Added placeholder icon for feeds without an icon" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:275 msgid "Migrated some widgets to Glade templates" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:276 msgid "Option to use reader mode by default" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:277 msgid "Option to show article content from the feed" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:285 msgid "Fixed labels alignment" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:286 msgid "Changed app name to Feeds" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:287 msgid "Added separators for the two sections of the app" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:288 msgid "Using links as feed titles when there is no title" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:289 msgid "Added preference for maximum article age" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:290 msgid "Added zoom keyboard shortcuts" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:291 msgid "Added preference to enable JavaScript" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:292 msgid "Fix window control positions when they are on the left" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:299 msgid "Feeds for websites without favicons will now work" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:306 msgid "Fixed bug with adding new feeds" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:313 msgid "Switched to native file chooser" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:314 msgid "Added empty state initial screen for sidebar" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:315 msgid "Added italian translation" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:322 msgid "First release" msgstr "" gfeeds-2.2.0/po/cs.po000066400000000000000000000265511440757451400143570ustar00rootroot00000000000000# Czech translations for Feeds package. # Copyright (C) 2019 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the GNOME Feeds package. # Marek ÄŒernocký 2022. # msgid "" msgstr "" "Project-Id-Version: gfeeds\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/gfeeds/issues\n" "POT-Creation-Date: 2022-02-09 10:26+0000\n" "PO-Revision-Date: 2022-03-18 15:22+0100\n" "Last-Translator: Marek ÄŒernocký \n" "Language-Team: ÄeÅ¡tina \n" "Language: cs\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>=2 && n<=4) ? 1 : 2;\n" #: data/org.gabmus.gfeeds.appdata.xml.in:4 msgid "Feeds" msgstr "Kanály" #: data/org.gabmus.gfeeds.appdata.xml.in:6 data/org.gabmus.gfeeds.desktop.in:7 msgid "News reader for GNOME" msgstr "ÄŒteÄka novinek pro GNOME" #: data/org.gabmus.gfeeds.appdata.xml.in:15 msgid "" "Feeds is a minimal RSS/Atom feed reader built with speed and simplicity in " "mind." msgstr "" "Aplikace Kanály je minimalistický prohlížeÄ kanálů RSS/Atom, který si cení " "rychlosti a jednoduchosti." #: data/org.gabmus.gfeeds.appdata.xml.in:16 msgid "" "It offers a simple user interface that only shows the latest news from your " "subscriptions." msgstr "" "Má jednoduché uživatelské rozhraní, které zobrazuje pouze nejnovÄ›jší zprávy " "z vaÅ¡ich odbÄ›rů." #: data/org.gabmus.gfeeds.appdata.xml.in:17 msgid "" "Articles are shown in a web view by default, with javascript disabled for a " "faster and less intrusive user experience. There's also a reader mode " "included, built from the one GNOME Web/Epiphany uses." msgstr "" "ÄŒlánky se ve výchozím nastavení zobrazují ve webovém zobrazení s vypnutým " "Javascriptem, aby mÄ›l uživatel rychlejší a ménÄ› ruÅ¡ivé prostÅ™edí. K dispozici " "je také režim ÄteÄky založený na aplikaci Web GNOME/Epiphany." #: data/org.gabmus.gfeeds.appdata.xml.in:18 msgid "Feeds can be imported and exported via OPML." msgstr "Kanály je možné importovat a exportovat pÅ™es OPML." #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/org.gabmus.gfeeds.desktop.in:16 msgid "rss;reader;feed;news;" msgstr "rss;ÄteÄka;feed;kanál;news;novinky;Älánky;" #: data/ui/extra_popover_menu.ui:19 msgid "Web View" msgstr "Webové zobrazení" #: data/ui/extra_popover_menu.ui:26 msgid "Reader Mode" msgstr "Režim ÄteÄky" #: data/ui/extra_popover_menu.ui:33 msgid "Feed Content" msgstr "Obsah kanálu" #: gfeeds/confirm_add_dialog.py:16 msgid "Do you want to import these feeds?" msgstr "Chcete naimportovat tyto kanály?" #: gfeeds/confirm_add_dialog.py:17 msgid "Do you want to import this feed?" msgstr "Chcete naimportovat tento kanál?" #: gfeeds/download_manager.py:88 #, python-brace-format msgid "`{0}`: connection timed out" msgstr "„{0}“: vyprÅ¡el Äasový limit" #: gfeeds/download_manager.py:92 #, python-brace-format msgid "`{0}` might not be a valid address" msgstr "„{0}“ nemusí být platná adresa" #: gfeeds/download_manager.py:117 msgid "Error downloading `{0}`, code `{1}`" msgstr "Chyba pÅ™i stahování „{0}“, kód „{1}“" #: gfeeds/feeds_manager.py:87 #, python-brace-format msgid "Feed {0} exists already, skipping" msgstr "Kanál {0} již existuje, vynechává se" #: gfeeds/feeds_view.py:14 msgid "All feeds" msgstr "VÅ¡echny kanály" #: gfeeds/get_favicon.py:45 #, python-brace-format msgid "Error downloading favicon for `{0}`" msgstr "Chyba pÅ™i stahování ikony pro „{0}“" #: gfeeds/headerbar.py:171 msgid "" "There were problems with some feeds.\n" "Do you want to remove them?" msgstr "" "Vyskytl se problém s nÄ›kterými kanály.\n" "PÅ™ejete si je odstranit?" #: gfeeds/main_leaflet.py:118 #, python-brace-format msgid "{0} new article" msgid_plural "{0} new articles" msgstr[0] "{0} nový Älánek" msgstr[1] "{0} nové Älánky" msgstr[2] "{0} nových Älánků" #: gfeeds/__main__.py:251 msgid "url" msgstr "URL" #: gfeeds/__main__.py:254 msgid "opml file local url or rss remote url to import" msgstr "místní URL souboru OPML nebo vzdálené URL RSS pro import" #: gfeeds/manage_feeds_window.py:229 msgid "Do you want to delete these feeds?" msgstr "Chcete smazat tyto kanály?" #: gfeeds/manage_feeds_window.py:281 msgid "Manage Feeds" msgstr "Správa kanálů" #: gfeeds/opml_file_chooser.py:7 msgid "XML files" msgstr "Soubory XML" #: gfeeds/opml_file_chooser.py:14 msgid "Choose an OPML file to import" msgstr "VýbÄ›r souboru OPML pro import" #: gfeeds/opml_file_chooser.py:18 msgid "Open" msgstr "Otevřít" #: gfeeds/opml_file_chooser.py:19 gfeeds/opml_file_chooser.py:31 msgid "Cancel" msgstr "ZruÅ¡it" #: gfeeds/opml_file_chooser.py:26 msgid "Choose where to save the exported OPML file" msgstr "VýbÄ›r umístÄ›ní pro vyexportovaný soubor OPML" #: gfeeds/opml_file_chooser.py:30 msgid "Save" msgstr "Uložit" #: gfeeds/opml_manager.py:42 msgid "Error: OPML path provided does not exist" msgstr "Chyba: Zadaná cesta k OPML neexistuje" #: gfeeds/opml_manager.py:53 #, python-brace-format msgid "Error parsing OPML file `{0}`" msgstr "Chyba pÅ™i zpracování souboru OPML „{0}“" #: gfeeds/preferences_window.py:22 msgid "General" msgstr "Obecné" #: gfeeds/preferences_window.py:25 msgid "General preferences" msgstr "Obecné pÅ™edvolby" #: gfeeds/preferences_window.py:27 msgid "Show newer articles first" msgstr "NovÄ›jší Älánky zobrazovat jako první" #: gfeeds/preferences_window.py:32 msgid "Open links in your browser" msgstr "Otevírat odkazy ve vaÅ¡em prohlížeÄi" #: gfeeds/preferences_window.py:36 msgid "Use external video player for YouTube" msgstr "Používat externí videopÅ™ehrávaÄ pro YouTube" #: gfeeds/preferences_window.py:38 msgid "Requires youtube-dl and a compatible video player" msgstr "Vyžaduje program youtube-dl a kompatibilní videopÅ™ehrávaÄ." #: gfeeds/preferences_window.py:44 msgid "Preferred video player" msgstr "UpÅ™ednostňovaný videopÅ™ehrávaÄ" #: gfeeds/preferences_window.py:48 msgid "Maximum article age" msgstr "Maximální stáří Älánku" #: gfeeds/preferences_window.py:49 msgid "In days" msgstr "Ve dnech" #: gfeeds/preferences_window.py:56 msgid "Refresh preferences" msgstr "PÅ™edvolby aktualizace" #: gfeeds/preferences_window.py:58 msgid "Refresh articles on startup" msgstr "Aktualizovat Älánky pÅ™i spuÅ¡tÄ›ní" #: gfeeds/preferences_window.py:62 msgid "New articles notification" msgstr "Upozorňovat na nové Älánky" #: gfeeds/preferences_window.py:66 msgid "Enable auto-refresh" msgstr "Povolit automatické aktualizace" #: gfeeds/preferences_window.py:70 msgid "Auto-refresh interval" msgstr "ÄŒetnost automatických aktualizací" #: gfeeds/preferences_window.py:71 msgid "In seconds" msgstr "V sekundách" #: gfeeds/preferences_window.py:78 msgid "Cache" msgstr "Mezipaměť" #: gfeeds/preferences_window.py:80 msgid "Clear caches" msgstr "Smazat mezipamÄ›ti" #: gfeeds/preferences_window.py:81 msgid "Clear" msgstr "Smazat" #: gfeeds/preferences_window.py:109 msgid "Appearance" msgstr "Vzhled" #: gfeeds/preferences_window.py:112 msgid "Appearance preferences" msgstr "PÅ™edvolby vzhledu" #: gfeeds/preferences_window.py:114 msgid "Dark mode" msgstr "Tmavý motiv" #: gfeeds/preferences_window.py:118 msgid "Use dark theme for reader mode" msgstr "Používat tmavý motiv pro režim Ätení" #: gfeeds/preferences_window.py:122 msgid "Show article thumbnails" msgstr "Zobrazovat miniatury Älánků" #: gfeeds/preferences_window.py:127 msgid "Maximum thumbnail height" msgstr "Maximální výška miniatury" #: gfeeds/preferences_window.py:133 msgid "Show full articles titles" msgstr "Zobrazovat celé nadpisy Älánků" #: gfeeds/preferences_window.py:138 msgid "Show full feeds names" msgstr "Zobrazovat celé názvy kanálů" #: gfeeds/preferences_window.py:145 msgid "Font preferences" msgstr "PÅ™edvolby fontů" #: gfeeds/preferences_window.py:147 msgid "Use system font for titles" msgstr "Používat systémový font pro nadpisy" #: gfeeds/preferences_window.py:151 msgid "Use system font for paragraphs" msgstr "Používat systémový font pro odstavce" #: gfeeds/preferences_window.py:155 msgid "Custom title font" msgstr "Vlastní font pro nadpisy" #: gfeeds/preferences_window.py:159 msgid "Custom paragraph font" msgstr "Vlastní font pro odstavce" #: gfeeds/preferences_window.py:163 msgid "Custom monospace font" msgstr "Vlastní font s pevnou šířkou" #: gfeeds/preferences_window.py:175 msgid "Privacy" msgstr "Soukromí" #: gfeeds/preferences_window.py:178 msgid "Privacy preferences" msgstr "PÅ™edvolby soukromí" #: gfeeds/preferences_window.py:180 msgid "Enable JavaScript" msgstr "Povolit JavaScript" #: gfeeds/preferences_window.py:185 msgid "Try to block advertisements" msgstr "ZkouÅ¡et blokovat reklamy" #: gfeeds/preferences_window.py:187 gfeeds/preferences_window.py:222 msgid "Requires app restart" msgstr "Vyžaduje restart aplikace" #: gfeeds/preferences_window.py:191 msgid "Update advertisement blocking list" msgstr "Aktualizovat seznam pro blokování reklam" #: gfeeds/preferences_window.py:192 msgid "Updates automatically every 10 days" msgstr "Aktualizovat automaticky každých 10 dní" #: gfeeds/preferences_window.py:193 msgid "Update" msgstr "Aktualizovat" #: gfeeds/preferences_window.py:206 msgid "Advanced" msgstr "PokroÄilé" #: gfeeds/preferences_window.py:209 msgid "Advanced preferences" msgstr "PokroÄilé pÅ™edvolby…" #: gfeeds/preferences_window.py:211 msgid "Maximum refresh threads" msgstr "Maximum vláken pro aktualizace" #: gfeeds/preferences_window.py:213 msgid "How many threads to use for feeds refresh" msgstr "Kolik vláken používat pro aktualizace kanálů." #: gfeeds/preferences_window.py:220 msgid "Experimental GtkListView for articles list" msgstr "Experimentální GtkListView pro seznam Älánků" #: gfeeds/rss_parser.py:67 #, python-brace-format msgid "Error: unable to parse datetime {0} for feeditem {1}" msgstr "Chyba: nelze zpracovat datum/Äas {0} pro položku kanálu {1}" #: gfeeds/rss_parser.py:148 #, python-brace-format msgid "Errors while parsing feed `{0}`" msgstr "Chyby pÅ™i zpracování kanálu „{0}“" #: gfeeds/rss_parser.py:175 #, python-brace-format msgid "`{0}` may not be an RSS or Atom feed" msgstr "„{0}“ nesmí být kanál RSS nebo Atom." #: gfeeds/sidebar.py:23 msgid "Loading feeds..." msgstr "NaÄítají se kanály…" #: gfeeds/sidebar_row_popover.py:31 gfeeds/sidebar_row_popover.py:58 msgid "Mark as unread" msgstr "OznaÄit jako nepÅ™eÄtené" #: gfeeds/sidebar_row_popover.py:38 gfeeds/sidebar_row_popover.py:50 msgid "Mark as read" msgstr "OznaÄit jako pÅ™eÄtené" #: gfeeds/suggestion_bar.py:37 msgid "There are some errors" msgstr "Vyskytly se chyby" #: gfeeds/suggestion_bar.py:46 msgid "Show" msgstr "Zobrazit" #: gfeeds/suggestion_bar.py:47 msgid "Ignore" msgstr "Ignorovat" #: gfeeds/suggestion_bar.py:70 msgid "There were problems with some feeds. Do you want to remove them?" msgstr "Vyskytl se problém s nÄ›kterými kanály. PÅ™ejete si je odebrat?" #: gfeeds/suggestion_bar.py:97 msgid "You are offline" msgstr "Nejste pÅ™ipojeni k síti" #: gfeeds/webview.py:183 msgid "Link copied to clipboard!" msgstr "Odkaz byl zkopírován do schránky" #: gfeeds/webview.py:205 msgid "Feed content not available for this article" msgstr "Obsah kanálu není pro tento Älánek dostupný" gfeeds-2.2.0/po/da.po000066400000000000000000000247541440757451400143410ustar00rootroot00000000000000# Danish translation for gfeeds. # Copyright (C) 2022 gfeeds's COPYRIGHT HOLDER # This file is distributed under the same license as the gfeeds package. # Ask Hjorth Larsen , 2022. # # Ordliste # feed -> (nyheds)kilde msgid "" msgstr "" "Project-Id-Version: gfeeds master\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/gfeeds/issues\n" "POT-Creation-Date: 2022-05-06 18:45+0000\n" "PO-Revision-Date: 2022-06-26 16:07+0200\n" "Last-Translator: Ask Hjorth Larsen \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" #: data/org.gabmus.gfeeds.appdata.xml.in:4 msgid "Feeds" msgstr "Feeds" #: data/org.gabmus.gfeeds.appdata.xml.in:6 data/org.gabmus.gfeeds.desktop.in:7 msgid "News reader for GNOME" msgstr "Nyhedslæser til GNOME" #: data/org.gabmus.gfeeds.appdata.xml.in:15 msgid "" "Feeds is a minimal RSS/Atom feed reader built with speed and simplicity in " "mind." msgstr "Feeds er en minimal RSS/Atom-kildelæser, som er skrevet med henblik pÃ¥ hastighed og enkelhed." #: data/org.gabmus.gfeeds.appdata.xml.in:16 msgid "" "It offers a simple user interface that only shows the latest news from your " "subscriptions." msgstr "Programmet tilbyder en simpel brugergrænseflade, som kun viser de sidste nyheder fra dine abonnementer." #: data/org.gabmus.gfeeds.appdata.xml.in:17 msgid "" "Articles are shown in a web view by default, with javascript disabled for a " "faster and less intrusive user experience. There's also a reader mode " "included, built from the one GNOME Web/Epiphany uses." msgstr "Artikler vises som standard i webvisning med JavaScript deaktiveret for at give en hurtigere og mindre generende brugeroplevelse. Der er ogsÃ¥ en inkluderet læsetilstand, der bygger pÃ¥ den, GNOME Web/Epiphany bruger." #: data/org.gabmus.gfeeds.appdata.xml.in:18 msgid "Feeds can be imported and exported via OPML." msgstr "Nyhedskilder kan importeres og eksporteres via OPML." #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/org.gabmus.gfeeds.desktop.in:16 msgid "rss;reader;feed;news;" msgstr "rss;reader;feed;news;" #: gfeeds/feed_item.py:49 #, python-brace-format msgid "Error: unable to parse datetime {0} for feeditem {1}" msgstr "Fejl: kan ikke fortolke datetime {0} for feeditem {1}" #: gfeeds/feed_parser.py:37 #, python-brace-format msgid "Errors while parsing feed `{0}`" msgstr "Fejl ved fortolkning af feed “{0}â€" #: gfeeds/feed_parser.py:55 #, python-brace-format msgid "`{0}` may not be an RSS or Atom feed" msgstr "“{0}†er mÃ¥ske ikke et RSS- eller Atom-feed" #: gfeeds/feeds_manager.py:88 #, python-brace-format msgid "Feed {0} exists already, skipping" msgstr "Kilden {0} findes allerede — springer over" #: gfeeds/feeds_view.py:13 msgid "All feeds" msgstr "Alle kilder" #: gfeeds/headerbar.py:184 msgid "" "There were problems with some feeds.\n" "Do you want to remove them?" msgstr "" "Der opstod problemer med visse nyhedskilder.\n" "Vil du fjerne dem?" #: gfeeds/main_leaflet.py:119 #, python-brace-format msgid "{0} new article" msgid_plural "{0} new articles" msgstr[0] "{0} ny artikel" msgstr[1] "{0} nye artikler" #: gfeeds/__main__.py:229 msgid "Do you want to import these feeds?" msgstr "Vil du importere disse nyhedskilder?" #: gfeeds/__main__.py:256 msgid "Do you want to import this feed?" msgstr "Vil du importere denne nyhedskilde?" #: gfeeds/__main__.py:285 msgid "url" msgstr "url" #: gfeeds/__main__.py:288 msgid "opml file local url or rss remote url to import" msgstr "lokal url til opml-fil eller fjern-url til rss som skal importeres" #: gfeeds/manage_feeds_window.py:263 msgid "Manage Feeds" msgstr "HÃ¥ndtér nyhedskilder" #: gfeeds/manage_feeds_window.py:318 msgid "Do you want to delete these feeds?" msgstr "Vil du slette disse nyhedskilder?" #: gfeeds/opml_file_chooser.py:7 msgid "XML files" msgstr "XML-filer" #: gfeeds/opml_file_chooser.py:14 msgid "Choose an OPML file to import" msgstr "Vælg en OPML-fil der skal importeres" #: gfeeds/opml_file_chooser.py:18 msgid "Open" msgstr "Ã…bn" #: gfeeds/opml_file_chooser.py:19 gfeeds/opml_file_chooser.py:31 msgid "Cancel" msgstr "Annullér" #: gfeeds/opml_file_chooser.py:26 msgid "Choose where to save the exported OPML file" msgstr "Vælg hvor den eksporterede OPML-fil skal gemmes" #: gfeeds/opml_file_chooser.py:30 msgid "Save" msgstr "Gem" #: gfeeds/opml_manager.py:42 msgid "Error: OPML path provided does not exist" msgstr "Fejl: Den givne OPML-sti findes ikke" #: gfeeds/opml_manager.py:53 #, python-brace-format msgid "Error parsing OPML file `{0}`" msgstr "Fejl ved fortolkning af OPML-filen “{0}â€" #: gfeeds/preferences_window.py:22 msgid "General" msgstr "Generelle" #: gfeeds/preferences_window.py:25 msgid "General preferences" msgstr "Generelle indstillinger" #: gfeeds/preferences_window.py:27 msgid "Show newer articles first" msgstr "Vis nyere artikler først" #: gfeeds/preferences_window.py:32 msgid "Open links in your browser" msgstr "Ã…bn links i din browser" #: gfeeds/preferences_window.py:36 msgid "Use external video player for YouTube" msgstr "Brug ekstern videoafspiller til YouTube" #: gfeeds/preferences_window.py:38 msgid "Requires youtube-dl and a compatible video player" msgstr "Kræver youtube-dl og en kompatibel videoafspiller" #: gfeeds/preferences_window.py:44 msgid "Preferred video player" msgstr "Foretrukken videoafspiller" #: gfeeds/preferences_window.py:48 msgid "Maximum article age" msgstr "Maksimal alder pÃ¥ artikler" #: gfeeds/preferences_window.py:49 msgid "In days" msgstr "I dage" #: gfeeds/preferences_window.py:56 msgid "Refresh preferences" msgstr "Opdatér indstillinger" #: gfeeds/preferences_window.py:58 msgid "Refresh articles on startup" msgstr "Opdatér artikler ved programstart" #: gfeeds/preferences_window.py:62 msgid "New articles notification" msgstr "PÃ¥mindelse ved nye artikler" #: gfeeds/preferences_window.py:66 msgid "Enable auto-refresh" msgstr "Aktivér automatisk opdatering" #: gfeeds/preferences_window.py:70 msgid "Auto-refresh interval" msgstr "Interval for automatisk opdatering" #: gfeeds/preferences_window.py:71 msgid "In seconds" msgstr "I sekunder" #: gfeeds/preferences_window.py:78 msgid "Cache" msgstr "Mellemlager" #: gfeeds/preferences_window.py:80 msgid "Clear caches" msgstr "Ryd mellemlager" #: gfeeds/preferences_window.py:81 msgid "Clear" msgstr "Ryd" #: gfeeds/preferences_window.py:109 msgid "Appearance" msgstr "Udseende" #: gfeeds/preferences_window.py:112 msgid "Appearance preferences" msgstr "Indstillinger for udseende" #: gfeeds/preferences_window.py:114 msgid "Dark mode" msgstr "Mørk tilstand" #: gfeeds/preferences_window.py:118 msgid "Use dark theme for reader mode" msgstr "Brug mørkt tema i læsetilstand" #: gfeeds/preferences_window.py:122 msgid "Show article thumbnails" msgstr "Vis miniaturer for artikler" #: gfeeds/preferences_window.py:127 msgid "Maximum thumbnail height" msgstr "Maksimal højde af miniaturer" #: gfeeds/preferences_window.py:133 msgid "Show full articles titles" msgstr "Vis uforkortede artikeloverskrifter" #: gfeeds/preferences_window.py:138 msgid "Show full feeds names" msgstr "Vis fulde nyhedskildenavne" #: gfeeds/preferences_window.py:145 msgid "Font preferences" msgstr "Indstillinger for skrifttype" #: gfeeds/preferences_window.py:147 msgid "Use system font for titles" msgstr "Brug systemskrifttype til overskrifter" #: gfeeds/preferences_window.py:151 msgid "Use system font for paragraphs" msgstr "Brug systemskrifttype til afsnit" #: gfeeds/preferences_window.py:155 msgid "Custom title font" msgstr "Brugertilpasset skrifttype til overskrifter" #: gfeeds/preferences_window.py:159 msgid "Custom paragraph font" msgstr "Brugertilpasset skrifttype til afsnit" #: gfeeds/preferences_window.py:163 msgid "Custom monospace font" msgstr "Brugertilpasset fastbreddeskrifttype" #: gfeeds/preferences_window.py:175 msgid "Privacy" msgstr "Privatliv" #: gfeeds/preferences_window.py:178 msgid "Privacy preferences" msgstr "Indstillinger til privatliv" #: gfeeds/preferences_window.py:180 msgid "Enable JavaScript" msgstr "Aktivér JavaScript" #: gfeeds/preferences_window.py:185 msgid "Try to block advertisements" msgstr "Forsøg at blokere reklamer" #: gfeeds/preferences_window.py:187 gfeeds/preferences_window.py:222 msgid "Requires app restart" msgstr "Kræver programgenstart" #: gfeeds/preferences_window.py:191 msgid "Update advertisement blocking list" msgstr "Opdatér reklameblokeringsliste" #: gfeeds/preferences_window.py:192 msgid "Updates automatically every 10 days" msgstr "Opdaterer automatisk hver 10. dag" #: gfeeds/preferences_window.py:193 msgid "Update" msgstr "Opdatér" #: gfeeds/preferences_window.py:206 msgid "Advanced" msgstr "Avanceret" #: gfeeds/preferences_window.py:209 msgid "Advanced preferences" msgstr "Avancerede indstillinger" #: gfeeds/preferences_window.py:211 msgid "Maximum refresh threads" msgstr "Maksimalt antal opdateringstrÃ¥de" #: gfeeds/preferences_window.py:213 msgid "How many threads to use for feeds refresh" msgstr "Hvor mange trÃ¥de der skal bruges til at opdatere nyhedskilder" #: gfeeds/preferences_window.py:220 msgid "Experimental GtkListView for articles list" msgstr "Eksperimentel GtkListView for artikelliste" #: gfeeds/sidebar.py:21 msgid "Loading feeds..." msgstr "Indlæser nyhedskilder …" #: gfeeds/sidebar_row_popover.py:31 gfeeds/sidebar_row_popover.py:58 msgid "Mark as unread" msgstr "Markér som ulæst" #: gfeeds/sidebar_row_popover.py:38 gfeeds/sidebar_row_popover.py:50 msgid "Mark as read" msgstr "Markér som læst" #: gfeeds/util/download_manager.py:96 #, python-brace-format msgid "`{0}`: connection timed out" msgstr "“{0}â€: forbindelsens tidsgrænse udløb" #: gfeeds/util/download_manager.py:105 #, python-brace-format msgid "`{0}` might not be a valid address" msgstr "“{0}†er mÃ¥ske ikke en gyldig adresse" #: gfeeds/util/download_manager.py:144 #, python-brace-format msgid "Error downloading `{0}`, code `{1}`" msgstr "Fejl ved download af “{0}â€, kode “{1}â€" #: gfeeds/util/get_favicon.py:53 #, python-brace-format msgid "Error downloading favicon for `{0}`" msgstr "Fejl ved download af favicon for “{0}â€" #: gfeeds/webview.py:201 msgid "Link copied to clipboard!" msgstr "Link kopieret til udklipsholder!" #: gfeeds/webview.py:223 msgid "Feed content not available for this article" msgstr "Nyhedskildeindhold er ikke tilgængeligt for denne artikel" gfeeds-2.2.0/po/de.po000066400000000000000000000772321440757451400143440ustar00rootroot00000000000000# German translations for Feeds package. # Copyright (C) 2019 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the GNOME Feeds package. # Gabriele Musco , 2019. # Onno Giesmann , 2019-2021. # Philipp Kiemle , 2022. # Jürgen Benvenuti , 2022, 2023. # Tim Sabsch , 2022. # msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/gfeeds/issues\n" "POT-Creation-Date: 2023-03-13 17:33+0000\n" "PO-Revision-Date: 2023-03-14 19:02+0100\n" "Last-Translator: Jürgen Benvenuti \n" "Language-Team: German \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 3.1.1\n" # Name der Anwendung und daher unübersetzt? - jb # Wir übersetzen auch die Anwendungsnamen. In diesem Fall finde ich allerdings, dass "Feed" auch die korrekte dt. Übersetzung ist, weil »[Nachrichten]quelle« nicht eindeutig ist - ts. #: data/org.gabmus.gfeeds.appdata.xml.in:4 msgid "Feeds" msgstr "Feeds" #: data/org.gabmus.gfeeds.appdata.xml.in:6 data/org.gabmus.gfeeds.desktop.in:7 msgid "News reader for GNOME" msgstr "Nachrichtenleser für GNOME" #: data/org.gabmus.gfeeds.appdata.xml.in:15 msgid "" "Feeds is a minimal RSS/Atom feed reader built with speed and simplicity in " "mind." msgstr "" "Feeds ist ein minimalistisches Anzeigeprogramm für RSS/Atom-Feeds, das Wert " "auf Geschwindigkeit und Einfachheit legt." #: data/org.gabmus.gfeeds.appdata.xml.in:16 msgid "" "It offers a simple user interface that only shows the latest news from your " "subscriptions." msgstr "" "Es hat eine einfach gehaltene Benutzeroberfläche, die nur die neuesten " "Nachrichten aus Ihren Abonnements anzeigt." #: data/org.gabmus.gfeeds.appdata.xml.in:17 msgid "" "Articles are shown in a web view by default, with javascript disabled for a " "faster and less intrusive user experience. There's also a reader mode " "included, built from the one GNOME Web/Epiphany uses." msgstr "" "Artikel werden standardmäßig in einer Webansicht angezeigt, in der " "JavaScript deaktiviert ist, um ein schnelleres und weniger aufdringliches " "Nutzungserlebnis zu bieten. Es ist auch ein Lesemodus verfügbar, der auf " "Grundlage der von GNOME Web/Epiphany verwendeten Funktionen erstellt wurde." #: data/org.gabmus.gfeeds.appdata.xml.in:18 msgid "Feeds can be imported and exported via OPML." msgstr "" "Feeds können mithilfe von OPML-Dateien importiert und exportiert werden." #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/org.gabmus.gfeeds.desktop.in:16 msgid "rss;reader;feed;news;" msgstr "rss;reader;feed;news;Nachrichtenquelle;" #: data/ui/aboutdialog.ui.in:10 msgid "translator-credits" msgstr "" "Gabriele Musco \n" "Onno Giesmann \n" "Philipp Kiemle \n" "Jürgen Benvenuti \n" "Tim Sabsch " #: data/ui/add_feed_popover.blp:11 msgid "Enter feed address to add" msgstr "Zum Hinzufügen Feed-Adresse eingeben" #: data/ui/add_feed_popover.blp:26 msgid "Add" msgstr "Hinzufügen" #: data/ui/add_feed_popover.blp:32 msgid "You're already subscribed to that feed!" msgstr "Sie haben diesen Feed bereits abonniert!" #: data/ui/empty_state.blp:7 msgid "Let's get started" msgstr "Es kann losgehen" #: data/ui/empty_state.blp:22 msgid "Add new feeds via URL" msgstr "Neue Feeds über URL hinzufügen" #: data/ui/empty_state.blp:27 msgid "Import an OPML file" msgstr "Eine OPML-Datei importieren" #: data/ui/left_headerbar.blp:6 msgid "_Show Read Articles" msgstr "Gelesene Artikel _anzeigen" #: data/ui/left_headerbar.blp:7 msgid "Mark All as Read" msgstr "Alle als gelesen markieren" #: data/ui/left_headerbar.blp:8 msgid "Mark All as _Unread" msgstr "Alle als _ungelesen markieren" #: data/ui/left_headerbar.blp:11 msgid "Show _Empty Feeds" msgstr "_Leere Feeds anzeigen" #: data/ui/left_headerbar.blp:12 msgid "_Manage Feeds" msgstr "Feeds _verwalten" #: data/ui/left_headerbar.blp:13 msgid "_Import OPML" msgstr "OPML _importieren" #: data/ui/left_headerbar.blp:14 msgid "E_xport OPML" msgstr "OPML _exportieren" #: data/ui/left_headerbar.blp:17 msgid "P_references" msgstr "_Einstellungen" #: data/ui/left_headerbar.blp:18 msgid "_Keyboard Shortcuts" msgstr "Tasten_kürzel" #: data/ui/left_headerbar.blp:19 msgid "_About Feeds" msgstr "_Info zu Feeds" #: data/ui/left_headerbar.blp:28 msgid "Filter" msgstr "Filter" #: data/ui/left_headerbar.blp:32 msgid "Add Feed" msgstr "Feed hinzufügen" #: data/ui/left_headerbar.blp:36 msgid "Menu" msgstr "Menü" #: data/ui/left_headerbar.blp:41 data/ui/shortcutsWindow.blp:35 msgid "Refresh" msgstr "Aktualisieren" #: data/ui/left_headerbar.blp:46 data/ui/shortcutsWindow.blp:39 msgid "Search" msgstr "Suchen" #: data/ui/left_headerbar.blp:50 msgid "There Are Errors" msgstr "Es gibt Fehler" #: data/ui/main_leaflet.blp:40 msgid "Offline" msgstr "Offline" #: data/ui/manage_feeds_headerbar.blp:7 gfeeds/manage_feeds_window.py:257 msgid "Manage Feeds" msgstr "Feeds verwalten" #: data/ui/manage_feeds_headerbar.blp:11 msgid "Manage Tags for Selected Feeds" msgstr "Schlagwörter für ausgewählte Feeds verwalten" #: data/ui/manage_feeds_headerbar.blp:16 msgid "Select/Unselect All" msgstr "Alle auswählen/abwählen" #: data/ui/manage_feeds_headerbar.blp:21 msgid "Delete Selected Feeds" msgstr "Markierte Feeds löschen" #: data/ui/manage_tags_content.blp:17 msgid "New tag name…" msgstr "Neues Schlagwort …" #: data/ui/manage_tags_content.blp:24 msgid "Add Tag" msgstr "Schlagwort hinzufügen" #: data/ui/manage_tags_content.blp:39 msgid "There are no tags yet" msgstr "Noch keine Schlagwörter" #: data/ui/manage_tags_content.blp:40 msgid "Add some using the entry above" msgstr "Über das Feld oben hinzufügen" #: data/ui/right_headerbar.blp:9 msgid "Open in _Browser" msgstr "Im _Browser öffnen" #: data/ui/right_headerbar.blp:10 msgid "Open in External Media _Player" msgstr "In externer Medienwiedergabe öffnen" #: data/ui/right_headerbar.blp:11 msgid "_Copy Article Link" msgstr "Artikelverweis _kopieren" #: data/ui/right_headerbar.blp:17 data/ui/right_headerbar.blp:96 msgid "View Mode" msgstr "Ansichtsmodus" #: data/ui/right_headerbar.blp:19 msgid "Web View" msgstr "Webansicht" #: data/ui/right_headerbar.blp:24 msgid "Reader Mode" msgstr "Leseansicht" #: data/ui/right_headerbar.blp:29 msgid "Feed Content" msgstr "Feed-Inhalt" #: data/ui/right_headerbar.blp:44 data/ui/shortcutsWindow.blp:66 msgid "Zoom Out" msgstr "Ansicht verkleinern" #: data/ui/right_headerbar.blp:51 data/ui/shortcutsWindow.blp:70 msgid "Reset Zoom" msgstr "Ansicht zurücksetzen" #: data/ui/right_headerbar.blp:57 data/ui/shortcutsWindow.blp:62 msgid "Zoom In" msgstr "Ansicht vergrößern" #: data/ui/right_headerbar.blp:90 msgid "Back to Articles" msgstr "Zurück zu den Artikeln" #: data/ui/shortcutsWindow.blp:9 gfeeds/preferences_window.py:24 msgid "General" msgstr "Allgemein" #: data/ui/shortcutsWindow.blp:12 msgid "Open Keyboard Shortcuts" msgstr "Tastenkürzel öffnen" #: data/ui/shortcutsWindow.blp:16 msgid "Open Menu" msgstr "Menü öffnen" #: data/ui/shortcutsWindow.blp:20 msgid "Open Preferences" msgstr "Einstellungen öffnen" #: data/ui/shortcutsWindow.blp:24 msgid "Open Filter" msgstr "Filter öffnen" #: data/ui/shortcutsWindow.blp:28 msgid "Quit" msgstr "Beenden" #: data/ui/shortcutsWindow.blp:32 msgid "Article List" msgstr "Artikelliste" # Kontext: Nächster Artikel #: data/ui/shortcutsWindow.blp:43 msgid "Next" msgstr "Nächster" # Kontext: Vorheriger Artikel #: data/ui/shortcutsWindow.blp:47 msgid "Previous" msgstr "Vorheriger" #: data/ui/shortcutsWindow.blp:51 msgid "Show/Hide Read Articles" msgstr "Gelesene Artikel anzeigen/ausblenden" #: data/ui/shortcutsWindow.blp:55 msgid "Mark All Read" msgstr "Alle als gelesen markieren" #: data/ui/shortcutsWindow.blp:59 msgid "Article" msgstr "Artikel" #: data/ui/shortcutsWindow.blp:74 data/ui/sidebar_listbox_row.blp:6 msgid "Open in Browser" msgstr "Im Browser öffnen" #: data/ui/sidebar_listbox_row.blp:5 msgid "Mark as Read/Unread" msgstr "Als gelesen/ungelesen markieren" #: data/ui/webview.blp:12 msgid "Select an article" msgstr "Wählen Sie einen Artikel aus" #: gfeeds/feed_item.py:59 #, python-brace-format msgid "Error: unable to parse datetime {0} for feeditem {1}" msgstr "" "Fehler: Datum- und Zeitangabe {0} für Feed-Eintrag {1} kann nicht ermittelt " "werden" #: gfeeds/feed_parser.py:61 #, python-brace-format msgid "Errors while parsing feed `{0}`, URL: `{1}`" msgstr "Fehler beim Analysieren des Feeds »{0}«, Adresse: »{1}«" #: gfeeds/feed_parser.py:75 #, python-brace-format msgid "Error decoding unicode data from feed `{0}`, URL: `{1}`" msgstr "" "Fehler beim Dekodieren von Unicode-Daten des Feeds »{0}«, Adresse: »{1}«" #: gfeeds/feed_parser.py:82 #, python-brace-format msgid "Error extracting data from feed `{0}`, URL: `{1}`" msgstr "Fehler beim Extrahieren von Daten des Feeds »{0}«, Adresse: »{1}«" #: gfeeds/feed_parser.py:90 #, python-brace-format msgid "`{0}` may not be an RSS or Atom feed" msgstr "»{0}« ist möglicherweise kein RSS- oder Atom-Feed" #: gfeeds/feeds_manager.py:83 #, python-brace-format msgid "Feed {0} exists already, skipping" msgstr "Feed {0} existiert bereits, wird übersprungen" #: gfeeds/feeds_view.py:13 msgid "All feeds" msgstr "Alle Feeds" #: gfeeds/headerbar.py:197 msgid "There were problems with some feeds. Do you want to remove them?" msgstr "Es gab Probleme mit einigen Feeds. Möchten Sie diese entfernen?" #: gfeeds/headerbar.py:202 msgid "_Keep" msgstr "_Behalten" #: gfeeds/headerbar.py:204 msgid "_Remove" msgstr "_Entfernen" #: gfeeds/main_leaflet.py:114 #, python-brace-format msgid "{0} new article" msgid_plural "{0} new articles" msgstr[0] "{0} neuer Artikel" msgstr[1] "{0} neue Artikel" #: gfeeds/__main__.py:232 msgid "Do you want to import these feeds?" msgstr "Möchten Sie diese Feeds importieren?" #: gfeeds/__main__.py:239 gfeeds/__main__.py:273 #: gfeeds/manage_feeds_window.py:324 msgid "_Cancel" msgstr "_Abbrechen" #: gfeeds/__main__.py:242 gfeeds/__main__.py:276 msgid "_Import" msgstr "_Importieren" #: gfeeds/__main__.py:269 msgid "Do you want to import this feed?" msgstr "Möchten Sie diesen Feed importieren?" #: gfeeds/__main__.py:301 msgid "url" msgstr "Adresse" # Cannot translate it yet. Have to see it in the next version what does it mean #: gfeeds/__main__.py:304 msgid "opml file local url or rss remote url to import" msgstr "" "Lokale Adresse für opml-Datei oder entfernte RSS-Adresse zum Importieren" #: gfeeds/manage_feeds_window.py:321 msgid "Do you want to delete these feeds?" msgstr "Möchten Sie diese Feeds löschen?" #: gfeeds/manage_feeds_window.py:326 msgid "_Delete" msgstr "_Löschen" #: gfeeds/opml_file_chooser.py:7 msgid "XML files" msgstr "XML-Dateien" #: gfeeds/opml_file_chooser.py:14 msgid "Choose an OPML file to import" msgstr "Eine OPML-Datei für den Import auswählen" #: gfeeds/opml_file_chooser.py:18 msgid "Open" msgstr "Öffnen" #: gfeeds/opml_file_chooser.py:19 gfeeds/opml_file_chooser.py:31 msgid "Cancel" msgstr "Abbrechen" #: gfeeds/opml_file_chooser.py:26 msgid "Choose where to save the exported OPML file" msgstr "Einen Speicherort für die exportierte OPML-Datei auswählen" #: gfeeds/opml_file_chooser.py:30 msgid "Save" msgstr "Speichern" #: gfeeds/preferences_window.py:27 msgid "General preferences" msgstr "Allgemeine Einstellungen" #: gfeeds/preferences_window.py:29 msgid "Show newer articles first" msgstr "Neuere Artikel zuerst anzeigen" #: gfeeds/preferences_window.py:34 msgid "Open links in your browser" msgstr "Verweise im Browser öffnen" #: gfeeds/preferences_window.py:38 msgid "Use external video player for YouTube" msgstr "Eine externe Medienwiedergabe für YouTube verwenden" #: gfeeds/preferences_window.py:40 msgid "Requires youtube-dl and a compatible video player" msgstr "Benötigt youtube-dl und eine kompatible Medienwiedergabe" #: gfeeds/preferences_window.py:46 msgid "Preferred video player" msgstr "Bevorzugte Medienwiedergabe" #: gfeeds/preferences_window.py:50 msgid "Maximum article age" msgstr "Maximales Alter der Artikel" #: gfeeds/preferences_window.py:51 msgid "In days" msgstr "In Tagen" #: gfeeds/preferences_window.py:58 msgid "Refresh preferences" msgstr "Einstellungen aktualisieren" #: gfeeds/preferences_window.py:60 msgid "Refresh articles on startup" msgstr "Artikel beim Starten aktualisieren" #: gfeeds/preferences_window.py:64 msgid "New articles notification" msgstr "Benachrichtigung über neue Artikel" #: gfeeds/preferences_window.py:68 msgid "Enable auto-refresh" msgstr "Automatische Aktualisierung aktivieren" #: gfeeds/preferences_window.py:72 msgid "Auto-refresh interval" msgstr "Intervall für automatische Aktualisierung" #: gfeeds/preferences_window.py:73 msgid "In seconds" msgstr "In Sekunden" #: gfeeds/preferences_window.py:80 msgid "Cache" msgstr "Zwischenspeicher" #: gfeeds/preferences_window.py:82 msgid "Clear caches" msgstr "Zwischenspeicher leeren" #: gfeeds/preferences_window.py:83 msgid "Clear" msgstr "Leeren" #: gfeeds/preferences_window.py:109 msgid "Appearance" msgstr "Erscheinungsbild" #: gfeeds/preferences_window.py:112 msgid "Appearance preferences" msgstr "Erscheinungsbild-Einstellungen" #: gfeeds/preferences_window.py:114 msgid "Dark mode" msgstr "Dunkle Ansicht" #: gfeeds/preferences_window.py:118 msgid "Reader mode theme" msgstr "Thema der Leseansicht" #: gfeeds/preferences_window.py:122 msgid "Automatic" msgstr "Automatisch" #: gfeeds/preferences_window.py:122 msgid "Light" msgstr "Hell" #: gfeeds/preferences_window.py:122 msgid "Dark" msgstr "Dunkel" #: gfeeds/preferences_window.py:126 msgid "Show article thumbnails" msgstr "Vorschaubilder der Artikel anzeigen" #: gfeeds/preferences_window.py:131 msgid "Show full articles titles" msgstr "Vollständige Artikel-Titel anzeigen" #: gfeeds/preferences_window.py:136 msgid "Show full feeds names" msgstr "Vollständige Feed-Titel anzeigen" #: gfeeds/preferences_window.py:143 msgid "Font preferences" msgstr "Schrift-Einstellungen" #: gfeeds/preferences_window.py:145 msgid "Use system font for titles" msgstr "Systemschrift für Titel verwenden" #: gfeeds/preferences_window.py:149 msgid "Use system font for paragraphs" msgstr "Systemschrift für Absätze verwenden" #: gfeeds/preferences_window.py:153 msgid "Custom title font" msgstr "Benutzerdefinierte Titelschrift" #: gfeeds/preferences_window.py:157 msgid "Custom paragraph font" msgstr "Benutzerdefinierte Absatzschrift" #: gfeeds/preferences_window.py:161 msgid "Custom monospace font" msgstr "Benutzerdefinierte nichtproportionale Schrift" #: gfeeds/preferences_window.py:173 msgid "Privacy" msgstr "Datenschutz" #: gfeeds/preferences_window.py:177 msgid "Privacy preferences" msgstr "Datenschutzeinstellungen" #: gfeeds/preferences_window.py:179 msgid "Enable JavaScript" msgstr "JavaScript aktivieren" #: gfeeds/preferences_window.py:184 msgid "Try to block advertisements" msgstr "Werbung wenn möglich blockieren" #: gfeeds/preferences_window.py:186 gfeeds/preferences_window.py:221 msgid "Requires app restart" msgstr "Erfordert Neustart des Programms" #: gfeeds/preferences_window.py:190 msgid "Update advertisement blocking list" msgstr "Werbeblockierungsliste aktualisieren" #: gfeeds/preferences_window.py:191 msgid "Updates automatically every 10 days" msgstr "Aktualisiert automatisch alle 10 Tage" #: gfeeds/preferences_window.py:192 msgid "Update" msgstr "Aktualisieren" #: gfeeds/preferences_window.py:205 msgid "Advanced" msgstr "Erweitert" #: gfeeds/preferences_window.py:208 msgid "Advanced preferences" msgstr "Erweiterte Einstellungen" #: gfeeds/preferences_window.py:210 msgid "Maximum refresh threads" msgstr "Maximale Aktualisierungsthreads" #: gfeeds/preferences_window.py:212 msgid "How many threads to use for feeds refresh" msgstr "Anzahl der verwendeten Threads zum Aktualisieren von Feeds" #: gfeeds/preferences_window.py:219 msgid "Experimental GtkListView for articles list" msgstr "Experimentelle GtkListView für Artikelliste" #: gfeeds/preferences_window.py:227 msgid "Troubleshooting" msgstr "Fehlerbehandlung" #: gfeeds/preferences_window.py:229 msgid "Export Configuration as JSON" msgstr "Einstellungen als JSON exportieren" # »this« = Aktuelle Einstellungen #: gfeeds/preferences_window.py:230 msgid "Attach this when reporting bugs" msgstr "" "Legt fest, ob die aktuellen Einstellungen zum Fehlerbericht hinzufügt werden " "sollen" #: gfeeds/preferences_window.py:231 msgid "Export" msgstr "Exportieren" # »Feeds« = Anwendung #. type: ignore #: gfeeds/preferences_window.py:244 msgid "Feeds Configuration" msgstr "Feeds-Einstellungen" #: gfeeds/preferences_window.py:248 msgid "_Close" msgstr "_Schließen" #: gfeeds/preferences_window.py:251 msgid "Cop_y" msgstr "_Kopieren" #: gfeeds/util/download_manager.py:112 #, python-brace-format msgid "`{0}`: connection timed out" msgstr "»{0}«: Zeitüberschreitung der Verbindung" #: gfeeds/util/download_manager.py:121 #, python-brace-format msgid "`{0}` might not be a valid address" msgstr "»{0}« ist möglicherweise keine gültige Adresse" #: gfeeds/util/download_manager.py:161 #, python-brace-format msgid "Error downloading `{0}`, code `{1}`" msgstr "Fehler beim Herunterladen von »{0}«, Code »{1}«" #: gfeeds/util/get_favicon.py:48 #, python-brace-format msgid "Error downloading favicon for `{0}`" msgstr "Fehler beim Herunterladen des Favicons für »{0}«" #: gfeeds/util/opml_parser.py:33 msgid "Error: OPML path provided does not exist" msgstr "Fehler: Der angegebene OPML-Pfad existiert nicht" #: gfeeds/util/opml_parser.py:44 #, python-brace-format msgid "Error parsing OPML file `{0}`" msgstr "Fehler beim Analysieren der OPML-Datei »{0}«" #: gfeeds/webview.py:204 msgid "Link copied to clipboard!" msgstr "Verweis in die Zwischenablage kopiert!" #: gfeeds/webview.py:226 msgid "Feed content not available for this article" msgstr "Feed-Inhalt für diesen Artikel nicht verfügbar" #~ msgid "Loading feeds..." #~ msgstr "Nachrichtenquellen werden geladen …" #~ msgid "Mark as read" #~ msgstr "Als gelesen markieren" #~ msgid "Thumbnail" #~ msgstr "Vorschau" #, python-brace-format #~ msgid "`{0}` is not an URL" #~ msgstr "`{0}` ist keine URL" #~ msgid "General Settings" #~ msgstr "Allgemeine Einstellungen" #~ msgid "Open YouTube links via your video player" #~ msgstr "YouTube-Links mit meinem Videoabspieler öffnen" #~ msgid "Great when paired with youtube-dl enabled players" #~ msgstr "Großartig in Verbindung mit youtube-dl-fähigen Playern" #~ msgid "Clear all caches" #~ msgstr "Zwischenspeicher leeren" #~ msgid "View" #~ msgstr "Ansicht" #~ msgid "View Settings" #~ msgstr "Ansichtseinstellungen" #~ msgid "Use dark theme for reader mode" #~ msgstr "Dunkles Thema für Leseansicht verwenden" #~ msgid "Advanced Settings" #~ msgstr "Erweiterte Einstellungen" #~ msgid "Feed" #~ msgstr "Feed" #~ msgid "Show" #~ msgstr "Anzeigen" #~ msgid "Ignore" #~ msgstr "Ignorieren" #~ msgid "You are offline" #~ msgstr "Sie haben keine Internetverbindung" #~ msgid "Filler View" #~ msgstr "Füllansicht" #~ msgid "https://..." #~ msgstr "https://..." #~ msgid "Change view mode" #~ msgstr "Ansichtsmodus ändern" #~ msgid "Share" #~ msgstr "Teilen" # Cannot find this word in the UI of the app. Stay tuned. #~ msgid "label" #~ msgstr "Beschriftung" #~ msgid "Search articles" #~ msgstr "Artikel suchen" #~ msgid "page0" #~ msgstr "page0" #~ msgid "page1" #~ msgstr "page1" #~ msgid "@prettyname@" #~ msgstr "@prettyname@" #~ msgid "Gabriele Musco" #~ msgstr "Gabriele Musco" #~ msgid "Fixed view mode button" #~ msgstr "Problem mit der Schaltfläche für den Ansichtsmodus behoben" #~ msgid "Option to open YouTube links with an external media player" #~ msgstr "" #~ "YouTube-Links können optional mit einem externen Medienabspieler geöffnet " #~ "werden" #~ msgid "" #~ "Saved articles are no longer stored inside the cache directory, avoiding " #~ "accidental deletion" #~ msgstr "" #~ "Gespeicherte Artikel werden nicht mehr im Cache-Verzeichnis gespeichert, " #~ "um nicht unbeabsichtigt gelöscht zu werden" #~ msgid "Feed icons improvements for high DPI screens" #~ msgstr "Feed-Symbole wurden für hochauflösende Bildschirme optimiert" #~ msgid "UI improvements on phones" #~ msgstr "Verbesserungen an der Benutzeroberfläche für Telefone" #~ msgid "Switched to the new libhandy Avatar widget" #~ msgstr "Wechsel zu dem neuen libhandy-Avatar-Widget" #~ msgid "Added Dutch translation courtesy of Heimen Stoffels" #~ msgstr "" #~ "Niederländische Übersetzung hinzugefügt. Danke schön an Heimen Stoffels" #~ msgid "Fixed searchbar" #~ msgstr "Fehler mit Suchleiste behoben" #~ msgid "" #~ "New tags feature! You can now categorize your feeds by creating custom " #~ "tags" #~ msgstr "" #~ "Neues Tag-Feature! Sie können Ihre Feeds nun mit eigenen Tags beschriften " #~ "bzw. kategorisieren" #~ msgid "RSS links can now be opened directly in Feeds to be imported" #~ msgstr "" #~ "RSS-Links können nun direkt in Feeds geöffnet werden, um sie zu " #~ "importieren" #~ msgid "Mark as read now only marks the currently visible feeds" #~ msgstr "" #~ "Das Markieren-als-gelesen markiert jetzt nur die Feeds, die sichtbar sind" #~ msgid "Added support for the latest version of libhandy" #~ msgstr "Unterstützung für die neueste Version von libhandy hinzugefügt" #~ msgid "Improved message dialogs" #~ msgstr "Verbesserte Mitteilungsdialoge" #~ msgid "Performance improvements when importing OPML files" #~ msgstr "Leistungssteigerungen beim Importieren von OPML-Dateien" #~ msgid "Removed option to disable client side decoration" #~ msgstr "Option zum Entfernen der Fensterdekoration entfernt" #~ msgid "" #~ "Don't remove feeds automatically if they have errors, instead ask the " #~ "user what to do" #~ msgstr "" #~ "Feeds mit Fehlern werden nicht mehr automatisch entfernt, sondern der " #~ "Anwender wird gefragt, was gemacht werden soll" #~ msgid "Updated Italian translation" #~ msgstr "Italienische Übersetzung aktualisiert" #~ msgid "Updated French translation" #~ msgstr "Französische Übersetzung aktualisiert" #~ msgid "Bug fixes" #~ msgstr "Fehlerbehebungen" #~ msgid "Updated version number" #~ msgstr "Versionsnummer aktualisiert" #~ msgid "You can now add some feeds by just using the website URL" #~ msgstr "" #~ "Es ist jetzt möglich, Feeds einfach über einen Webseitenlink hinzuzufügen" #~ msgid "New generated placeholder icon for feeds without one" #~ msgstr "Neu generiertes Platzhalter-Symbol für Feeds ohne Symbole" #~ msgid "Improved reader mode" #~ msgstr "Lesemodus verbessert" #~ msgid "Swipe left on your touchscreen to move back from an article" #~ msgstr "Links wischen auf einem Touchscreen, um vom Artikel zurückzugehen" #~ msgid "Code blocks in articles now have syntax highlighting" #~ msgstr "Codeblöcke in Artikeln haben jetzt Syntax-Highlighting" #~ msgid "Added French translation" #~ msgstr "Französische Übersetzung hinzugefügt" #~ msgid "Removed the colored border left of the articles" #~ msgstr "Die farbige Markierung links an den Artikeln wurde entfernt" #~ msgid "More keyboard shortcuts" #~ msgstr "Mehr Tastenkürzel" #~ msgid "Added option to refresh articles on startup" #~ msgstr "" #~ "Es wurde eine Option hinzugefügt, Artikel beim Start zu aktualisieren" #~ msgid "Updated to the GNOME 3.36 runtime" #~ msgstr "Aktualisierung der GNOME 3.36-Laufzeit" #~ msgid "Various improvements and bug fixes" #~ msgstr "Verschiedene Verbesserungen und Fehlerbehebungen" #~ msgid "Added loading progress bar" #~ msgstr "Anzeige für Ladefortschritt hinzugefügt" #~ msgid "Added Spanish translation" #~ msgstr "Spanische Übersetzung hinzugefügt" #~ msgid "Various UI improvements" #~ msgstr "Verschiedene Verbesserungen in der Benutzeroberfläche" #~ msgid "Performance improvements" #~ msgstr "Performance-Verbesserungen" #~ msgid "Various bug fixes" #~ msgstr "Verschiedene Fehlerbehebungen" #~ msgid "Load cached articles on startup" #~ msgstr "Zwischengespeicherte Artikel beim Starten laden" #~ msgid "Added new view mode menu" #~ msgstr "Neuer Ansichtenmodus hinzugefügt" #~ msgid "Added Brazilian Portuguese translation" #~ msgstr "Brasilianische Übersetzung hinzugefügt" #~ msgid "Added Russian translation" #~ msgstr "Russische Übersetzung hinzugefügt" #~ msgid "Option to ellipsize article titles for a more compact view" #~ msgstr "" #~ "Es gibt die Möglichkeit, Artikeltitel zu kürzen, um eine kompaktere " #~ "Ansicht zu ermöglichen" #~ msgid "Added a search function" #~ msgstr "Suchfunktion hinzugefügt" #~ msgid "Updated dependencies" #~ msgstr "Abhängigkeiten aktualisiert" #~ msgid "Errors with feeds are now shown in the UI" #~ msgstr "Fehler mit Feeds werden jetzt auf der Benutzeroberfläche angezeigt" #~ msgid "Big UI overhaul" #~ msgstr "Gründliche Überarbeitung der Benutzeroberfläche" #~ msgid "Updated translations" #~ msgstr "Übersetzungen aktualisiert" #~ msgid "OPML file association" #~ msgstr "OPML-Dateizuordnung" #~ msgid "Changed left headerbar button order" #~ msgstr "Reihenfolge der linken Symbolleiste geändert" #~ msgid "Optimization for updating feeds" #~ msgstr "Aktualisieren von Feeds optimiert" #~ msgid "Redesigned right click/longpress menu" #~ msgstr "Überarbeitetes Menü bei Rechtsklick oder langem Drücken" #~ msgid "Option to show/hide read articles" #~ msgstr "Option für gelesene Artikel anzeigen/ausblenden" #~ msgid "Reworked suggestion bar" #~ msgstr "Überarbeitete Vorschlagsleiste" #~ msgid "Changed name to Feeds" #~ msgstr "Name zu Feeds geändert" #~ msgid "Improved CPU utilization" #~ msgstr "Verbesserte CPU-Auslastung" #~ msgid "New right click or longpress menu for articles" #~ msgstr "Neues Menü bei Rechtsklick oder langem Druck auf Artikel" #~ msgid "You can now save articles offline" #~ msgstr "" #~ "Sie können jetzt Artikel speichern, um sie später ohne Internetverbindung " #~ "zu lesen" #~ msgid "Initial suggestion to add feeds is now less intrusive" #~ msgstr "" #~ "Der zu Beginn erscheinende Vorschlag, neue Feeds hinzuzufügen, ist jetzt " #~ "weniger aufdringlich" #~ msgid "Read articles are now greyed out" #~ msgstr "Gelesene Artikel werden nun grau dargestellt" #~ msgid "Concurrent feeds refresh, with customizable thread count" #~ msgstr "" #~ "Gleichzeitige Aktualisierung mehrerer Feeds; mit einer einstellbaren " #~ "Anzahl von Threads" #~ msgid "Added German translation (thanks @Etamuk)" #~ msgstr "Deutsche Übersetzung hinzugefügt (Danke @Etamuk)" #~ msgid "Fix bugs in reader mode" #~ msgstr "Einige Fehler in Leseansicht behoben" #~ msgid "Minor bug fix" #~ msgstr "Kleinere Fehlerbehebung" #~ msgid "Improved date and time parsing and display" #~ msgstr "Verbesserte Analyse und Anzeige von Datum und Uhrzeit" #~ msgid "Reader mode can now work on websites without an article tag" #~ msgstr "" #~ "Der Lesemodus kann jetzt auf Webseiten ohne Artikel-Tag verwendet werden" #~ msgid "Slight improvements to the icon" #~ msgstr "Leichte Verbesserungen am Symbol" #~ msgid "New feature to filter articles by feed" #~ msgstr "Neue Funktion zum Filtern der Artikel nach Feed" #~ msgid "Improved favicon download" #~ msgstr "Verbessertes Herunterladen des Favicon" #~ msgid "Fixed refresh duplicating articles" #~ msgstr "Das Aktualisieren von doppelten Artikeln wurde korrigiert" #~ msgid "Added option to disable client side decoration" #~ msgstr "Option hinzugefügt, die Fensterdekoration abzuschalten" #~ msgid "Brought primary menu in line with GNOME HIG" #~ msgstr "Hauptmenü so gestaltet, dass es den GNOME-Richtlinien entspricht" #~ msgid "Added placeholder icon for feeds without an icon" #~ msgstr "Platzhalter für Feeds ohne Symbol hinzugefügt" #~ msgid "Migrated some widgets to Glade templates" #~ msgstr "Einige Widgets wurden zu Glade-Vorlagen verlegt" #~ msgid "Option to use reader mode by default" #~ msgstr "Option zum standardmäßigen Verwenden der Leseansicht" #~ msgid "Option to show article content from the feed" #~ msgstr "Option zum Zeigen des Artikelinhaltes aus dem Feed" #~ msgid "Fixed labels alignment" #~ msgstr "Ausrichtung der Beschreibung verbessert" #~ msgid "Changed app name to Feeds" #~ msgstr "Name der Anwendung zu Feeds geändert" #~ msgid "Added separators for the two sections of the app" #~ msgstr "Trenner zwischen den beiden Bereichen der App hinzugefügt" #~ msgid "Using links as feed titles when there is no title" #~ msgstr "Benutze die Links als Feed-Titel, wenn kein Titel verfügbar ist" #~ msgid "Added preference for maximum article age" #~ msgstr "Einstellung zum Festlegen des maximalen Artikelalters hinzugefügt" #~ msgid "Added zoom keyboard shortcuts" #~ msgstr "Tastaturkürzel für Zoomen hinzugefügt" #~ msgid "Added preference to enable JavaScript" #~ msgstr "Einstellung zum Aktivieren von JavaScript hinzugefügt" #~ msgid "Fix window control positions when they are on the left" #~ msgstr "" #~ "Fehler mit Schaltflächenposition für Fenstersteuerung behoben, wenn diese " #~ "auf der linken Seite sind" #~ msgid "Feeds for websites without favicons will now work" #~ msgstr "Feeds für Webseiten ohne Favicons werden jetzt funktionieren" #~ msgid "Fixed bug with adding new feeds" #~ msgstr "Fehler beim Hinzufügen neuer Feeds behoben" #~ msgid "Switched to native file chooser" #~ msgstr "Wechsel zum nativen Dateiwähler" #~ msgid "Added empty state initial screen for sidebar" #~ msgstr "Leeren Anfangsbildschirm für Seitenleiste hinzugefügt" #~ msgid "Added italian translation" #~ msgstr "Italienische Übersetzung hinzugefügt" #~ msgid "First release" #~ msgstr "Erste Veröffentlichung" #, python-brace-format #~ msgid "" #~ "Error resizing favicon for feed {0}. Probably not an image.\n" #~ "Trying downloading favicon from an article." #~ msgstr "" #~ "Fehler bei der Größenänderung des Favicons für {0}. Wahrscheinlich ist es " #~ "keine Grafik.\n" #~ "Versuche das Laden des Favicons aus dem Artikel." #, python-brace-format #~ msgid "" #~ "Error resizing favicon from article for feed {0}.\n" #~ "Deleting invalid favicon." #~ msgstr "" #~ "Fehler bei Größenänderung des Favicons aus dem Artikel für Feed {0}.\n" #~ "Lösche ungültiges Favicon." #~ msgid "Reader mode unavailable for this site" #~ msgstr "Leseansicht für diese Seite nicht verfügbar" #~ msgid "Show colored border" #~ msgstr "Farbigen Rand anzeigen" #~ msgid "Enable client side decoration" #~ msgstr "Fensterdekoration aktivieren" #~ msgid "There were problems with some feeds" #~ msgstr "Es gab Probleme mit einigen Feeds" #~ msgid "@appid@" #~ msgstr "@appid@" #~ msgid "Use reader mode by default" #~ msgstr "Verwende standardmäßig die Leseansicht" #~ msgid "Use content from the RSS feed" #~ msgstr "Inhalt aus dem RSS-Feed verwenden" #~ msgid "Load RSS content" #~ msgstr "Lade RSS-Inhalt" #~ msgid "New feed URL" #~ msgstr "URL des neuen Feed" #~ msgid "Add a feed or import an OPML file" #~ msgstr "Einen Feed hinzufügen oder eine OPML-Datei importieren" #~ msgid "Select an article" #~ msgstr "Wählen Sie einen Artikel aus" #~ msgid "GNOME Feeds" #~ msgstr "GNOME Feeds" #~ msgid "" #~ "GNOME Feeds is a minimal RSS/Atom feed reader built with speed and " #~ "simplicity in mind." #~ msgstr "" #~ "GNOME Feeds ist ein minimalistischer Betrachter für RSS/Atom-Feeds, der " #~ "auf Geschwindigkeit und Einfachheit ausgelegt ist." #, fuzzy #~| msgid "Do you want to delete these feeds?" #~ msgid "Do you want to import this file?" #~ msgstr "Wollen Sie diese Feeds wirklich löschen?" #~ msgid "Add a feed or import an OPML file" #~ msgstr "Einen Feed hinzufügen oder eine OPML-Datei importieren" #~ msgid "This does nothing" #~ msgstr "Das bringt nichts" gfeeds-2.2.0/po/es.po000066400000000000000000000735651440757451400143700ustar00rootroot00000000000000# Spanish translations for gfeeds package. # Copyright (C) 2019 THE gfeeds'S COPYRIGHT HOLDER # This file is distributed under the same license as the gfeeds package. # odiseo , 2019. # Óscar Fernández Díaz , 2021-2002 # msgid "" msgstr "" "Project-Id-Version: gfeeds 0.11\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2022-02-23 14:18+0100\n" "PO-Revision-Date: 2022-02-23 14:21+0100\n" "Last-Translator: Óscar Fernández Díaz \n" "Language-Team: Spanish\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: Poedit 3.0.1\n" #: ../gfeeds/__main__.py:259 msgid "url" msgstr "url" #: ../gfeeds/__main__.py:262 msgid "opml file local url or rss remote url to import" msgstr "url de fichero local opml o remota rss url a importar" #: ../gfeeds/confirm_add_dialog.py:16 msgid "Do you want to import these feeds?" msgstr "¿Quiere importar estas fuentes?" #: ../gfeeds/confirm_add_dialog.py:17 msgid "Do you want to import this feed?" msgstr "¿Quiere importar esta fuente?" #: ../gfeeds/download_manager.py:88 #, python-brace-format msgid "`{0}`: connection timed out" msgstr "`{0}`: la conexión se ha agotado" #: ../gfeeds/download_manager.py:92 #, python-brace-format msgid "`{0}` might not be a valid address" msgstr "`{0}` podría no ser una dirección válida" #: ../gfeeds/download_manager.py:117 #, python-brace-format msgid "Error downloading `{0}`, code `{1}`" msgstr "Error descargando `{0}`, código `{1}`" #: ../gfeeds/feeds_manager.py:87 #, python-brace-format msgid "Feed {0} exists already, skipping" msgstr "Fuente {0} ya existe, saltando" #: ../gfeeds/feeds_view.py:14 msgid "All feeds" msgstr "Todas las fuentes" #: ../gfeeds/get_favicon.py:45 #, python-brace-format msgid "Error downloading favicon for `{0}`" msgstr "Error descargando el icono para `{0}`" #: ../gfeeds/headerbar.py:171 msgid "" "There were problems with some feeds.\n" "Do you want to remove them?" msgstr "" "Hubo problemas con algunas fuentes.\n" "¿Quiere eliminarlas?" #: ../gfeeds/main_leaflet.py:121 #, python-brace-format msgid "{0} new article" msgid_plural "{0} new articles" msgstr[0] "{0} artículo nuevo" msgstr[1] "{0} artículos nuevos" #: ../gfeeds/manage_feeds_window.py:225 msgid "Do you want to delete these feeds?" msgstr "¿Quiere borrar estas fuentes?" #: ../gfeeds/manage_feeds_window.py:277 msgid "Manage Feeds" msgstr "Organizar fuentes" #: ../gfeeds/opml_file_chooser.py:7 msgid "XML files" msgstr "Ficheros XML" #: ../gfeeds/opml_file_chooser.py:14 msgid "Choose an OPML file to import" msgstr "Escoger un fichero OPML a importar" #: ../gfeeds/opml_file_chooser.py:18 msgid "Open" msgstr "Abrir" #: ../gfeeds/opml_file_chooser.py:19 ../gfeeds/opml_file_chooser.py:31 msgid "Cancel" msgstr "Cancelar" #: ../gfeeds/opml_file_chooser.py:26 msgid "Choose where to save the exported OPML file" msgstr "Escoger donde guardar el fichero OPML exportado" #: ../gfeeds/opml_file_chooser.py:30 msgid "Save" msgstr "Guardar" #: ../gfeeds/opml_manager.py:42 msgid "Error: OPML path provided does not exist" msgstr "Error: La ruta suministrada del fichero OPML no existe" #: ../gfeeds/opml_manager.py:53 #, python-brace-format msgid "Error parsing OPML file `{0}`" msgstr "Error parseando el fichero OPML `{0}`" #: ../gfeeds/preferences_window.py:22 msgid "General" msgstr "General" #: ../gfeeds/preferences_window.py:25 msgid "General preferences" msgstr "Preferencias generales" #: ../gfeeds/preferences_window.py:27 msgid "Show newer articles first" msgstr "Mostrar los artículos recientes primero" #: ../gfeeds/preferences_window.py:32 msgid "Open links in your browser" msgstr "Abrir enlaces en su navegador" #: ../gfeeds/preferences_window.py:36 msgid "Use external video player for YouTube" msgstr "Usar un reproductor de vídeo externo para YouTube" #: ../gfeeds/preferences_window.py:38 msgid "Requires youtube-dl and a compatible video player" msgstr "Requiere youtube-dl y un reproductor de vídeo compatible" #: ../gfeeds/preferences_window.py:44 msgid "Preferred video player" msgstr "Reproductor de vídeo preferido" #: ../gfeeds/preferences_window.py:48 msgid "Maximum article age" msgstr "Duración máxima del artículo" #: ../gfeeds/preferences_window.py:49 msgid "In days" msgstr "En días" #: ../gfeeds/preferences_window.py:56 msgid "Refresh preferences" msgstr "Actualizar preferencias" #: ../gfeeds/preferences_window.py:58 msgid "Refresh articles on startup" msgstr "Actualizar los artículos al inicio" #: ../gfeeds/preferences_window.py:62 msgid "New articles notification" msgstr "Notificación de artículos nuevos" #: ../gfeeds/preferences_window.py:66 msgid "Enable auto-refresh" msgstr "Activar la actualización automática" #: ../gfeeds/preferences_window.py:70 msgid "Auto-refresh interval" msgstr "Intervalo de actualización automática" #: ../gfeeds/preferences_window.py:71 msgid "In seconds" msgstr "En segundos" #: ../gfeeds/preferences_window.py:78 msgid "Cache" msgstr "Caché" #: ../gfeeds/preferences_window.py:80 msgid "Clear caches" msgstr "Borrar caché" #: ../gfeeds/preferences_window.py:81 msgid "Clear" msgstr "Borrar" #: ../gfeeds/preferences_window.py:109 msgid "Appearance" msgstr "Apariencia" #: ../gfeeds/preferences_window.py:112 msgid "Appearance preferences" msgstr "Preferencias de apariencia" #: ../gfeeds/preferences_window.py:114 msgid "Dark mode" msgstr "Modo oscuro" #: ../gfeeds/preferences_window.py:118 msgid "Use dark theme for reader mode" msgstr "Usar el tema oscuro para el modo lectura" #: ../gfeeds/preferences_window.py:122 msgid "Show article thumbnails" msgstr "Mostrar las miniaturas de los artículos" #: ../gfeeds/preferences_window.py:127 msgid "Maximum thumbnail height" msgstr "Altura máxima de la miniatura" #: ../gfeeds/preferences_window.py:133 msgid "Show full articles titles" msgstr "Mostrar el título de los artículos completo" #: ../gfeeds/preferences_window.py:138 msgid "Show full feeds names" msgstr "Mostrar el nombre completo de las fuentes" #: ../gfeeds/preferences_window.py:145 msgid "Font preferences" msgstr "Preferencias de tipografía" #: ../gfeeds/preferences_window.py:147 msgid "Use system font for titles" msgstr "Usar la tipografía del sistema para los títulos" #: ../gfeeds/preferences_window.py:151 msgid "Use system font for paragraphs" msgstr "Usar la tipografía del sistema para los párrafos" #: ../gfeeds/preferences_window.py:155 msgid "Custom title font" msgstr "Tipografía del título personalizada" #: ../gfeeds/preferences_window.py:159 msgid "Custom paragraph font" msgstr "Tipografía del párrafo personalizada" #: ../gfeeds/preferences_window.py:163 msgid "Custom monospace font" msgstr "Tipografía monoespaciada personalizada" #: ../gfeeds/preferences_window.py:175 msgid "Privacy" msgstr "Privacidad" #: ../gfeeds/preferences_window.py:178 msgid "Privacy preferences" msgstr "Preferencias de privacidad" #: ../gfeeds/preferences_window.py:180 msgid "Enable JavaScript" msgstr "Activar Javascript" #: ../gfeeds/preferences_window.py:185 msgid "Try to block advertisements" msgstr "Intentar bloquear los anuncios" #: ../gfeeds/preferences_window.py:187 ../gfeeds/preferences_window.py:222 msgid "Requires app restart" msgstr "Requiere reiniciar la aplicación" #: ../gfeeds/preferences_window.py:191 msgid "Update advertisement blocking list" msgstr "Actualizar la lista de bloqueo de anuncios" #: ../gfeeds/preferences_window.py:192 msgid "Updates automatically every 10 days" msgstr "Se actualiza automáticamente cada 10 días" #: ../gfeeds/preferences_window.py:193 msgid "Update" msgstr "Actualizar" #: ../gfeeds/preferences_window.py:206 msgid "Advanced" msgstr "Avanzado" #: ../gfeeds/preferences_window.py:209 msgid "Advanced preferences" msgstr "Preferencias avanzadas" #: ../gfeeds/preferences_window.py:211 msgid "Maximum refresh threads" msgstr "Máximo número de hilos para actualizar" #: ../gfeeds/preferences_window.py:213 msgid "How many threads to use for feeds refresh" msgstr "Cuántos hilos usar para la actualización de las fuentes" #: ../gfeeds/preferences_window.py:220 msgid "Experimental GtkListView for articles list" msgstr "GtkListView experimental para la lista de artículos" #: ../gfeeds/rss_parser.py:67 #, python-brace-format msgid "Error: unable to parse datetime {0} for feeditem {1}" msgstr "Error: no se pudo parsear la fecha {0} para el elemento {1}" #: ../gfeeds/rss_parser.py:148 #, python-brace-format msgid "Errors while parsing feed `{0}`" msgstr "Errores en el parseo de la fuente `{0}`" #: ../gfeeds/rss_parser.py:175 #, python-brace-format msgid "`{0}` may not be an RSS or Atom feed" msgstr "`{0}` podría no ser una fuente web o Atom" #: ../gfeeds/sidebar.py:21 msgid "Loading feeds..." msgstr "Cargando fuentes..." #: ../gfeeds/sidebar_row_popover.py:31 ../gfeeds/sidebar_row_popover.py:58 msgid "Mark as unread" msgstr "Marcar como no leído" #: ../gfeeds/sidebar_row_popover.py:38 ../gfeeds/sidebar_row_popover.py:50 msgid "Mark as read" msgstr "Marcar como leido" #: ../gfeeds/suggestion_bar.py:37 msgid "There are some errors" msgstr "Hay algunos errores" #: ../gfeeds/suggestion_bar.py:46 msgid "Show" msgstr "Mostrar" #: ../gfeeds/suggestion_bar.py:47 msgid "Ignore" msgstr "Ignorar" #: ../gfeeds/suggestion_bar.py:70 msgid "There were problems with some feeds. Do you want to remove them?" msgstr "Hubo problemas con algunas fuentes. ¿Quiere eliminarlas?" #: ../gfeeds/suggestion_bar.py:97 msgid "You are offline" msgstr "Está desconectado" #: ../gfeeds/webview.py:188 msgid "Link copied to clipboard!" msgstr "¡Enlace copiado al portapapeles!" #: ../gfeeds/webview.py:210 msgid "Feed content not available for this article" msgstr "El contenido de la fuente no está disponible para este artículo" #: ../data/ui/extra_popover_menu.ui:19 msgid "Web View" msgstr "Visualización web" #: ../data/ui/extra_popover_menu.ui:26 msgid "Reader Mode" msgstr "Modo de lectura" #: ../data/ui/extra_popover_menu.ui:33 msgid "Feed Content" msgstr "Contenido de la fuente" #: ../data/ui/add_feed_popover.blp:11 msgid "Enter feed address to add" msgstr "Introducir la dirección de la fuente a añadir" #: ../data/ui/add_feed_popover.blp:26 msgid "Add" msgstr "Añadir" #: ../data/ui/add_feed_popover.blp:32 msgid "You're already subscribed to that feed!" msgstr "¡Ya tiene esta fuente!" #: ../data/ui/empty_state.blp:7 msgid "Let's get started" msgstr "Comencemos" #: ../data/ui/empty_state.blp:22 msgid "Add new feeds via URL" msgstr "Añadir nuevas fuentes vía URL" #: ../data/ui/empty_state.blp:27 msgid "Import an OPML file" msgstr "Importar un fichero OPML" #: ../data/ui/left_headerbar.blp:6 msgid "Show Read Articles" msgstr "Mostrar artículos leídos" #: ../data/ui/left_headerbar.blp:7 msgid "Mark All as Read" msgstr "Marcar todo como leído" #: ../data/ui/left_headerbar.blp:8 msgid "Mark All as Unread" msgstr "Marcar todo como no leído" #: ../data/ui/left_headerbar.blp:12 msgid "Import OPML" msgstr "Importar OPML" #: ../data/ui/left_headerbar.blp:13 msgid "Export OPML" msgstr "Exportar OPML" #: ../data/ui/left_headerbar.blp:16 msgid "Preferences" msgstr "Preferencias" #: ../data/ui/left_headerbar.blp:17 msgid "Keyboard Shortcuts" msgstr "Atajos del teclado" #: ../data/ui/left_headerbar.blp:18 msgid "About Feeds" msgstr "Acerca de Feeds" #: ../data/ui/left_headerbar.blp:27 msgid "Filter" msgstr "Filtrar" #: ../data/ui/left_headerbar.blp:31 msgid "Add Feed" msgstr "Añadir fuentes" #: ../data/ui/left_headerbar.blp:35 msgid "Menu" msgstr "Menú" #: ../data/ui/left_headerbar.blp:40 ../data/ui/shortcutsWindow.blp:31 msgid "Refresh" msgstr "Actualizar" #: ../data/ui/left_headerbar.blp:45 ../data/ui/shortcutsWindow.blp:35 msgid "Search" msgstr "Buscar" #: ../data/ui/left_headerbar.blp:50 msgid "There Are Errors" msgstr "Hay errores" #: ../data/ui/manage_feeds_headerbar.blp:11 msgid "Manage Tags for Selected Feeds" msgstr "Gestionar las etiquetas de las fuentes seleccionadas" #: ../data/ui/manage_feeds_headerbar.blp:16 msgid "Select/Unselect All" msgstr "Seleccionar/Deseleccionar todo" #: ../data/ui/manage_feeds_headerbar.blp:21 msgid "Delete Selected Feeds" msgstr "Borrar las fuentes seleccionadas" #: ../data/ui/manage_tags_content.blp:17 msgid "New tag name…" msgstr "Nuevo nombre de la etiqueta…" #: ../data/ui/manage_tags_content.blp:24 msgid "Add Tag" msgstr "Añadir etiqueta" #: ../data/ui/manage_tags_content.blp:39 msgid "There are no tags yet" msgstr "No hay etiquetas todavía" #: ../data/ui/manage_tags_content.blp:40 msgid "Add some using the entry above" msgstr "Añadir alguna usando la entrada de arriba" #: ../data/ui/right_headerbar.blp:9 ../data/ui/shortcutsWindow.blp:70 msgid "Open in Browser" msgstr "Abrir en el navegador" #: ../data/ui/right_headerbar.blp:10 msgid "Open in External Media Player" msgstr "Abrir en el reproductor multimedia externo" #: ../data/ui/right_headerbar.blp:11 msgid "Copy Article Link" msgstr "Copiar el enlace del artículo" #: ../data/ui/right_headerbar.blp:22 ../data/ui/shortcutsWindow.blp:62 msgid "Zoom Out" msgstr "Alejar" #: ../data/ui/right_headerbar.blp:27 ../data/ui/shortcutsWindow.blp:66 msgid "Reset Zoom" msgstr "Restablecer zoom" #: ../data/ui/right_headerbar.blp:32 ../data/ui/shortcutsWindow.blp:58 msgid "Zoom In" msgstr "Ampliar" #: ../data/ui/right_headerbar.blp:65 msgid "Back to Articles" msgstr "Volver a los artículos" #: ../data/ui/right_headerbar.blp:71 msgid "Change View Mode" msgstr "Cambiar modo de vista" #: ../data/ui/row_popover.blp:19 msgid "Mark as Read" msgstr "Marcar como leído" #: ../data/ui/shortcutsWindow.blp:12 msgid "Open Keyboard Shortcuts" msgstr "Abrir Atajos del teclado" #: ../data/ui/shortcutsWindow.blp:16 msgid "Open Menu" msgstr "Abrir Menú" #: ../data/ui/shortcutsWindow.blp:20 msgid "Open Preferences" msgstr "Abrir Preferencias" #: ../data/ui/shortcutsWindow.blp:24 msgid "Quit" msgstr "Salir" #: ../data/ui/shortcutsWindow.blp:28 msgid "Article List" msgstr "Lista de artículos" #: ../data/ui/shortcutsWindow.blp:39 msgid "Next" msgstr "Siguiente" #: ../data/ui/shortcutsWindow.blp:43 msgid "Previous" msgstr "Anterior" #: ../data/ui/shortcutsWindow.blp:47 msgid "Show/Hide Read Articles" msgstr "Mostrar/Ocultar artículos leídos" #: ../data/ui/shortcutsWindow.blp:51 msgid "Mark All Read" msgstr "Marcar todo como leído" #: ../data/ui/shortcutsWindow.blp:55 msgid "Article" msgstr "Artículo" #: ../data/ui/webview.blp:12 msgid "Select an article" msgstr "Seleccionar un artículo" #: ../data/org.gabmus.gfeeds.desktop.in:6 msgid "@prettyname@" msgstr "@prettyname@" #: ../data/org.gabmus.gfeeds.desktop.in:7 msgid "News reader for GNOME" msgstr "Lector de noticias para GNOME" #: ../data/org.gabmus.gfeeds.desktop.in:16 msgid "rss;reader;feed;news;" msgstr "rss;reader;feed;news;lector;fuentes;noticias;" #: ../data/org.gabmus.gfeeds.appdata.xml.in:4 msgid "Feeds" msgstr "Feeds" #: ../data/org.gabmus.gfeeds.appdata.xml.in:15 msgid "" "Feeds is a minimal RSS/Atom feed reader built with speed and simplicity in " "mind." msgstr "" "Feeds es un lector de fuentes web/Atom construido con la velocidad y " "simplicidad en mente." #: ../data/org.gabmus.gfeeds.appdata.xml.in:16 msgid "" "It offers a simple user interface that only shows the latest news from your " "subscriptions." msgstr "" "Ofrece un interfaz simple de usuario que solo muestra las últimas noticias " "de sus suscripciones." #: ../data/org.gabmus.gfeeds.appdata.xml.in:17 msgid "" "Articles are shown in a web view by default, with javascript disabled for a " "faster and less intrusive user experience. There's also a reader mode " "included, built from the one GNOME Web/Epiphany uses." msgstr "" "Los artículos son mostrados en el visor web por defecto con javascript " "desactivado para una experiencia de usuario más rápida y menos intrusiva. " "También hay un modo lectura incluido, usando funcionalidades de GNOME Web/" "Epiphany." #: ../data/org.gabmus.gfeeds.appdata.xml.in:18 msgid "Feeds can be imported and exported via OPML." msgstr "Las fuentes pueden ser importados y exportadas usando el formato OPML." #: ../data/org.gabmus.gfeeds.appdata.xml.in:59 msgid "Fixed view mode button" msgstr "Corregido el botón del modo vista" #: ../data/org.gabmus.gfeeds.appdata.xml.in:60 msgid "Option to open YouTube links with an external media player" msgstr "" "Opción para abrir enlaces de YouTube con un reproductor multimedia externo" #: ../data/org.gabmus.gfeeds.appdata.xml.in:61 msgid "" "Saved articles are no longer stored inside the cache directory, avoiding " "accidental deletion" msgstr "" "Los artículos guardados ya no se almacenan en el directorio de la caché, lo " "que evita su eliminación accidental" #: ../data/org.gabmus.gfeeds.appdata.xml.in:69 msgid "Feed icons improvements for high DPI screens" msgstr "Mejoras en los iconos de las fuentes para las pantallas de alta DPI" #: ../data/org.gabmus.gfeeds.appdata.xml.in:77 msgid "UI improvements on phones" msgstr "Mejoras en la interfaz de usuario de los teléfonos" #: ../data/org.gabmus.gfeeds.appdata.xml.in:85 msgid "Switched to the new libhandy Avatar widget" msgstr "Cambiado al nuevo widget de Avatar de libhandy" #: ../data/org.gabmus.gfeeds.appdata.xml.in:86 msgid "Added Dutch translation courtesy of Heimen Stoffels" msgstr "Añadida la traducción al neerlandés por cortesía de Heimen Stoffels" #: ../data/org.gabmus.gfeeds.appdata.xml.in:93 msgid "Fixed searchbar" msgstr "Corregida la barra de búsqueda" #: ../data/org.gabmus.gfeeds.appdata.xml.in:101 msgid "" "New tags feature! You can now categorize your feeds by creating custom tags" msgstr "" "¡Nueva función de etiquetas! Ahora puedes clasificar sus fuentes creando " "etiquetas personalizadas" #: ../data/org.gabmus.gfeeds.appdata.xml.in:102 msgid "RSS links can now be opened directly in Feeds to be imported" msgstr "" "Ahora los enlaces web pueden abrirse directamente en Feeds para ser " "importados" #: ../data/org.gabmus.gfeeds.appdata.xml.in:103 msgid "Mark as read now only marks the currently visible feeds" msgstr "Marcar como leído ahora solo marca las fuentes actualmente visibles" #: ../data/org.gabmus.gfeeds.appdata.xml.in:104 msgid "Added support for the latest version of libhandy" msgstr "Añadido el soporte para la última versión de libhandy" #: ../data/org.gabmus.gfeeds.appdata.xml.in:105 msgid "Improved message dialogs" msgstr "Mejorados los diálogos de mensajes" #: ../data/org.gabmus.gfeeds.appdata.xml.in:106 msgid "Performance improvements when importing OPML files" msgstr "Mejoras de rendimiento en la importación de archivos OPML" #: ../data/org.gabmus.gfeeds.appdata.xml.in:107 msgid "Removed option to disable client side decoration" msgstr "Eliminada la opción de desactivar la decoración del lado del cliente" #: ../data/org.gabmus.gfeeds.appdata.xml.in:114 msgid "" "Don't remove feeds automatically if they have errors, instead ask the user " "what to do" msgstr "" "No se eliminan las fuentes automáticamente si tienen errores, sino que se " "pregunta qué se debe hacer" #: ../data/org.gabmus.gfeeds.appdata.xml.in:115 #: ../data/org.gabmus.gfeeds.appdata.xml.in:137 msgid "Updated Italian translation" msgstr "Actualizada la traducción al italiano" #: ../data/org.gabmus.gfeeds.appdata.xml.in:122 msgid "Updated French translation" msgstr "Actualizada la traducción al francés" #: ../data/org.gabmus.gfeeds.appdata.xml.in:129 msgid "Bug fixes" msgstr "Corrección de errores" #: ../data/org.gabmus.gfeeds.appdata.xml.in:136 msgid "Updated version number" msgstr "Número de versión actualizado" #: ../data/org.gabmus.gfeeds.appdata.xml.in:144 msgid "You can now add some feeds by just using the website URL" msgstr "" "Ahora puede añadir algunas fuentes simplemente utilizando la URL del sitio " "web" #: ../data/org.gabmus.gfeeds.appdata.xml.in:145 msgid "New generated placeholder icon for feeds without one" msgstr "Nuevo icono de marcador de posición generado para las fuentes sin uno" #: ../data/org.gabmus.gfeeds.appdata.xml.in:146 msgid "Improved reader mode" msgstr "Mejorado el modo de lectura" #: ../data/org.gabmus.gfeeds.appdata.xml.in:147 msgid "Swipe left on your touchscreen to move back from an article" msgstr "" "Deslice el dedo hacia la izquierda en la pantalla táctil para retroceder de " "un artículo" #: ../data/org.gabmus.gfeeds.appdata.xml.in:148 msgid "Code blocks in articles now have syntax highlighting" msgstr "" "Los bloques de código en los artículos ahora tienen resaltado de sintaxis" #: ../data/org.gabmus.gfeeds.appdata.xml.in:149 msgid "Added French translation" msgstr "Añadida la traducción al francés" #: ../data/org.gabmus.gfeeds.appdata.xml.in:150 msgid "Removed the colored border left of the articles" msgstr "Eliminado el borde de color a la izquierda de los artículos" #: ../data/org.gabmus.gfeeds.appdata.xml.in:151 msgid "More keyboard shortcuts" msgstr "Más atajos del teclado" #: ../data/org.gabmus.gfeeds.appdata.xml.in:152 msgid "Added option to refresh articles on startup" msgstr "Añadida la opción de actualizar los artículos al inicio" #: ../data/org.gabmus.gfeeds.appdata.xml.in:153 msgid "Updated to the GNOME 3.36 runtime" msgstr "Actualizado al runtime de GNOME 3.36" #: ../data/org.gabmus.gfeeds.appdata.xml.in:154 msgid "Various improvements and bug fixes" msgstr "Varias mejoras y correcciones de errores" #: ../data/org.gabmus.gfeeds.appdata.xml.in:161 msgid "Added loading progress bar" msgstr "Añadida una barra de progreso de carga" #: ../data/org.gabmus.gfeeds.appdata.xml.in:162 msgid "Added Spanish translation" msgstr "Añadida la traducción al español" #: ../data/org.gabmus.gfeeds.appdata.xml.in:163 #: ../data/org.gabmus.gfeeds.appdata.xml.in:174 #: ../data/org.gabmus.gfeeds.appdata.xml.in:188 msgid "Various UI improvements" msgstr "Varias mejoras de la IU" #: ../data/org.gabmus.gfeeds.appdata.xml.in:164 #: ../data/org.gabmus.gfeeds.appdata.xml.in:175 msgid "Performance improvements" msgstr "Mejoras en el rendimiento" #: ../data/org.gabmus.gfeeds.appdata.xml.in:165 #: ../data/org.gabmus.gfeeds.appdata.xml.in:176 #: ../data/org.gabmus.gfeeds.appdata.xml.in:189 #: ../data/org.gabmus.gfeeds.appdata.xml.in:199 #: ../data/org.gabmus.gfeeds.appdata.xml.in:214 #: ../data/org.gabmus.gfeeds.appdata.xml.in:225 #: ../data/org.gabmus.gfeeds.appdata.xml.in:278 msgid "Various bug fixes" msgstr "Varias correcciones de errores" #: ../data/org.gabmus.gfeeds.appdata.xml.in:172 msgid "Load cached articles on startup" msgstr "Cargar artículos cacheados en el arranque" #: ../data/org.gabmus.gfeeds.appdata.xml.in:173 msgid "Added new view mode menu" msgstr "Añadido un nuevo menú de modo de vista" #: ../data/org.gabmus.gfeeds.appdata.xml.in:177 msgid "Added Brazilian Portuguese translation" msgstr "Añadida la traducción al portugués de Brasil" #: ../data/org.gabmus.gfeeds.appdata.xml.in:178 msgid "Added Russian translation" msgstr "Añadida la traducción al ruso" #: ../data/org.gabmus.gfeeds.appdata.xml.in:185 msgid "Option to ellipsize article titles for a more compact view" msgstr "Opción de elipsar los artículos para una vista más compacta" #: ../data/org.gabmus.gfeeds.appdata.xml.in:186 msgid "Added a search function" msgstr "Añadida una función de búsqueda" #: ../data/org.gabmus.gfeeds.appdata.xml.in:187 msgid "Updated dependencies" msgstr "Dependencias actualizadas" #: ../data/org.gabmus.gfeeds.appdata.xml.in:196 msgid "Errors with feeds are now shown in the UI" msgstr "Los errores con las fuentes se muestran ahora en la interfaz" #: ../data/org.gabmus.gfeeds.appdata.xml.in:197 msgid "Big UI overhaul" msgstr "Gran revisión de la IU" #: ../data/org.gabmus.gfeeds.appdata.xml.in:198 msgid "Updated translations" msgstr "Actualizadas las traducciones" #: ../data/org.gabmus.gfeeds.appdata.xml.in:206 msgid "OPML file association" msgstr "Asociación de archivos OPML" #: ../data/org.gabmus.gfeeds.appdata.xml.in:207 msgid "Changed left headerbar button order" msgstr "" "Cambiado el orden de los botones de la barra de encabezamiento izquierda" #: ../data/org.gabmus.gfeeds.appdata.xml.in:208 msgid "Optimization for updating feeds" msgstr "Optimización de la actualización de fuentes" #: ../data/org.gabmus.gfeeds.appdata.xml.in:209 msgid "Redesigned right click/longpress menu" msgstr "Rediseño del menú de clic derecho/pulsación larga" #: ../data/org.gabmus.gfeeds.appdata.xml.in:210 msgid "Option to show/hide read articles" msgstr "Opción de mostrar/ocultar los artículos leídos" #: ../data/org.gabmus.gfeeds.appdata.xml.in:211 msgid "Reworked suggestion bar" msgstr "Barra de sugerencias renovada" #: ../data/org.gabmus.gfeeds.appdata.xml.in:212 msgid "Changed name to Feeds" msgstr "Cambiado el nombre a Feeds" #: ../data/org.gabmus.gfeeds.appdata.xml.in:213 msgid "Improved CPU utilization" msgstr "Mejorada la utilización de la CPU" #: ../data/org.gabmus.gfeeds.appdata.xml.in:221 msgid "New right click or longpress menu for articles" msgstr "Nuevo menú de clic derecho o pulsación larga para artículos" #: ../data/org.gabmus.gfeeds.appdata.xml.in:222 msgid "You can now save articles offline" msgstr "Ahora puedes guardar artículos sin conexión" #: ../data/org.gabmus.gfeeds.appdata.xml.in:223 msgid "Initial suggestion to add feeds is now less intrusive" msgstr "La sugerencia inicial de añadir fuentes es ahora menos intrusiva" #: ../data/org.gabmus.gfeeds.appdata.xml.in:224 msgid "Read articles are now greyed out" msgstr "Los artículos leídos son ahora grises" #: ../data/org.gabmus.gfeeds.appdata.xml.in:232 msgid "Concurrent feeds refresh, with customizable thread count" msgstr "" "Actualización simultánea de las fuentes, con un número de hilos " "personalizable" #: ../data/org.gabmus.gfeeds.appdata.xml.in:233 msgid "Added German translation (thanks @Etamuk)" msgstr "Añadida la traducción al alemán (gracias @Etamuk)" #: ../data/org.gabmus.gfeeds.appdata.xml.in:240 msgid "Fix bugs in reader mode" msgstr "Corrección de errores en el modo lectura" #: ../data/org.gabmus.gfeeds.appdata.xml.in:247 msgid "Minor bug fix" msgstr "Corrección de errores menores" #: ../data/org.gabmus.gfeeds.appdata.xml.in:254 msgid "Improved date and time parsing and display" msgstr "Mejorado el análisis y la visualización de la fecha y la hora" #: ../data/org.gabmus.gfeeds.appdata.xml.in:255 msgid "Reader mode can now work on websites without an article tag" msgstr "" "El modo de lectura ahora puede funcionar en sitios web sin etiqueta de " "artículo" #: ../data/org.gabmus.gfeeds.appdata.xml.in:256 msgid "Slight improvements to the icon" msgstr "Ligeras mejoras en el icono" #: ../data/org.gabmus.gfeeds.appdata.xml.in:257 msgid "New feature to filter articles by feed" msgstr "Nueva función para filtrar los artículos por fuente" #: ../data/org.gabmus.gfeeds.appdata.xml.in:264 msgid "Improved favicon download" msgstr "Mejorada la descarga del favicon" #: ../data/org.gabmus.gfeeds.appdata.xml.in:265 msgid "Fixed refresh duplicating articles" msgstr "Corregida la actualización de los artículos duplicados" #: ../data/org.gabmus.gfeeds.appdata.xml.in:272 msgid "Added option to disable client side decoration" msgstr "Añadida la opción de desactivar la decoración del lado del cliente" #: ../data/org.gabmus.gfeeds.appdata.xml.in:273 msgid "Brought primary menu in line with GNOME HIG" msgstr "Se ha adaptado el menú principal a GNOME HIG" #: ../data/org.gabmus.gfeeds.appdata.xml.in:274 msgid "Added placeholder icon for feeds without an icon" msgstr "Añadido un icono de marcador de posición para las fuentes sin icono" #: ../data/org.gabmus.gfeeds.appdata.xml.in:275 msgid "Migrated some widgets to Glade templates" msgstr "Migración de algunos widgets a las plantillas de Glade" #: ../data/org.gabmus.gfeeds.appdata.xml.in:276 msgid "Option to use reader mode by default" msgstr "Opción de usar el modo lectura por defecto" #: ../data/org.gabmus.gfeeds.appdata.xml.in:277 msgid "Option to show article content from the feed" msgstr "Opción de mostrar el contenido del artículo desde la fuente" #: ../data/org.gabmus.gfeeds.appdata.xml.in:285 msgid "Fixed labels alignment" msgstr "Corregida la alineación de las etiquetas" #: ../data/org.gabmus.gfeeds.appdata.xml.in:286 msgid "Changed app name to Feeds" msgstr "Cambiado el nombre de la aplicación a Feeds" #: ../data/org.gabmus.gfeeds.appdata.xml.in:287 msgid "Added separators for the two sections of the app" msgstr "Añadidos los separadores para las dos secciones de la aplicación" #: ../data/org.gabmus.gfeeds.appdata.xml.in:288 msgid "Using links as feed titles when there is no title" msgstr "Uso de enlaces como títulos de fuentes cuando no hay títulos" #: ../data/org.gabmus.gfeeds.appdata.xml.in:289 msgid "Added preference for maximum article age" msgstr "Añadida la preferencia por la antigüedad máxima del artículo" #: ../data/org.gabmus.gfeeds.appdata.xml.in:290 msgid "Added zoom keyboard shortcuts" msgstr "Se han añadido los atajos de teclado para el zoom" #: ../data/org.gabmus.gfeeds.appdata.xml.in:291 msgid "Added preference to enable JavaScript" msgstr "Añadida la preferencia de activar JavaScript" #: ../data/org.gabmus.gfeeds.appdata.xml.in:292 msgid "Fix window control positions when they are on the left" msgstr "" "Arregladas las posiciones de los controles de las ventanas cuando están a la " "izquierda" #: ../data/org.gabmus.gfeeds.appdata.xml.in:299 msgid "Feeds for websites without favicons will now work" msgstr "Ahora funcionan las fuentes de los sitios web sin favicons" #: ../data/org.gabmus.gfeeds.appdata.xml.in:306 msgid "Fixed bug with adding new feeds" msgstr "Corregido un error al añadir nuevas fuentes" #: ../data/org.gabmus.gfeeds.appdata.xml.in:313 msgid "Switched to native file chooser" msgstr "Cambiado al selector de archivos nativo" #: ../data/org.gabmus.gfeeds.appdata.xml.in:314 msgid "Added empty state initial screen for sidebar" msgstr "Añadida la pantalla inicial de estado vacío para la barra lateral" #: ../data/org.gabmus.gfeeds.appdata.xml.in:315 msgid "Added italian translation" msgstr "Añadida la traducción al italiano" #: ../data/org.gabmus.gfeeds.appdata.xml.in:322 msgid "First release" msgstr "Primera versión" gfeeds-2.2.0/po/eu.po000066400000000000000000000417501440757451400143610ustar00rootroot00000000000000# Basque translation for gfeeds. # Copyright (C) 2022 gfeeds's COPYRIGHT HOLDER # This file is distributed under the same license as the gfeeds package. # Asier Sarasua Garmendia , 2022. # msgid "" msgstr "Project-Id-Version: gfeeds master\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/gfeeds/issues\n" "POT-Creation-Date: 2022-10-02 17:13+0000\n" "PO-Revision-Date: 2022-12-04 20:28+0000\n" "Last-Translator: Asier Sarasua Garmendia \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" #: data/org.gabmus.gfeeds.appdata.xml.in:4 msgid "Feeds" msgstr "Jarioak" #: data/org.gabmus.gfeeds.appdata.xml.in:6 data/org.gabmus.gfeeds.desktop.in:7 msgid "News reader for GNOME" msgstr "Albisteen irakurlea GNOMErako" #: data/org.gabmus.gfeeds.appdata.xml.in:15 msgid "" "Feeds is a minimal RSS/Atom feed reader built with speed and simplicity in " "mind." msgstr "Jarioak aplikazioa RSS/Atom jarioen irakurle txikia da, azkarra eta sinplea izateko sortua." #: data/org.gabmus.gfeeds.appdata.xml.in:16 msgid "" "It offers a simple user interface that only shows the latest news from your " "subscriptions." msgstr "Zure harpidetzen azken albisteak soilik erakusten dituen erabiltzaile-interfaze sotila eskaintzen du." #: data/org.gabmus.gfeeds.appdata.xml.in:17 msgid "" "Articles are shown in a web view by default, with javascript disabled for a " "faster and less intrusive user experience. There's also a reader mode " "included, built from the one GNOME Web/Epiphany uses." msgstr "Artikuluak web motako bista batean erakusten dira modu lehenetsian, eta Javascript desgaituta izaten da erabiltzaile-esperientzia azkarragoa eta pribatuagoa izan dadin. Irakurle-modu bat ere badu, GNOME Weba aplikazioak erabiltzen duena baliatuta sortu dena." #: data/org.gabmus.gfeeds.appdata.xml.in:18 msgid "Feeds can be imported and exported via OPML." msgstr "Jarioak OPML bidez inportatu eta esportatu daitezke." #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/org.gabmus.gfeeds.desktop.in:16 msgid "rss;reader;feed;news;" msgstr "rss;irakurlea;jarioa;albisteak;" #: data/ui/aboutdialog.ui.in:10 msgid "translator-credits" msgstr "translator-credits" #: data/ui/add_feed_popover.blp:11 msgid "Enter feed address to add" msgstr "Sartu gehituko den jarioaren helbidea" #: data/ui/add_feed_popover.blp:26 msgid "Add" msgstr "Gehitu" #: data/ui/add_feed_popover.blp:32 msgid "You're already subscribed to that feed!" msgstr "Dagoeneko harpidetuta zaude jario horretara" #: data/ui/empty_state.blp:7 msgid "Let's get started" msgstr "Hasi" #: data/ui/empty_state.blp:22 msgid "Add new feeds via URL" msgstr "Gehitu jario berriak URL baten bidez" #: data/ui/empty_state.blp:27 msgid "Import an OPML file" msgstr "Inportatu OPML fitxategia" #: data/ui/left_headerbar.blp:6 msgid "_Show Read Articles" msgstr "E_rakutsi irakurritako artikuluak" #: data/ui/left_headerbar.blp:7 msgid "Mark All as Read" msgstr "Markatu dena irakurrita gisa" #: data/ui/left_headerbar.blp:8 msgid "Mark All as _Unread" msgstr "Markatu dena i_rakurri gabe gisa" #: data/ui/left_headerbar.blp:11 msgid "Show _Empty Feeds" msgstr "Erakutsi _hutsik dauden jarioak" #: data/ui/left_headerbar.blp:12 msgid "_Manage Feeds" msgstr "_Kudeatu jarioak" #: data/ui/left_headerbar.blp:13 msgid "_Import OPML" msgstr "_Inportatu OPML" #: data/ui/left_headerbar.blp:14 msgid "E_xport OPML" msgstr "E_sportatu OPML" #: data/ui/left_headerbar.blp:17 msgid "P_references" msgstr "H_obespenak" #: data/ui/left_headerbar.blp:18 msgid "_Keyboard Shortcuts" msgstr "Las_ter-teklak" #: data/ui/left_headerbar.blp:19 msgid "_About Feeds" msgstr "Jarioak aplikazioari _buruz" #: data/ui/left_headerbar.blp:28 msgid "Filter" msgstr "Iragazi" #: data/ui/left_headerbar.blp:32 msgid "Add Feed" msgstr "Gehitu jarioa" #: data/ui/left_headerbar.blp:36 msgid "Menu" msgstr "Menua" #: data/ui/left_headerbar.blp:41 data/ui/shortcutsWindow.blp:35 msgid "Refresh" msgstr "Freskatu" #: data/ui/left_headerbar.blp:46 data/ui/shortcutsWindow.blp:39 msgid "Search" msgstr "Bilatu" #: data/ui/left_headerbar.blp:51 msgid "There Are Errors" msgstr "Erroreak daude" #: data/ui/main_leaflet.blp:40 msgid "Offline" msgstr "Lineaz kanpo" #: data/ui/manage_feeds_headerbar.blp:7 gfeeds/manage_feeds_window.py:263 msgid "Manage Feeds" msgstr "Kudeatu jarioak" #: data/ui/manage_feeds_headerbar.blp:11 msgid "Manage Tags for Selected Feeds" msgstr "Kudeatu hautatutako jarioen etiketak" #: data/ui/manage_feeds_headerbar.blp:16 msgid "Select/Unselect All" msgstr "Hautatu/Desautatu dena" #: data/ui/manage_feeds_headerbar.blp:21 msgid "Delete Selected Feeds" msgstr "Ezabatu hautatutako jarioak" #: data/ui/manage_tags_content.blp:17 msgid "New tag name…" msgstr "Etiketa-izen berria…" #: data/ui/manage_tags_content.blp:24 msgid "Add Tag" msgstr "Gehitu etiketa" #: data/ui/manage_tags_content.blp:39 msgid "There are no tags yet" msgstr "Ez dago etiketarik oraindik" #: data/ui/manage_tags_content.blp:40 msgid "Add some using the entry above" msgstr "Gehitu zenbait goiko sarrera erabiliz" #: data/ui/right_headerbar.blp:9 msgid "Open in _Browser" msgstr "Ireki _nabigatzailean" #: data/ui/right_headerbar.blp:10 msgid "Open in External Media _Player" msgstr "Ireki kanpoko _erreproduzitzailean" #: data/ui/right_headerbar.blp:11 msgid "_Copy Article Link" msgstr "K_opiatu artikuluaren esteka" #: data/ui/right_headerbar.blp:17 data/ui/right_headerbar.blp:96 msgid "View Mode" msgstr "Ikusteko modua" #: data/ui/right_headerbar.blp:19 msgid "Web View" msgstr "Web ikuspegia" #: data/ui/right_headerbar.blp:24 msgid "Reader Mode" msgstr "Irakurle modua" #: data/ui/right_headerbar.blp:29 msgid "Feed Content" msgstr "Jarioaren edukia" #: data/ui/right_headerbar.blp:44 data/ui/shortcutsWindow.blp:66 msgid "Zoom Out" msgstr "Txikiagotu" #: data/ui/right_headerbar.blp:51 data/ui/shortcutsWindow.blp:70 msgid "Reset Zoom" msgstr "Berrezarri zooma" #: data/ui/right_headerbar.blp:57 data/ui/shortcutsWindow.blp:62 msgid "Zoom In" msgstr "Handiagotu" #: data/ui/right_headerbar.blp:90 msgid "Back to Articles" msgstr "Itzuli artikuluetara" #: data/ui/shortcutsWindow.blp:9 gfeeds/preferences_window.py:24 msgid "General" msgstr "Orokorra" #: data/ui/shortcutsWindow.blp:12 msgid "Open Keyboard Shortcuts" msgstr "Ireki laster-teklak" #: data/ui/shortcutsWindow.blp:16 msgid "Open Menu" msgstr "Ireki menua" #: data/ui/shortcutsWindow.blp:20 msgid "Open Preferences" msgstr "Ireki hobespenak" #: data/ui/shortcutsWindow.blp:24 msgid "Open Filter" msgstr "Ireki iragazkia" #: data/ui/shortcutsWindow.blp:28 msgid "Quit" msgstr "Irten" #: data/ui/shortcutsWindow.blp:32 msgid "Article List" msgstr "Artikulu-zerrenda" #: data/ui/shortcutsWindow.blp:43 msgid "Next" msgstr "Hurrengoa" #: data/ui/shortcutsWindow.blp:47 msgid "Previous" msgstr "Aurrekoa" #: data/ui/shortcutsWindow.blp:51 msgid "Show/Hide Read Articles" msgstr "Erakutsi/Ezkutatu irakurritako artikuluak" #: data/ui/shortcutsWindow.blp:55 msgid "Mark All Read" msgstr "Markatu dena irakurrita gisa" #: data/ui/shortcutsWindow.blp:59 msgid "Article" msgstr "Artikulua" #: data/ui/shortcutsWindow.blp:74 data/ui/sidebar_listbox_row.blp:6 msgid "Open in Browser" msgstr "Ireki nabigatzailean" #: data/ui/sidebar_listbox_row.blp:5 msgid "Mark as Read/Unread" msgstr "Markatu irakurrita/irakurri gabeko gisa" #: data/ui/webview.blp:12 msgid "Select an article" msgstr "Hautatu artikulu bat" #: gfeeds/feed_item.py:57 #, python-brace-format msgid "Error: unable to parse datetime {0} for feeditem {1}" msgstr "Errorea: Ezin da {0} data analizatu {1} jario-elementurako" #: gfeeds/feed_parser.py:61 #, python-brace-format msgid "Errors while parsing feed `{0}`, URL: `{1}`" msgstr "Erroreak `{0}` jarioa, URL: `{1}` analizatzean" #: gfeeds/feed_parser.py:71 #, python-brace-format msgid "`{0}` may not be an RSS or Atom feed" msgstr "`{0}` agian ez da RSS edo Atom jario bat" #: gfeeds/feeds_manager.py:97 #, python-brace-format msgid "Feed {0} exists already, skipping" msgstr "{0} jarioa badago lehendik, saltatzen" #: gfeeds/feeds_view.py:13 msgid "All feeds" msgstr "Jario guztiak" #: gfeeds/headerbar.py:197 msgid "There were problems with some feeds. Do you want to remove them?" msgstr "Arazoak egon dira zenbat jariorekin. Haiek kendu nahi al dituzu?" #: gfeeds/headerbar.py:202 msgid "_Keep" msgstr "_Mantendu" #: gfeeds/headerbar.py:204 msgid "_Remove" msgstr "_Kendu" #: gfeeds/main_leaflet.py:122 #, python-brace-format msgid "{0} new article" msgid_plural "{0} new articles" msgstr[0] "Artikulu berri {0}" msgstr[1] "{0} artikulu berri" #: gfeeds/__main__.py:232 msgid "Do you want to import these feeds?" msgstr "Jario hauek inportatu nahi dituzu?" #: gfeeds/__main__.py:239 gfeeds/__main__.py:273 #: gfeeds/manage_feeds_window.py:330 msgid "_Cancel" msgstr "_Utzi" #: gfeeds/__main__.py:242 gfeeds/__main__.py:276 msgid "_Import" msgstr "_Inportatu" #: gfeeds/__main__.py:269 msgid "Do you want to import this feed?" msgstr "Jario hau inportatu nahi duzu?" #: gfeeds/__main__.py:301 msgid "url" msgstr "URLa" #: gfeeds/__main__.py:304 msgid "opml file local url or rss remote url to import" msgstr "inportatuko den OPML fitxategiaren URL lokala edo urruneko RSSaren URLa" #: gfeeds/manage_feeds_window.py:327 msgid "Do you want to delete these feeds?" msgstr "Jario horiek ezabatu nahi al dituzu?" #: gfeeds/manage_feeds_window.py:332 msgid "_Delete" msgstr "Ez_abatu" #: gfeeds/opml_file_chooser.py:7 msgid "XML files" msgstr "XML fitxategiak" #: gfeeds/opml_file_chooser.py:14 msgid "Choose an OPML file to import" msgstr "Aukeratu inportatuko den OPML fitxategi bat" #: gfeeds/opml_file_chooser.py:18 msgid "Open" msgstr "Ireki" #: gfeeds/opml_file_chooser.py:19 gfeeds/opml_file_chooser.py:31 msgid "Cancel" msgstr "Utzi" #: gfeeds/opml_file_chooser.py:26 msgid "Choose where to save the exported OPML file" msgstr "Aukeratu non gordeko den esportatutako OPML fitxategia" #: gfeeds/opml_file_chooser.py:30 msgid "Save" msgstr "Gorde" #: gfeeds/preferences_window.py:27 msgid "General preferences" msgstr "Hobespen orokorrak" #: gfeeds/preferences_window.py:29 msgid "Show newer articles first" msgstr "Erakutsi artikulu berriak lehenengo" #: gfeeds/preferences_window.py:34 msgid "Open links in your browser" msgstr "Ireki estekak zure nabigatzailean" #: gfeeds/preferences_window.py:38 msgid "Use external video player for YouTube" msgstr "Erabili kanpoko bideo-erreproduzigailua YouTuberako" #: gfeeds/preferences_window.py:40 msgid "Requires youtube-dl and a compatible video player" msgstr "youtube-dl eta bideo-erreproduzigailu bateragarri bat behar ditu" #: gfeeds/preferences_window.py:46 msgid "Preferred video player" msgstr "Hobetsitako bideo-erreproduzigailua" #: gfeeds/preferences_window.py:50 msgid "Maximum article age" msgstr "Artikuluen gehieneko adina" #: gfeeds/preferences_window.py:51 msgid "In days" msgstr "Egunetan" #: gfeeds/preferences_window.py:58 msgid "Refresh preferences" msgstr "Freskatu hobespenak" #: gfeeds/preferences_window.py:60 msgid "Refresh articles on startup" msgstr "Freskatu artikuluak abioan" #: gfeeds/preferences_window.py:64 msgid "New articles notification" msgstr "Artikulu berrien jakinarazpena" #: gfeeds/preferences_window.py:68 msgid "Enable auto-refresh" msgstr "Gaitu freskatze automatikoa" #: gfeeds/preferences_window.py:72 msgid "Auto-refresh interval" msgstr "Freskatze automatikoko tartea" #: gfeeds/preferences_window.py:73 msgid "In seconds" msgstr "Segundotan" #: gfeeds/preferences_window.py:80 msgid "Cache" msgstr "Cachea" #: gfeeds/preferences_window.py:82 msgid "Clear caches" msgstr "Garbitu cacheak" #: gfeeds/preferences_window.py:83 msgid "Clear" msgstr "Garbitu" #: gfeeds/preferences_window.py:109 msgid "Appearance" msgstr "Itxura" #: gfeeds/preferences_window.py:112 msgid "Appearance preferences" msgstr "Itxura-hobespenak" #: gfeeds/preferences_window.py:114 msgid "Dark mode" msgstr "Modu iluna" #: gfeeds/preferences_window.py:118 msgid "Reader mode theme" msgstr "Irakurle moduaren gaia" #: gfeeds/preferences_window.py:122 msgid "Automatic" msgstr "Automatikoa" #: gfeeds/preferences_window.py:122 msgid "Light" msgstr "Argia" #: gfeeds/preferences_window.py:122 msgid "Dark" msgstr "Iluna" #: gfeeds/preferences_window.py:126 msgid "Show article thumbnails" msgstr "Erakutsi artikuluen koadro txikiak" #: gfeeds/preferences_window.py:131 msgid "Show full articles titles" msgstr "Erakutsi artikuluen izenburu osoa" #: gfeeds/preferences_window.py:136 msgid "Show full feeds names" msgstr "Erakutsi jarioen izen osoak" #: gfeeds/preferences_window.py:143 msgid "Font preferences" msgstr "Letra-tipoaren hobespenak" #: gfeeds/preferences_window.py:145 msgid "Use system font for titles" msgstr "Erabili sistemaren letra-tipoa izenburuetan" #: gfeeds/preferences_window.py:149 msgid "Use system font for paragraphs" msgstr "erabili sistemaren letra-tipoa paragrafoetan" #: gfeeds/preferences_window.py:153 msgid "Custom title font" msgstr "Izenburuen letra-tipo pertsonalizatua" #: gfeeds/preferences_window.py:157 msgid "Custom paragraph font" msgstr "Paragrafoen letra-tipo pertsonalizatua" #: gfeeds/preferences_window.py:161 msgid "Custom monospace font" msgstr "Tarte bakarreko letra-tipo pertsonalizatua" #: gfeeds/preferences_window.py:173 msgid "Privacy" msgstr "Pribatutasuna" #: gfeeds/preferences_window.py:177 msgid "Privacy preferences" msgstr "Pribatutasun-hobespenak" #: gfeeds/preferences_window.py:179 msgid "Enable JavaScript" msgstr "Gaitu JavaScript" #: gfeeds/preferences_window.py:184 msgid "Try to block advertisements" msgstr "Saiatu iragarkiak blokeatzen" #: gfeeds/preferences_window.py:186 gfeeds/preferences_window.py:221 msgid "Requires app restart" msgstr "Aplikazioa berrabiarazi behar da" #: gfeeds/preferences_window.py:190 msgid "Update advertisement blocking list" msgstr "Eguneratu iragarkien blokeatze-zerrenda" #: gfeeds/preferences_window.py:191 msgid "Updates automatically every 10 days" msgstr "10 egunetik behin automatikoki eguneratzen da" #: gfeeds/preferences_window.py:192 msgid "Update" msgstr "Eguneratu" #: gfeeds/preferences_window.py:205 msgid "Advanced" msgstr "Aurreratua" #: gfeeds/preferences_window.py:208 msgid "Advanced preferences" msgstr "Hobespen aurreratuak" #: gfeeds/preferences_window.py:210 msgid "Maximum refresh threads" msgstr "Gehieneko freskatze-hariak" #: gfeeds/preferences_window.py:212 msgid "How many threads to use for feeds refresh" msgstr "Zenbat hari erabiliko diren jarioak freskatzeko" #: gfeeds/preferences_window.py:219 msgid "Experimental GtkListView for articles list" msgstr "GtkListView esperimentala artikuluen zerrendetarako" #: gfeeds/preferences_window.py:227 msgid "Troubleshooting" msgstr "Arazoen ebazpena" #: gfeeds/preferences_window.py:229 msgid "Export Configuration as JSON" msgstr "Esportatu konfigurazioa JSON gisa" #: gfeeds/preferences_window.py:230 msgid "Attach this when reporting bugs" msgstr "Erantsi hau akatsak jakinaraztean" #: gfeeds/preferences_window.py:231 msgid "Export" msgstr "Esportatu" #. type: ignore #: gfeeds/preferences_window.py:244 msgid "Feeds Configuration" msgstr "Jarioen konfigurazioa" #: gfeeds/preferences_window.py:248 msgid "_Close" msgstr "It_xi" #: gfeeds/preferences_window.py:251 msgid "Cop_y" msgstr "_Kopiatu" #: gfeeds/util/download_manager.py:112 #, python-brace-format msgid "`{0}`: connection timed out" msgstr "`{0}`: konexioaren denbora agortu da" #: gfeeds/util/download_manager.py:121 #, python-brace-format msgid "`{0}` might not be a valid address" msgstr "`{0}` beharbada ez da baliozko helbidea" #: gfeeds/util/download_manager.py:161 #, python-brace-format msgid "Error downloading `{0}`, code `{1}`" msgstr "Errorea `{0}` deskargatzen, `{1}` kodea" #: gfeeds/util/get_favicon.py:48 #, python-brace-format msgid "Error downloading favicon for `{0}`" msgstr "Errorea favicona deskargatzen `{0}` jariorako" #: gfeeds/util/opml_parser.py:33 msgid "Error: OPML path provided does not exist" msgstr "Errorea: emandako OPML bide-izena ez da existitzen" #: gfeeds/util/opml_parser.py:44 #, python-brace-format msgid "Error parsing OPML file `{0}`" msgstr "Errorea `{0}` OPML fitxategia analizatzean" #: gfeeds/webview.py:204 msgid "Link copied to clipboard!" msgstr "Esteka arbelean kopiatu da!" #: gfeeds/webview.py:226 msgid "Feed content not available for this article" msgstr "Jarioaren edukia ez dago erabilgarri artikulu honetarako" #~ msgid "" #~ "There were problems with some feeds.\n" #~ "Do you want to remove them?" #~ msgstr "" #~ "Arazoak daude zenbait jariorekin.\n" #~ "Haiek kendu nahi al dituzu?" #~ msgid "Loading feeds..." #~ msgstr "Jarioak kargatzen..." #~ msgid "Use dark theme for reader mode" #~ msgstr "Erabili gai iluna irakurle modurako" #~ msgid "Maximum thumbnail height" #~ msgstr "Koadro txikien gehieneko altuera" #~ msgid "Show" #~ msgstr "Erakutsi" #~ msgid "Ignore" #~ msgstr "Ez ikusi egin" #~ msgid "You are offline" #~ msgstr "Lineaz kanpo zaude" gfeeds-2.2.0/po/fa.po000066400000000000000000000305211440757451400143300ustar00rootroot00000000000000# Persian translation for gfeeds. # Copyright (C) 2022 gfeeds's COPYRIGHT HOLDER # This file is distributed under the same license as the gfeeds package. # MohammadSaleh Kamyab , 2022. # msgid "" msgstr "" "Project-Id-Version: gfeeds master\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/gfeeds/issues\n" "POT-Creation-Date: 2022-06-02 09:20+0000\n" "PO-Revision-Date: 2022-06-20 16:58+0430\n" "Last-Translator: MohammadSaleh Kamyab \n" "Language-Team: Persian \n" "Language: fa\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" "X-Generator: Poedit 3.1\n" #: data/org.gabmus.gfeeds.appdata.xml.in:4 msgid "Feeds" msgstr "خوراک‌ها" #: data/org.gabmus.gfeeds.appdata.xml.in:6 data/org.gabmus.gfeeds.desktop.in:7 msgid "News reader for GNOME" msgstr "خبرخوان برای گنوم" #: data/org.gabmus.gfeeds.appdata.xml.in:15 msgid "" "Feeds is a minimal RSS/Atom feed reader built with speed and simplicity in mind." msgstr "" "خوراک‌ها، خوراک‌خوانی کمینه‌گرا برای RSS/اتم است Ú©Ù‡ با هد٠سرعت Ùˆ سادگی ساخته شده " "است." #: data/org.gabmus.gfeeds.appdata.xml.in:16 msgid "" "It offers a simple user interface that only shows the latest news from your " "subscriptions." msgstr "رابط کاربری ساده‌ای دارد Ú©Ù‡ Ùقط آخرین اخبار را از پی‌گیری‌هایتان نمایش می‌دهد." #: data/org.gabmus.gfeeds.appdata.xml.in:17 msgid "" "Articles are shown in a web view by default, with javascript disabled for a " "faster and less intrusive user experience. There's also a reader mode included, " "built from the one GNOME Web/Epiphany uses." msgstr "" "مقاله‌ها به طور پیش‌گزیده در نمای وب نشان داده می‌شوند؛ با جاوااسکریپت از کار " "Ø§ÙØªØ§Ø¯Ù‡ برای تجربهٔ کاربری‌ای سریع‌تر Ùˆ حضور کم‌تر ÙØ¶ÙˆÙ„‌ها. همچنین یک حالت خواندن را " "نیز شامل می‌شود Ú©Ù‡ از همانی Ú©Ù‡ وب گنوم/Ø§Ù¾ÛŒÙØ§Ù†ÛŒ Ø§Ø³ØªÙØ§Ø¯Ù‡ می‌کند، ساخته شده است." #: data/org.gabmus.gfeeds.appdata.xml.in:18 msgid "Feeds can be imported and exported via OPML." msgstr "خوراک‌ها می‌توانند از طریق OPML درون‌ریزی Ùˆ برون‌ریزی شوند." #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/org.gabmus.gfeeds.desktop.in:16 msgid "rss;reader;feed;news;" msgstr "rss;reader;feeds;news;آراس‌اس;خوان;خبرخوان;خوراک‌خوان;خبرها;اخبار;خوراک;" #: gfeeds/feed_item.py:49 #, python-brace-format msgid "Error: unable to parse datetime {0} for feeditem {1}" msgstr "خطا: ناتوانی در تجزیهٔ زمان Ùˆ تاریخ {0} برای مورد خوراک {1}" #: gfeeds/feed_parser.py:37 #, python-brace-format msgid "Errors while parsing feed `{0}`, URL: `{1}`" msgstr "خطا هنگام تجزیهٔ خوراک «{0}»، نشانی: «{1}»" #: gfeeds/feed_parser.py:55 #, python-brace-format msgid "`{0}` may not be an RSS or Atom feed" msgstr "احتمالاً «{0}» یک خوراک RSS یا اتم نیست" #: gfeeds/feeds_manager.py:88 #, python-brace-format msgid "Feed {0} exists already, skipping" msgstr "خوراک {0} هم‌اکنون وجود دارد، پریدن" #: gfeeds/feeds_view.py:13 msgid "All feeds" msgstr "تمامی خوراک‌ها" #: gfeeds/headerbar.py:184 msgid "" "There were problems with some feeds.\n" "Do you want to remove them?" msgstr "" "مشکلی با برخی از خوراک‌ها وجود دارد.\n" "آیا می‌خواهید برشان دارید؟" #: gfeeds/main_leaflet.py:119 #, python-brace-format msgid "{0} new article" msgid_plural "{0} new articles" msgstr[0] "{0} مقالهٔ جدید" #: gfeeds/__main__.py:229 msgid "Do you want to import these feeds?" msgstr "آیا می‌خواهید این خوراک‌ها را درون‌ریزی کنید؟" #: gfeeds/__main__.py:256 msgid "Do you want to import this feed?" msgstr "آیا می‌خواهید این خوراک را درون‌ریزی کنید؟" #: gfeeds/__main__.py:285 msgid "url" msgstr "نشانی" #: gfeeds/__main__.py:288 msgid "opml file local url or rss remote url to import" msgstr "پروندهٔ opml محلّی یا نشانی دوردست rss برای درون‌ریزی" #: gfeeds/manage_feeds_window.py:263 msgid "Manage Feeds" msgstr "مدیریت خوراک‌ها" #: gfeeds/manage_feeds_window.py:318 msgid "Do you want to delete these feeds?" msgstr "آیا می‌خواهید این خوراک‌ها را حذ٠کنید؟" #: gfeeds/opml_file_chooser.py:7 msgid "XML files" msgstr "پرونده‌های XML" #: gfeeds/opml_file_chooser.py:14 msgid "Choose an OPML file to import" msgstr "یک پروندهٔ OMPL را برای درون‌ریزی انتخاب کنید" #: gfeeds/opml_file_chooser.py:18 msgid "Open" msgstr "گشودن" #: gfeeds/opml_file_chooser.py:19 gfeeds/opml_file_chooser.py:31 msgid "Cancel" msgstr "لغو" #: gfeeds/opml_file_chooser.py:26 msgid "Choose where to save the exported OPML file" msgstr "مکان ذخیره‌سازی پروندهٔ OPML برون‌ریخته را انتخاب کنید" #: gfeeds/opml_file_chooser.py:30 msgid "Save" msgstr "ذخیره" #: gfeeds/opml_manager.py:42 msgid "Error: OPML path provided does not exist" msgstr "خطا: مسیر OPML ارائه شده وجود ندارد" #: gfeeds/opml_manager.py:53 #, python-brace-format msgid "Error parsing OPML file `{0}`" msgstr "خطا در تجزیهٔ پروندهٔ OMPL â€Â«{0}»" #: gfeeds/preferences_window.py:22 msgid "General" msgstr "عمومی" #: gfeeds/preferences_window.py:25 msgid "General preferences" msgstr "ترجیحات عمومی" #: gfeeds/preferences_window.py:27 msgid "Show newer articles first" msgstr "نمایش مقاله‌های جدیدتر در ابتدا" #: gfeeds/preferences_window.py:32 msgid "Open links in your browser" msgstr "گشودن پیوند‌های در مروگرتان" #: gfeeds/preferences_window.py:36 msgid "Use external video player for YouTube" msgstr "Ø§Ø³ØªÙØ§Ø¯Ù‡ از پخش‌کنندهٔ خارجی برای یوتیوب" #: gfeeds/preferences_window.py:38 msgid "Requires youtube-dl and a compatible video player" msgstr "به youtube-dl Ùˆ یک پخش‌کنندهٔ ویدیوی سازگار نیاز دارد" #: gfeeds/preferences_window.py:44 msgid "Preferred video player" msgstr "پخش‌کنندهٔ ویدیوی ترجیحی" #: gfeeds/preferences_window.py:48 msgid "Maximum article age" msgstr "سن بیشینهٔ مقاله" #: gfeeds/preferences_window.py:49 msgid "In days" msgstr "به روز" #: gfeeds/preferences_window.py:56 msgid "Refresh preferences" msgstr "تازه‌سازی ترجیحات" #: gfeeds/preferences_window.py:58 msgid "Refresh articles on startup" msgstr "تازه‌سازی مقاله‌ها هنگام شروع" #: gfeeds/preferences_window.py:62 msgid "New articles notification" msgstr "اعلان مقاله‌های جدید" #: gfeeds/preferences_window.py:66 msgid "Enable auto-refresh" msgstr "به کار انداختن تازه‌سازی خودکار" #: gfeeds/preferences_window.py:70 msgid "Auto-refresh interval" msgstr "ÙØ§ØµÙ„Ù‡Ù” تازه‌سازی خودکار" #: gfeeds/preferences_window.py:71 msgid "In seconds" msgstr "به ثانیه" #: gfeeds/preferences_window.py:78 msgid "Cache" msgstr "انباره" #: gfeeds/preferences_window.py:80 msgid "Clear caches" msgstr "پاک‌سازی انباره‌ها" #: gfeeds/preferences_window.py:81 msgid "Clear" msgstr "پاک‌سازی" #: gfeeds/preferences_window.py:109 msgid "Appearance" msgstr "ظاهر" #: gfeeds/preferences_window.py:112 msgid "Appearance preferences" msgstr "ترجیحات ظاهر" #: gfeeds/preferences_window.py:114 msgid "Dark mode" msgstr "حالت تاریک" #: gfeeds/preferences_window.py:118 msgid "Reader mode theme" msgstr "پوستهٔ حالت خواندن" #: gfeeds/preferences_window.py:122 msgid "Automatic" msgstr "خودکار" #: gfeeds/preferences_window.py:122 msgid "Light" msgstr "روشن" #: gfeeds/preferences_window.py:122 msgid "Dark" msgstr "تاریک" #: gfeeds/preferences_window.py:126 msgid "Show article thumbnails" msgstr "نمایش بندانگشتی مقاله‌ها" #: gfeeds/preferences_window.py:131 msgid "Show full articles titles" msgstr "نمایش عنوان کامل مقاله‌ها" #: gfeeds/preferences_window.py:136 msgid "Show full feeds names" msgstr "نمایش نام کامل خوراک‌ها" #: gfeeds/preferences_window.py:143 msgid "Font preferences" msgstr "ترجیحات قلم" #: gfeeds/preferences_window.py:145 msgid "Use system font for titles" msgstr "Ø§Ø³ØªÙØ§Ø¯Ù‡ از قلم سامانه برای عنوان‌ها" #: gfeeds/preferences_window.py:149 msgid "Use system font for paragraphs" msgstr "Ø§Ø³ØªÙØ§Ø¯Ù‡ از قلم سامانه برای بندها" #: gfeeds/preferences_window.py:153 msgid "Custom title font" msgstr "قلم عنوان Ø³ÙØ§Ø±Ø´ÛŒ" #: gfeeds/preferences_window.py:157 msgid "Custom paragraph font" msgstr "قلم بند Ø³ÙØ§Ø±Ø´ÛŒ" #: gfeeds/preferences_window.py:161 msgid "Custom monospace font" msgstr "قلم هم‌عرض Ø³ÙØ§Ø±Ø´ÛŒ" #: gfeeds/preferences_window.py:173 msgid "Privacy" msgstr "حریم خصوصی" #: gfeeds/preferences_window.py:176 msgid "Privacy preferences" msgstr "ترجیحات حریم خصوصی" #: gfeeds/preferences_window.py:178 msgid "Enable JavaScript" msgstr "به کار انداختن جاوااسکریپت" #: gfeeds/preferences_window.py:183 msgid "Try to block advertisements" msgstr "سعی برای مسدود کردن تبلیغات" #: gfeeds/preferences_window.py:185 gfeeds/preferences_window.py:220 msgid "Requires app restart" msgstr "نیاز به راه‌اندازی دوبارهٔ کاره دارد" #: gfeeds/preferences_window.py:189 msgid "Update advertisement blocking list" msgstr "به‌روز رسانی سیاههٔ مسدودیت تبلیغات" #: gfeeds/preferences_window.py:190 msgid "Updates automatically every 10 days" msgstr "هر Û±Û° روز به طور خودکار به‌روز می‌شود" #: gfeeds/preferences_window.py:191 msgid "Update" msgstr "به‌روز رسانی" #: gfeeds/preferences_window.py:204 msgid "Advanced" msgstr "Ù¾ÛŒØ´â€ŒØ±ÙØªÙ‡" #: gfeeds/preferences_window.py:207 msgid "Advanced preferences" msgstr "ترجیحات Ù¾ÛŒØ´â€ŒØ±ÙØªÙ‡" #: gfeeds/preferences_window.py:209 msgid "Maximum refresh threads" msgstr "بیشینهٔ ریسه‌های تازه‌سازی" #: gfeeds/preferences_window.py:211 msgid "How many threads to use for feeds refresh" msgstr "Ú†Ù‡ تعداد ریسه برای تازه‌سازی خوراک‌ها Ø§Ø³ØªÙØ§Ø¯Ù‡ شود" #: gfeeds/preferences_window.py:218 msgid "Experimental GtkListView for articles list" msgstr "â€GtkListView تجربی برای سیاههٔ مقاله‌ها" #: gfeeds/sidebar.py:21 msgid "Loading feeds..." msgstr "بار کردن خوراک‌ها…" #: gfeeds/sidebar_row_popover.py:31 gfeeds/sidebar_row_popover.py:58 msgid "Mark as unread" msgstr "علامت زدن به عنون نخوانده" #: gfeeds/sidebar_row_popover.py:38 gfeeds/sidebar_row_popover.py:50 msgid "Mark as read" msgstr "علامت زدن به عنوان خوانده" #: gfeeds/util/download_manager.py:102 #, python-brace-format msgid "`{0}`: connection timed out" msgstr "«{0}»: زمان اتّصال تمام شد" #: gfeeds/util/download_manager.py:111 #, python-brace-format msgid "`{0}` might not be a valid address" msgstr "ممکن است «{0}» نشانی معتبری نباشد" #: gfeeds/util/download_manager.py:150 #, python-brace-format msgid "Error downloading `{0}`, code `{1}`" msgstr "خطای بارگیری «{0}»، کد «{1}»" #: gfeeds/util/get_favicon.py:53 #, python-brace-format msgid "Error downloading favicon for `{0}`" msgstr "خطای بارگیری favicon برای «{0}»" #: gfeeds/webview.py:201 msgid "Link copied to clipboard!" msgstr "پیوند به تخته‌گیره رونوشت شد!" #: gfeeds/webview.py:223 msgid "Feed content not available for this article" msgstr "محتوای خوراک برای این مقاله موجود نیست" gfeeds-2.2.0/po/fi.po000066400000000000000000000420141440757451400143400ustar00rootroot00000000000000# Finnish translation for gfeeds. # Copyright (C) 2021 gfeeds's COPYRIGHT HOLDER # This file is distributed under the same license as the gfeeds package. # Jiri Grönroos , 2021. # msgid "" msgstr "" "Project-Id-Version: gfeeds master\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/gfeeds/issues\n" "POT-Creation-Date: 2022-10-02 17:13+0000\n" "PO-Revision-Date: 2022-10-05 12:20+0300\n" "Last-Translator: Jiri Grönroos \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.1.1\n" #: data/org.gabmus.gfeeds.appdata.xml.in:4 msgid "Feeds" msgstr "Syötteet" #: data/org.gabmus.gfeeds.appdata.xml.in:6 data/org.gabmus.gfeeds.desktop.in:7 msgid "News reader for GNOME" msgstr "Uutislukija Gnomelle" #: data/org.gabmus.gfeeds.appdata.xml.in:15 msgid "" "Feeds is a minimal RSS/Atom feed reader built with speed and simplicity in " "mind." msgstr "" "Syötteet on minimaalinen RSS-/Atom-syötteenlukija, jota rakentaessa on " "keskitytty nopeuteen ja yksinkertaisuuteen." #: data/org.gabmus.gfeeds.appdata.xml.in:16 msgid "" "It offers a simple user interface that only shows the latest news from your " "subscriptions." msgstr "" "Se sisältää yksinkertaisen käyttöliittymän, joka näyttää uusimmat uutiset " "tilauksistasi." #: data/org.gabmus.gfeeds.appdata.xml.in:17 msgid "" "Articles are shown in a web view by default, with javascript disabled for a " "faster and less intrusive user experience. There's also a reader mode " "included, built from the one GNOME Web/Epiphany uses." msgstr "" "Artikkelit näytetään oletusarvoisesti web-näkymässä, JavaScript poistettuna " "käytöstä, jotta käyttökokemus on nopea ja häiriötön. Lisäksi tarjolla on " "vaihtoehtoinen lukunäkymä." #: data/org.gabmus.gfeeds.appdata.xml.in:18 msgid "Feeds can be imported and exported via OPML." msgstr "Syötteitä on mahdollista tuoda ja viedä käyttäen OPML:ää." #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/org.gabmus.gfeeds.desktop.in:16 msgid "rss;reader;feed;news;" msgstr "rss;reader;feed;news;syötteet;lukija;uutiset;" #: data/ui/aboutdialog.ui.in:10 msgid "translator-credits" msgstr "Jiri Grönroos" #: data/ui/add_feed_popover.blp:11 msgid "Enter feed address to add" msgstr "Anna lisättävän syötteen osoite" #: data/ui/add_feed_popover.blp:26 msgid "Add" msgstr "Lisää" #: data/ui/add_feed_popover.blp:32 msgid "You're already subscribed to that feed!" msgstr "Olet jo tilannut kyseisen syötteen!" #: data/ui/empty_state.blp:7 msgid "Let's get started" msgstr "Aloitetaan" #: data/ui/empty_state.blp:22 msgid "Add new feeds via URL" msgstr "Lisää uusia syötteitä URL-osoitteen avulla" #: data/ui/empty_state.blp:27 msgid "Import an OPML file" msgstr "Tuo OPML-tiedosto" #: data/ui/left_headerbar.blp:6 msgid "_Show Read Articles" msgstr "_Näytä luetut artikkelit" #: data/ui/left_headerbar.blp:7 msgid "Mark All as Read" msgstr "Merkitse kaikki luetuiksi" #: data/ui/left_headerbar.blp:8 msgid "Mark All as _Unread" msgstr "Merkitse _kaikki lukemattomiksi" #: data/ui/left_headerbar.blp:11 msgid "Show _Empty Feeds" msgstr "Näytä _tyhjät syötteet" #: data/ui/left_headerbar.blp:12 msgid "_Manage Feeds" msgstr "_Hallitse syötteitä" #: data/ui/left_headerbar.blp:13 msgid "_Import OPML" msgstr "_Tuo OPML" #: data/ui/left_headerbar.blp:14 msgid "E_xport OPML" msgstr "_Vie OPML" #: data/ui/left_headerbar.blp:17 msgid "P_references" msgstr "_Asetukset" #: data/ui/left_headerbar.blp:18 msgid "_Keyboard Shortcuts" msgstr "_Pikanäppäimet" #: data/ui/left_headerbar.blp:19 msgid "_About Feeds" msgstr "Tietoja - _Syötteet" #: data/ui/left_headerbar.blp:28 msgid "Filter" msgstr "Suodata" #: data/ui/left_headerbar.blp:32 msgid "Add Feed" msgstr "Lisää syöte" #: data/ui/left_headerbar.blp:36 msgid "Menu" msgstr "Valikko" #: data/ui/left_headerbar.blp:41 data/ui/shortcutsWindow.blp:35 msgid "Refresh" msgstr "Päivitä" #: data/ui/left_headerbar.blp:46 data/ui/shortcutsWindow.blp:39 msgid "Search" msgstr "Etsi" #: data/ui/left_headerbar.blp:51 msgid "There Are Errors" msgstr "Ilmeni virheitä" #: data/ui/main_leaflet.blp:40 msgid "Offline" msgstr "Ei verkossa" #: data/ui/manage_feeds_headerbar.blp:7 gfeeds/manage_feeds_window.py:263 msgid "Manage Feeds" msgstr "Hallitse syötteitä" #: data/ui/manage_feeds_headerbar.blp:11 msgid "Manage Tags for Selected Feeds" msgstr "Hallitse valittujen syötteiden tunnisteita" #: data/ui/manage_feeds_headerbar.blp:16 msgid "Select/Unselect All" msgstr "Valitse kaikki tai ei mitään" #: data/ui/manage_feeds_headerbar.blp:21 msgid "Delete Selected Feeds" msgstr "Poista valitut syötteet" #: data/ui/manage_tags_content.blp:17 msgid "New tag name…" msgstr "Uuden tunnisteen nimi…" #: data/ui/manage_tags_content.blp:24 msgid "Add Tag" msgstr "Lisää tunniste" #: data/ui/manage_tags_content.blp:39 msgid "There are no tags yet" msgstr "Tunnisteita ei vielä ole" #: data/ui/manage_tags_content.blp:40 msgid "Add some using the entry above" msgstr "Lisää tunnisteita yläpuolelta" #: data/ui/right_headerbar.blp:9 msgid "Open in _Browser" msgstr "Avaa _selaimessa" #: data/ui/right_headerbar.blp:10 msgid "Open in External Media _Player" msgstr "Avaa ulkoisessa _mediasoittimessa" #: data/ui/right_headerbar.blp:11 msgid "_Copy Article Link" msgstr "Kopioi _artikkelin linkki" #: data/ui/right_headerbar.blp:17 data/ui/right_headerbar.blp:96 msgid "View Mode" msgstr "Katselunäkymä" #: data/ui/right_headerbar.blp:19 msgid "Web View" msgstr "Web-näkymä" #: data/ui/right_headerbar.blp:24 msgid "Reader Mode" msgstr "Lukunäkymä" #: data/ui/right_headerbar.blp:29 msgid "Feed Content" msgstr "Syötteen sisältö" #: data/ui/right_headerbar.blp:44 data/ui/shortcutsWindow.blp:66 msgid "Zoom Out" msgstr "Loitonna" #: data/ui/right_headerbar.blp:51 data/ui/shortcutsWindow.blp:70 msgid "Reset Zoom" msgstr "Palauta mittakaava" #: data/ui/right_headerbar.blp:57 data/ui/shortcutsWindow.blp:62 msgid "Zoom In" msgstr "Lähennä" #: data/ui/right_headerbar.blp:90 msgid "Back to Articles" msgstr "Takaisin artikkeleihin" #: data/ui/shortcutsWindow.blp:9 gfeeds/preferences_window.py:24 msgid "General" msgstr "Yleiset" #: data/ui/shortcutsWindow.blp:12 msgid "Open Keyboard Shortcuts" msgstr "Avaa pikanäppäimet" #: data/ui/shortcutsWindow.blp:16 msgid "Open Menu" msgstr "Avaa valikko" #: data/ui/shortcutsWindow.blp:20 msgid "Open Preferences" msgstr "Avaa asetukset" #: data/ui/shortcutsWindow.blp:24 msgid "Open Filter" msgstr "Avaa suodatin" #: data/ui/shortcutsWindow.blp:28 msgid "Quit" msgstr "Lopeta" #: data/ui/shortcutsWindow.blp:32 msgid "Article List" msgstr "Artikkeliluettelo" #: data/ui/shortcutsWindow.blp:43 msgid "Next" msgstr "Seuraava" #: data/ui/shortcutsWindow.blp:47 msgid "Previous" msgstr "Edellinen" #: data/ui/shortcutsWindow.blp:51 msgid "Show/Hide Read Articles" msgstr "Näytä/piilota luetut artikkelit" #: data/ui/shortcutsWindow.blp:55 msgid "Mark All Read" msgstr "Merkitse kaikki luetuiksi" #: data/ui/shortcutsWindow.blp:59 msgid "Article" msgstr "Artikkeli" #: data/ui/shortcutsWindow.blp:74 data/ui/sidebar_listbox_row.blp:6 msgid "Open in Browser" msgstr "Avaa selaimessa" #: data/ui/sidebar_listbox_row.blp:5 msgid "Mark as Read/Unread" msgstr "Merkitse luetuksi/lukemattomaksi" #: data/ui/webview.blp:12 msgid "Select an article" msgstr "Valitse artikkeli" #: gfeeds/feed_item.py:57 #, python-brace-format msgid "Error: unable to parse datetime {0} for feeditem {1}" msgstr "Virhe: ei voitu jäsentää datetimea {0} syötekohteelle {1}" #: gfeeds/feed_parser.py:61 #, python-brace-format msgid "Errors while parsing feed `{0}`, URL: `{1}`" msgstr "Virhe jäsentäessä syötettä `{0}`, URL: `{1}`" #: gfeeds/feed_parser.py:71 #, python-brace-format msgid "`{0}` may not be an RSS or Atom feed" msgstr "`{0}` ei välttämättä ole RSS- tai Atom-syöte" #: gfeeds/feeds_manager.py:97 #, python-brace-format msgid "Feed {0} exists already, skipping" msgstr "Syöte {0} on jo olemassa, ohitetaan" #: gfeeds/feeds_view.py:13 msgid "All feeds" msgstr "Kaikki syötteet" #: gfeeds/headerbar.py:197 msgid "There were problems with some feeds. Do you want to remove them?" msgstr "Joidenkin syötteiden kanssa ilmeni ongelmia. Haluatko poistaa ne?" #: gfeeds/headerbar.py:202 msgid "_Keep" msgstr "_Säilytä" #: gfeeds/headerbar.py:204 msgid "_Remove" msgstr "_Poista" #: gfeeds/main_leaflet.py:122 #, python-brace-format msgid "{0} new article" msgid_plural "{0} new articles" msgstr[0] "{0} uusi artikkeli" msgstr[1] "{0} uutta artikkelia" #: gfeeds/__main__.py:232 msgid "Do you want to import these feeds?" msgstr "Haluatko tuoda nämä syötteet?" #: gfeeds/__main__.py:239 gfeeds/__main__.py:273 #: gfeeds/manage_feeds_window.py:330 msgid "_Cancel" msgstr "_Peru" #: gfeeds/__main__.py:242 gfeeds/__main__.py:276 msgid "_Import" msgstr "_Tuo" #: gfeeds/__main__.py:269 msgid "Do you want to import this feed?" msgstr "Haluatko tuoda tämän syötteen?" #: gfeeds/__main__.py:301 msgid "url" msgstr "url" #: gfeeds/__main__.py:304 msgid "opml file local url or rss remote url to import" msgstr "opml-tiedoston paikallinen osoite tai rss-etäosoite tuotavaksi" #: gfeeds/manage_feeds_window.py:327 msgid "Do you want to delete these feeds?" msgstr "Haluatko poistaa nämä syötteet?" #: gfeeds/manage_feeds_window.py:332 msgid "_Delete" msgstr "_Poista" #: gfeeds/opml_file_chooser.py:7 msgid "XML files" msgstr "XML-tiedostot" #: gfeeds/opml_file_chooser.py:14 msgid "Choose an OPML file to import" msgstr "Valitse tuotava OPML-tiedosto" #: gfeeds/opml_file_chooser.py:18 msgid "Open" msgstr "Avaa" #: gfeeds/opml_file_chooser.py:19 gfeeds/opml_file_chooser.py:31 msgid "Cancel" msgstr "Peru" #: gfeeds/opml_file_chooser.py:26 msgid "Choose where to save the exported OPML file" msgstr "Valitse mihin vietävä OPML-tiedosto tallennetaan" #: gfeeds/opml_file_chooser.py:30 msgid "Save" msgstr "Tallenna" #: gfeeds/preferences_window.py:27 msgid "General preferences" msgstr "Yleiset asetukset" #: gfeeds/preferences_window.py:29 msgid "Show newer articles first" msgstr "Näytä uusimmat artikkelit ensin" #: gfeeds/preferences_window.py:34 msgid "Open links in your browser" msgstr "Avaa linkit selaimessa" #: gfeeds/preferences_window.py:38 msgid "Use external video player for YouTube" msgstr "Käytä erillistä videosoitinta YouTube-katseluun" #: gfeeds/preferences_window.py:40 msgid "Requires youtube-dl and a compatible video player" msgstr "Vaatii youtube-dl:n ja yhteensopivan videosoittimen" #: gfeeds/preferences_window.py:46 msgid "Preferred video player" msgstr "Ensisijainen videosoitin" #: gfeeds/preferences_window.py:50 msgid "Maximum article age" msgstr "Artikkelin enimmäisikä" #: gfeeds/preferences_window.py:51 msgid "In days" msgstr "Päivissä" #: gfeeds/preferences_window.py:58 msgid "Refresh preferences" msgstr "Päivityksen asetukset" #: gfeeds/preferences_window.py:60 msgid "Refresh articles on startup" msgstr "Päivitä artikkelit käynnistyksen yhteydessä" #: gfeeds/preferences_window.py:64 msgid "New articles notification" msgstr "Uusien artikkelien ilmoitus" #: gfeeds/preferences_window.py:68 msgid "Enable auto-refresh" msgstr "Käytä automaattista päivitystä" #: gfeeds/preferences_window.py:72 msgid "Auto-refresh interval" msgstr "Automaattisen päivityksen väli" #: gfeeds/preferences_window.py:73 msgid "In seconds" msgstr "Sekunneissa" #: gfeeds/preferences_window.py:80 msgid "Cache" msgstr "Välimuisti" #: gfeeds/preferences_window.py:82 msgid "Clear caches" msgstr "Tyhjennä välimuistit" #: gfeeds/preferences_window.py:83 msgid "Clear" msgstr "Tyhjennä" #: gfeeds/preferences_window.py:109 msgid "Appearance" msgstr "Ulkoasu" #: gfeeds/preferences_window.py:112 msgid "Appearance preferences" msgstr "Ulkoasun asetukset" #: gfeeds/preferences_window.py:114 msgid "Dark mode" msgstr "Tumma tila" #: gfeeds/preferences_window.py:118 msgid "Reader mode theme" msgstr "Lukunäkymän teema" #: gfeeds/preferences_window.py:122 msgid "Automatic" msgstr "Automaattinen" #: gfeeds/preferences_window.py:122 msgid "Light" msgstr "Vaalea" #: gfeeds/preferences_window.py:122 msgid "Dark" msgstr "Tumma" #: gfeeds/preferences_window.py:126 msgid "Show article thumbnails" msgstr "Näytä artikkelin pienoiskuvat" #: gfeeds/preferences_window.py:131 msgid "Show full articles titles" msgstr "Näytä artikkelien otsikot kokonaan" #: gfeeds/preferences_window.py:136 msgid "Show full feeds names" msgstr "Näytä syötteiden nimet kokonaan" #: gfeeds/preferences_window.py:143 msgid "Font preferences" msgstr "Fonttiasetukset" #: gfeeds/preferences_window.py:145 msgid "Use system font for titles" msgstr "Käytä järjestelmän fonttia otsikoille" #: gfeeds/preferences_window.py:149 msgid "Use system font for paragraphs" msgstr "Käytä järjestelmän fonttia kappaleille" #: gfeeds/preferences_window.py:153 msgid "Custom title font" msgstr "Mukautettu otsikkofontti" #: gfeeds/preferences_window.py:157 msgid "Custom paragraph font" msgstr "Mukautettu kappalefontti" #: gfeeds/preferences_window.py:161 msgid "Custom monospace font" msgstr "Mukautettu tasalevyinen fontti" #: gfeeds/preferences_window.py:173 msgid "Privacy" msgstr "Yksityisyys" #: gfeeds/preferences_window.py:177 msgid "Privacy preferences" msgstr "Yksityisyyden asetukset" #: gfeeds/preferences_window.py:179 msgid "Enable JavaScript" msgstr "Käytä JavaScriptiä" #: gfeeds/preferences_window.py:184 msgid "Try to block advertisements" msgstr "Yritä estää mainokset" #: gfeeds/preferences_window.py:186 gfeeds/preferences_window.py:221 msgid "Requires app restart" msgstr "Vaatii sovelluksen käynnistämisen uudelleen" #: gfeeds/preferences_window.py:190 msgid "Update advertisement blocking list" msgstr "Päivitä mainosestolista" #: gfeeds/preferences_window.py:191 msgid "Updates automatically every 10 days" msgstr "Päivittyy automaattisesti 10 päivän välein" #: gfeeds/preferences_window.py:192 msgid "Update" msgstr "Päivitä" #: gfeeds/preferences_window.py:205 msgid "Advanced" msgstr "Lisäasetukset" #: gfeeds/preferences_window.py:208 msgid "Advanced preferences" msgstr "Edistyneet asetukset" #: gfeeds/preferences_window.py:210 msgid "Maximum refresh threads" msgstr "Säikeiden enimmäismäärä päivityksessä" #: gfeeds/preferences_window.py:212 msgid "How many threads to use for feeds refresh" msgstr "Kuinka montaa säiettä syötteiden päivittämiseen käytetään" #: gfeeds/preferences_window.py:219 msgid "Experimental GtkListView for articles list" msgstr "Kokeellinen GtkListView artikkeliluettelolle" #: gfeeds/preferences_window.py:227 msgid "Troubleshooting" msgstr "Ongelmanratkaisu" #: gfeeds/preferences_window.py:229 msgid "Export Configuration as JSON" msgstr "Vie asetukset JSON-muotoon" #: gfeeds/preferences_window.py:230 msgid "Attach this when reporting bugs" msgstr "Liitä tämä, kun ilmoitat ongelmista" #: gfeeds/preferences_window.py:231 msgid "Export" msgstr "Vie" #. type: ignore #: gfeeds/preferences_window.py:244 msgid "Feeds Configuration" msgstr "Syötteet-sovelluksen asetukset" #: gfeeds/preferences_window.py:248 msgid "_Close" msgstr "_Sulje" #: gfeeds/preferences_window.py:251 msgid "Cop_y" msgstr "Ko_pioi" #: gfeeds/util/download_manager.py:112 #, python-brace-format msgid "`{0}`: connection timed out" msgstr "`{0}`: yhteys aikakatkaistiin" #: gfeeds/util/download_manager.py:121 #, python-brace-format msgid "`{0}` might not be a valid address" msgstr "`{0}` ei ole välttämättä kelvollinen osoite" #: gfeeds/util/download_manager.py:161 #, python-brace-format msgid "Error downloading `{0}`, code `{1}`" msgstr "Virhe ladatessa `{0}`, koodi `{1}`" #: gfeeds/util/get_favicon.py:48 #, python-brace-format msgid "Error downloading favicon for `{0}`" msgstr "Virhe ladatessa favicon-kuvaketta kohteelle `{0}`" #: gfeeds/util/opml_parser.py:33 msgid "Error: OPML path provided does not exist" msgstr "Virhe: Määritettyä OPML-polkua ei ole olemassa" #: gfeeds/util/opml_parser.py:44 #, python-brace-format msgid "Error parsing OPML file `{0}`" msgstr "Virhe jäsentäessä OPML-tiedostoa `{0}`" #: gfeeds/webview.py:204 msgid "Link copied to clipboard!" msgstr "Linkki kopioitu leikepöydälle!" #: gfeeds/webview.py:226 msgid "Feed content not available for this article" msgstr "Syötteen sisältöä tälle artikkelille ei ole saatavilla" #~ msgid "" #~ "There were problems with some feeds.\n" #~ "Do you want to remove them?" #~ msgstr "" #~ "Joidenkin syötteiden kohdalla ilmeni virheitä.\n" #~ "Haluatko poistaa ne?" #~ msgid "Loading feeds..." #~ msgstr "Ladataan syötteitä..." #~ msgid "Use dark theme for reader mode" #~ msgstr "Käytä tummaa teemaa lukunäkymässä" #~ msgid "Maximum thumbnail height" #~ msgstr "Pienoiskuvan suurin korkeus" #~ msgid "Show" #~ msgstr "Näytä" #~ msgid "Ignore" #~ msgstr "Ohita" #~ msgid "You are offline" #~ msgstr "Et ole yhteydessä verkkoon" #~ msgid "Choose a folder" #~ msgstr "Valitse kansio" gfeeds-2.2.0/po/fr.po000066400000000000000000000721361440757451400143610ustar00rootroot00000000000000# French translations for gfeeds package. # Copyright (C) 2019 THE gfeeds'S COPYRIGHT HOLDER # This file is distributed under the same license as the gfeeds package. # Éloi Rivard , 2019-2022. # Charles Monzat , 2022. # msgid "" msgstr "" "Project-Id-Version: gfeeds 0.12\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/gfeeds/issues\n" "POT-Creation-Date: 2022-05-09 14:29+0000\n" "PO-Revision-Date: 2022-05-25 18:56+0200\n" "Last-Translator: Charles Monzat \n" "Language-Team: GNOME French Team \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-Generator: Gtranslator 40.0\n" #: data/org.gabmus.gfeeds.appdata.xml.in:4 msgid "Feeds" msgstr "Flux" #: data/org.gabmus.gfeeds.appdata.xml.in:6 data/org.gabmus.gfeeds.desktop.in:7 msgid "News reader for GNOME" msgstr "Lecteur de flux pour GNOME" #: data/org.gabmus.gfeeds.appdata.xml.in:15 msgid "" "Feeds is a minimal RSS/Atom feed reader built with speed and simplicity in " "mind." msgstr "" "Flux est un lecteur de flux RSS / Atom minimal conçu dans le but d’obtenir " "vitesse et simplicité." #: data/org.gabmus.gfeeds.appdata.xml.in:16 msgid "" "It offers a simple user interface that only shows the latest news from your " "subscriptions." msgstr "" "Il propose une interface utilisateur simple qui n’affiche que les nouvelles " "les plus récentes de vos abonnements." #: data/org.gabmus.gfeeds.appdata.xml.in:17 msgid "" "Articles are shown in a web view by default, with javascript disabled for a " "faster and less intrusive user experience. There's also a reader mode " "included, built from the one GNOME Web/Epiphany uses." msgstr "" "Les articles sont affichés dans une vue web par défaut, avec javascript " "désactivé afin de fournir une expérience utilisateur plus rapide et moins " "intrusive. Il y a aussi un mode lecture, construit d’après celui que Web de " "GNOME (Epiphany) utilise." #: data/org.gabmus.gfeeds.appdata.xml.in:18 msgid "Feeds can be imported and exported via OPML." msgstr "Les flux peuvent êtres importés et exportés via OPML." #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/org.gabmus.gfeeds.desktop.in:16 msgid "rss;reader;feed;news;" msgstr "rss;reader;feed;news;lecture;nouvelles;journaux;flux;" #: gfeeds/feed_item.py:49 #, python-brace-format msgid "Error: unable to parse datetime {0} for feeditem {1}" msgstr "" "Erreur : impossible d’analyser la date et l’heure {0} pour l’élément de flux " "{1}" #: gfeeds/feed_parser.py:37 #, python-brace-format msgid "Errors while parsing feed `{0}`" msgstr "Erreurs lors de l’analyse du flux « {0} »" #: gfeeds/feed_parser.py:55 #, python-brace-format msgid "`{0}` may not be an RSS or Atom feed" msgstr "« {0} » n’est sans doute pas un flux RSS ou Atom" #: gfeeds/feeds_manager.py:88 #, python-brace-format msgid "Feed {0} exists already, skipping" msgstr "Le flux {0} existe déjà, ignoré" #: gfeeds/feeds_view.py:13 msgid "All feeds" msgstr "Tous les flux" #: gfeeds/headerbar.py:184 msgid "" "There were problems with some feeds.\n" "Do you want to remove them?" msgstr "" "Il y a eu des problèmes avec certains flux.\n" "Voulez-vous les supprimer ?" #: gfeeds/main_leaflet.py:119 #, python-brace-format msgid "{0} new article" msgid_plural "{0} new articles" msgstr[0] "{0} nouvel article" msgstr[1] "{0} nouveaux articles" #: gfeeds/__main__.py:229 msgid "Do you want to import these feeds?" msgstr "Voulez-vous importer ces flux ?" #: gfeeds/__main__.py:256 msgid "Do you want to import this feed?" msgstr "Voulez-vous importer ce flux ?" #: gfeeds/__main__.py:285 msgid "url" msgstr "url" #: gfeeds/__main__.py:288 msgid "opml file local url or rss remote url to import" msgstr "URL locale du fichier opml ou URL distante rss à importer" #: gfeeds/manage_feeds_window.py:263 msgid "Manage Feeds" msgstr "Gérer les flux" #: gfeeds/manage_feeds_window.py:318 msgid "Do you want to delete these feeds?" msgstr "Voulez-vous supprimer ces flux ?" #: gfeeds/opml_file_chooser.py:7 msgid "XML files" msgstr "Fichiers XML" #: gfeeds/opml_file_chooser.py:14 msgid "Choose an OPML file to import" msgstr "Choisir un fichier OPML à importer" #: gfeeds/opml_file_chooser.py:18 msgid "Open" msgstr "Ouvrir" #: gfeeds/opml_file_chooser.py:19 gfeeds/opml_file_chooser.py:31 msgid "Cancel" msgstr "Annuler" #: gfeeds/opml_file_chooser.py:26 msgid "Choose where to save the exported OPML file" msgstr "Choisir où enregistrer le fichier OPML exporté" #: gfeeds/opml_file_chooser.py:30 msgid "Save" msgstr "Enregistrer" #: gfeeds/opml_manager.py:42 msgid "Error: OPML path provided does not exist" msgstr "Erreur : Le chemin du fichier OPML n’existe pas" #: gfeeds/opml_manager.py:53 #, python-brace-format msgid "Error parsing OPML file `{0}`" msgstr "Erreur lors de l’analyse du fichier OPML « {0} »" #: gfeeds/preferences_window.py:22 msgid "General" msgstr "Général" #: gfeeds/preferences_window.py:25 msgid "General preferences" msgstr "Paramètres généraux" #: gfeeds/preferences_window.py:27 msgid "Show newer articles first" msgstr "Afficher l’article le plus récent en premier" #: gfeeds/preferences_window.py:32 msgid "Open links in your browser" msgstr "Ouvrir les liens dans votre navigateur" #: gfeeds/preferences_window.py:36 msgid "Use external video player for YouTube" msgstr "Utiliser un lecteur vidéo externe pour YouTube" #: gfeeds/preferences_window.py:38 msgid "Requires youtube-dl and a compatible video player" msgstr "Nécessite youtube-dl et un lecteur vidéo compatible" #: gfeeds/preferences_window.py:44 msgid "Preferred video player" msgstr "Lecteur vidéo préféré" #: gfeeds/preferences_window.py:48 msgid "Maximum article age" msgstr "Âge maximum des articles" #: gfeeds/preferences_window.py:49 msgid "In days" msgstr "En jours" #: gfeeds/preferences_window.py:56 msgid "Refresh preferences" msgstr "Préférences d’actualisation" #: gfeeds/preferences_window.py:58 msgid "Refresh articles on startup" msgstr "Actualiser les articles au démarrage" #: gfeeds/preferences_window.py:62 msgid "New articles notification" msgstr "Notification des nouveaux articles" #: gfeeds/preferences_window.py:66 msgid "Enable auto-refresh" msgstr "Activer l’actualisation automatique" #: gfeeds/preferences_window.py:70 msgid "Auto-refresh interval" msgstr "Intervalle d’actualisation automatique" #: gfeeds/preferences_window.py:71 msgid "In seconds" msgstr "En secondes" #: gfeeds/preferences_window.py:78 msgid "Cache" msgstr "Cache" #: gfeeds/preferences_window.py:80 msgid "Clear caches" msgstr "Effacer les caches" #: gfeeds/preferences_window.py:81 msgid "Clear" msgstr "Effacer" #: gfeeds/preferences_window.py:109 msgid "Appearance" msgstr "Apparence" #: gfeeds/preferences_window.py:112 msgid "Appearance preferences" msgstr "Paramètres d’apparence" #: gfeeds/preferences_window.py:114 msgid "Dark mode" msgstr "Mode sombre" #: gfeeds/preferences_window.py:118 #| msgid "Reader Mode" msgid "Reader mode theme" msgstr "Thème du mode lecture" #: gfeeds/preferences_window.py:122 msgid "Automatic" msgstr "Automatique" #: gfeeds/preferences_window.py:122 msgid "Light" msgstr "Clair" #: gfeeds/preferences_window.py:122 #| msgid "Dark mode" msgid "Dark" msgstr "Sombre" #: gfeeds/preferences_window.py:126 msgid "Show article thumbnails" msgstr "Afficher les vignettes des articles" #: gfeeds/preferences_window.py:131 msgid "Show full articles titles" msgstr "Afficher les titres complets des articles" #: gfeeds/preferences_window.py:136 msgid "Show full feeds names" msgstr "Afficher les noms complets des flux" #: gfeeds/preferences_window.py:143 msgid "Font preferences" msgstr "Paramètres de police" #: gfeeds/preferences_window.py:145 msgid "Use system font for titles" msgstr "Utiliser la police système pour les titres" #: gfeeds/preferences_window.py:149 msgid "Use system font for paragraphs" msgstr "Utiliser la police système pour les paragraphes" #: gfeeds/preferences_window.py:153 msgid "Custom title font" msgstr "Police de titre personnalisée" #: gfeeds/preferences_window.py:157 msgid "Custom paragraph font" msgstr "Police de paragraphe personnalisée" #: gfeeds/preferences_window.py:161 msgid "Custom monospace font" msgstr "Police à chasse fixe personnalisée" #: gfeeds/preferences_window.py:173 msgid "Privacy" msgstr "Confidentialité" #: gfeeds/preferences_window.py:176 msgid "Privacy preferences" msgstr "Paramètres de confidentialité" #: gfeeds/preferences_window.py:178 msgid "Enable JavaScript" msgstr "Activer Javascript" #: gfeeds/preferences_window.py:183 msgid "Try to block advertisements" msgstr "Essayer de bloquer les publicités" #: gfeeds/preferences_window.py:185 gfeeds/preferences_window.py:220 msgid "Requires app restart" msgstr "Nécessite le redémarrage de l’application" #: gfeeds/preferences_window.py:189 msgid "Update advertisement blocking list" msgstr "Mettre à jour la liste de blocage des publicités" #: gfeeds/preferences_window.py:190 msgid "Updates automatically every 10 days" msgstr "Mise à jour automatique tous les 10 jours" #: gfeeds/preferences_window.py:191 msgid "Update" msgstr "Mettre à jour" #: gfeeds/preferences_window.py:204 msgid "Advanced" msgstr "Avancé" #: gfeeds/preferences_window.py:207 msgid "Advanced preferences" msgstr "Paramètres avancés" #: gfeeds/preferences_window.py:209 msgid "Maximum refresh threads" msgstr "Nombre maximal de fils d’actualisation" #: gfeeds/preferences_window.py:211 msgid "How many threads to use for feeds refresh" msgstr "Nombre de fils à utiliser pour actualiser les flux" #: gfeeds/preferences_window.py:218 msgid "Experimental GtkListView for articles list" msgstr "Activation expérimentale de GtkListView pour la liste des articles" #: gfeeds/sidebar.py:21 msgid "Loading feeds..." msgstr "Chargement des flux…" #: gfeeds/sidebar_row_popover.py:31 gfeeds/sidebar_row_popover.py:58 msgid "Mark as unread" msgstr "Marqué comme non lu" #: gfeeds/sidebar_row_popover.py:38 gfeeds/sidebar_row_popover.py:50 msgid "Mark as read" msgstr "Marquer comme lu" #: gfeeds/util/download_manager.py:96 #, python-brace-format msgid "`{0}`: connection timed out" msgstr "« {0} » : connexion expirée" #: gfeeds/util/download_manager.py:105 #, python-brace-format msgid "`{0}` might not be a valid address" msgstr "« {0} » n’est sans doute pas une adresse valide" #: gfeeds/util/download_manager.py:144 #, python-brace-format msgid "Error downloading `{0}`, code `{1}`" msgstr "Erreur lors du téléchargement de « {0} », code « {1} »" #: gfeeds/util/get_favicon.py:53 #, python-brace-format msgid "Error downloading favicon for `{0}`" msgstr "Erreur lors du téléchargement du favicon pour « {0} »" #: gfeeds/webview.py:201 msgid "Link copied to clipboard!" msgstr "Lien copié dans le presse-papiers !" #: gfeeds/webview.py:223 msgid "Feed content not available for this article" msgstr "Contenu du flux indisponible pour cet article" #~ msgid "Use dark theme for reader mode" #~ msgstr "Utiliser le thème sombre pour le mode lecture" #~ msgid "Maximum thumbnail height" #~ msgstr "Hauteur maximale des vignettes" #~ msgid "Enter feed address to add" #~ msgstr "Entrez l'adresse du flux à ajouter" #~ msgid "Add" #~ msgstr "Ajouter" #~ msgid "You're already subscribed to that feed!" #~ msgstr "Vous êtes déjà abonné à ce flux !" #~ msgid "Let's get started" #~ msgstr "Commençons" #~ msgid "Add new feeds via URL" #~ msgstr "Ajouter de nouveaux flux via une URL" #~ msgid "Import an OPML file" #~ msgstr "Importer un fichier OPML" #~ msgid "Show Read Articles" #~ msgstr "Montrer les articles lus" #~ msgid "Mark All as Read" #~ msgstr "Marquer tous comme lus" #~ msgid "Mark All as Unread" #~ msgstr "Marquer tous comme non-lus" #~ msgid "Show Empty Feeds" #~ msgstr "Montrer les flux vides" #~ msgid "Import OPML" #~ msgstr "Importer un fichier OPML" #~ msgid "Export OPML" #~ msgstr "Exporter un fichier OPML" #~ msgid "Preferences" #~ msgstr "Préférences" #~ msgid "Keyboard Shortcuts" #~ msgstr "Raccourcis clavier" #~ msgid "About Feeds" #~ msgstr "À propos" #~ msgid "Filter" #~ msgstr "Filtrer" #~ msgid "Add Feed" #~ msgstr "Ajouter un flux" #~ msgid "Menu" #~ msgstr "Menu" #~ msgid "Refresh" #~ msgstr "Rafraîchir" #~ msgid "Search" #~ msgstr "Rechercher" #~ msgid "There Are Errors" #~ msgstr "Il y a des erreurs" #~ msgid "Offline" #~ msgstr "Hors-ligne" #~ msgid "Manage Tags for Selected Feeds" #~ msgstr "Gérer les étiquettes pour les flux sélectionnés" #~ msgid "Select/Unselect All" #~ msgstr "Sélectionner / désélectionner tous" #~ msgid "Delete Selected Feeds" #~ msgstr "Supprimer les flux sélectionnés" #~ msgid "New tag name…" #~ msgstr "Nouveau nom d'étiquette..." #~ msgid "Add Tag" #~ msgstr "Ajouter une étiquette" #~ msgid "There are no tags yet" #~ msgstr "Il n'y a pas encore d'étiquettes" #~ msgid "Add some using the entry above" #~ msgstr "Ajoutez-en en utilisant l'entrée ci-dessus" #~ msgid "Open in Browser" #~ msgstr "Ouvrir dans le navigateur" #~ msgid "Open in External Media Player" #~ msgstr "Ouvrir dans un lecteur média externe" #~ msgid "Copy Article Link" #~ msgstr "Copier le lien de l'article" #~ msgid "View Mode" #~ msgstr "Mode de vue" #~ msgid "Web View" #~ msgstr "Page web" #~ msgid "Feed Content" #~ msgstr "Contenu du flux" #~ msgid "Zoom Out" #~ msgstr "Dézoomer" #~ msgid "Reset Zoom" #~ msgstr "Réinitialiser le zoom" #~ msgid "Zoom In" #~ msgstr "Zoomer" #~ msgid "Back to Articles" #~ msgstr "Retour aux articles" #~ msgid "Mark as Read" #~ msgstr "Marquer comme lu" #~ msgid "No" #~ msgstr "Non" #~ msgid "Yes" #~ msgstr "Oui" #~ msgid "Open Keyboard Shortcuts" #~ msgstr "Ouvrir les raccourcis clavier" #~ msgid "Open Menu" #~ msgstr "Ouvrir le menu" #~ msgid "Open Preferences" #~ msgstr "Ouvrir les préférences" #~ msgid "Open Filter" #~ msgstr "Ouvrir le filtre" #~ msgid "Quit" #~ msgstr "Quitter" #~ msgid "Article List" #~ msgstr "Liste des articles" #~ msgid "Next" #~ msgstr "Suivant" #~ msgid "Previous" #~ msgstr "Précédent" #~ msgid "Show/Hide Read Articles" #~ msgstr "Montrer / cacher les articles lus" #~ msgid "Mark All Read" #~ msgstr "Marquer tous comme lus" #~ msgid "Article" #~ msgstr "Article" #~ msgid "Select an article" #~ msgstr "Choisir un article" #~ msgid "@prettyname@" #~ msgstr "@prettyname@" #~ msgid "Links in the web view show a preview of the destination URL" #~ msgstr "" #~ "Les liens dans la vue web montrent un aperçu de l'URL de destination" #~ msgid "Stability improvements related to article thumbnails" #~ msgstr "Améliorations de stabilité liées aux vignettes des articles" #~ msgid "Reworked dialog windows" #~ msgstr "Fenêtres de dialogues remaniées" #~ msgid "Fixes for non-unicode character encodings" #~ msgstr "Corrections pour l'encodage de caractères non-unicodes" #~ msgid "Fixes for importing OPML" #~ msgstr "Correction pour l'import de fichiers OPML" #~ msgid "Various bug fixes and improvements" #~ msgstr "Diverses corrections de bogues et améliorations" #~ msgid "Code refactoring" #~ msgstr "Refonte du code" #~ msgid "Flatpak dependency fixes" #~ msgstr "Corrections dans les dépendances Flatpak" #~ msgid "Brand new look powered by GTK4 and Libadwaita" #~ msgstr "Tout nouveau look avec GTK4 et Libadwaita" #~ msgid "Articles can have thumbnails" #~ msgstr "Les articles peuvent avoir des vignettes" #~ msgid "New advertisement blocking feature" #~ msgstr "Nouvelle fonctionnalité de blocage des pubs" #~ msgid "Human friendly article date and time" #~ msgstr "Date et heure de l'article lisibles" #~ msgid "Less intrusive feed error notification" #~ msgstr "Notification d'erreur de flux moins intrusive" #~ msgid "Customizable reader mode fonts" #~ msgstr "Polices de caractères personnalisables en mode lecture" #~ msgid "Empty feeds can be hidden" #~ msgstr "Les flux vides peuvent être cachés" #~ msgid "New lightning fast C++ powered backend for feed parsing" #~ msgstr "Nouveau backend d'analyse des flux en C++ vif comme l'éclair" #~ msgid "Experimental article list implementation using GtkListView" #~ msgstr "" #~ "Implémentation expérimentale d'une liste d'articles utilisant GtkListView" #~ msgid "Removed saved articles feature" #~ msgstr "Fonctionnalité de sauvegarde des articles retirée" #~ msgid "Fixed view mode button" #~ msgstr "Bouton de mode de vue réparé" #~ msgid "Option to open YouTube links with an external media player" #~ msgstr "" #~ "Possibilité d'ouvrir les liens YouTube avec un lecteur média externe" #~ msgid "" #~ "Saved articles are no longer stored inside the cache directory, avoiding " #~ "accidental deletion" #~ msgstr "" #~ "Les articles sauvegardés ne sont plus stockés dans le cache du " #~ "répertoire, évitant des suppressions accidentelles" #~ msgid "Feed icons improvements for high DPI screens" #~ msgstr "Améliorations des icônes des flux pour les écrans HDPI" #~ msgid "UI improvements on phones" #~ msgstr "Améliorations de l'interface pour les téléphones" #~ msgid "Switched to the new libhandy Avatar widget" #~ msgstr "Passage au nouveau widget Avatar de libhandy" #~ msgid "Added Dutch translation courtesy of Heimen Stoffels" #~ msgstr "Ajout d'une traduction néerlandaise grâce à Heimen Stoffels" #~ msgid "Fixed searchbar" #~ msgstr "Barre de recherche réparée" #~ msgid "" #~ "New tags feature! You can now categorize your feeds by creating custom " #~ "tags" #~ msgstr "" #~ "Nouvelle fonctionnalité : les étiquettes ! Vous pouvez désormais " #~ "catégoriser vos flux en créant des étiquettes personnalisées" #~ msgid "RSS links can now be opened directly in Feeds to be imported" #~ msgstr "" #~ "Les liens RSS peuvent maintenant être ouverts directement dans Flux pour " #~ "être importés" #~ msgid "Mark as read now only marks the currently visible feeds" #~ msgstr "" #~ "La fonction \"marquer comme lu\" ne marque désormais seulement que les " #~ "flux actuellement visibles" #~ msgid "Added support for the latest version of libhandy" #~ msgstr "Ajout du support pour la dernière version de libhandy" #~ msgid "Improved message dialogs" #~ msgstr "Dialogues de message améliorés" #~ msgid "Performance improvements when importing OPML files" #~ msgstr "" #~ "Amélioration des performances lors de l'importation de fichiers OPML" #~ msgid "Removed option to disable client side decoration" #~ msgstr "" #~ "Suppression de l'option permettant de désactiver la décoration côté client" #~ msgid "" #~ "Don't remove feeds automatically if they have errors, instead ask the " #~ "user what to do" #~ msgstr "" #~ "Si un flux a des erreurs, il sera demandé à l'utilisateur que faire, " #~ "plutôt que de le supprimer automatiquement" #~ msgid "Updated Italian translation" #~ msgstr "Mise à jour de la traduction italienne" #~ msgid "Updated French translation" #~ msgstr "Mise à jour de la traduction française" #~ msgid "Bug fixes" #~ msgstr "Correction d'anomalies" #~ msgid "Updated version number" #~ msgstr "Mise à jour du numéro de version" #~ msgid "You can now add some feeds by just using the website URL" #~ msgstr "Il est désormais possible d'ajouter un flux via l'URL d'un site web" #~ msgid "New generated placeholder icon for feeds without one" #~ msgstr "Nouveaux icônes temporaires pour les flux qui en manquent" #~ msgid "Improved reader mode" #~ msgstr "Mode lecture amélioré" #~ msgid "Swipe left on your touchscreen to move back from an article" #~ msgstr "" #~ "Glissez vers la gauche de votre écran tactile pour revenir à l'article " #~ "précédent" #~ msgid "Code blocks in articles now have syntax highlighting" #~ msgstr "Les blocs de code sont désormais colorés syntaxiquement" #~ msgid "Added French translation" #~ msgstr "Ajout de la traduction française" #~ msgid "Removed the colored border left of the articles" #~ msgstr "Suppression de la bordure colorée à gauche des articles" #~ msgid "More keyboard shortcuts" #~ msgstr "Plus de raccourcis clavier" #~ msgid "Added option to refresh articles on startup" #~ msgstr "" #~ "Ajout d'une option permettant de rafraîchir les articles au démarrage" #~ msgid "Updated to the GNOME 3.36 runtime" #~ msgstr "Mise à jour vers GNOME 3.36" #~ msgid "Various improvements and bug fixes" #~ msgstr "Diverses améliorations et corrections d'anomalies" #~ msgid "Added loading progress bar" #~ msgstr "Ajout d'une barre de chargement" #~ msgid "Added Spanish translation" #~ msgstr "Ajout de la traduction espagnole" #~ msgid "Various UI improvements" #~ msgstr "Diverses améliorations concernant l'interface" #~ msgid "Performance improvements" #~ msgstr "Améliorations des performances" #~ msgid "Various bug fixes" #~ msgstr "Diverses corrections de bogues" #~ msgid "Load cached articles on startup" #~ msgstr "Chargement des articles en cache au démarrage" #~ msgid "Added new view mode menu" #~ msgstr "Ajout du nouveau de menu de mode de vue" #~ msgid "Added Brazilian Portuguese translation" #~ msgstr "Ajout de la traduction en portugais brésilien" #~ msgid "Added Russian translation" #~ msgstr "Ajout de la traduction en russe" #~ msgid "Option to ellipsize article titles for a more compact view" #~ msgstr "Option pour ellipser les articles pour une vue plus compacte" #~ msgid "Added a search function" #~ msgstr "Ajout d'une fonction de recherche" #~ msgid "Updated dependencies" #~ msgstr "Mise à jour des dépendances" #~ msgid "Errors with feeds are now shown in the UI" #~ msgstr "Les erreurs de flux sont désormais affichées dans l'interface" #~ msgid "Big UI overhaul" #~ msgstr "Gros remaniement de l'interface" #~ msgid "Updated translations" #~ msgstr "Mise à jour des traductions" #~ msgid "OPML file association" #~ msgstr "Association aux fichiers OPML" #~ msgid "Changed left headerbar button order" #~ msgstr "Changement de l'ordre des boutons de la barre de titre gauche" #~ msgid "Optimization for updating feeds" #~ msgstr "Optimisations sur la mise à jour des flux" #~ msgid "Redesigned right click/longpress menu" #~ msgstr "Remaniement du menu clic droit / appui long" #~ msgid "Option to show/hide read articles" #~ msgstr "Option pour afficher ou masquer les articles lus" #~ msgid "Reworked suggestion bar" #~ msgstr "Remaniement de la barre de suggestion" #~ msgid "Changed name to Feeds" #~ msgstr "Changement de nom pour Feeds" #~ msgid "Improved CPU utilization" #~ msgstr "Améliorations de l'utilisation CPU" #~ msgid "New right click or longpress menu for articles" #~ msgstr "Nouveau menu de clic droit (ou d'appui long)" #~ msgid "You can now save articles offline" #~ msgstr "Vous pouvez désormais sauvegarder les articles hors-connexion" #~ msgid "Initial suggestion to add feeds is now less intrusive" #~ msgstr "" #~ "La suggestion initiale d'ajout de flux est désormais moins intrusive" #~ msgid "Read articles are now greyed out" #~ msgstr "Les articles lus sont désormais grisés" #~ msgid "Concurrent feeds refresh, with customizable thread count" #~ msgstr "" #~ "Rafraîchissement concurrent des flux, avec un nombre de thread " #~ "personnalisable" #~ msgid "Added German translation (thanks @Etamuk)" #~ msgstr "Traduction allemande (merci @Etamuk)" #~ msgid "Fix bugs in reader mode" #~ msgstr "Corrections de bug en mode lecture" #~ msgid "Minor bug fix" #~ msgstr "Correction de bogue mineure" #~ msgid "Improved date and time parsing and display" #~ msgstr "Améliorations de l'analyse et de l'affichage des dates" #~ msgid "Reader mode can now work on websites without an article tag" #~ msgstr "" #~ "Le mode lecture fonctionne désormais pour les sites sans tag d'article" #~ msgid "Slight improvements to the icon" #~ msgstr "Légère amélioration de l'icône" #~ msgid "New feature to filter articles by feed" #~ msgstr "Nouvelle fonctionnalité de filtre d'articles par flux" #~ msgid "Improved favicon download" #~ msgstr "Amélioration des téléchargements des favicons" #~ msgid "Fixed refresh duplicating articles" #~ msgstr "Correction des rafraîchissements dupliquant les articles" #~ msgid "Added option to disable client side decoration" #~ msgstr "Ajout d'une option pour désactiver la décoration côté client" #~ msgid "Brought primary menu in line with GNOME HIG" #~ msgstr "Introduction du menu primaire raccord avec les GNOME HIG" #~ msgid "Added placeholder icon for feeds without an icon" #~ msgstr "Ajout d'un icône par défaut pour les articles sans icône" #~ msgid "Migrated some widgets to Glade templates" #~ msgstr "Migration de certains widgets vers des templates Glade" #~ msgid "Option to use reader mode by default" #~ msgstr "Option pour utiliser le mode lecture par défaut" #~ msgid "Option to show article content from the feed" #~ msgstr "Option pour afficher le contenu de l'article à partir du flux" #~ msgid "Fixed labels alignment" #~ msgstr "Correction de l'alignement de labels" #~ msgid "Changed app name to Feeds" #~ msgstr "Changement du nom de l'app pour Feeds" #~ msgid "Added separators for the two sections of the app" #~ msgstr "Ajout de séparateurs pour les deux sections de l'app" #~ msgid "Using links as feed titles when there is no title" #~ msgstr "Utilisation du lien comme titre pour les articles sans titre" #~ msgid "Added preference for maximum article age" #~ msgstr "Ajout d'une option pour l'âge maximal d'un article" #~ msgid "Added zoom keyboard shortcuts" #~ msgstr "Ajout de raccourcis claviers de zoom" #~ msgid "Added preference to enable JavaScript" #~ msgstr "Ajout d'une option pour activer Javascript" #~ msgid "Fix window control positions when they are on the left" #~ msgstr "" #~ "Correction des positions des contrôles de fenêtre lorsqu'ils sont sur la " #~ "gauche" #~ msgid "Feeds for websites without favicons will now work" #~ msgstr "Les flux des sites sans favicons fonctionneront désormais" #~ msgid "Fixed bug with adding new feeds" #~ msgstr "Correction d'un bug à l'ajout de nouveaux flux" #~ msgid "Switched to native file chooser" #~ msgstr "Utilisation d'un sélecteur de fichiers natif" #~ msgid "Added empty state initial screen for sidebar" #~ msgstr "Ajout d'un écran d'état initial vide pour le barre latérale" #~ msgid "Added italian translation" #~ msgstr "Ajout de la traduction italienne" #~ msgid "First release" #~ msgstr "Première parution" #~ msgid "Feed" #~ msgstr "Flux" #~ msgid "Saved" #~ msgstr "Favoris" #~ msgid "General Settings" #~ msgstr "Paramètres généraux" #~ msgid "Clear all caches" #~ msgstr "Vider tous les caches" #~ msgid "View" #~ msgstr "Affichage" #~ msgid "View Settings" #~ msgstr "Paramètres de la vue" #~ msgid "Enable client side decoration" #~ msgstr "Activer les décorations côté client" #~ msgid "Advanced Settings" #~ msgstr "Paramètres avancés" #~ msgid "How many threads to refresh feeds" #~ msgstr "Nombre maximum de threads de rafraîchissement" #, python-brace-format #~ msgid "`{0}` is not an URL" #~ msgstr "`{0}` n'est pas une URL" #~ msgid "Thumbnail" #~ msgstr "Miniature" #~ msgid "Filler View" #~ msgstr "Vue de remplissage" #~ msgid "RSS content or summary not available for this article" #~ msgstr "" #~ "Le résumé et le contenu RSS ne sont pas disponibles pour cet article" #~ msgid "Refresh feeds" #~ msgstr "Rafraîchir les flux" #~ msgid "Add new feed" #~ msgstr "Ajouter un nouveau flux" #~ msgid "Select/Unselect all" #~ msgstr "Sélectionner/dé-sélectionner tout" #~ msgid "Delete selected feeds" #~ msgstr "Supprimer les flux sélectionnés" #~ msgid "There are some errors" #~ msgstr "Il y a des erreurs" #~ msgid "Show" #~ msgstr "Afficher" #~ msgid "Ignore" #~ msgstr "Ignorer" #~ msgid "There were problems with some feeds" #~ msgstr "Il y a eu des problèmes avec quelques flux" #~ msgid "You are offline" #~ msgstr "Vous êtes déconnectés" #~ msgid "View mode" #~ msgstr "Mode de vue" #~ msgid "RSS Content" #~ msgstr "Contenu du flux" #~ msgid "Save article" #~ msgstr "Sauvegarder l'article" #~ msgid "Refresh articles" #~ msgstr "Rafraîchir les articles" #~ msgid "Search articles" #~ msgstr "Rechercher des articles" #~ msgid "Next article" #~ msgstr "Article suivant" #~ msgid "Previous article" #~ msgstr "Article précédent" #~ msgid "Show/Hide read articles" #~ msgstr "Afficher/masquer des articles" #~ msgid "Zoom in" #~ msgstr "Zoomer" #~ msgid "Zoom out" #~ msgstr "Dézoomer" #~ msgid "Reset zoom" #~ msgstr "Réinitialiser le zoom" #~ msgid "Show read articles" #~ msgstr "Montrer les articles lus" #~ msgid "Mark all as read" #~ msgstr "Marquer tout comme lu" #~ msgid "Mark all as unread" #~ msgstr "Marquer tout comme non-lu" #~ msgid "Filter by feed" #~ msgstr "Filtrer par flux" #~ msgid "Back to articles" #~ msgstr "Retour aux articles" #~ msgid "Change view mode" #~ msgstr "Changer le mode de vue" #~ msgid "Share" #~ msgstr "Partager" #~ msgid "Open externally" #~ msgstr "Ouvrir dans le navigateur" #~ msgid "https://..." #~ msgstr "https://" #~ msgid "@appid@" #~ msgstr "@appid@" #~ msgid "Gabriele Musco" #~ msgstr "Gabriele Musco" #~ msgid "Show colored border" #~ msgstr "Afficher la bordure colorée" #~ msgid "Reader mode unavailable for this site" #~ msgstr "Le mode lecture n'est pas disponible pour ce site" gfeeds-2.2.0/po/fur.po000066400000000000000000000406271440757451400145460ustar00rootroot00000000000000# Friulian translation for gfeeds. # Copyright (C) 2023 gfeeds's COPYRIGHT HOLDER # This file is distributed under the same license as the gfeeds package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: gfeeds master\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/gfeeds/issues\n" "POT-Creation-Date: 2022-11-20 14:23+0000\n" "PO-Revision-Date: 2023-01-11 22:25+0000\n" "Last-Translator: Fabio T. \n" "Language-Team: Friulian \n" "Language: fur\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-Editor: HaiPO 1.4 beta\n" #: data/org.gabmus.gfeeds.appdata.xml.in:4 msgid "Feeds" msgstr "Feeds" #: data/org.gabmus.gfeeds.appdata.xml.in:6 data/org.gabmus.gfeeds.desktop.in:7 msgid "News reader for GNOME" msgstr "Letôr di notiziis par GNOME" #: data/org.gabmus.gfeeds.appdata.xml.in:15 msgid "" "Feeds is a minimal RSS/Atom feed reader built with speed and simplicity in " "mind." msgstr "" "Feeds al è un letôr di feed RSS/Atom minimâl progjetât cul obietîf di sei " "svelt e sempliç." #: data/org.gabmus.gfeeds.appdata.xml.in:16 msgid "" "It offers a simple user interface that only shows the latest news from your " "subscriptions." msgstr "" "Al ufrìs une interface utent che e mostre dome lis ultimis notiziis des tôs " "sotscrizions." #: data/org.gabmus.gfeeds.appdata.xml.in:17 msgid "" "Articles are shown in a web view by default, with javascript disabled for a " "faster and less intrusive user experience. There's also a reader mode " "included, built from the one GNOME Web/Epiphany uses." msgstr "" "I articui a vegnin mostrâts tant che impostazion predefinide intune viodude " "web, cun javascript disativât par vê une esperience utent plui svelte e " "mancul intrusive. E je ancje includude une modalitât di leture, fate de " "stesse che al dopre GNOME Web/Epiphany." #: data/org.gabmus.gfeeds.appdata.xml.in:18 msgid "Feeds can be imported and exported via OPML." msgstr "Al è pussibil impuartâ in Feeds e espuartâ di Feeds midiant OPML." #. Translators: Search terms to find this application. Do NOT translate or #. localize the semicolons! The list MUST also end with a semicolon! #: data/org.gabmus.gfeeds.desktop.in:16 msgid "rss;reader;feed;news;" msgstr "rss;reader;letôr;feed;news;notiziis;gnovis;" #: data/ui/aboutdialog.ui.in:10 msgid "translator-credits" msgstr "Fabio Tomat " #: data/ui/add_feed_popover.blp:11 msgid "Enter feed address to add" msgstr "Inserìs la direzion dal feed di zontâ" #: data/ui/add_feed_popover.blp:26 msgid "Add" msgstr "Zonte" #: data/ui/add_feed_popover.blp:32 msgid "You're already subscribed to that feed!" msgstr "Tu âs za sotscrit chel feed!" #: data/ui/empty_state.blp:7 msgid "Let's get started" msgstr "Scomencìn" #: data/ui/empty_state.blp:22 msgid "Add new feeds via URL" msgstr "Zonte gnûfs feeds vie URL" #: data/ui/empty_state.blp:27 msgid "Import an OPML file" msgstr "Impuarte un file OPML" #: data/ui/left_headerbar.blp:6 msgid "_Show Read Articles" msgstr "_Mostre articui lets" #: data/ui/left_headerbar.blp:7 msgid "Mark All as Read" msgstr "Segne ducj come lets" #: data/ui/left_headerbar.blp:8 msgid "Mark All as _Unread" msgstr "Segne dut come _no lets" #: data/ui/left_headerbar.blp:11 msgid "Show _Empty Feeds" msgstr "Mostre feeds _vueits" #: data/ui/left_headerbar.blp:12 msgid "_Manage Feeds" msgstr "_Gjestìs Feeds" #: data/ui/left_headerbar.blp:13 msgid "_Import OPML" msgstr "_Impuarte OPML" #: data/ui/left_headerbar.blp:14 msgid "E_xport OPML" msgstr "E_spuarte OPML" #: data/ui/left_headerbar.blp:17 msgid "P_references" msgstr "P_referencis" #: data/ui/left_headerbar.blp:18 msgid "_Keyboard Shortcuts" msgstr "_Scurtis di tastiere" #: data/ui/left_headerbar.blp:19 msgid "_About Feeds" msgstr "_Informazions su Feeds" #: data/ui/left_headerbar.blp:28 msgid "Filter" msgstr "Filtre" #: data/ui/left_headerbar.blp:32 msgid "Add Feed" msgstr "Zonte feed" #: data/ui/left_headerbar.blp:36 msgid "Menu" msgstr "Menù" #: data/ui/left_headerbar.blp:41 data/ui/shortcutsWindow.blp:35 msgid "Refresh" msgstr "Inzorne" #: data/ui/left_headerbar.blp:46 data/ui/shortcutsWindow.blp:39 msgid "Search" msgstr "Cîr" #: data/ui/left_headerbar.blp:50 msgid "There Are Errors" msgstr "A son erôrs" #: data/ui/main_leaflet.blp:40 msgid "Offline" msgstr "Fûr rêt" #: data/ui/manage_feeds_headerbar.blp:7 gfeeds/manage_feeds_window.py:257 msgid "Manage Feeds" msgstr "Gjestìs feeds" #: data/ui/manage_feeds_headerbar.blp:11 msgid "Manage Tags for Selected Feeds" msgstr "Gjestìs lis etichetis pai feeds selezionâts" #: data/ui/manage_feeds_headerbar.blp:16 msgid "Select/Unselect All" msgstr "Selezione/Deselezione dut" #: data/ui/manage_feeds_headerbar.blp:21 msgid "Delete Selected Feeds" msgstr "Elimine i feeds selezionâts" #: data/ui/manage_tags_content.blp:17 msgid "New tag name…" msgstr "Gnûf non di etichete…" #: data/ui/manage_tags_content.blp:24 msgid "Add Tag" msgstr "Zonte etichete" #: data/ui/manage_tags_content.blp:39 msgid "There are no tags yet" msgstr "Ancjemò nissune etichete" #: data/ui/manage_tags_content.blp:40 msgid "Add some using the entry above" msgstr "Zonte cualchidune doprant il cjamp chi parsore" #: data/ui/right_headerbar.blp:9 msgid "Open in _Browser" msgstr "Vierç tal _navigadôr" #: data/ui/right_headerbar.blp:10 msgid "Open in External Media _Player" msgstr "Vierç intun ri_produtôr multimediâl esterni" #: data/ui/right_headerbar.blp:11 msgid "_Copy Article Link" msgstr "_Copie colegament dal articul" #: data/ui/right_headerbar.blp:17 data/ui/right_headerbar.blp:96 msgid "View Mode" msgstr "Modalitât di visualizazion" #: data/ui/right_headerbar.blp:19 msgid "Web View" msgstr "Viodude web" #: data/ui/right_headerbar.blp:24 msgid "Reader Mode" msgstr "Modalitât leture" #: data/ui/right_headerbar.blp:29 msgid "Feed Content" msgstr "Contignût dal feed" #: data/ui/right_headerbar.blp:44 data/ui/shortcutsWindow.blp:66 msgid "Zoom Out" msgstr "Impiçulìs" #: data/ui/right_headerbar.blp:51 data/ui/shortcutsWindow.blp:70 msgid "Reset Zoom" msgstr "Azere ingrandiment" #: data/ui/right_headerbar.blp:57 data/ui/shortcutsWindow.blp:62 msgid "Zoom In" msgstr "Ingrandìs" #: data/ui/right_headerbar.blp:90 msgid "Back to Articles" msgstr "Torne ai articui" #: data/ui/shortcutsWindow.blp:9 gfeeds/preferences_window.py:24 msgid "General" msgstr "Gjenerâl" #: data/ui/shortcutsWindow.blp:12 msgid "Open Keyboard Shortcuts" msgstr "Vierç lis scurtis di tastiere" #: data/ui/shortcutsWindow.blp:16 msgid "Open Menu" msgstr "Vierç menù" #: data/ui/shortcutsWindow.blp:20 msgid "Open Preferences" msgstr "Vierç preferencis" #: data/ui/shortcutsWindow.blp:24 msgid "Open Filter" msgstr "Vierç filtri" #: data/ui/shortcutsWindow.blp:28 msgid "Quit" msgstr "Jes" #: data/ui/shortcutsWindow.blp:32 msgid "Article List" msgstr "Liste articui" #: data/ui/shortcutsWindow.blp:43 msgid "Next" msgstr "Sucessîf" #: data/ui/shortcutsWindow.blp:47 msgid "Previous" msgstr "Precedent" #: data/ui/shortcutsWindow.blp:51 msgid "Show/Hide Read Articles" msgstr "Mostre/Plate articui lets" #: data/ui/shortcutsWindow.blp:55 msgid "Mark All Read" msgstr "Segne ducj come lets" #: data/ui/shortcutsWindow.blp:59 msgid "Article" msgstr "Articul" #: data/ui/shortcutsWindow.blp:74 data/ui/sidebar_listbox_row.blp:6 msgid "Open in Browser" msgstr "Vierç tal navigadôr" #: data/ui/sidebar_listbox_row.blp:5 msgid "Mark as Read/Unread" msgstr "Segne come let/no-let" #: data/ui/webview.blp:12 msgid "Select an article" msgstr "Selezione un articul" #: gfeeds/feed_item.py:59 #, python-brace-format msgid "Error: unable to parse datetime {0} for feeditem {1}" msgstr "Erôr: impussibil analizâ la marche temporâl {0} pal articul {1}" #: gfeeds/feed_parser.py:61 #, python-brace-format msgid "Errors while parsing feed `{0}`, URL: `{1}`" msgstr "Erôrs tal analizâ il feed `{0}`, URL: `{1}`" #: gfeeds/feed_parser.py:71 #, python-brace-format msgid "`{0}` may not be an RSS or Atom feed" msgstr "Al è pussibil che `{0}` nol sedi un feed RSS o Atom" #: gfeeds/feeds_manager.py:97 #, python-brace-format msgid "Feed {0} exists already, skipping" msgstr "Il feed {0} al esist za, si salte" #: gfeeds/feeds_view.py:13 msgid "All feeds" msgstr "Ducj i feeds" #: gfeeds/headerbar.py:197 msgid "There were problems with some feeds. Do you want to remove them?" msgstr "A son vignûts fûr problemis cun cualchi feed. Desideristu gjavâju?" #: gfeeds/headerbar.py:202 msgid "_Keep" msgstr "_Ten" #: gfeeds/headerbar.py:204 msgid "_Remove" msgstr "_Gjave" #: gfeeds/main_leaflet.py:114 #, python-brace-format msgid "{0} new article" msgid_plural "{0} new articles" msgstr[0] "{0} gnûf articul" msgstr[1] "{0} gnûfs articui" #: gfeeds/__main__.py:232 msgid "Do you want to import these feeds?" msgstr "Desideristu impuartâ chescj feeds?" #: gfeeds/__main__.py:239 gfeeds/__main__.py:273 #: gfeeds/manage_feeds_window.py:324 msgid "_Cancel" msgstr "_Anule" #: gfeeds/__main__.py:242 gfeeds/__main__.py:276 msgid "_Import" msgstr "_Impuarte" #: gfeeds/__main__.py:269 msgid "Do you want to import this feed?" msgstr "Desideristu impuartâ chest feed?" #: gfeeds/__main__.py:301 msgid "url" msgstr "url" #: gfeeds/__main__.py:304 msgid "opml file local url or rss remote url to import" msgstr "url locâl dal file opml o url rss esterni di impuartâ" #: gfeeds/manage_feeds_window.py:321 msgid "Do you want to delete these feeds?" msgstr "Desideristu eliminâ chescj feeds?" #: gfeeds/manage_feeds_window.py:326 msgid "_Delete" msgstr "_Elimine" #: gfeeds/opml_file_chooser.py:7 msgid "XML files" msgstr "Files XML" #: gfeeds/opml_file_chooser.py:14 msgid "Choose an OPML file to import" msgstr "Sielç un file OPML di impuartâ" #: gfeeds/opml_file_chooser.py:18 msgid "Open" msgstr "Vierç" #: gfeeds/opml_file_chooser.py:19 gfeeds/opml_file_chooser.py:31 msgid "Cancel" msgstr "Anule" #: gfeeds/opml_file_chooser.py:26 msgid "Choose where to save the exported OPML file" msgstr "Sielç dulà salvâ il file OPML espuartât" #: gfeeds/opml_file_chooser.py:30 msgid "Save" msgstr "Salve" #: gfeeds/preferences_window.py:27 msgid "General preferences" msgstr "Preferencis gjenerâls" #: gfeeds/preferences_window.py:29 msgid "Show newer articles first" msgstr "Mostre prin i articui gnûfs" #: gfeeds/preferences_window.py:34 msgid "Open links in your browser" msgstr "Vierç i colegaments tal to navigadôr" #: gfeeds/preferences_window.py:38 msgid "Use external video player for YouTube" msgstr "Dopre riprodutôr video esterni par YouTube" #: gfeeds/preferences_window.py:40 msgid "Requires youtube-dl and a compatible video player" msgstr "Al domande youtube-dl e un riprodutôr video compatibil" #: gfeeds/preferences_window.py:46 msgid "Preferred video player" msgstr "Riprodutôr video preferît" #: gfeeds/preferences_window.py:50 msgid "Maximum article age" msgstr "Etât massime dai articui" #: gfeeds/preferences_window.py:51 msgid "In days" msgstr "In dîs" #: gfeeds/preferences_window.py:58 msgid "Refresh preferences" msgstr "Preferencis di inzornament" #: gfeeds/preferences_window.py:60 msgid "Refresh articles on startup" msgstr "Inzorne i articui al inviament" #: gfeeds/preferences_window.py:64 msgid "New articles notification" msgstr "Notifiche pai gnûfs articui" #: gfeeds/preferences_window.py:68 msgid "Enable auto-refresh" msgstr "Abilite inzornament automatic" #: gfeeds/preferences_window.py:72 msgid "Auto-refresh interval" msgstr "Dade tra i inzornaments automatics" #: gfeeds/preferences_window.py:73 msgid "In seconds" msgstr "In seconts" #: gfeeds/preferences_window.py:80 msgid "Cache" msgstr "Cache" #: gfeeds/preferences_window.py:82 msgid "Clear caches" msgstr "Nete lis caches" #: gfeeds/preferences_window.py:83 msgid "Clear" msgstr "Nete" #: gfeeds/preferences_window.py:109 msgid "Appearance" msgstr "Aspiet" #: gfeeds/preferences_window.py:112 msgid "Appearance preferences" msgstr "Preferencis dal aspiet" #: gfeeds/preferences_window.py:114 msgid "Dark mode" msgstr "Modalitât scure" #: gfeeds/preferences_window.py:118 msgid "Reader mode theme" msgstr "Teme de modalitât leture" #: gfeeds/preferences_window.py:122 msgid "Automatic" msgstr "Automatic" #: gfeeds/preferences_window.py:122 msgid "Light" msgstr "Clâr" #: gfeeds/preferences_window.py:122 msgid "Dark" msgstr "Scûr" #: gfeeds/preferences_window.py:126 msgid "Show article thumbnails" msgstr "Mostre miniaturis dai articui" #: gfeeds/preferences_window.py:131 msgid "Show full articles titles" msgstr "Mostre titui complets dai articui" #: gfeeds/preferences_window.py:136 msgid "Show full feeds names" msgstr "Mostre nons complets dai feeds" #: gfeeds/preferences_window.py:143 msgid "Font preferences" msgstr "Preferencis dai caratars" #: gfeeds/preferences_window.py:145 msgid "Use system font for titles" msgstr "Dopre il caratar di sisteme pai titui" #: gfeeds/preferences_window.py:149 msgid "Use system font for paragraphs" msgstr "Dopre il caratar di sisteme pai paragrafs" #: gfeeds/preferences_window.py:153 msgid "Custom title font" msgstr "Caratar dai titui personalizât" #: gfeeds/preferences_window.py:157 msgid "Custom paragraph font" msgstr "Caratar dai paragrafs personalizât" #: gfeeds/preferences_window.py:161 msgid "Custom monospace font" msgstr "Caratar a spaziadure fisse personalizât" #: gfeeds/preferences_window.py:173 msgid "Privacy" msgstr "Riservatece" #: gfeeds/preferences_window.py:177 msgid "Privacy preferences" msgstr "Preferencis pe riservatece" #: gfeeds/preferences_window.py:179 msgid "Enable JavaScript" msgstr "Abilite JavaScript" #: gfeeds/preferences_window.py:184 msgid "Try to block advertisements" msgstr "Cîr di blocâ lis publicitâts" #: gfeeds/preferences_window.py:186 gfeeds/preferences_window.py:221 msgid "Requires app restart" msgstr "Al covente tornâ a inviâ la aplicazion" #: gfeeds/preferences_window.py:190 msgid "Update advertisement blocking list" msgstr "Inzorne la liste di bloc de publicitât" #: gfeeds/preferences_window.py:191 msgid "Updates automatically every 10 days" msgstr "Al inzorne in automatic ogni 10 dîs" #: gfeeds/preferences_window.py:192 msgid "Update" msgstr "Inzorne" #: gfeeds/preferences_window.py:205 msgid "Advanced" msgstr "Avanzadis" #: gfeeds/preferences_window.py:208 msgid "Advanced preferences" msgstr "Preferencis avanzadis" #: gfeeds/preferences_window.py:210 msgid "Maximum refresh threads" msgstr "Threads massims pal inzornament" #: gfeeds/preferences_window.py:212 msgid "How many threads to use for feeds refresh" msgstr "Trops threads doprâ par inzornâ i feeds" #: gfeeds/preferences_window.py:219 msgid "Experimental GtkListView for articles list" msgstr "GtkListView sperimentâl pe liste dai articui" #: gfeeds/preferences_window.py:227 msgid "Troubleshooting" msgstr "Risoluzion problemis" #: gfeeds/preferences_window.py:229 msgid "Export Configuration as JSON" msgstr "Espuarte configurazion come JSON" #: gfeeds/preferences_window.py:230 msgid "Attach this when reporting bugs" msgstr "Zonte chest cuant che tu segnalis i erôrs" #: gfeeds/preferences_window.py:231 msgid "Export" msgstr "Espuarte" #. type: ignore #: gfeeds/preferences_window.py:244 msgid "Feeds Configuration" msgstr "Configurazion dai feeds" #: gfeeds/preferences_window.py:248 msgid "_Close" msgstr "_Siere" #: gfeeds/preferences_window.py:251 msgid "Cop_y" msgstr "Cop_ie" #: gfeeds/util/download_manager.py:112 #, python-brace-format msgid "`{0}`: connection timed out" msgstr "`{0}`: conession scjadude" #: gfeeds/util/download_manager.py:121 #, python-brace-format msgid "`{0}` might not be a valid address" msgstr "Al podarès sei che `{0}` no sedi une direzion valide" #: gfeeds/util/download_manager.py:161 #, python-brace-format msgid "Error downloading `{0}`, code `{1}`" msgstr "Erôr tal discjariâ `{0}`, codiç `{1}`" #: gfeeds/util/get_favicon.py:48 #, python-brace-format msgid "Error downloading favicon for `{0}`" msgstr "Erôr tal discjariâ la favicon par `{0}`" #: gfeeds/util/opml_parser.py:33 msgid "Error: OPML path provided does not exist" msgstr "Erôr: il percors OPML indicât nol esist" #: gfeeds/util/opml_parser.py:44 #, python-brace-format msgid "Error parsing OPML file `{0}`" msgstr "Erôr tal analizâ il file OPML `{0}`" #: gfeeds/webview.py:204 msgid "Link copied to clipboard!" msgstr "Colegament copiât intes notis!" #: gfeeds/webview.py:226 msgid "Feed content not available for this article" msgstr "Il contignût dal feed nol è disponibil par chest articul" gfeeds-2.2.0/po/he.po000066400000000000000000000631431440757451400143440ustar00rootroot00000000000000# Hebrew translation for gfeeds. # Copyright (C) 2022 gfeeds's COPYRIGHT HOLDER # This file is distributed under the same license as the gfeeds package. # Yosef Or Boczko , 2022. # msgid "" msgstr "" "Project-Id-Version: gfeeds master\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/gfeeds/issues\n" "POT-Creation-Date: 2022-07-12 05:28+0000\n" "PO-Revision-Date: 2022-08-18 20:49+0300\n" "Last-Translator: Yosef Or Boczko \n" "Language-Team: Hebrew <>\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: Gtranslator 40.0\n" #: data/org.gabmus.gfeeds.appdata.xml.in:4 msgid "Feeds" msgstr "הזנות" #: data/org.gabmus.gfeeds.appdata.xml.in:6 data/org.gabmus.gfeeds.desktop.in:7 msgid "News reader for GNOME" msgstr "×§×•×¨× ×—×“×©×•×ª עבור GNOME" #: data/org.gabmus.gfeeds.appdata.xml.in:15 msgid "" "Feeds is a minimal RSS/Atom feed reader built with speed and simplicity in " "mind." msgstr "הזנות ×”×•× ×§×•×¨× ×”×–× ×ª RSS/Atom בסיסי הנבנה במחשב על מהירות ופשטות." #: data/org.gabmus.gfeeds.appdata.xml.in:16 msgid "" "It offers a simple user interface that only shows the latest news from your " "subscriptions." msgstr "×”×•× ×ž×¦×™×¢ ממשק משתמש פשוט שרק מציג ×ת החדשות ×”×חרונות מההרשמות שלך." #: data/org.gabmus.gfeeds.appdata.xml.in:17 msgid "" "Articles are shown in a web view by default, with javascript disabled for a " "faster and less intrusive user experience. There's also a reader mode " "included, built from the one GNOME Web/Epiphany uses." msgstr "" "מ××ž×¨×™× ×ž×•×¦×’×™× ×‘×ª×¦×•×’×ª ×ינטרנט בבררת מחדל, ×¢× JavaScript מושבת לטובת חווית " "משתמש מהירה יותר וחסרת הפרעות. כלול ×’× ×ž×¦×‘ קרי××”, נבנה מזה שבשימוש דפדפן " "GNOME â€(Epiphany)." #: data/org.gabmus.gfeeds.appdata.xml.in:18 msgid "Feeds can be imported and exported via OPML." msgstr "הזנות יכול ×œ×™×™×‘×•× ×•×œ×™×™×¦× ×‘×מצעות OPML." #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/org.gabmus.gfeeds.desktop.in:16 msgid "rss;reader;feed;news;" msgstr "×”×–× ×”;הזנות;rss;קרי××”;חדשות;feed;feeds;" #: gfeeds/feed_item.py:49 #, python-brace-format msgid "Error: unable to parse datetime {0} for feeditem {1}" msgstr "שגי××”: ×œ× × ×™×ª×Ÿ לנתח ×ת הת×ריך והשעה {0} עבור פריט ×”×–× ×” {1}" #: gfeeds/feed_parser.py:37 #, python-brace-format #| msgid "Errors while parsing feed `{0}`" msgid "Errors while parsing feed `{0}`, URL: `{1}`" msgstr "שגי××” בניתוח ×”×–× ×” '{0}', כתובת: '{1}'" #: gfeeds/feed_parser.py:55 #, python-brace-format msgid "`{0}` may not be an RSS or Atom feed" msgstr "â€×™×ª×›×Ÿ ו־'{0} ×ינו הזנת RSS ×ו Atom" #: gfeeds/feeds_manager.py:88 #, python-brace-format msgid "Feed {0} exists already, skipping" msgstr "×”×–× ×” {0} כבר קיימת, מדלג" #: gfeeds/feeds_view.py:13 msgid "All feeds" msgstr "כל ההזנות" #: gfeeds/headerbar.py:184 msgid "" "There were problems with some feeds.\n" "Do you want to remove them?" msgstr "" "יש בעיות ×¢× ×›×ž×” הזנות.\n" "×”×× ×‘×¨×¦×•× ×š למחוק ×ותן?" #: gfeeds/main_leaflet.py:119 #, python-brace-format msgid "{0} new article" msgid_plural "{0} new articles" msgstr[0] "מ×מר חדש ×חד" msgstr[1] "שני מ××ž×¨×™× ×—×“×©×™×" msgstr[2] "â€{0} מ××ž×¨×™× ×—×“×©×™×" msgstr[3] "â€{0} מ××ž×¨×™× ×—×“×©×™×" #: gfeeds/__main__.py:229 msgid "Do you want to import these feeds?" msgstr "×”×× ×‘×¨×¦×•× ×š ×œ×™×™×‘× ×”×–× ×•×ª ×לה?" #: gfeeds/__main__.py:256 msgid "Do you want to import this feed?" msgstr "×”×× ×‘×¨×¦×•× ×š ×œ×™×™×‘× ×”×–× ×” זו?" #: gfeeds/__main__.py:285 msgid "url" msgstr "כתובת" #: gfeeds/__main__.py:288 msgid "opml file local url or rss remote url to import" msgstr "קובץ OPML מקומי, כתובת URL ×ו RSS מרוחק לייבו×" #: gfeeds/manage_feeds_window.py:263 msgid "Manage Feeds" msgstr "ניהול הזנות" #: gfeeds/manage_feeds_window.py:318 msgid "Do you want to delete these feeds?" msgstr "×”×× ×‘×¨×¦×•× ×š למחוק הזנות ×לה?" #: gfeeds/opml_file_chooser.py:7 msgid "XML files" msgstr "קובצי XML" #: gfeeds/opml_file_chooser.py:14 msgid "Choose an OPML file to import" msgstr "בחירת קובץ OPML לייבו×" #: gfeeds/opml_file_chooser.py:18 msgid "Open" msgstr "פתיחה" #: gfeeds/opml_file_chooser.py:19 gfeeds/opml_file_chooser.py:31 msgid "Cancel" msgstr "ביטול" #: gfeeds/opml_file_chooser.py:26 msgid "Choose where to save the exported OPML file" msgstr "בחירה היכן לשמור ×ת קובץ ×”Ö¾OPML המיוב×" #: gfeeds/opml_file_chooser.py:30 msgid "Save" msgstr "שמירה" #: gfeeds/opml_manager.py:42 msgid "Error: OPML path provided does not exist" msgstr "שגי××”: נתיב OPML שסופק ×ינו ×§×™×™×" #: gfeeds/opml_manager.py:53 #, python-brace-format msgid "Error parsing OPML file `{0}`" msgstr "שגי××” בניתוח קובץ OPML â€'‎{0}'" #: gfeeds/preferences_window.py:22 msgid "General" msgstr "כללי" #: gfeeds/preferences_window.py:25 msgid "General preferences" msgstr "העדפות כלליות" #: gfeeds/preferences_window.py:27 msgid "Show newer articles first" msgstr "הצגת מ××ž×¨×™× ×—×“×©×™× ×¨×שוני×" #: gfeeds/preferences_window.py:32 msgid "Open links in your browser" msgstr "פתיחת ×§×™×©×•×¨×™× ×‘×“×¤×“×¤×Ÿ שלך" #: gfeeds/preferences_window.py:36 msgid "Use external video player for YouTube" msgstr "שימוש בנגן ×¡×¨×˜×™× ×—×™×¦×•× ×™ עבור YouTube" #: gfeeds/preferences_window.py:38 msgid "Requires youtube-dl and a compatible video player" msgstr "דורש youtube-dl ונגן ×¡×¨×˜×™× ×ž×ª××™×" #: gfeeds/preferences_window.py:44 msgid "Preferred video player" msgstr "נגן ×¡×¨×˜×™× ×ž×•×¢×“×£" #: gfeeds/preferences_window.py:48 msgid "Maximum article age" msgstr "×ורך ×—×™×™× ×ž×¨×‘×™ למ×מר" #: gfeeds/preferences_window.py:49 msgid "In days" msgstr "בימי×" #: gfeeds/preferences_window.py:56 msgid "Refresh preferences" msgstr "העדפות רענון" #: gfeeds/preferences_window.py:58 msgid "Refresh articles on startup" msgstr "רענון מ××ž×¨×™× ×¢× ×”×”×¤×¢×œ×”" #: gfeeds/preferences_window.py:62 msgid "New articles notification" msgstr "התרעה על מ××ž×¨×™× ×—×“×©×™×" #: gfeeds/preferences_window.py:66 msgid "Enable auto-refresh" msgstr "ל×פשר רענון ×וטומטי" #: gfeeds/preferences_window.py:70 msgid "Auto-refresh interval" msgstr "מרווח לרענון ×וטומטי" #: gfeeds/preferences_window.py:71 msgid "In seconds" msgstr "בשניות" #: gfeeds/preferences_window.py:78 msgid "Cache" msgstr "מטמון" #: gfeeds/preferences_window.py:80 msgid "Clear caches" msgstr "פינוי מטמון" #: gfeeds/preferences_window.py:81 msgid "Clear" msgstr "פינוי" #: gfeeds/preferences_window.py:109 msgid "Appearance" msgstr "מר××”" #: gfeeds/preferences_window.py:112 msgid "Appearance preferences" msgstr "העדפות מר××”" #: gfeeds/preferences_window.py:114 msgid "Dark mode" msgstr "מצב ×›×”×”" #: gfeeds/preferences_window.py:118 #| msgid "Reader Mode" msgid "Reader mode theme" msgstr "ערכת מצב קרי××”" #: gfeeds/preferences_window.py:122 msgid "Automatic" msgstr "×וטומטי" #: gfeeds/preferences_window.py:122 msgid "Light" msgstr "בהיר" #: gfeeds/preferences_window.py:122 #| msgid "Dark mode" msgid "Dark" msgstr "×›×”×”" #: gfeeds/preferences_window.py:126 msgid "Show article thumbnails" msgstr "הצגת תמונות ממוזערות למ×מר" #: gfeeds/preferences_window.py:131 msgid "Show full articles titles" msgstr "הצגת כותרת מל××” למ×מר" #: gfeeds/preferences_window.py:136 msgid "Show full feeds names" msgstr "הצגת ×©× ×ž×œ× ×©×œ הזנות" #: gfeeds/preferences_window.py:143 msgid "Font preferences" msgstr "העדפות גופן" #: gfeeds/preferences_window.py:145 msgid "Use system font for titles" msgstr "שימוש בגופן מערכת לכותרות" #: gfeeds/preferences_window.py:149 msgid "Use system font for paragraphs" msgstr "שימוש בגופן מערכת לפסק×ות" #: gfeeds/preferences_window.py:153 msgid "Custom title font" msgstr "גופן מות×× ×œ×›×•×ª×¨×ª" #: gfeeds/preferences_window.py:157 msgid "Custom paragraph font" msgstr "גופן מות×× ×œ×¤×¡×§×ות" #: gfeeds/preferences_window.py:161 msgid "Custom monospace font" msgstr "גופן ב×ורך קבוע מות××" #: gfeeds/preferences_window.py:173 msgid "Privacy" msgstr "פרטיות" #: gfeeds/preferences_window.py:176 msgid "Privacy preferences" msgstr "העדפות פרטיות" #: gfeeds/preferences_window.py:178 msgid "Enable JavaScript" msgstr "ל×פשר JavaScript" #: gfeeds/preferences_window.py:183 msgid "Try to block advertisements" msgstr "לנסות ×œ×—×¡×•× ×¤×¨×¡×•×ž×•×ª" #: gfeeds/preferences_window.py:185 gfeeds/preferences_window.py:220 msgid "Requires app restart" msgstr "נדרשת הפעלה מחדש של היישו×" #: gfeeds/preferences_window.py:189 msgid "Update advertisement blocking list" msgstr "עדכון רשימת חסימת פרסומות" #: gfeeds/preferences_window.py:190 msgid "Updates automatically every 10 days" msgstr "עדכון ×וטומטי בכל 10 ימי×" #: gfeeds/preferences_window.py:191 msgid "Update" msgstr "עדכון" #: gfeeds/preferences_window.py:204 msgid "Advanced" msgstr "מתקד×" #: gfeeds/preferences_window.py:207 msgid "Advanced preferences" msgstr "העדפות מתקדמות" #: gfeeds/preferences_window.py:209 msgid "Maximum refresh threads" msgstr "מספר ×—×•×˜×™× ×ž×¨×‘×™×™× ×œ×¨×¢× ×•×Ÿ" #: gfeeds/preferences_window.py:211 msgid "How many threads to use for feeds refresh" msgstr "כמה ×—×•×˜×™× ×œ×©×™×ž×•×© לרענון הזנות" #: gfeeds/preferences_window.py:218 msgid "Experimental GtkListView for articles list" msgstr "â€GtkListView ניסיוני עבור רשימת המ×מרי×" #: gfeeds/sidebar.py:21 msgid "Loading feeds..." msgstr "טוען הזנות…" #: gfeeds/sidebar_row_popover.py:31 gfeeds/sidebar_row_popover.py:58 msgid "Mark as unread" msgstr "סימון ×›×œ× × ×§×¨×" #: gfeeds/sidebar_row_popover.py:38 gfeeds/sidebar_row_popover.py:50 msgid "Mark as read" msgstr "סימון כנקר×" #: gfeeds/util/download_manager.py:102 #, python-brace-format msgid "`{0}`: connection timed out" msgstr "â€'{0}': ×ª× ×–×ž×Ÿ ההתחברות" #: gfeeds/util/download_manager.py:111 #, python-brace-format msgid "`{0}` might not be a valid address" msgstr "יתכן ו־'{0}' כתובת ×œ× ×ª×§×¤×”" #: gfeeds/util/download_manager.py:150 #, python-brace-format msgid "Error downloading `{0}`, code `{1}`" msgstr "שגי××” בהורדת '{0}', קוד '{1}'" #: gfeeds/util/get_favicon.py:53 #, python-brace-format msgid "Error downloading favicon for `{0}`" msgstr "שגי××” בהורדת צלמית עבור '{0}'" #: gfeeds/webview.py:201 msgid "Link copied to clipboard!" msgstr "קישור הועתק ללוח הגזירי×!" #: gfeeds/webview.py:223 msgid "Feed content not available for this article" msgstr "תוכן ×”×”×–× ×” ×œ× ×–×™×ž×Ÿ למ×מר ×–×”" #~ msgid "Use dark theme for reader mode" #~ msgstr "שימוש בערכת × ×•×©× ×›×”×” במצב קרי××”" #~ msgid "Maximum thumbnail height" #~ msgstr "גובה מרבי לתמונה ממוזערת" #~ msgid "There are some errors" #~ msgstr "יש כמה שגי×ות" #~ msgid "Show" #~ msgstr "הצגה" #~ msgid "Ignore" #~ msgstr "התעלמות" #~ msgid "There were problems with some feeds. Do you want to remove them?" #~ msgstr "ישנן בעיות בכמה הזנות. ×”×× ×‘×¨×¦×•× ×š למחוק ×ותן?" #~ msgid "You are offline" #~ msgstr "הנך במצב ×œ× ×ž×§×•×•×Ÿ" #~ msgid "Web View" #~ msgstr "תצוגת ×ינטרנט" #~ msgid "Feed Content" #~ msgstr "תוכן ×”×–× ×”" #~ msgid "Open Keyboard Shortcuts" #~ msgstr "פתיחת צירופי מקשי×" #~ msgid "Open Menu" #~ msgstr "פתיחת תפריט" #~ msgid "Open Preferences" #~ msgstr "פתיחת העדפות" #~ msgid "Open Filter" #~ msgstr "פתיחת מסנן" #~ msgid "Quit" #~ msgstr "יצי××”" #~ msgid "Article List" #~ msgstr "רשימת מ×מרי×" #~ msgid "Refresh" #~ msgstr "רענון" #~ msgid "Search" #~ msgstr "חיפוש" #~ msgid "Next" #~ msgstr "הב×" #~ msgid "Previous" #~ msgstr "הקוד×" #~ msgid "Show/Hide Read Articles" #~ msgstr "הצגת/הסתרת מ××ž×¨×™× ×©× ×§×¨×ו" #~ msgid "Mark All Read" #~ msgstr "סימון ×›×œ× × ×§×¨×" #~ msgid "Article" #~ msgstr "מ×מר" #~ msgid "Zoom In" #~ msgstr "התקרבות" #~ msgid "Zoom Out" #~ msgstr "התרחקות" #~ msgid "Reset Zoom" #~ msgstr "×יפוס התקריב" #~ msgid "Open in Browser" #~ msgstr "פתיחה בדפדפן" #~ msgid "Enter feed address to add" #~ msgstr "יש להזין כתובת ×”×–× ×” להוספה" #~ msgid "Add" #~ msgstr "הוספה" #~ msgid "You're already subscribed to that feed!" #~ msgstr "כבר נרשמת להזנה זו!" #~ msgid "Show Read Articles" #~ msgstr "הצגת מ××ž×¨×™× ×©× ×§×¨×ו" #~ msgid "Mark All as Read" #~ msgstr "סימון הכול כנקר×" #~ msgid "Mark All as Unread" #~ msgstr "סימון הכל ×›×œ× × ×§×¨×" #~ msgid "Show Empty Feeds" #~ msgstr "הצגת הזנות ריקות" #~ msgid "Import OPML" #~ msgstr "×™×™×‘×•× OPML" #~ msgid "Export OPML" #~ msgstr "×™×™×¦×•× OPML" #~ msgid "Preferences" #~ msgstr "העדפות" #~ msgid "Keyboard Shortcuts" #~ msgstr "צירופי מקשי×" #~ msgid "About Feeds" #~ msgstr "על הזנות" #~ msgid "Filter" #~ msgstr "מסנן" #~ msgid "Add Feed" #~ msgstr "הוספת ×”×–× ×”" #~ msgid "Menu" #~ msgstr "תפריט" #~ msgid "There Are Errors" #~ msgstr "יש שגי×ות" #~ msgid "New tag name…" #~ msgstr "×©× ×ª×’×™×ª חדש…" #~ msgid "Add Tag" #~ msgstr "הוספת תגית" #~ msgid "There are no tags yet" #~ msgstr "עוד ×ין תגיות" #~ msgid "Add some using the entry above" #~ msgstr "הוספה של כמה ב×מצעות השורה מעל" #~ msgid "Open in External Media Player" #~ msgstr "פתיחה בנגן מדיה חיצוני" #~ msgid "Copy Article Link" #~ msgstr "העתק קישור מ×מר" #~ msgid "Back to Articles" #~ msgstr "חזרה למ×מרי×" #~ msgid "Change View Mode" #~ msgstr "שינוי מצב תצוגה" #~ msgid "Let's get started" #~ msgstr "בו×ו נתחיל" #~ msgid "Add new feeds via URL" #~ msgstr "הוספת הזנות חדשות ב×מצעות כתובת URL" #~ msgid "Import an OPML file" #~ msgstr "×™×™×‘×•× ×§×•×‘×¥ OPML" #~ msgid "Manage Tags for Selected Feeds" #~ msgstr "ניהול תגיות עבור הזנות נבחרות" #~ msgid "Select/Unselect All" #~ msgstr "בחירת/ביטול בחירת הכול" #~ msgid "Delete Selected Feeds" #~ msgstr "מחיקת הזנות נבחרות" #~ msgid "Mark as Read" #~ msgstr "סימון כנקר×" #~ msgid "Select an article" #~ msgstr "בחירה מ×מר" #~ msgid "@prettyname@" #~ msgstr "@yoseforb@" #~ msgid "Gabriele Musco" #~ msgstr "Gabriele Musco" #~ msgid "Fixed view mode button" #~ msgstr "כפתור מצב תצוגה קבוע" #~ msgid "Option to open YouTube links with an external media player" #~ msgstr "×פשרות לפתוח קישורי YouTube ב×מצעות נגד מדיה חיצוני" #~ msgid "" #~ "Saved articles are no longer stored inside the cache directory, avoiding " #~ "accidental deletion" #~ msgstr "" #~ "מ××ž×¨×™× ×©×ž×•×¨×™× ×œ× ×ž××•×—×¡× ×™× ×™×•×ª×¨ בתיקיית המטמון, על מנת להימנע ממחיקה ×©×œ×”× " #~ "בטעות" #~ msgid "Feed icons improvements for high DPI screens" #~ msgstr "שיפור סמליל ×”×™×™×©×•× ×¢×‘×•×¨ ×ž×¡×›×™× ×¢× ×”×‘×—× ×” גבוהה" #~ msgid "UI improvements on phones" #~ msgstr "שיפורי מנשק משתמש בטלפוני×" #~ msgid "Switched to the new libhandy Avatar widget" #~ msgstr "מעבר ליישומון ×וט×ר חדש מ־libhandy" #~ msgid "Added Dutch translation courtesy of Heimen Stoffels" #~ msgstr "הוספת ×ª×¨×’×•× ×œ×”×•×œ× ×“×™×ª תודות ל־Heimen Stoffels" #~ msgid "Fixed searchbar" #~ msgstr "שורת חיפוש קבועה" #~ msgid "" #~ "New tags feature! You can now categorize your feeds by creating custom " #~ "tags" #~ msgstr "" #~ "יכולת תגיות חדשה! ניתן עכשיו לסדר לקטגוריות ×ת ההזנות שלך ב×מצעות יצירת " #~ "תגיות מות×מות" #~ msgid "RSS links can now be opened directly in Feeds to be imported" #~ msgstr "ניתן כעת לפתוח קישורי RSS ישירות בהזנות לייבו×" #~ msgid "Mark as read now only marks the currently visible feeds" #~ msgstr "סימון ×›× ×§×¨× ×¢×›×©×™×• מסמן רק ×ת ההזנות הגלויות" #~ msgid "Added support for the latest version of libhandy" #~ msgstr "הוספת תמיכה לגרסה ×”×חרונה של libhandy" #~ msgid "Improved message dialogs" #~ msgstr "שיפו הודעה בחלונות דו-שיח" #~ msgid "Performance improvements when importing OPML files" #~ msgstr "שיפורי ×‘×™×¦×•×¢×™× ×‘×™×™×‘×•× ×§×•×‘×¦×™ OPML" #~ msgid "Removed option to disable client side decoration" #~ msgstr "מחיקת ×פשרות להשבתת קישוטי צד לקוח" #~ msgid "" #~ "Don't remove feeds automatically if they have errors, instead ask the " #~ "user what to do" #~ msgstr "" #~ "הזנות ×œ× × ×ž×—×§×•×ª ב×ופן ×וטומטי ×× ×™×© שגי×ות, ×‘×ž×§×•× ×–×ת המשתמש נש×ל מה לעשות" #~ msgid "Updated Italian translation" #~ msgstr "עדכון ×ª×¨×’×•× ×œ×יטלקית" #~ msgid "Updated French translation" #~ msgstr "עדכון ×ª×¨×’×•× ×œ×¦×¨×¤×ª×™×ª" #~ msgid "Bug fixes" #~ msgstr "תיקוני תקלות" #~ msgid "Updated version number" #~ msgstr "עדכון מספר גרסה" #~ msgid "You can now add some feeds by just using the website URL" #~ msgstr "ניתן כעת להוסיף כמה הזנות רק על ידי שימוש בכתובת URL של ×תר ×ינטרנט" #~ msgid "New generated placeholder icon for feeds without one" #~ msgstr "יצירת סמליל מציין ×ž×™×§×•× ×—×“×© להזנות ×œ×œ× ×חד ×›×–×”" #~ msgid "Improved reader mode" #~ msgstr "שיפור מצב קרי××”" #~ msgid "Swipe left on your touchscreen to move back from an article" #~ msgstr "החלקה שמ×לה במסך לוח המגע שלך לחזרה ל×חור ממ×מר" #~ msgid "Code blocks in articles now have syntax highlighting" #~ msgstr "גושי קוד במ××ž×¨×™× ×ž×•×¦×’×™× ×›×¢×ª ×¢× ×”×“×’×©×ª תחביר" #~ msgid "Added French translation" #~ msgstr "הוספת ×ª×¨×’×•× ×œ×¦×¨×¤×ª×™×ª" #~ msgid "Removed the colored border left of the articles" #~ msgstr "הסרת צבע בגבול השמ×לי של המ×מרי×" #~ msgid "More keyboard shortcuts" #~ msgstr "עוד צירופי מקשי×" #~ msgid "Added option to refresh articles on startup" #~ msgstr "הוספת ×פשרות לרענון מ××ž×¨×™× ×¢× ×”×”×¤×¢×œ×”" #~ msgid "Updated to the GNOME 3.36 runtime" #~ msgstr "עדכון לזמן הריצה של GNOME 3.36" #~ msgid "Various improvements and bug fixes" #~ msgstr "מספר ×©×™×¤×•×¨×™× ×•×ª×™×§×•× ×™ תקלות" #~ msgid "Added loading progress bar" #~ msgstr "הוספת פס טעינה" #~ msgid "Added Spanish translation" #~ msgstr "הוספת ×ª×¨×’×•× ×œ×¡×¤×¨×“×™×ª" #~ msgid "Various UI improvements" #~ msgstr "מספר שיפור מנשק משתמש" #~ msgid "Performance improvements" #~ msgstr "שיפורי ביצועי×" #~ msgid "Various bug fixes" #~ msgstr "מספר תיקוני תקלות" #~ msgid "Load cached articles on startup" #~ msgstr "טעינת מטמון מ××ž×¨×™× ×‘×”×¤×¢×œ×”" #~ msgid "Added new view mode menu" #~ msgstr "הוספת תפריט חדש למצב תצוגה" #~ msgid "Added Brazilian Portuguese translation" #~ msgstr "הוספת ×ª×¨×’×•× ×œ×¤×•×¨×˜×•×’×–×™×ª ברזיל×ית" #~ msgid "Added Russian translation" #~ msgstr "הוספת ×ª×¨×’×•× ×œ×¨×•×¡×™×ª" #~ msgid "Option to ellipsize article titles for a more compact view" #~ msgstr "×פשרות " #~ msgid "Added a search function" #~ msgstr "הוספת ×פשרות חיפוש" #~ msgid "Updated dependencies" #~ msgstr "עדכון תלויות" #~ msgid "Errors with feeds are now shown in the UI" #~ msgstr "שגי×ות בהזנות כעת מוצגות במנשק המשתמש" #~ msgid "Big UI overhaul" #~ msgstr "שיפוץ נרחב למנשק המשתמש" #~ msgid "Updated translations" #~ msgstr "עדכוני תרגו×" #~ msgid "OPML file association" #~ msgstr "קישור קובץ OPML" #~ msgid "Changed left headerbar button order" #~ msgstr "שינוי סדר ×‘×›×¤×ª×•×¨×™× ×‘×©×¨×•×¨×ª הכותרת השמ×לית" #~ msgid "Optimization for updating feeds" #~ msgstr "שיפור ×‘×™×¦×•×¢×™× ×‘×¢×“×›×•×Ÿ הזנות" #~ msgid "Redesigned right click/longpress menu" #~ msgstr "עיצוב מחדש של לחיצה ימנית/לחיצה ×רוכה על תפריט" #~ msgid "Option to show/hide read articles" #~ msgstr "×פשרות להצגת/הסתרת מ××ž×¨×™× ×©× ×§×¨×ו" #~ msgid "Reworked suggestion bar" #~ msgstr "עבודה מחדש על שורת ההצעות" #~ msgid "Changed name to Feeds" #~ msgstr "שינוי ×©× ×œ×”×–× ×•×ª" #~ msgid "Improved CPU utilization" #~ msgstr "שיפור כלי מעבד" #~ msgid "New right click or longpress menu for articles" #~ msgstr "לחיצה ימנית ×ו לחיצה ×רוכה על תפריט למעבר למ×מרי×" #~ msgid "You can now save articles offline" #~ msgstr "ניתן כעת לשמור מ××ž×¨×™× ×œ×ž×¦×‘ ×œ× ×ž×§×•×•×Ÿ" #~ msgid "Initial suggestion to add feeds is now less intrusive" #~ msgstr "ההצעה הר×שונית להוספת הזנות כעת פחות מפריע" #~ msgid "Read articles are now greyed out" #~ msgstr "מ××ž×¨×™× ×©× ×§×¨×ו ×ž×¡×•×ž× ×™× ×¢×›×©×™×• ב×פור" #~ msgid "Concurrent feeds refresh, with customizable thread count" #~ msgstr "רענון הזנות במקביל, ×¢× ×פשרות הת×מה של מספר חוטי×" #~ msgid "Added German translation (thanks @Etamuk)" #~ msgstr "הוספת ×ª×¨×’×•× ×œ×’×¨×ž× ×™×ª (תודות ל־‎@Etamuk‎)" #~ msgid "Fix bugs in reader mode" #~ msgstr "תיקוני תקלות במצב קרי××”" #~ msgid "Minor bug fix" #~ msgstr "תיקוני תקלות קטני×" #~ msgid "Improved date and time parsing and display" #~ msgstr "שיפור ניתוח ת×ריך ושעה בתצוגה" #~ msgid "Reader mode can now work on websites without an article tag" #~ msgstr "מצב קרי××” עובד עכשיו ×’× ×‘×תרי ×ינטרנט ×œ×œ× ×ª×’×™×ª מ×מר" #~ msgid "Slight improvements to the icon" #~ msgstr "×©×™×¤×•×¨×™× ×§×œ×™× ×œ×¡×ž×œ×™×œ" #~ msgid "New feature to filter articles by feed" #~ msgstr "תכונה חדשה לסינון מ××ž×¨×™× ×œ×¤×™ ×”×–× ×”" #~ msgid "Improved favicon download" #~ msgstr "שיפור הורדה סמליל מועדף" #~ msgid "Fixed refresh duplicating articles" #~ msgstr "תיקון רענון כפול של מ×מרי×" #~ msgid "Added option to disable client side decoration" #~ msgstr "הוספת ×פשרות להשבתת קישוטי צד לקוח" #~ msgid "Brought primary menu in line with GNOME HIG" #~ msgstr "יישור קו של התפריט העיקרי ל־GNOME HIG" #~ msgid "Added placeholder icon for feeds without an icon" #~ msgstr "הוספת סמליל מציין ×ž×™×§×•× ×œ×”×–× ×•×ª ×œ×œ× ×¡×ž×œ×™×œ" #~ msgid "Migrated some widgets to Glade templates" #~ msgstr "מעבר של כמה ×™×™×©×•×ž×•× ×™× ×œ×ª×‘× ×™×•×ª Glade" #~ msgid "Option to use reader mode by default" #~ msgstr "×פשרות להשתמש במצב קרי××” בבררת מחדל" #~ msgid "Option to show article content from the feed" #~ msgstr "×פשרות להצגת תוכן מ×מר מההזנה" #~ msgid "Fixed labels alignment" #~ msgstr "תיקון יישור תוויות" #~ msgid "Changed app name to Feeds" #~ msgstr "שינוי ×©× ×”×™×™×©×•× ×œ×”×–× ×•×ª (Feeds)" #~ msgid "Added separators for the two sections of the app" #~ msgstr "הוספת ×ž×¤×¨×™×“×™× ×œ×©× ×™ ×”×ž×§×˜×¢×™× ×©×œ היישו×" #~ msgid "Using links as feed titles when there is no title" #~ msgstr "שימוש ×‘×§×™×©×•×¨×™× ×›×›×•×ª×¨×ª להזנה בזמן ש×ין כותרת" #~ msgid "Added preference for maximum article age" #~ msgstr "הוספת העדפה לזמן ×—×™×™× ×ž×¨×‘×™ למ×מר" #~ msgid "Added zoom keyboard shortcuts" #~ msgstr "הוספת צירופי ×ž×§×©×™× ×œ×ª×§×¨×™×‘" #~ msgid "Added preference to enable JavaScript" #~ msgstr "הוספת העדפה ל×פשור JavaScript" #~ msgid "Fix window control positions when they are on the left" #~ msgstr "תיקון ×ž×™×§×•× ×¤×§×“×™ חלון בשעה ×©×”× ×‘×¦×“ שמ×ל" #~ msgid "Feeds for websites without favicons will now work" #~ msgstr "הזנות ל×תר ×ינטרנט ×œ×œ× ×¡×ž×œ×™×œ תעבדנה עכשיו" #~ msgid "Fixed bug with adding new feeds" #~ msgstr "תיקון תקלה ×¢× ×”×•×¡×¤×ª הזנות חדשות" #~ msgid "Switched to native file chooser" #~ msgstr "מעבר לבוחר ×§×‘×¦×™× ×˜×‘×¢×™" #~ msgid "Added empty state initial screen for sidebar" #~ msgstr "הוספת מצב מסך ריק לסרגל הצד" #~ msgid "Added italian translation" #~ msgstr "הוספת ×ª×¨×’×•× ×œ×יטלקית" #~ msgid "First release" #~ msgstr "שחרור ר×שון" gfeeds-2.2.0/po/hu.po000066400000000000000000000435271440757451400143700ustar00rootroot00000000000000# Hungarian translations for gfeeds package. # Copyright (C) 2021, 2022, 2023 Free Software Foundation, Inc. # This file is distributed under the same license as the gfeeds package. # # Meskó Balázs , 2021, 2022. # Balázs Úr , 2022, 2023. msgid "" msgstr "" "Project-Id-Version: gfeeds master\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/gfeeds/issues\n" "POT-Creation-Date: 2023-03-11 08:34+0000\n" "PO-Revision-Date: 2023-03-11 10:27+0100\n" "Last-Translator: Balázs Úr \n" "Language-Team: Hungarian \n" "Language: hu\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 22.08.2\n" #: data/org.gabmus.gfeeds.appdata.xml.in:4 msgid "Feeds" msgstr "Hírforrások" #: data/org.gabmus.gfeeds.appdata.xml.in:6 data/org.gabmus.gfeeds.desktop.in:7 msgid "News reader for GNOME" msgstr "Hírolvasó a GNOME-hoz" #: data/org.gabmus.gfeeds.appdata.xml.in:15 msgid "" "Feeds is a minimal RSS/Atom feed reader built with speed and simplicity in " "mind." msgstr "" "A Hírforrások egy minimális RSS/Atom hírolvasó, amely a sebességre és az " "egyszerűségre törekedve készült." #: data/org.gabmus.gfeeds.appdata.xml.in:16 msgid "" "It offers a simple user interface that only shows the latest news from your " "subscriptions." msgstr "" "Egyszerű felhasználó felületet biztosít, amely csak a legfrissebb híreket " "jeleníti meg a feliratkozásai közül." #: data/org.gabmus.gfeeds.appdata.xml.in:17 msgid "" "Articles are shown in a web view by default, with javascript disabled for a " "faster and less intrusive user experience. There's also a reader mode " "included, built from the one GNOME Web/Epiphany uses." msgstr "" "A cikkek alapértelmezetten egy webnézetben jelennek meg, letiltott " "JavaScripttel a gyorsabb betöltés és a kevésbé tolakodó felhasználói élmény " "érdekében. Tartalmaz olvasó módot is, amely ugyanarra az összetevÅ‘re épül, " "mint amit a GNOME Web/Epiphany is használ." #: data/org.gabmus.gfeeds.appdata.xml.in:18 msgid "Feeds can be imported and exported via OPML." msgstr "A hírforrások OPML-bÅ‘l importálhatók és abba exportálhatók." #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/org.gabmus.gfeeds.desktop.in:16 msgid "rss;reader;feed;news;" msgstr "rss;olvasó;hírforrás;hírek;" #: data/ui/aboutdialog.ui.in:10 msgid "translator-credits" msgstr "" "Meskó Balázs , 2021, 2022.\n" "Úr Balázs , 2022." #: data/ui/add_feed_popover.blp:11 msgid "Enter feed address to add" msgstr "Adja meg a hozzáadandó hírforrás címét" #: data/ui/add_feed_popover.blp:26 msgid "Add" msgstr "Hozzáadás" #: data/ui/add_feed_popover.blp:32 msgid "You're already subscribed to that feed!" msgstr "Már feliratkozott erre a hírforrásra!" #: data/ui/empty_state.blp:7 msgid "Let's get started" msgstr "Kezdjen hozzá" #: data/ui/empty_state.blp:22 msgid "Add new feeds via URL" msgstr "Új hírforrások hozzáadása URL-lel" #: data/ui/empty_state.blp:27 msgid "Import an OPML file" msgstr "OPML-fájl importálása" #: data/ui/left_headerbar.blp:6 msgid "_Show Read Articles" msgstr "Olvasott cikkek meg_jelenítése" #: data/ui/left_headerbar.blp:7 msgid "Mark All as Read" msgstr "Összes megjelölése olvasottként" #: data/ui/left_headerbar.blp:8 msgid "Mark All as _Unread" msgstr "Összes megjelölése _olvasatlanként" #: data/ui/left_headerbar.blp:11 msgid "Show _Empty Feeds" msgstr "Ü_res hírforrások megjelenítése" #: data/ui/left_headerbar.blp:12 msgid "_Manage Feeds" msgstr "_Hírforrások kezelése" #: data/ui/left_headerbar.blp:13 msgid "_Import OPML" msgstr "OPML _importálása" #: data/ui/left_headerbar.blp:14 msgid "E_xport OPML" msgstr "OPML e_xportálása" #: data/ui/left_headerbar.blp:17 msgid "P_references" msgstr "_Beállítások" #: data/ui/left_headerbar.blp:18 msgid "_Keyboard Shortcuts" msgstr "_Gyorsbillentyűk" #: data/ui/left_headerbar.blp:19 msgid "_About Feeds" msgstr "A Hírforrások _névjegye" #: data/ui/left_headerbar.blp:28 msgid "Filter" msgstr "SzűrÅ‘" #: data/ui/left_headerbar.blp:32 msgid "Add Feed" msgstr "Hírforrás hozzáadása" #: data/ui/left_headerbar.blp:36 msgid "Menu" msgstr "Menü" #: data/ui/left_headerbar.blp:41 data/ui/shortcutsWindow.blp:35 msgid "Refresh" msgstr "Frissítés" #: data/ui/left_headerbar.blp:46 data/ui/shortcutsWindow.blp:39 msgid "Search" msgstr "Keresés" #: data/ui/left_headerbar.blp:50 msgid "There Are Errors" msgstr "Hibák találhatók" #: data/ui/main_leaflet.blp:40 msgid "Offline" msgstr "Kapcsolat nélkül" #: data/ui/manage_feeds_headerbar.blp:7 gfeeds/manage_feeds_window.py:257 msgid "Manage Feeds" msgstr "Hírforrások kezelése" #: data/ui/manage_feeds_headerbar.blp:11 msgid "Manage Tags for Selected Feeds" msgstr "Kiválasztott hírforrások címkéinek kezelése" #: data/ui/manage_feeds_headerbar.blp:16 msgid "Select/Unselect All" msgstr "Összes kiválasztása be/ki" #: data/ui/manage_feeds_headerbar.blp:21 msgid "Delete Selected Feeds" msgstr "Kiválasztott hírforrások törlése" #: data/ui/manage_tags_content.blp:17 msgid "New tag name…" msgstr "Új címke neve…" #: data/ui/manage_tags_content.blp:24 msgid "Add Tag" msgstr "Címke hozzáadása" #: data/ui/manage_tags_content.blp:39 msgid "There are no tags yet" msgstr "Még nincsenek címkék" #: data/ui/manage_tags_content.blp:40 msgid "Add some using the entry above" msgstr "Adjon hozzá párat a fenti beviteli mezÅ‘vel" #: data/ui/right_headerbar.blp:9 msgid "Open in _Browser" msgstr "Megnyitás _böngészÅ‘ben" #: data/ui/right_headerbar.blp:10 msgid "Open in External Media _Player" msgstr "Megnyitás külsÅ‘ média_lejátszóban" #: data/ui/right_headerbar.blp:11 msgid "_Copy Article Link" msgstr "Cikk hivatkozásának _másolása" #: data/ui/right_headerbar.blp:17 data/ui/right_headerbar.blp:96 msgid "View Mode" msgstr "Nézet mód" #: data/ui/right_headerbar.blp:19 msgid "Web View" msgstr "Webnézet" #: data/ui/right_headerbar.blp:24 msgid "Reader Mode" msgstr "Olvasó mód" #: data/ui/right_headerbar.blp:29 msgid "Feed Content" msgstr "Hírforrás tartalma" #: data/ui/right_headerbar.blp:44 data/ui/shortcutsWindow.blp:66 msgid "Zoom Out" msgstr "Kicsinyítés" #: data/ui/right_headerbar.blp:51 data/ui/shortcutsWindow.blp:70 msgid "Reset Zoom" msgstr "Nagyítás visszaállítása" #: data/ui/right_headerbar.blp:57 data/ui/shortcutsWindow.blp:62 msgid "Zoom In" msgstr "Nagyítás" #: data/ui/right_headerbar.blp:90 msgid "Back to Articles" msgstr "Vissza a cikkekhez" #: data/ui/shortcutsWindow.blp:9 gfeeds/preferences_window.py:24 msgid "General" msgstr "Ãltalános" #: data/ui/shortcutsWindow.blp:12 msgid "Open Keyboard Shortcuts" msgstr "Gyorsbillentyűk megnyitása" #: data/ui/shortcutsWindow.blp:16 msgid "Open Menu" msgstr "Menü megnyitása" #: data/ui/shortcutsWindow.blp:20 msgid "Open Preferences" msgstr "Beállítások megnyitása" #: data/ui/shortcutsWindow.blp:24 msgid "Open Filter" msgstr "SzűrÅ‘ megnyitása" #: data/ui/shortcutsWindow.blp:28 msgid "Quit" msgstr "Kilépés" #: data/ui/shortcutsWindow.blp:32 msgid "Article List" msgstr "Cikklista" #: data/ui/shortcutsWindow.blp:43 msgid "Next" msgstr "KövetkezÅ‘" #: data/ui/shortcutsWindow.blp:47 msgid "Previous" msgstr "ElÅ‘zÅ‘" #: data/ui/shortcutsWindow.blp:51 msgid "Show/Hide Read Articles" msgstr "Olvasott cikkek megjelenítése/elrejtése" #: data/ui/shortcutsWindow.blp:55 msgid "Mark All Read" msgstr "Összes megjelölése olvasottként" #: data/ui/shortcutsWindow.blp:59 msgid "Article" msgstr "Cikk" #: data/ui/shortcutsWindow.blp:74 data/ui/sidebar_listbox_row.blp:6 msgid "Open in Browser" msgstr "Megnyitás böngészÅ‘ben" #: data/ui/sidebar_listbox_row.blp:5 msgid "Mark as Read/Unread" msgstr "Megjelölés olvasottként/olvasatlanként" #: data/ui/webview.blp:12 msgid "Select an article" msgstr "Válasszon egy cikket" #: gfeeds/feed_item.py:59 #, python-brace-format msgid "Error: unable to parse datetime {0} for feeditem {1}" msgstr "Hiba: a(z) {0} dátum nem dolgozható fel ennél a hírforráselemnél: {1}" #: gfeeds/feed_parser.py:61 #, python-brace-format msgid "Errors while parsing feed `{0}`, URL: `{1}`" msgstr "Hibák történtek a(z) „{0}†hírforrás feldolgozásakor, URL: „{1}â€" #: gfeeds/feed_parser.py:75 #, python-brace-format #| msgid "Errors while parsing feed `{0}`, URL: `{1}`" msgid "Error decoding unicode data from feed `{0}`, URL: `{1}`" msgstr "" "Hiba a(z) „{0}†hírforrásból származó Unicode adatok dekódolásakor, URL: „{1}â€" #: gfeeds/feed_parser.py:82 #, python-brace-format #| msgid "Errors while parsing feed `{0}`, URL: `{1}`" msgid "Error extracting data from feed `{0}`, URL: `{1}`" msgstr "Hiba a(z) „{0}†hírforrásból származó adatok kinyerésekor, URL: „{1}â€" #: gfeeds/feed_parser.py:90 #, python-brace-format msgid "`{0}` may not be an RSS or Atom feed" msgstr "A(z) „{0}†lehet, hogy nem RSS vagy Atom hírforrás" #: gfeeds/feeds_manager.py:83 #, python-brace-format msgid "Feed {0} exists already, skipping" msgstr "A(z) „{0}†hírforrás már létezik, kihagyás" #: gfeeds/feeds_view.py:13 msgid "All feeds" msgstr "Összes hírforrás" #: gfeeds/headerbar.py:197 msgid "There were problems with some feeds. Do you want to remove them?" msgstr "Problémák voltak egyes hírforrásokkal. Szeretné eltávolítani azokat?" #: gfeeds/headerbar.py:202 msgid "_Keep" msgstr "_Megtartás" #: gfeeds/headerbar.py:204 msgid "_Remove" msgstr "_Eltávolítás" #: gfeeds/main_leaflet.py:114 #, python-brace-format msgid "{0} new article" msgid_plural "{0} new articles" msgstr[0] "{0} új cikk" msgstr[1] "{0} új cikk" #: gfeeds/__main__.py:232 msgid "Do you want to import these feeds?" msgstr "Szeretné importálni ezeket a hírforrásokat?" #: gfeeds/__main__.py:239 gfeeds/__main__.py:273 #: gfeeds/manage_feeds_window.py:324 msgid "_Cancel" msgstr "_Mégse" #: gfeeds/__main__.py:242 gfeeds/__main__.py:276 msgid "_Import" msgstr "_Importálás" #: gfeeds/__main__.py:269 msgid "Do you want to import this feed?" msgstr "Szeretné importálni ezt a hírforrást?" #: gfeeds/__main__.py:301 msgid "url" msgstr "URL" #: gfeeds/__main__.py:304 msgid "opml file local url or rss remote url to import" msgstr "importálandó helyi OPML-fájl vagy távoli RSS URL" #: gfeeds/manage_feeds_window.py:321 msgid "Do you want to delete these feeds?" msgstr "Szeretné törölni ezeket a hírforrásokat?" #: gfeeds/manage_feeds_window.py:326 msgid "_Delete" msgstr "_Törlés" #: gfeeds/opml_file_chooser.py:7 msgid "XML files" msgstr "XML-fájlok" #: gfeeds/opml_file_chooser.py:14 msgid "Choose an OPML file to import" msgstr "Válassza ki az importálandó OPML-fájlt" #: gfeeds/opml_file_chooser.py:18 msgid "Open" msgstr "Megnyitás" #: gfeeds/opml_file_chooser.py:19 gfeeds/opml_file_chooser.py:31 msgid "Cancel" msgstr "Mégse" #: gfeeds/opml_file_chooser.py:26 msgid "Choose where to save the exported OPML file" msgstr "Válassza ki, hogy hová mentse az exportálandó OPML-fájlt" #: gfeeds/opml_file_chooser.py:30 msgid "Save" msgstr "Mentés" #: gfeeds/preferences_window.py:27 msgid "General preferences" msgstr "Ãltalános beállítások" #: gfeeds/preferences_window.py:29 msgid "Show newer articles first" msgstr "Újabb cikkek megjelenítése elsÅ‘ként" #: gfeeds/preferences_window.py:34 msgid "Open links in your browser" msgstr "Hivatkozások megnyitása böngészÅ‘ben" #: gfeeds/preferences_window.py:38 msgid "Use external video player for YouTube" msgstr "KülsÅ‘ videólejátszó használata a YouTube-hoz" #: gfeeds/preferences_window.py:40 msgid "Requires youtube-dl and a compatible video player" msgstr "A youtube-dl és egy kompatibilis videólejátszó meglétét igényli" #: gfeeds/preferences_window.py:46 msgid "Preferred video player" msgstr "ElÅ‘nyben részesített videólejátszó" #: gfeeds/preferences_window.py:50 msgid "Maximum article age" msgstr "Cikkek legnagyobb életkora" #: gfeeds/preferences_window.py:51 msgid "In days" msgstr "Napokban" #: gfeeds/preferences_window.py:58 msgid "Refresh preferences" msgstr "Beállítások frissítése" #: gfeeds/preferences_window.py:60 msgid "Refresh articles on startup" msgstr "Cikkek frissítése indításkor" #: gfeeds/preferences_window.py:64 msgid "New articles notification" msgstr "Új cikkek értesítés" #: gfeeds/preferences_window.py:68 msgid "Enable auto-refresh" msgstr "Automatikus frissítés engedélyezése" #: gfeeds/preferences_window.py:72 msgid "Auto-refresh interval" msgstr "Automatikus frissítés idÅ‘köze" #: gfeeds/preferences_window.py:73 msgid "In seconds" msgstr "Másodpercben" #: gfeeds/preferences_window.py:80 msgid "Cache" msgstr "Gyorsítótár" #: gfeeds/preferences_window.py:82 msgid "Clear caches" msgstr "Gyorsítótárak törlése" #: gfeeds/preferences_window.py:83 msgid "Clear" msgstr "Törlés" #: gfeeds/preferences_window.py:109 msgid "Appearance" msgstr "Megjelenés" #: gfeeds/preferences_window.py:112 msgid "Appearance preferences" msgstr "Megjelenési beállítások" #: gfeeds/preferences_window.py:114 msgid "Dark mode" msgstr "Sötét mód" #: gfeeds/preferences_window.py:118 msgid "Reader mode theme" msgstr "Olvasó mód témája" #: gfeeds/preferences_window.py:122 msgid "Automatic" msgstr "Automatikus" #: gfeeds/preferences_window.py:122 msgid "Light" msgstr "Világos" #: gfeeds/preferences_window.py:122 msgid "Dark" msgstr "Sötét" #: gfeeds/preferences_window.py:126 msgid "Show article thumbnails" msgstr "Cikkek bélyegképeinek megjelenítése" #: gfeeds/preferences_window.py:131 msgid "Show full articles titles" msgstr "Teljes cikkcímek megjelenítése" #: gfeeds/preferences_window.py:136 msgid "Show full feeds names" msgstr "Teljes hírforrásnevek megjelenítése" #: gfeeds/preferences_window.py:143 msgid "Font preferences" msgstr "Betűkészlet beállításai" #: gfeeds/preferences_window.py:145 msgid "Use system font for titles" msgstr "Rendszer betűkészletének használata a címeknél" #: gfeeds/preferences_window.py:149 msgid "Use system font for paragraphs" msgstr "Rendszer betűkészletének használata a bekezdéseknél" #: gfeeds/preferences_window.py:153 msgid "Custom title font" msgstr "Egyéni betűkészlet a címhez" #: gfeeds/preferences_window.py:157 msgid "Custom paragraph font" msgstr "Egyéni betűkészlet a bekezdéshez" #: gfeeds/preferences_window.py:161 msgid "Custom monospace font" msgstr "Egyéni rögzített szélességű betűkészlet" #: gfeeds/preferences_window.py:173 msgid "Privacy" msgstr "Adatvédelem" #: gfeeds/preferences_window.py:177 msgid "Privacy preferences" msgstr "Adatvédelmi beállítások" #: gfeeds/preferences_window.py:179 msgid "Enable JavaScript" msgstr "JavaScript engedélyezése" #: gfeeds/preferences_window.py:184 msgid "Try to block advertisements" msgstr "Hirdetések tiltásának kísérlete" #: gfeeds/preferences_window.py:186 gfeeds/preferences_window.py:221 msgid "Requires app restart" msgstr "Az alkalmazás újraindítását igényli" #: gfeeds/preferences_window.py:190 msgid "Update advertisement blocking list" msgstr "Hirdetések tiltólistájának frissítése" #: gfeeds/preferences_window.py:191 msgid "Updates automatically every 10 days" msgstr "Automatikusan frissíti 10 naponként" #: gfeeds/preferences_window.py:192 msgid "Update" msgstr "Frissítés" #: gfeeds/preferences_window.py:205 msgid "Advanced" msgstr "Speciális" #: gfeeds/preferences_window.py:208 msgid "Advanced preferences" msgstr "Speciális beállítások" #: gfeeds/preferences_window.py:210 msgid "Maximum refresh threads" msgstr "Frissítési szálak legnagyobb száma" #: gfeeds/preferences_window.py:212 msgid "How many threads to use for feeds refresh" msgstr "Hány szálat használjon a hírforrások frissítéséhez" #: gfeeds/preferences_window.py:219 msgid "Experimental GtkListView for articles list" msgstr "Kísérleti GtkListView a cikkek listájához" #: gfeeds/preferences_window.py:227 msgid "Troubleshooting" msgstr "Hibaelhárítás" #: gfeeds/preferences_window.py:229 msgid "Export Configuration as JSON" msgstr "Beállítások exportálása JSON-ként" #: gfeeds/preferences_window.py:230 msgid "Attach this when reporting bugs" msgstr "Ennek csatolása a hibák jelentésekor" #: gfeeds/preferences_window.py:231 msgid "Export" msgstr "Exportálás" #. type: ignore #: gfeeds/preferences_window.py:244 msgid "Feeds Configuration" msgstr "Hírforrások beállításai" #: gfeeds/preferences_window.py:248 msgid "_Close" msgstr "_Bezárás" #: gfeeds/preferences_window.py:251 msgid "Cop_y" msgstr "_Másolás" #: gfeeds/util/download_manager.py:112 #, python-brace-format msgid "`{0}`: connection timed out" msgstr "„{0}â€: idÅ‘túllépés a kapcsolatban" #: gfeeds/util/download_manager.py:121 #, python-brace-format msgid "`{0}` might not be a valid address" msgstr "A „{0}†lehet, hogy nem érvényes cím" #: gfeeds/util/download_manager.py:161 #, python-brace-format msgid "Error downloading `{0}`, code `{1}`" msgstr "Hiba a(z) „{0}†letöltésekor, kód: „{1}â€" #: gfeeds/util/get_favicon.py:48 #, python-brace-format msgid "Error downloading favicon for `{0}`" msgstr "Hiba a(z) „{0}†böngészÅ‘ikonjának letöltésekor" #: gfeeds/util/opml_parser.py:33 msgid "Error: OPML path provided does not exist" msgstr "Hiba: A megadott OPML útvonal nem létezik" #: gfeeds/util/opml_parser.py:44 #, python-brace-format msgid "Error parsing OPML file `{0}`" msgstr "Hiba a(z) „{0}†OPML-fájl feldolgozásakor" #: gfeeds/webview.py:204 msgid "Link copied to clipboard!" msgstr "Hivatkozás a vágólapra másolva!" #: gfeeds/webview.py:226 msgid "Feed content not available for this article" msgstr "Nem érhetÅ‘ el hírforrástartalom ennél a cikknél" gfeeds-2.2.0/po/id.po000066400000000000000000000412571440757451400143460ustar00rootroot00000000000000# Indonesian translation for gfeeds. # Copyright (C) 2022 gfeeds's COPYRIGHT HOLDER # This file is distributed under the same license as the gfeeds package. # Kukuh Syafaat , 2022. # Andika Triwidada , 2023. # msgid "" msgstr "" "Project-Id-Version: gfeeds master\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/gfeeds/issues\n" "POT-Creation-Date: 2023-03-11 08:34+0000\n" "PO-Revision-Date: 2023-03-22 17:53+0700\n" "Last-Translator: Andika Triwidada \n" "Language-Team: Indonesian \n" "Language: id\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" "X-Generator: Poedit 3.2.2\n" #: data/org.gabmus.gfeeds.appdata.xml.in:4 msgid "Feeds" msgstr "Asupan" #: data/org.gabmus.gfeeds.appdata.xml.in:6 data/org.gabmus.gfeeds.desktop.in:7 msgid "News reader for GNOME" msgstr "Pembaca berita untuk GNOME" #: data/org.gabmus.gfeeds.appdata.xml.in:15 msgid "" "Feeds is a minimal RSS/Atom feed reader built with speed and simplicity in " "mind." msgstr "" "Asupan adalah pembaca asupan RSS/Atom minimal yang dibangun dengan " "mempertimbangkan kecepatan dan kesederhanaan." #: data/org.gabmus.gfeeds.appdata.xml.in:16 msgid "" "It offers a simple user interface that only shows the latest news from your " "subscriptions." msgstr "" "Ini menawarkan antarmuka pengguna sederhana yang hanya menampilkan berita " "terbaru dari langganan Anda." #: data/org.gabmus.gfeeds.appdata.xml.in:17 msgid "" "Articles are shown in a web view by default, with javascript disabled for a " "faster and less intrusive user experience. There's also a reader mode " "included, built from the one GNOME Web/Epiphany uses." msgstr "" "Artikel ditampilkan dalam tampilan web secara bawaan, dengan javascript " "dinonaktifkan untuk pengalaman pengguna yang lebih cepat dan tidak terlalu " "mengganggu. Ada juga mode pembaca yang disertakan, dibangun dari yang " "digunakan oleh Web/Epiphany GNOME." #: data/org.gabmus.gfeeds.appdata.xml.in:18 msgid "Feeds can be imported and exported via OPML." msgstr "Asupan dapat diimpor dan diekspor melalui OPML." #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/org.gabmus.gfeeds.desktop.in:16 msgid "rss;reader;feed;news;" msgstr "rss;pembaca;asupan;umpan;berita;" #: data/ui/aboutdialog.ui.in:10 msgid "translator-credits" msgstr "" "Kukuh Syafaat , 2022.\n" "Andika Triwidada , 2023." #: data/ui/add_feed_popover.blp:11 msgid "Enter feed address to add" msgstr "Masukkan alamat asupan untuk ditambahkan" #: data/ui/add_feed_popover.blp:26 msgid "Add" msgstr "Tambah" #: data/ui/add_feed_popover.blp:32 msgid "You're already subscribed to that feed!" msgstr "Anda sudah berlangganan asupan itu!" #: data/ui/empty_state.blp:7 msgid "Let's get started" msgstr "Mari kita mulai" #: data/ui/empty_state.blp:22 msgid "Add new feeds via URL" msgstr "Menambahkan asupan baru melalui URL" #: data/ui/empty_state.blp:27 msgid "Import an OPML file" msgstr "Galat mengurai berkas OPML" #: data/ui/left_headerbar.blp:6 msgid "_Show Read Articles" msgstr "_Tampilkan Artikel yang Telah Dibaca" #: data/ui/left_headerbar.blp:7 msgid "Mark All as Read" msgstr "Tandai Semua sebagai Sudah Dibaca" #: data/ui/left_headerbar.blp:8 msgid "Mark All as _Unread" msgstr "Tandai Semua sebagai Bel_um Dibaca" #: data/ui/left_headerbar.blp:11 msgid "Show _Empty Feeds" msgstr "Tampilkan Asupan K_osong" #: data/ui/left_headerbar.blp:12 msgid "_Manage Feeds" msgstr "Kelola Asupan" #: data/ui/left_headerbar.blp:13 msgid "_Import OPML" msgstr "_Impor OPML" #: data/ui/left_headerbar.blp:14 msgid "E_xport OPML" msgstr "E_kspor OPML" #: data/ui/left_headerbar.blp:17 msgid "P_references" msgstr "P_referensi" #: data/ui/left_headerbar.blp:18 msgid "_Keyboard Shortcuts" msgstr "Pintasan Papan _Ketik" #: data/ui/left_headerbar.blp:19 msgid "_About Feeds" msgstr "Tentang _Asupan" #: data/ui/left_headerbar.blp:28 msgid "Filter" msgstr "Tapis" #: data/ui/left_headerbar.blp:32 msgid "Add Feed" msgstr "Tambah Asupan" #: data/ui/left_headerbar.blp:36 msgid "Menu" msgstr "Menu" #: data/ui/left_headerbar.blp:41 data/ui/shortcutsWindow.blp:35 msgid "Refresh" msgstr "Segarkan" #: data/ui/left_headerbar.blp:46 data/ui/shortcutsWindow.blp:39 msgid "Search" msgstr "Cari" #: data/ui/left_headerbar.blp:50 msgid "There Are Errors" msgstr "Ada Kesalahan" #: data/ui/main_leaflet.blp:40 msgid "Offline" msgstr "Luring" #: data/ui/manage_feeds_headerbar.blp:7 gfeeds/manage_feeds_window.py:257 msgid "Manage Feeds" msgstr "Mengelola Asupan" #: data/ui/manage_feeds_headerbar.blp:11 msgid "Manage Tags for Selected Feeds" msgstr "Kelola Tag untuk Asupan yang Dipilih" #: data/ui/manage_feeds_headerbar.blp:16 msgid "Select/Unselect All" msgstr "Pilih/Batalkan Pilihan Semua" #: data/ui/manage_feeds_headerbar.blp:21 msgid "Delete Selected Feeds" msgstr "Hapus Asupan yang Dipilih" #: data/ui/manage_tags_content.blp:17 msgid "New tag name…" msgstr "Nama tag baru…" #: data/ui/manage_tags_content.blp:24 msgid "Add Tag" msgstr "Tambah Tag" #: data/ui/manage_tags_content.blp:39 msgid "There are no tags yet" msgstr "Belum ada tag" #: data/ui/manage_tags_content.blp:40 msgid "Add some using the entry above" msgstr "Tambahkan beberapa menggunakan entri di atas" #: data/ui/right_headerbar.blp:9 msgid "Open in _Browser" msgstr "Buka di Peram_ban" #: data/ui/right_headerbar.blp:10 msgid "Open in External Media _Player" msgstr "Buka di _Pemutar Media Eksternal" #: data/ui/right_headerbar.blp:11 msgid "_Copy Article Link" msgstr "_Salin Tautan Artikel" #: data/ui/right_headerbar.blp:17 data/ui/right_headerbar.blp:96 msgid "View Mode" msgstr "Mode Tampilan" #: data/ui/right_headerbar.blp:19 msgid "Web View" msgstr "Tampilan Web" #: data/ui/right_headerbar.blp:24 msgid "Reader Mode" msgstr "Mode Pembaca" #: data/ui/right_headerbar.blp:29 msgid "Feed Content" msgstr "Konten Asupan" #: data/ui/right_headerbar.blp:44 data/ui/shortcutsWindow.blp:66 msgid "Zoom Out" msgstr "Perkecil" #: data/ui/right_headerbar.blp:51 data/ui/shortcutsWindow.blp:70 msgid "Reset Zoom" msgstr "Setel Ulang Zoom" #: data/ui/right_headerbar.blp:57 data/ui/shortcutsWindow.blp:62 msgid "Zoom In" msgstr "Perbesar" #: data/ui/right_headerbar.blp:90 msgid "Back to Articles" msgstr "Kembali ke Artikel" #: data/ui/shortcutsWindow.blp:9 gfeeds/preferences_window.py:24 msgid "General" msgstr "Umum" #: data/ui/shortcutsWindow.blp:12 msgid "Open Keyboard Shortcuts" msgstr "Buka Pintasan Papan Tik" #: data/ui/shortcutsWindow.blp:16 msgid "Open Menu" msgstr "Buka Menu" #: data/ui/shortcutsWindow.blp:20 msgid "Open Preferences" msgstr "Buka Preferensi" #: data/ui/shortcutsWindow.blp:24 msgid "Open Filter" msgstr "Buka Filter" #: data/ui/shortcutsWindow.blp:28 msgid "Quit" msgstr "Keluar" #: data/ui/shortcutsWindow.blp:32 msgid "Article List" msgstr "Daftar Artikel" #: data/ui/shortcutsWindow.blp:43 msgid "Next" msgstr "Selanjutnya" #: data/ui/shortcutsWindow.blp:47 msgid "Previous" msgstr "Sebelumnya" #: data/ui/shortcutsWindow.blp:51 msgid "Show/Hide Read Articles" msgstr "Tampilkan/Sembunyikan Artikel yang Sudah Dibaca" #: data/ui/shortcutsWindow.blp:55 msgid "Mark All Read" msgstr "Tandai Semua Dibaca" #: data/ui/shortcutsWindow.blp:59 msgid "Article" msgstr "Artikel" #: data/ui/shortcutsWindow.blp:74 data/ui/sidebar_listbox_row.blp:6 msgid "Open in Browser" msgstr "Buka di Peramban" #: data/ui/sidebar_listbox_row.blp:5 msgid "Mark as Read/Unread" msgstr "Tandai sebagai Sudah/Belum Dibaca" #: data/ui/webview.blp:12 msgid "Select an article" msgstr "Pilih artikel" #: gfeeds/feed_item.py:59 #, python-brace-format msgid "Error: unable to parse datetime {0} for feeditem {1}" msgstr "Galat: tidak dapat mengurai datetime {0} untuk feeditem {1}" #: gfeeds/feed_parser.py:61 #, python-brace-format msgid "Errors while parsing feed `{0}`, URL: `{1}`" msgstr "Galat saat mengurai asupan '{0}', URL: '{1}'" #: gfeeds/feed_parser.py:75 #, python-brace-format msgid "Error decoding unicode data from feed `{0}`, URL: `{1}`" msgstr "Galat saat mengurai asupan '{0}', URL: '{1}'" #: gfeeds/feed_parser.py:82 #, python-brace-format msgid "Error extracting data from feed `{0}`, URL: `{1}`" msgstr "Galat saat mengurai asupan '{0}', URL: '{1}'" #: gfeeds/feed_parser.py:90 #, python-brace-format msgid "`{0}` may not be an RSS or Atom feed" msgstr "'{0}' mungkin bukan RSS atau asupan Atom" #: gfeeds/feeds_manager.py:83 #, python-brace-format msgid "Feed {0} exists already, skipping" msgstr "Asupan {0} sudah ada, melewati" #: gfeeds/feeds_view.py:13 msgid "All feeds" msgstr "Semua asupan" #: gfeeds/headerbar.py:197 msgid "There were problems with some feeds. Do you want to remove them?" msgstr "Ada masalah dengan beberapa asupan. Apakah Anda ingin menghapusnya?" #: gfeeds/headerbar.py:202 msgid "_Keep" msgstr "_Pertahankan" #: gfeeds/headerbar.py:204 msgid "_Remove" msgstr "_Hapus" #: gfeeds/main_leaflet.py:114 #, python-brace-format msgid "{0} new article" msgid_plural "{0} new articles" msgstr[0] "{0} artikel baru" #: gfeeds/__main__.py:232 msgid "Do you want to import these feeds?" msgstr "Apakah Anda ingin mengimpor asupan ini?" #: gfeeds/__main__.py:239 gfeeds/__main__.py:273 #: gfeeds/manage_feeds_window.py:324 msgid "_Cancel" msgstr "_Batal" #: gfeeds/__main__.py:242 gfeeds/__main__.py:276 msgid "_Import" msgstr "_Impor" #: gfeeds/__main__.py:269 msgid "Do you want to import this feed?" msgstr "Apakah Anda ingin mengimpor asupan ini?" #: gfeeds/__main__.py:301 msgid "url" msgstr "url" #: gfeeds/__main__.py:304 msgid "opml file local url or rss remote url to import" msgstr "opml berkas url lokal atau rss url jauh untuk mengimpor" #: gfeeds/manage_feeds_window.py:321 msgid "Do you want to delete these feeds?" msgstr "Apakah Anda ingin menghapus asupan ini?" #: gfeeds/manage_feeds_window.py:326 msgid "_Delete" msgstr "_Hapus" #: gfeeds/opml_file_chooser.py:7 msgid "XML files" msgstr "Berkas XML" #: gfeeds/opml_file_chooser.py:14 msgid "Choose an OPML file to import" msgstr "Pilih berkas OPML untuk diimpor" #: gfeeds/opml_file_chooser.py:18 msgid "Open" msgstr "Buka" #: gfeeds/opml_file_chooser.py:19 gfeeds/opml_file_chooser.py:31 msgid "Cancel" msgstr "Batal" #: gfeeds/opml_file_chooser.py:26 msgid "Choose where to save the exported OPML file" msgstr "Pilih tempat untuk menyimpan berkas OPML yang diekspor" #: gfeeds/opml_file_chooser.py:30 msgid "Save" msgstr "Simpan" #: gfeeds/preferences_window.py:27 msgid "General preferences" msgstr "Preferensi umum" #: gfeeds/preferences_window.py:29 msgid "Show newer articles first" msgstr "Tampilkan artikel yang lebih baru terlebih dahulu" #: gfeeds/preferences_window.py:34 msgid "Open links in your browser" msgstr "Buka tautan di peramban Anda" #: gfeeds/preferences_window.py:38 msgid "Use external video player for YouTube" msgstr "Gunakan pemutar video eksternal untuk YouTube" #: gfeeds/preferences_window.py:40 msgid "Requires youtube-dl and a compatible video player" msgstr "Membutuhkan youtube-dl dan pemutar video yang kompatibel" #: gfeeds/preferences_window.py:46 msgid "Preferred video player" msgstr "Pemutar video pilihan" #: gfeeds/preferences_window.py:50 msgid "Maximum article age" msgstr "Usia artikel maksimum" #: gfeeds/preferences_window.py:51 msgid "In days" msgstr "Dalam beberapa hari" #: gfeeds/preferences_window.py:58 msgid "Refresh preferences" msgstr "Preferensi penyegaran" #: gfeeds/preferences_window.py:60 msgid "Refresh articles on startup" msgstr "Segarkan artikel saat awal mulai" #: gfeeds/preferences_window.py:64 msgid "New articles notification" msgstr "Pemberitahuan artikel baru" #: gfeeds/preferences_window.py:68 msgid "Enable auto-refresh" msgstr "Aktifkan penyegaran otomatis" #: gfeeds/preferences_window.py:72 msgid "Auto-refresh interval" msgstr "Interval penyegaran otomatis" #: gfeeds/preferences_window.py:73 msgid "In seconds" msgstr "Dalam detik" #: gfeeds/preferences_window.py:80 msgid "Cache" msgstr "Singgahan" #: gfeeds/preferences_window.py:82 msgid "Clear caches" msgstr "Hapus singgahan" #: gfeeds/preferences_window.py:83 msgid "Clear" msgstr "Bersihkan" #: gfeeds/preferences_window.py:109 msgid "Appearance" msgstr "Penampilan" #: gfeeds/preferences_window.py:112 msgid "Appearance preferences" msgstr "Preferensi penampilan" #: gfeeds/preferences_window.py:114 msgid "Dark mode" msgstr "Mode gelap" #: gfeeds/preferences_window.py:118 msgid "Reader mode theme" msgstr "Tema mode pembaca" #: gfeeds/preferences_window.py:122 msgid "Automatic" msgstr "Otomatis" #: gfeeds/preferences_window.py:122 msgid "Light" msgstr "Terang" #: gfeeds/preferences_window.py:122 msgid "Dark" msgstr "Gelap" #: gfeeds/preferences_window.py:126 msgid "Show article thumbnails" msgstr "Tampilkan gambar mini artikel" #: gfeeds/preferences_window.py:131 msgid "Show full articles titles" msgstr "Tampilkan judul artikel lengkap" #: gfeeds/preferences_window.py:136 msgid "Show full feeds names" msgstr "Tampilkan nama asupan lengkap" #: gfeeds/preferences_window.py:143 msgid "Font preferences" msgstr "Preferensi fonta" #: gfeeds/preferences_window.py:145 msgid "Use system font for titles" msgstr "Gunakan fonta sistem untuk judul" #: gfeeds/preferences_window.py:149 msgid "Use system font for paragraphs" msgstr "Gunakan fonta sistem untuk paragraf" #: gfeeds/preferences_window.py:153 msgid "Custom title font" msgstr "Fonta judul ubahan" #: gfeeds/preferences_window.py:157 msgid "Custom paragraph font" msgstr "Fonta paragraf ubahan" #: gfeeds/preferences_window.py:161 msgid "Custom monospace font" msgstr "Fonta lebar seragam (monospace) ubahan" #: gfeeds/preferences_window.py:173 msgid "Privacy" msgstr "Privasi" #: gfeeds/preferences_window.py:177 msgid "Privacy preferences" msgstr "Preferensi privasi" #: gfeeds/preferences_window.py:179 msgid "Enable JavaScript" msgstr "Aktifkan JavaScript" #: gfeeds/preferences_window.py:184 msgid "Try to block advertisements" msgstr "Cobalah untuk memblokir iklan" #: gfeeds/preferences_window.py:186 gfeeds/preferences_window.py:221 msgid "Requires app restart" msgstr "Membutuhkan mulai ulang aplikasi" #: gfeeds/preferences_window.py:190 msgid "Update advertisement blocking list" msgstr "Pemutakhiran daftar pemblokiran iklan" #: gfeeds/preferences_window.py:191 msgid "Updates automatically every 10 days" msgstr "Pemutakhiran secara otomatis setiap 10 hari" #: gfeeds/preferences_window.py:192 msgid "Update" msgstr "Pemutakhiran" #: gfeeds/preferences_window.py:205 msgid "Advanced" msgstr "Tingkat Lanjut" #: gfeeds/preferences_window.py:208 msgid "Advanced preferences" msgstr "Preferensi lanjutan" #: gfeeds/preferences_window.py:210 msgid "Maximum refresh threads" msgstr "Thread maksimum penyegaran" #: gfeeds/preferences_window.py:212 msgid "How many threads to use for feeds refresh" msgstr "Berapa banyak thread yang akan digunakan untuk menyegarkan asupan" #: gfeeds/preferences_window.py:219 msgid "Experimental GtkListView for articles list" msgstr "Experimental GtkListView untuk daftar artikel" #: gfeeds/preferences_window.py:227 msgid "Troubleshooting" msgstr "Penyelesaian Masalah" #: gfeeds/preferences_window.py:229 msgid "Export Configuration as JSON" msgstr "Ekspor Konfigurasi sebagai JSON" #: gfeeds/preferences_window.py:230 msgid "Attach this when reporting bugs" msgstr "Lampirkan ini saat melaporkan kutu" #: gfeeds/preferences_window.py:231 msgid "Export" msgstr "Ekspor" #. type: ignore #: gfeeds/preferences_window.py:244 msgid "Feeds Configuration" msgstr "Konfigurasi Asupan" #: gfeeds/preferences_window.py:248 msgid "_Close" msgstr "_Tutup" #: gfeeds/preferences_window.py:251 msgid "Cop_y" msgstr "Sal_in" #: gfeeds/util/download_manager.py:112 #, python-brace-format msgid "`{0}`: connection timed out" msgstr "'{0}': waktu koneksi habis" #: gfeeds/util/download_manager.py:121 #, python-brace-format msgid "`{0}` might not be a valid address" msgstr "'{0}' mungkin bukan alamat yang valid" #: gfeeds/util/download_manager.py:161 #, python-brace-format msgid "Error downloading `{0}`, code `{1}`" msgstr "Galat mengunduh '{0}', kode '{1}'" #: gfeeds/util/get_favicon.py:48 #, python-brace-format msgid "Error downloading favicon for `{0}`" msgstr "Galat mengunduh favicon untuk '{0}'" #: gfeeds/util/opml_parser.py:33 msgid "Error: OPML path provided does not exist" msgstr "Galat: Path OPML yang disediakan tidak ada" #: gfeeds/util/opml_parser.py:44 #, python-brace-format msgid "Error parsing OPML file `{0}`" msgstr "Galat mengurai berkas OPML '{0}'" #: gfeeds/webview.py:204 msgid "Link copied to clipboard!" msgstr "Tautan disalin ke papan klip!" #: gfeeds/webview.py:226 msgid "Feed content not available for this article" msgstr "Konten asupan tidak tersedia untuk artikel ini" gfeeds-2.2.0/po/it.po000066400000000000000000001056171440757451400143670ustar00rootroot00000000000000# Italian translations for PACKAGE package. # Copyright (C) 2019 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the GNOME Feeds package. # Gabriele Musco , 2019-2022. # msgid "" msgstr "" "Project-Id-Version: unnamed project\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-03-25 14:38+0100\n" "PO-Revision-Date: 2022-10-02 19:12+0200\n" "Last-Translator: Gabriele Musco \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" "Plural-Forms: nplurals=2; plural=(n != 1)\n" "X-Generator: Gtranslator 42.0\n" #: ../gfeeds/feeds_view.py:13 msgid "All feeds" msgstr "Tutti i feed" #: ../gfeeds/feed_item.py:62 #, python-brace-format msgid "Error: unable to parse datetime {0} for feeditem {1}" msgstr "Errore: impossibile analizzare data e ora {0} per l'articolo {1}" #: ../gfeeds/feeds_manager.py:83 #, python-brace-format msgid "Feed {0} exists already, skipping" msgstr "Il feed {0} esiste già, lo salto" #: ../gfeeds/preferences_window.py:24 msgid "General" msgstr "Generale" #: ../gfeeds/preferences_window.py:27 msgid "General preferences" msgstr "Preferenze generali" #: ../gfeeds/preferences_window.py:29 msgid "Show newer articles first" msgstr "Mostra nuovi articoli per primi" #: ../gfeeds/preferences_window.py:34 msgid "Open links in your browser" msgstr "Apri link nel tuo browser" #: ../gfeeds/preferences_window.py:38 msgid "Use external video player for YouTube" msgstr "Usa un riproduttore video esterno per YouTube" #: ../gfeeds/preferences_window.py:40 msgid "Requires youtube-dl and a compatible video player" msgstr "Richiede youtube-dl ed un riproduttore video compatibile" #: ../gfeeds/preferences_window.py:46 msgid "Preferred video player" msgstr "Riproduttore video preferito" #: ../gfeeds/preferences_window.py:50 msgid "Maximum article age" msgstr "Età massima degli articoli" #: ../gfeeds/preferences_window.py:51 msgid "In days" msgstr "In giorni" #: ../gfeeds/preferences_window.py:58 msgid "Refresh preferences" msgstr "Preferenze di aggiornamento" #: ../gfeeds/preferences_window.py:60 msgid "Refresh articles on startup" msgstr "Aggiorna articoli all'avvio" #: ../gfeeds/preferences_window.py:64 msgid "New articles notification" msgstr "Notifiche per nuovi articoli" #: ../gfeeds/preferences_window.py:68 msgid "Enable auto-refresh" msgstr "Attiva ricarica automatica" #: ../gfeeds/preferences_window.py:72 msgid "Auto-refresh interval" msgstr "Intervallo per la ricarica automatica" #: ../gfeeds/preferences_window.py:73 msgid "In seconds" msgstr "In secondi" #: ../gfeeds/preferences_window.py:80 msgid "Cache" msgstr "Cache" #: ../gfeeds/preferences_window.py:82 msgid "Clear caches" msgstr "Pulisci le cache" #: ../gfeeds/preferences_window.py:83 msgid "Clear" msgstr "Pulisci" #: ../gfeeds/preferences_window.py:109 msgid "Appearance" msgstr "Aspetto" #: ../gfeeds/preferences_window.py:112 msgid "Appearance preferences" msgstr "Preferenze dell'aspetto" #: ../gfeeds/preferences_window.py:114 msgid "Dark mode" msgstr "Modalità scura" #: ../gfeeds/preferences_window.py:118 msgid "Reader mode theme" msgstr "Tema della modalità lettura" #: ../gfeeds/preferences_window.py:122 msgid "Automatic" msgstr "Automatico" #: ../gfeeds/preferences_window.py:122 msgid "Light" msgstr "Chiaro" #: ../gfeeds/preferences_window.py:122 msgid "Dark" msgstr "Scuro" #: ../gfeeds/preferences_window.py:126 msgid "Show article thumbnails" msgstr "Mostra miniature per gli articoli" #: ../gfeeds/preferences_window.py:131 msgid "Show full articles titles" msgstr "Mostra i titoli completi degli articoli" #: ../gfeeds/preferences_window.py:136 msgid "Show full feeds names" msgstr "Mostra nomi completi dei feed" #: ../gfeeds/preferences_window.py:143 msgid "Font preferences" msgstr "Preferenze dei caratteri" #: ../gfeeds/preferences_window.py:145 msgid "Use system font for titles" msgstr "Usa il carattere di sistema per i titoli" #: ../gfeeds/preferences_window.py:149 msgid "Use system font for paragraphs" msgstr "Usa il carattere di sistema per i paragrafi" #: ../gfeeds/preferences_window.py:153 msgid "Custom title font" msgstr "Carattere dei titoli personale" #: ../gfeeds/preferences_window.py:157 msgid "Custom paragraph font" msgstr "Carattere dei paragrafi personale" #: ../gfeeds/preferences_window.py:161 msgid "Custom monospace font" msgstr "Carattere a spaziatura fissa personale" #: ../gfeeds/preferences_window.py:173 msgid "Privacy" msgstr "Privacy" #: ../gfeeds/preferences_window.py:177 msgid "Privacy preferences" msgstr "Preferenze della privacy" #: ../gfeeds/preferences_window.py:179 msgid "Enable JavaScript" msgstr "Attiva JavaScript" #: ../gfeeds/preferences_window.py:184 msgid "Try to block advertisements" msgstr "Tenta di bloccare le pubblicità" #: ../gfeeds/preferences_window.py:186 ../gfeeds/preferences_window.py:221 msgid "Requires app restart" msgstr "Richiede un riavvio dell'app" #: ../gfeeds/preferences_window.py:190 msgid "Update advertisement blocking list" msgstr "Aggiorna lista di blocco delle pubblicità" #: ../gfeeds/preferences_window.py:191 msgid "Updates automatically every 10 days" msgstr "Si aggiorna automaticamente ogni 10 giorni" #: ../gfeeds/preferences_window.py:192 msgid "Update" msgstr "Aggiorna" #: ../gfeeds/preferences_window.py:205 msgid "Advanced" msgstr "Avanzate" #: ../gfeeds/preferences_window.py:208 msgid "Advanced preferences" msgstr "Preferenze avanzate" #: ../gfeeds/preferences_window.py:210 msgid "Maximum refresh threads" msgstr "Massimi thread per aggiornamento" #: ../gfeeds/preferences_window.py:212 msgid "How many threads to use for feeds refresh" msgstr "Quanti thread usare per aggiornare i feed" #: ../gfeeds/preferences_window.py:219 msgid "Experimental GtkListView for articles list" msgstr "GtkListView sperimentale per la lista degli articoli" #: ../gfeeds/preferences_window.py:227 msgid "Troubleshooting" msgstr "Risoluzione dei problemi" #: ../gfeeds/preferences_window.py:229 msgid "Export Configuration as JSON" msgstr "Esporta configurazione come JSON" #: ../gfeeds/preferences_window.py:230 msgid "Attach this when reporting bugs" msgstr "Allega questo quando segnali dei difetti" #: ../gfeeds/preferences_window.py:231 msgid "Export" msgstr "Esporta" #: ../gfeeds/preferences_window.py:244 msgid "Feeds Configuration" msgstr "Configurazione di Feeds" #: ../gfeeds/preferences_window.py:248 msgid "_Close" msgstr "_Chiudi" #: ../gfeeds/preferences_window.py:251 msgid "Cop_y" msgstr "Cop_ia" #: ../gfeeds/feed_parser.py:61 #, python-brace-format msgid "Errors while parsing feed `{0}`, URL: `{1}`" msgstr "Errori nell'analisi del feed `{0}`, URL: `{1}`" #: ../gfeeds/feed_parser.py:75 #, python-brace-format msgid "Error decoding unicode data from feed `{0}`, URL: `{1}`" msgstr "" #: ../gfeeds/feed_parser.py:82 #, python-brace-format msgid "Error extracting data from feed `{0}`, URL: `{1}`" msgstr "" #: ../gfeeds/feed_parser.py:90 #, python-brace-format msgid "`{0}` may not be an RSS or Atom feed" msgstr "`{0}` potrebbe non essere un feed RSS o Atom" #: ../gfeeds/webview.py:200 msgid "Link copied to clipboard!" msgstr "Link copiato negli appunti!" #: ../gfeeds/webview.py:222 msgid "Feed content not available for this article" msgstr "Contenuto del feed non disponibile per questo articolo" #: ../gfeeds/main_leaflet.py:114 #, python-brace-format msgid "{0} new article" msgid_plural "{0} new articles" msgstr[0] "{0} nuovo articolo" msgstr[1] "{0} nuovi articoli" #: ../gfeeds/opml_file_chooser.py:7 msgid "XML files" msgstr "File XML" #: ../gfeeds/opml_file_chooser.py:14 msgid "Choose an OPML file to import" msgstr "Scegli un file OPML da importare" #: ../gfeeds/opml_file_chooser.py:18 msgid "Open" msgstr "Apri" #: ../gfeeds/opml_file_chooser.py:19 ../gfeeds/opml_file_chooser.py:31 msgid "Cancel" msgstr "Annulla" #: ../gfeeds/opml_file_chooser.py:26 msgid "Choose where to save the exported OPML file" msgstr "Scegli dove salvare il file OPML esportato" #: ../gfeeds/opml_file_chooser.py:30 msgid "Save" msgstr "Salva" #: ../gfeeds/manage_feeds_window.py:257 msgid "Manage Feeds" msgstr "Gestisci feed" #: ../gfeeds/manage_feeds_window.py:321 msgid "Do you want to delete these feeds?" msgstr "Vuoi eliminare questi feed?" #: ../gfeeds/manage_feeds_window.py:324 ../gfeeds/__main__.py:239 #: ../gfeeds/__main__.py:273 msgid "_Cancel" msgstr "_Annulla" #: ../gfeeds/manage_feeds_window.py:326 msgid "_Delete" msgstr "_Elimina" #: ../gfeeds/headerbar.py:197 msgid "There were problems with some feeds. Do you want to remove them?" msgstr "Ci sono stati dei problemi con alcuni feed. Vuoi rimuoverli?" #: ../gfeeds/headerbar.py:202 msgid "_Keep" msgstr "_Mantieni" #: ../gfeeds/headerbar.py:204 msgid "_Remove" msgstr "_Rimuovi" #: ../gfeeds/__main__.py:232 msgid "Do you want to import these feeds?" msgstr "Vuoi importare questi feed?" #: ../gfeeds/__main__.py:242 ../gfeeds/__main__.py:276 msgid "_Import" msgstr "_Importa" #: ../gfeeds/__main__.py:269 msgid "Do you want to import this feed?" msgstr "Vuoi importare questo feed?" #: ../gfeeds/__main__.py:301 msgid "url" msgstr "url" #: ../gfeeds/__main__.py:304 msgid "opml file local url or rss remote url to import" msgstr "url locale del file opml o url rss remota da importare" #: ../gfeeds/util/opml_parser.py:33 msgid "Error: OPML path provided does not exist" msgstr "Errore: il percorso all'OPML fornito non esiste" #: ../gfeeds/util/opml_parser.py:44 #, python-brace-format msgid "Error parsing OPML file `{0}`" msgstr "Errore nell'analisi del file OPML `{0}`" #: ../gfeeds/util/build_reader_html.py:104 #, python-brace-format msgid "Author: {1}" msgstr "" #: ../gfeeds/util/build_reader_html.py:108 #, python-brace-format msgid "Author: {0}" msgstr "" #: ../gfeeds/util/download_manager.py:112 #, python-brace-format msgid "`{0}`: connection timed out" msgstr "`{0}`: timeout connessione" #: ../gfeeds/util/download_manager.py:121 #, python-brace-format msgid "`{0}` might not be a valid address" msgstr "`{0}` potrebbe non essere un indirizzo valido" #: ../gfeeds/util/download_manager.py:161 #, python-brace-format msgid "Error downloading `{0}`, code `{1}`" msgstr "Errore nel download di `{0}`, codice `{1}`" #: ../gfeeds/util/get_favicon.py:48 #, python-brace-format msgid "Error downloading favicon for `{0}`" msgstr "Errore nel download della favicon per `{0}`" #: ../data/ui/main_leaflet.blp:40 msgid "Offline" msgstr "Disconnesso" #: ../data/ui/left_headerbar.blp:6 msgid "_Show Read Articles" msgstr "Mo_stra articoli letti" #: ../data/ui/left_headerbar.blp:7 msgid "Mark All as Read" msgstr "Segna tutti come letti" #: ../data/ui/left_headerbar.blp:8 msgid "Mark All as _Unread" msgstr "Segna t_utti come non letti" #: ../data/ui/left_headerbar.blp:11 msgid "Show _Empty Feeds" msgstr "Mostra f_eed vuoti" #: ../data/ui/left_headerbar.blp:12 msgid "_Manage Feeds" msgstr "_Gestisci feed" #: ../data/ui/left_headerbar.blp:13 msgid "_Import OPML" msgstr "_Importa OPML" #: ../data/ui/left_headerbar.blp:14 msgid "E_xport OPML" msgstr "Esporta _OPML" #: ../data/ui/left_headerbar.blp:17 msgid "P_references" msgstr "P_referenze" #: ../data/ui/left_headerbar.blp:18 msgid "_Keyboard Shortcuts" msgstr "Scorciatoie da _tastiera" #: ../data/ui/left_headerbar.blp:19 msgid "_About Feeds" msgstr "Inform_azioni su Feeds" #: ../data/ui/left_headerbar.blp:28 msgid "Filter" msgstr "Filtra" #: ../data/ui/left_headerbar.blp:32 msgid "Add Feed" msgstr "Aggiungi feed" #: ../data/ui/left_headerbar.blp:36 msgid "Menu" msgstr "Menu" #: ../data/ui/left_headerbar.blp:41 ../data/ui/shortcutsWindow.blp:35 msgid "Refresh" msgstr "Ricarica" #: ../data/ui/left_headerbar.blp:46 ../data/ui/shortcutsWindow.blp:39 msgid "Search" msgstr "Cerca" #: ../data/ui/left_headerbar.blp:50 msgid "There Are Errors" msgstr "Ci sono errori" #: ../data/ui/sidebar_listbox_row.blp:5 msgid "Mark as Read/Unread" msgstr "Segna come letto/non letto" #: ../data/ui/sidebar_listbox_row.blp:6 ../data/ui/shortcutsWindow.blp:74 msgid "Open in Browser" msgstr "Apri nel browser" #: ../data/ui/manage_feeds_headerbar.blp:11 msgid "Manage Tags for Selected Feeds" msgstr "Gestisci i tag per i feed selezionati" #: ../data/ui/manage_feeds_headerbar.blp:16 msgid "Select/Unselect All" msgstr "Seleziona/deseleziona tutto" #: ../data/ui/manage_feeds_headerbar.blp:21 msgid "Delete Selected Feeds" msgstr "Elimina i feed selezionati" #: ../data/ui/right_headerbar.blp:9 msgid "Open in _Browser" msgstr "Apri nel _browser" #: ../data/ui/right_headerbar.blp:10 msgid "Open in External Media _Player" msgstr "Apri in un ri_produttore multimediale esterno" #: ../data/ui/right_headerbar.blp:11 msgid "_Copy Article Link" msgstr "_Copia collegamento dell'articolo" #: ../data/ui/right_headerbar.blp:17 ../data/ui/right_headerbar.blp:96 msgid "View Mode" msgstr "Modalità di Visualizzazione" #: ../data/ui/right_headerbar.blp:19 msgid "Web View" msgstr "Vista web" #: ../data/ui/right_headerbar.blp:24 msgid "Reader Mode" msgstr "Modalità lettura" #: ../data/ui/right_headerbar.blp:29 msgid "Feed Content" msgstr "Contenuto del feed" #: ../data/ui/right_headerbar.blp:44 ../data/ui/shortcutsWindow.blp:66 msgid "Zoom Out" msgstr "Riduci ingrandimento" #: ../data/ui/right_headerbar.blp:51 ../data/ui/shortcutsWindow.blp:70 msgid "Reset Zoom" msgstr "Reimposta ingrandimento" #: ../data/ui/right_headerbar.blp:57 ../data/ui/shortcutsWindow.blp:62 msgid "Zoom In" msgstr "Aumenta ingrandimento" #: ../data/ui/right_headerbar.blp:90 msgid "Back to Articles" msgstr "Torna agli articoli" #: ../data/ui/empty_state.blp:7 msgid "Let's get started" msgstr "Cominciamo" #: ../data/ui/empty_state.blp:22 msgid "Add new feeds via URL" msgstr "Aggiungi nuovi feed tramite URL" #: ../data/ui/empty_state.blp:27 msgid "Import an OPML file" msgstr "Importa un file OPML" #: ../data/ui/shortcutsWindow.blp:12 msgid "Open Keyboard Shortcuts" msgstr "Apri scorciatoie da tastiera" #: ../data/ui/shortcutsWindow.blp:16 msgid "Open Menu" msgstr "Apri menu" #: ../data/ui/shortcutsWindow.blp:20 msgid "Open Preferences" msgstr "Apri preferenze" #: ../data/ui/shortcutsWindow.blp:24 msgid "Open Filter" msgstr "Apri filtro" #: ../data/ui/shortcutsWindow.blp:28 msgid "Quit" msgstr "Esci" #: ../data/ui/shortcutsWindow.blp:32 msgid "Article List" msgstr "Lista Articoli" #: ../data/ui/shortcutsWindow.blp:43 msgid "Next" msgstr "Successivo" #: ../data/ui/shortcutsWindow.blp:47 msgid "Previous" msgstr "Precedente" #: ../data/ui/shortcutsWindow.blp:51 msgid "Show/Hide Read Articles" msgstr "Mostra/Nascondi Articoli Letti" #: ../data/ui/shortcutsWindow.blp:55 msgid "Mark All Read" msgstr "Segna Tutti come Letti" #: ../data/ui/shortcutsWindow.blp:59 msgid "Article" msgstr "Articolo" #: ../data/ui/add_feed_popover.blp:11 msgid "Enter feed address to add" msgstr "Inserisci l'indirizzo del feed da aggiungere" #: ../data/ui/add_feed_popover.blp:26 msgid "Add" msgstr "Aggiungi" #: ../data/ui/add_feed_popover.blp:32 msgid "You're already subscribed to that feed!" msgstr "Sei già iscritto a questo feed!" #: ../data/ui/manage_tags_content.blp:17 msgid "New tag name…" msgstr "Nuovo nome tag…" #: ../data/ui/manage_tags_content.blp:24 msgid "Add Tag" msgstr "Aggiungi tag" #: ../data/ui/manage_tags_content.blp:39 msgid "There are no tags yet" msgstr "Non ci sono ancora tag" #: ../data/ui/manage_tags_content.blp:40 msgid "Add some using the entry above" msgstr "Aggiungine alcuni usando il campo qui sopra" #: ../data/ui/webview.blp:12 msgid "Select an article" msgstr "Seleziona un articolo" #: ../data/ui/aboutdialog.ui.in:10 msgid "translator-credits" msgstr "Gabriele Musco " #: ../data/org.gabmus.gfeeds.desktop.in:6 msgid "@prettyname@" msgstr "" #: ../data/org.gabmus.gfeeds.desktop.in:7 msgid "News reader for GNOME" msgstr "Lettore di notizie per GNOME" #: ../data/org.gabmus.gfeeds.desktop.in:16 msgid "rss;reader;feed;news;" msgstr "rss;reader;feed;news;lettore;notizie;" #: ../data/org.gabmus.gfeeds.appdata.xml.in:4 msgid "Feeds" msgstr "Feeds" #: ../data/org.gabmus.gfeeds.appdata.xml.in:15 msgid "" "Feeds is a minimal RSS/Atom feed reader built with speed and simplicity in " "mind." msgstr "" "Feeds è un lettore di feed RSS/Atom costruito con la velocità e la " "semplicità in mente." #: ../data/org.gabmus.gfeeds.appdata.xml.in:16 msgid "" "It offers a simple user interface that only shows the latest news from your " "subscriptions." msgstr "" "Offre un'interfaccia utente che mostra solo le ultime notizie dalle tue " "iscrizioni." #: ../data/org.gabmus.gfeeds.appdata.xml.in:17 msgid "" "Articles are shown in a web view by default, with javascript disabled for a " "faster and less intrusive user experience. There's also a reader mode " "included, built from the one GNOME Web/Epiphany uses." msgstr "" "Gli articoli sono mostrati in una vista web come opzione predefinita, con " "javascript disattivato per un'esperienza utente più veloce e meno intrusiva. " "È anche inclusa una modalità lettura, costruita dalla stessa che usa GNOME " "Web/Epiphany." #: ../data/org.gabmus.gfeeds.appdata.xml.in:18 msgid "Feeds can be imported and exported via OPML." msgstr "I feed possono essere importati ed esportati tramite OPML." #: ../data/org.gabmus.gfeeds.appdata.xml.in:59 msgid "Article author in reader mode" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:60 msgid "Updated WebKit to API version 6.0" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:68 msgid "Improved configuration management" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:69 msgid "Refactoring around GObject property binding" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:70 msgid "Removed top/bottom margin in reader mode" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:71 msgid "Catch text decoding errors" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:79 msgid "Fix divide by zero issue when adding the first feed" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:87 msgid "Reader mode color scheme can adapt to system theme" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:88 msgid "Fix high CPU usage in web view" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:89 msgid "New message dialog" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:90 msgid "Can open articles in browser from right click menu" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:91 msgid "Added a progress bar to show loading state" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:92 msgid "Small UI improvements" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:93 msgid "Fixes for thumbnail extraction" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:94 msgid "Fix OPML export edge cases" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:95 #: ../data/org.gabmus.gfeeds.appdata.xml.in:245 msgid "Various improvements and bug fixes" msgstr "Vari miglioramenti e correzioni di bug" #: ../data/org.gabmus.gfeeds.appdata.xml.in:103 msgid "Links in the web view show a preview of the destination URL" msgstr "" "I collegamenti nella vista web mostrano un'anteprima dell'indirizzo di " "destinazione" #: ../data/org.gabmus.gfeeds.appdata.xml.in:104 msgid "Stability improvements related to article thumbnails" msgstr "Miglioramenti di stabilità legati alle miniature degli articoli" #: ../data/org.gabmus.gfeeds.appdata.xml.in:105 msgid "Reworked dialog windows" msgstr "Riviste le finestre di dialogo" #: ../data/org.gabmus.gfeeds.appdata.xml.in:106 msgid "Fixes for non-unicode character encodings" msgstr "Correzioni per codifiche dei caratteri non unicode" #: ../data/org.gabmus.gfeeds.appdata.xml.in:107 msgid "Fixes for importing OPML" msgstr "Correzioni per l'imporazione dell'OPML" #: ../data/org.gabmus.gfeeds.appdata.xml.in:108 msgid "Various bug fixes and improvements" msgstr "Varie correzioni di bug e miglioramenti" #: ../data/org.gabmus.gfeeds.appdata.xml.in:109 msgid "Code refactoring" msgstr "Refactoring del codice" #: ../data/org.gabmus.gfeeds.appdata.xml.in:117 #: ../data/org.gabmus.gfeeds.appdata.xml.in:125 msgid "Flatpak dependency fixes" msgstr "Correzioni per le dipendenze del Flatpak" #: ../data/org.gabmus.gfeeds.appdata.xml.in:133 msgid "Brand new look powered by GTK4 and Libadwaita" msgstr "Aspetto completamente nuovo basato su GTK4 e Libadwaita" #: ../data/org.gabmus.gfeeds.appdata.xml.in:134 msgid "Articles can have thumbnails" msgstr "Gli articoli possono avere delle miniature" #: ../data/org.gabmus.gfeeds.appdata.xml.in:135 msgid "New advertisement blocking feature" msgstr "Nuova funzione per il blocco delle pubblicità" #: ../data/org.gabmus.gfeeds.appdata.xml.in:136 msgid "Human friendly article date and time" msgstr "Data e ora degli articoli più comprensibili" #: ../data/org.gabmus.gfeeds.appdata.xml.in:137 msgid "Less intrusive feed error notification" msgstr "Notifica di errori nei feed meno intrusiva" #: ../data/org.gabmus.gfeeds.appdata.xml.in:138 msgid "Customizable reader mode fonts" msgstr "Caratteri personalizzabili per la modalità lettura" #: ../data/org.gabmus.gfeeds.appdata.xml.in:139 msgid "Empty feeds can be hidden" msgstr "I feed vuoti possono essere nascosti" #: ../data/org.gabmus.gfeeds.appdata.xml.in:140 msgid "New lightning fast C++ powered backend for feed parsing" msgstr "" "Nuovo backend veloce come un fulmine per l'analisi dei feed basato su C++" #: ../data/org.gabmus.gfeeds.appdata.xml.in:141 msgid "Experimental article list implementation using GtkListView" msgstr "" "Implementazione sperimentale della lista degli articoli basata su GtkListView" #: ../data/org.gabmus.gfeeds.appdata.xml.in:142 msgid "Removed saved articles feature" msgstr "Rimossa la funzione per salvare gli articoli" #: ../data/org.gabmus.gfeeds.appdata.xml.in:150 msgid "Fixed view mode button" msgstr "Corretto il tasto per la modalità di visualizzazione" #: ../data/org.gabmus.gfeeds.appdata.xml.in:151 msgid "Option to open YouTube links with an external media player" msgstr "" "Opzione per aprire i link di YouTube attraverso un riproduttore multimediale " "esterno" #: ../data/org.gabmus.gfeeds.appdata.xml.in:152 msgid "" "Saved articles are no longer stored inside the cache directory, avoiding " "accidental deletion" msgstr "" "Gli articoli salvati non sono più conservati nella cartella cache, evitando " "così l'eliminazione accidentale" #: ../data/org.gabmus.gfeeds.appdata.xml.in:160 msgid "Feed icons improvements for high DPI screens" msgstr "Miglioramenti alle icone dei feed per schermi ad alti DPI" #: ../data/org.gabmus.gfeeds.appdata.xml.in:168 msgid "UI improvements on phones" msgstr "Miglioramenti alla UI per telefoni" #: ../data/org.gabmus.gfeeds.appdata.xml.in:176 msgid "Switched to the new libhandy Avatar widget" msgstr "Passaggio al widget Avatar di libhandy" #: ../data/org.gabmus.gfeeds.appdata.xml.in:177 msgid "Added Dutch translation courtesy of Heimen Stoffels" msgstr "Aggiunta correzione olandese grazie a Heimen Stoffels" #: ../data/org.gabmus.gfeeds.appdata.xml.in:184 msgid "Fixed searchbar" msgstr "Corretta la barra di ricerca" #: ../data/org.gabmus.gfeeds.appdata.xml.in:192 msgid "" "New tags feature! You can now categorize your feeds by creating custom tags" msgstr "" "Nuova funzione tag! Ora puoi categorizzare i tuoi feed creando tag " "personalizzati" #: ../data/org.gabmus.gfeeds.appdata.xml.in:193 msgid "RSS links can now be opened directly in Feeds to be imported" msgstr "" "I link RSS possono ora essere aperti direttamente in Feeds per essere " "importati" #: ../data/org.gabmus.gfeeds.appdata.xml.in:194 msgid "Mark as read now only marks the currently visible feeds" msgstr "Segna come letto ora segna solo i feed correntemente visibili" #: ../data/org.gabmus.gfeeds.appdata.xml.in:195 msgid "Added support for the latest version of libhandy" msgstr "Aggiunto il supporto all'ultima versione di libhandy" #: ../data/org.gabmus.gfeeds.appdata.xml.in:196 msgid "Improved message dialogs" msgstr "Migliorate le finestre di dialogo" #: ../data/org.gabmus.gfeeds.appdata.xml.in:197 msgid "Performance improvements when importing OPML files" msgstr "Miglioramenti di prestazioni nell'importazione dei file OPML" #: ../data/org.gabmus.gfeeds.appdata.xml.in:198 msgid "Removed option to disable client side decoration" msgstr "Rimossa opzione per disattivare la decorazione lato client" #: ../data/org.gabmus.gfeeds.appdata.xml.in:205 msgid "" "Don't remove feeds automatically if they have errors, instead ask the user " "what to do" msgstr "" "Non rimuovere i feed automaticamente se hanno errori, invece chiedi " "all'utente cosa fare" #: ../data/org.gabmus.gfeeds.appdata.xml.in:206 #: ../data/org.gabmus.gfeeds.appdata.xml.in:228 msgid "Updated Italian translation" msgstr "Aggiornata la traduzione italiana" #: ../data/org.gabmus.gfeeds.appdata.xml.in:213 msgid "Updated French translation" msgstr "Aggiunta traduzione francese" #: ../data/org.gabmus.gfeeds.appdata.xml.in:220 msgid "Bug fixes" msgstr "Correzione bug" #: ../data/org.gabmus.gfeeds.appdata.xml.in:227 msgid "Updated version number" msgstr "Aggiornato il numero di versione" #: ../data/org.gabmus.gfeeds.appdata.xml.in:235 msgid "You can now add some feeds by just using the website URL" msgstr "Ora puoi aggiungere alcuni feed usando soltanto l'URL del sito web" #: ../data/org.gabmus.gfeeds.appdata.xml.in:236 msgid "New generated placeholder icon for feeds without one" msgstr "Nuova icona riempitiva generata per i feed che non ne hanno una" #: ../data/org.gabmus.gfeeds.appdata.xml.in:237 msgid "Improved reader mode" msgstr "Migliorata la modalità lettura" #: ../data/org.gabmus.gfeeds.appdata.xml.in:238 msgid "Swipe left on your touchscreen to move back from an article" msgstr "" "Scorri da sinistra nel tuo schermo touch per tornare indietro da un articolo" #: ../data/org.gabmus.gfeeds.appdata.xml.in:239 msgid "Code blocks in articles now have syntax highlighting" msgstr "" "I blocchi di codice negli articoli ora hanno l'evidenziazione della sintassi" #: ../data/org.gabmus.gfeeds.appdata.xml.in:240 msgid "Added French translation" msgstr "Aggiunta traduzione francese" #: ../data/org.gabmus.gfeeds.appdata.xml.in:241 msgid "Removed the colored border left of the articles" msgstr "Rimossi i blocchi di colore a sinistra degli articoli" #: ../data/org.gabmus.gfeeds.appdata.xml.in:242 msgid "More keyboard shortcuts" msgstr "Scorciatoie da tastiera aggiuntive" #: ../data/org.gabmus.gfeeds.appdata.xml.in:243 msgid "Added option to refresh articles on startup" msgstr "Aggiunta opzione per aggiornare gli articoli all'avvio" #: ../data/org.gabmus.gfeeds.appdata.xml.in:244 msgid "Updated to the GNOME 3.36 runtime" msgstr "Aggiornato il runtime a GNOME 3.36" #: ../data/org.gabmus.gfeeds.appdata.xml.in:252 msgid "Added loading progress bar" msgstr "Aggiunta barra di caricamento" #: ../data/org.gabmus.gfeeds.appdata.xml.in:253 msgid "Added Spanish translation" msgstr "Aggiunta traduzione in spagnolo" #: ../data/org.gabmus.gfeeds.appdata.xml.in:254 #: ../data/org.gabmus.gfeeds.appdata.xml.in:265 #: ../data/org.gabmus.gfeeds.appdata.xml.in:279 msgid "Various UI improvements" msgstr "Vari miglioramenti alla UI" #: ../data/org.gabmus.gfeeds.appdata.xml.in:255 #: ../data/org.gabmus.gfeeds.appdata.xml.in:266 msgid "Performance improvements" msgstr "Miglioramenti di prestazioni" #: ../data/org.gabmus.gfeeds.appdata.xml.in:256 #: ../data/org.gabmus.gfeeds.appdata.xml.in:267 #: ../data/org.gabmus.gfeeds.appdata.xml.in:280 #: ../data/org.gabmus.gfeeds.appdata.xml.in:290 #: ../data/org.gabmus.gfeeds.appdata.xml.in:305 #: ../data/org.gabmus.gfeeds.appdata.xml.in:316 #: ../data/org.gabmus.gfeeds.appdata.xml.in:369 msgid "Various bug fixes" msgstr "Varie correzioni di bug" #: ../data/org.gabmus.gfeeds.appdata.xml.in:263 msgid "Load cached articles on startup" msgstr "Carica articoli in cache all'avvio" #: ../data/org.gabmus.gfeeds.appdata.xml.in:264 msgid "Added new view mode menu" msgstr "Aggiunto nuovo menù di visualizzazione" #: ../data/org.gabmus.gfeeds.appdata.xml.in:268 msgid "Added Brazilian Portuguese translation" msgstr "Aggiunta traduzione in portoghese brasiliano" #: ../data/org.gabmus.gfeeds.appdata.xml.in:269 msgid "Added Russian translation" msgstr "Aggiunta traduzione in russo" #: ../data/org.gabmus.gfeeds.appdata.xml.in:276 msgid "Option to ellipsize article titles for a more compact view" msgstr "" "Opzione per tagliare i titoli degli articoli per una vista più compatta" #: ../data/org.gabmus.gfeeds.appdata.xml.in:277 msgid "Added a search function" msgstr "Aggiunta funzione di ricerca" #: ../data/org.gabmus.gfeeds.appdata.xml.in:278 msgid "Updated dependencies" msgstr "Aggiornate le dipendenze" #: ../data/org.gabmus.gfeeds.appdata.xml.in:287 msgid "Errors with feeds are now shown in the UI" msgstr "Gli errori nei feed sono ora mostrati nella UI" #: ../data/org.gabmus.gfeeds.appdata.xml.in:288 msgid "Big UI overhaul" msgstr "Grande revisione della UI" #: ../data/org.gabmus.gfeeds.appdata.xml.in:289 msgid "Updated translations" msgstr "Aggiornate le traduzioni" #: ../data/org.gabmus.gfeeds.appdata.xml.in:297 msgid "OPML file association" msgstr "Associazione ai file OPML" #: ../data/org.gabmus.gfeeds.appdata.xml.in:298 msgid "Changed left headerbar button order" msgstr "Cambiato l'ordine dei bottoni nella headerbar di sinistra" #: ../data/org.gabmus.gfeeds.appdata.xml.in:299 msgid "Optimization for updating feeds" msgstr "Ottimizzazioni per l'aggiornamento dei feed" #: ../data/org.gabmus.gfeeds.appdata.xml.in:300 msgid "Redesigned right click/longpress menu" msgstr "Ridisegnato il menu di click destro/pressione prolungata" #: ../data/org.gabmus.gfeeds.appdata.xml.in:301 msgid "Option to show/hide read articles" msgstr "Opzione per mostrare/nascondere gli articoli letti" #: ../data/org.gabmus.gfeeds.appdata.xml.in:302 msgid "Reworked suggestion bar" msgstr "Ristrutturata la barra dei suggerimenti" #: ../data/org.gabmus.gfeeds.appdata.xml.in:303 msgid "Changed name to Feeds" msgstr "Cambiato il nome a Feeds" #: ../data/org.gabmus.gfeeds.appdata.xml.in:304 msgid "Improved CPU utilization" msgstr "Migliorato l'uso della CPU" #: ../data/org.gabmus.gfeeds.appdata.xml.in:312 msgid "New right click or longpress menu for articles" msgstr "Nuovo menu di click destro o pressione prolungata per gli articoli" #: ../data/org.gabmus.gfeeds.appdata.xml.in:313 msgid "You can now save articles offline" msgstr "Ora puoi salvare gli articoli offline" #: ../data/org.gabmus.gfeeds.appdata.xml.in:314 msgid "Initial suggestion to add feeds is now less intrusive" msgstr "" "Il suggerimento iniziale di aggiungere nuovi feed adesso è meno intrusivo" #: ../data/org.gabmus.gfeeds.appdata.xml.in:315 msgid "Read articles are now greyed out" msgstr "Gli articoli letti ora sono mostrati in grigio" #: ../data/org.gabmus.gfeeds.appdata.xml.in:323 msgid "Concurrent feeds refresh, with customizable thread count" msgstr "" "Aggiornamento dei feed con concorrenza, con numero di thread personalizzabile" #: ../data/org.gabmus.gfeeds.appdata.xml.in:324 msgid "Added German translation (thanks @Etamuk)" msgstr "Aggiunta traduzione in tedesco (grazie @Etamuk)" #: ../data/org.gabmus.gfeeds.appdata.xml.in:331 msgid "Fix bugs in reader mode" msgstr "Corretti i bug nella modalità lettura" #: ../data/org.gabmus.gfeeds.appdata.xml.in:338 msgid "Minor bug fix" msgstr "Correzione di bug minori" #: ../data/org.gabmus.gfeeds.appdata.xml.in:345 msgid "Improved date and time parsing and display" msgstr "Migliorati analisi e rappresentazione di data e ora" #: ../data/org.gabmus.gfeeds.appdata.xml.in:346 msgid "Reader mode can now work on websites without an article tag" msgstr "La modalità lettura ora funziona su siti senza tag article" #: ../data/org.gabmus.gfeeds.appdata.xml.in:347 msgid "Slight improvements to the icon" msgstr "Leggeri miglioramenti all'icona" #: ../data/org.gabmus.gfeeds.appdata.xml.in:348 msgid "New feature to filter articles by feed" msgstr "Nuova funzione per filtrare gli articoli per feed" #: ../data/org.gabmus.gfeeds.appdata.xml.in:355 msgid "Improved favicon download" msgstr "Migliorato il download delle favicon" #: ../data/org.gabmus.gfeeds.appdata.xml.in:356 msgid "Fixed refresh duplicating articles" msgstr "Corretta la duplicazione degli articoli dovuta all'aggiornamento" #: ../data/org.gabmus.gfeeds.appdata.xml.in:363 msgid "Added option to disable client side decoration" msgstr "Aggiunta opzione per disattivare la decorazione client side" #: ../data/org.gabmus.gfeeds.appdata.xml.in:364 msgid "Brought primary menu in line with GNOME HIG" msgstr "Portato il menu primario in linea con il GNOME HIG" #: ../data/org.gabmus.gfeeds.appdata.xml.in:365 msgid "Added placeholder icon for feeds without an icon" msgstr "Aggiunta icona riempitiva per feed senza icona" #: ../data/org.gabmus.gfeeds.appdata.xml.in:366 msgid "Migrated some widgets to Glade templates" msgstr "Migrato alcuni widget a template Glade" #: ../data/org.gabmus.gfeeds.appdata.xml.in:367 msgid "Option to use reader mode by default" msgstr "Opzione per usare la modalità lettura come predefinita" #: ../data/org.gabmus.gfeeds.appdata.xml.in:368 msgid "Option to show article content from the feed" msgstr "Opzione per mostrare il contenuto dell'articolo dal feed" #: ../data/org.gabmus.gfeeds.appdata.xml.in:376 msgid "Fixed labels alignment" msgstr "Corretto l'allineamento del testo" #: ../data/org.gabmus.gfeeds.appdata.xml.in:377 msgid "Changed app name to Feeds" msgstr "Cambiato il nome dell'app a Feeds" #: ../data/org.gabmus.gfeeds.appdata.xml.in:378 msgid "Added separators for the two sections of the app" msgstr "Aggiunti separatori per le due sezioni dell'app" #: ../data/org.gabmus.gfeeds.appdata.xml.in:379 msgid "Using links as feed titles when there is no title" msgstr "Uso dei link come titoli dei feed quando non c'è titolo" #: ../data/org.gabmus.gfeeds.appdata.xml.in:380 msgid "Added preference for maximum article age" msgstr "Aggiunta preferenza per la massima età degli articoli" #: ../data/org.gabmus.gfeeds.appdata.xml.in:381 msgid "Added zoom keyboard shortcuts" msgstr "Aggiunte scorciatoie da tastiera per lo zoom" #: ../data/org.gabmus.gfeeds.appdata.xml.in:382 msgid "Added preference to enable JavaScript" msgstr "Aggiunta preferenza per attivare JavaScript" #: ../data/org.gabmus.gfeeds.appdata.xml.in:383 msgid "Fix window control positions when they are on the left" msgstr "" "Corretta la posizione dei controlli della finestra quando sono a sinistra" #: ../data/org.gabmus.gfeeds.appdata.xml.in:390 msgid "Feeds for websites without favicons will now work" msgstr "I feed per i siti senza favicon adesso funzioneranno" #: ../data/org.gabmus.gfeeds.appdata.xml.in:397 msgid "Fixed bug with adding new feeds" msgstr "Corretto un bug nell'aggiunta di nuovi feed" #: ../data/org.gabmus.gfeeds.appdata.xml.in:404 msgid "Switched to native file chooser" msgstr "Passato al selezionatore di file nativo" #: ../data/org.gabmus.gfeeds.appdata.xml.in:405 msgid "Added empty state initial screen for sidebar" msgstr "Aggiunta una schermata di stato vuoto iniziale per la barra laterale" #: ../data/org.gabmus.gfeeds.appdata.xml.in:406 msgid "Added italian translation" msgstr "Aggiunta traduzione italiana" #: ../data/org.gabmus.gfeeds.appdata.xml.in:413 msgid "First release" msgstr "Prima release" gfeeds-2.2.0/po/ko.po000066400000000000000000000461271440757451400143640ustar00rootroot00000000000000# Korean translations for gfeeds package. # Copyright (C) 2021 THE gfeeds'S COPYRIGHT HOLDER # This file is distributed under the same license as the gfeeds package. # 風間ã¡ãˆã‚‹ , 2021. # DaeHyun Sung , 2023. # msgid "" msgstr "" "Project-Id-Version: gfeeds 0.16.2\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/gfeeds/issues\n" "POT-Creation-Date: 2023-03-14 22:33+0000\n" "PO-Revision-Date: 2023-03-16 22:44+0900\n" "Last-Translator: DaeHyun Sung \n" "Language-Team: Korean \n" "Language: ko\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" "X-Generator: Poedit 3.2.2\n" #: data/org.gabmus.gfeeds.appdata.xml.in:4 msgid "Feeds" msgstr "피드" #: data/org.gabmus.gfeeds.appdata.xml.in:6 data/org.gabmus.gfeeds.desktop.in:7 msgid "News reader for GNOME" msgstr "그놈 ë°ìФí¬í†±ì„ 위한 뉴스 리ë”" #: data/org.gabmus.gfeeds.appdata.xml.in:15 msgid "" "Feeds is a minimal RSS/Atom feed reader built with speed and simplicity in " "mind." msgstr "피드는 빠르고 심플하고 가벼운 RSS/Atom 피드 리ë”기입니다." #: data/org.gabmus.gfeeds.appdata.xml.in:16 msgid "" "It offers a simple user interface that only shows the latest news from your " "subscriptions." msgstr "" "사용ìžê°€ 구ë…한 í”¼ë“œì˜ ìµœê·¼ 소ì‹ë§Œ 보여주는 간단한 ì¸í„°íŽ˜ì´ìŠ¤ë¥¼ 제공합니다." #: data/org.gabmus.gfeeds.appdata.xml.in:17 msgid "" "Articles are shown in a web view by default, with javascript disabled for a " "faster and less intrusive user experience. There's also a reader mode " "included, built from the one GNOME Web/Epiphany uses." msgstr "" "기사는 빠른 ì‚¬ìš©ìž ê²½í—˜ì„ ì œê³µí•˜ë ¤ë©´ 기본ì ìœ¼ë¡œ JavaScriptê°€ ë¹„í™œì„±í™”ëœ ì›¹ " "뷰로 표시ë˜ë©°, ë¯¿ì„ ë§Œí•˜ê³  빠른 ì‚¬ìš©ìž ê²½í—˜ì„ ì œê³µí•©ë‹ˆë‹¤. ë˜í•œ, 그놈 웹/ì—피" "파니ì—서 사용하는 ì½ê¸° ëª¨ë“œë„ í¬í•¨ë˜ì–´ 있습니다." #: data/org.gabmus.gfeeds.appdata.xml.in:18 msgid "Feeds can be imported and exported via OPML." msgstr "OPMLì„ í†µí•´ 피드를 불러오거나 내보낼 수 있습니다." #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/org.gabmus.gfeeds.desktop.in:16 msgid "rss;reader;feed;news;" msgstr "rss;reader;feed;news;리ë”;피드;뉴스;" #: data/ui/aboutdialog.ui.in:10 msgid "translator-credits" msgstr "성대현 " #: data/ui/add_feed_popover.blp:11 msgid "Enter feed address to add" msgstr "추가할 í”¼ë“œì˜ ì£¼ì†Œ ìž…ë ¥" #: data/ui/add_feed_popover.blp:26 msgid "Add" msgstr "추가" #: data/ui/add_feed_popover.blp:32 msgid "You're already subscribed to that feed!" msgstr "ì´ë¯¸ 구ë…ëœ í”¼ë“œìž…ë‹ˆë‹¤!" #: data/ui/empty_state.blp:7 msgid "Let's get started" msgstr "시작해보기" #: data/ui/empty_state.blp:22 msgid "Add new feeds via URL" msgstr "URL로 새 피드 추가하기" #: data/ui/empty_state.blp:27 msgid "Import an OPML file" msgstr "OPML 파ì¼ë¡œ 불러오기" #: data/ui/left_headerbar.blp:6 msgid "_Show Read Articles" msgstr "ì½ì€ 기사 ë³´ì´ê¸°(_S)" #: data/ui/left_headerbar.blp:7 msgid "Mark All as Read" msgstr "ëª¨ë‘ ì½ìŒìœ¼ë¡œ 표시" #: data/ui/left_headerbar.blp:8 msgid "Mark All as _Unread" msgstr "ëª¨ë‘ ì½ì§€ 않ìŒìœ¼ë¡œ 표시(_U)" #: data/ui/left_headerbar.blp:11 msgid "Show _Empty Feeds" msgstr "빈 피드 ë³´ì´ê¸°(_E)" #: data/ui/left_headerbar.blp:12 msgid "_Manage Feeds" msgstr "피드 관리(_M)" #: data/ui/left_headerbar.blp:13 msgid "_Import OPML" msgstr "OPML íŒŒì¼ ê°€ì ¸ì˜¤ê¸°(_I)" #: data/ui/left_headerbar.blp:14 msgid "E_xport OPML" msgstr "OPML íŒŒì¼ ë‚´ë³´ë‚´ê¸°(_X)" #: data/ui/left_headerbar.blp:17 msgid "P_references" msgstr "기본 설정(_R)" #: data/ui/left_headerbar.blp:18 msgid "_Keyboard Shortcuts" msgstr "키보드 바로 가기(_K)" #: data/ui/left_headerbar.blp:19 msgid "_About Feeds" msgstr "피드 ì •ë³´(_A)" #: data/ui/left_headerbar.blp:28 msgid "Filter" msgstr "검색조건" #: data/ui/left_headerbar.blp:32 msgid "Add Feed" msgstr "피드 추가" #: data/ui/left_headerbar.blp:36 msgid "Menu" msgstr "메뉴" #: data/ui/left_headerbar.blp:41 data/ui/shortcutsWindow.blp:35 msgid "Refresh" msgstr "새로 고침" #: data/ui/left_headerbar.blp:46 data/ui/shortcutsWindow.blp:39 msgid "Search" msgstr "검색" #: data/ui/left_headerbar.blp:50 msgid "There Are Errors" msgstr "오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤" #: data/ui/main_leaflet.blp:40 msgid "Offline" msgstr "오프ë¼ì¸" #: data/ui/manage_feeds_headerbar.blp:7 gfeeds/manage_feeds_window.py:257 msgid "Manage Feeds" msgstr "피드 관리" #: data/ui/manage_feeds_headerbar.blp:11 msgid "Manage Tags for Selected Feeds" msgstr "ì„ íƒëœ í”¼ë“œì˜ íƒœê·¸ 관리" #: data/ui/manage_feeds_headerbar.blp:16 msgid "Select/Unselect All" msgstr "ëª¨ë‘ ì„ íƒ/í•´ì œ" #: data/ui/manage_feeds_headerbar.blp:21 msgid "Delete Selected Feeds" msgstr "ì„ íƒëœ 피드 ì‚­ì œ" #: data/ui/manage_tags_content.blp:17 msgid "New tag name…" msgstr "새 태그 ì´ë¦„…" #: data/ui/manage_tags_content.blp:24 msgid "Add Tag" msgstr "태그 추가" #: data/ui/manage_tags_content.blp:39 msgid "There are no tags yet" msgstr "태그가 없습니다" #: data/ui/manage_tags_content.blp:40 msgid "Add some using the entry above" msgstr "ìœ„ì˜ í•­ëª©ì„ ì‚¬ìš©í•˜ì—¬ ì¼ë¶€ 추가" #: data/ui/right_headerbar.blp:9 msgid "Open in _Browser" msgstr "브ë¼ìš°ì €ì—서 ë§í¬ 열기(_B)" #: data/ui/right_headerbar.blp:10 msgid "Open in External Media _Player" msgstr "외부 미디어 플레ì´ì–´ì—서 열기(_P)" #: data/ui/right_headerbar.blp:11 msgid "_Copy Article Link" msgstr "기사 ë§í¬ 복사(_C)" #: data/ui/right_headerbar.blp:17 data/ui/right_headerbar.blp:96 msgid "View Mode" msgstr "보기 모드" #: data/ui/right_headerbar.blp:19 msgid "Web View" msgstr "웹 표시" #: data/ui/right_headerbar.blp:24 msgid "Reader Mode" msgstr "ì½ê¸° 모드" #: data/ui/right_headerbar.blp:29 msgid "Feed Content" msgstr "피드 ë‚´ìš©" #: data/ui/right_headerbar.blp:44 data/ui/shortcutsWindow.blp:66 msgid "Zoom Out" msgstr "축소" #: data/ui/right_headerbar.blp:51 data/ui/shortcutsWindow.blp:70 msgid "Reset Zoom" msgstr "í¬ê¸° 초기화" #: data/ui/right_headerbar.blp:57 data/ui/shortcutsWindow.blp:62 msgid "Zoom In" msgstr "확대" #: data/ui/right_headerbar.blp:90 msgid "Back to Articles" msgstr "기사로 ëŒì•„가기" #: data/ui/shortcutsWindow.blp:9 gfeeds/preferences_window.py:24 msgid "General" msgstr "ì¼ë°˜" #: data/ui/shortcutsWindow.blp:12 msgid "Open Keyboard Shortcuts" msgstr "키보드 바로 가기 열기" #: data/ui/shortcutsWindow.blp:16 msgid "Open Menu" msgstr "메뉴 열기" #: data/ui/shortcutsWindow.blp:20 msgid "Open Preferences" msgstr "기본 설정 열기" #: data/ui/shortcutsWindow.blp:24 msgid "Open Filter" msgstr "검색조건 열기" #: data/ui/shortcutsWindow.blp:28 msgid "Quit" msgstr "ë내기" #: data/ui/shortcutsWindow.blp:32 msgid "Article List" msgstr "기사 목ë¡" #: data/ui/shortcutsWindow.blp:43 msgid "Next" msgstr "다ìŒ" #: data/ui/shortcutsWindow.blp:47 msgid "Previous" msgstr "ì´ì „" #: data/ui/shortcutsWindow.blp:51 msgid "Show/Hide Read Articles" msgstr "ì½ì€ 기사 ë³´ì´ê¸°/숨기기" #: data/ui/shortcutsWindow.blp:55 msgid "Mark All Read" msgstr "ëª¨ë‘ ì½ìŒ 표시" #: data/ui/shortcutsWindow.blp:59 msgid "Article" msgstr "기사" #: data/ui/shortcutsWindow.blp:74 data/ui/sidebar_listbox_row.blp:6 msgid "Open in Browser" msgstr "브ë¼ìš°ì €ë¡œ 열기" #: data/ui/sidebar_listbox_row.blp:5 msgid "Mark as Read/Unread" msgstr "ì½ìŒ/ì½ì§€ 않ìŒìœ¼ë¡œ 표시" #: data/ui/webview.blp:12 msgid "Select an article" msgstr "기사를 ì„ íƒí•˜ì‹­ì‹œì˜¤" #: gfeeds/feed_item.py:59 #, python-brace-format msgid "Error: unable to parse datetime {0} for feeditem {1}" msgstr "오류: {0}ì— ìžˆëŠ” 항목 {1}ì˜ ì‹œê°„ì„ íŒŒì‹±í•  수 ì—†ìŒ" #: gfeeds/feed_parser.py:61 #, python-brace-format msgid "Errors while parsing feed `{0}`, URL: `{1}`" msgstr "파싱하는 중 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤. 피드 ‘{0}’, URL: `{1}`" #: gfeeds/feed_parser.py:75 #, python-brace-format msgid "Error decoding unicode data from feed `{0}`, URL: `{1}`" msgstr "유니코드 ë°ì´í„° 디코딩 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤. 피드 ‘{0}’, URL: `{1}`" #: gfeeds/feed_parser.py:82 #, python-brace-format msgid "Error extracting data from feed `{0}`, URL: `{1}`" msgstr "ë°ì´í„° 추출 중 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤. 피드 ‘{0}’, URL: `{1}`" #: gfeeds/feed_parser.py:90 #, python-brace-format msgid "`{0}` may not be an RSS or Atom feed" msgstr "'{0}'ì€ RSS ë° ì•„í†° 피드가 ì•„ë‹ ìˆ˜ 있습니다" #: gfeeds/feeds_manager.py:83 #, python-brace-format msgid "Feed {0} exists already, skipping" msgstr "피드 {0}ì´ ì´ë¯¸ 존재함, 건너뜀" #: gfeeds/feeds_view.py:13 msgid "All feeds" msgstr "모든 피드" #: gfeeds/headerbar.py:197 msgid "There were problems with some feeds. Do you want to remove them?" msgstr "" "몇몇 í”¼ë“œì— ë¬¸ì œê°€ 있는 ê±° 같습니다.\n" "제거하시겠습니까?" #: gfeeds/headerbar.py:202 msgid "_Keep" msgstr "ë³´ê´€(_K)" #: gfeeds/headerbar.py:204 msgid "_Remove" msgstr "제거(_R)" #: gfeeds/main_leaflet.py:114 #, python-brace-format msgid "{0} new article" msgid_plural "{0} new articles" msgstr[0] "새 기사 {0}ê°œ" #: gfeeds/__main__.py:232 msgid "Do you want to import these feeds?" msgstr "ì´ í”¼ë“œë¥¼ 불러오겠습니까?" #: gfeeds/__main__.py:239 gfeeds/__main__.py:273 #: gfeeds/manage_feeds_window.py:324 msgid "_Cancel" msgstr "취소(_C)" #: gfeeds/__main__.py:242 gfeeds/__main__.py:276 msgid "_Import" msgstr "가져오기(_I)" #: gfeeds/__main__.py:269 msgid "Do you want to import this feed?" msgstr "ì´ í”¼ë“œë¥¼ 불러오겠습니까?" #: gfeeds/__main__.py:301 msgid "url" msgstr "url" #: gfeeds/__main__.py:304 msgid "opml file local url or rss remote url to import" msgstr "로컬 URL ë˜ëŠ” RSS ì›ê²© URLì´ ë‹´ê¸´ OPML 파ì¼ì„ 불러오기" #: gfeeds/manage_feeds_window.py:321 msgid "Do you want to delete these feeds?" msgstr "ì´ í”¼ë“œë¥¼ 삭제하시겠습니까?" #: gfeeds/manage_feeds_window.py:326 msgid "_Delete" msgstr "ì‚­ì œ(_D)" #: gfeeds/opml_file_chooser.py:7 msgid "XML files" msgstr "XML 파ì¼" #: gfeeds/opml_file_chooser.py:14 msgid "Choose an OPML file to import" msgstr "불러올 OPML íŒŒì¼ ì„ íƒ" #: gfeeds/opml_file_chooser.py:18 msgid "Open" msgstr "열기" #: gfeeds/opml_file_chooser.py:19 gfeeds/opml_file_chooser.py:31 msgid "Cancel" msgstr "취소" #: gfeeds/opml_file_chooser.py:26 msgid "Choose where to save the exported OPML file" msgstr "내보낸 OPML 파ì¼ì„ 저장할 위치 ì„ íƒ" #: gfeeds/opml_file_chooser.py:30 msgid "Save" msgstr "저장" #: gfeeds/preferences_window.py:27 msgid "General preferences" msgstr "ì¼ë°˜ 설정" #: gfeeds/preferences_window.py:29 msgid "Show newer articles first" msgstr "새 기사 먼저 보기" #: gfeeds/preferences_window.py:34 msgid "Open links in your browser" msgstr "브ë¼ìš°ì €ì—서 ë§í¬ 열기" #: gfeeds/preferences_window.py:38 msgid "Use external video player for YouTube" msgstr "비디오 플레ì´ì–´ë¡œ 유튜브 ë§í¬ 열기" #: gfeeds/preferences_window.py:40 msgid "Requires youtube-dl and a compatible video player" msgstr "youtube-dl ë° í˜¸í™˜ë˜ëŠ” 비디오 플레ì´ì–´ê°€ 필요합니다" #: gfeeds/preferences_window.py:46 msgid "Preferred video player" msgstr "선호하는 미디어 재ìƒê¸°" #: gfeeds/preferences_window.py:50 msgid "Maximum article age" msgstr "최대 기사 수" #: gfeeds/preferences_window.py:51 msgid "In days" msgstr "매ì¼" #: gfeeds/preferences_window.py:58 msgid "Refresh preferences" msgstr "기본 설정 새로고침" #: gfeeds/preferences_window.py:60 msgid "Refresh articles on startup" msgstr "시작 시 기사 새로고침" #: gfeeds/preferences_window.py:64 msgid "New articles notification" msgstr "새 기사 알림" #: gfeeds/preferences_window.py:68 msgid "Enable auto-refresh" msgstr "ìžë™ 새로고침 활성화" #: gfeeds/preferences_window.py:72 msgid "Auto-refresh interval" msgstr "ìžë™ 새로고침 간격" #: gfeeds/preferences_window.py:73 msgid "In seconds" msgstr "매 초마다" #: gfeeds/preferences_window.py:80 msgid "Cache" msgstr "ìºì‹œ" #: gfeeds/preferences_window.py:82 msgid "Clear caches" msgstr "ìºì‹œ 지우기" #: gfeeds/preferences_window.py:83 msgid "Clear" msgstr "지우기" #: gfeeds/preferences_window.py:109 msgid "Appearance" msgstr "모양" #: gfeeds/preferences_window.py:112 msgid "Appearance preferences" msgstr "모양 설정" #: gfeeds/preferences_window.py:114 msgid "Dark mode" msgstr "ë‹¤í¬ ëª¨ë“œ" #: gfeeds/preferences_window.py:118 msgid "Reader mode theme" msgstr "ì½ê¸° 모드 테마" #: gfeeds/preferences_window.py:122 msgid "Automatic" msgstr "ìžë™" #: gfeeds/preferences_window.py:122 msgid "Light" msgstr "ë¼ì´íЏ" #: gfeeds/preferences_window.py:122 msgid "Dark" msgstr "다í¬" #: gfeeds/preferences_window.py:126 msgid "Show article thumbnails" msgstr "기사 ì„¬ë„¤ì¼ í‘œì‹œ" #: gfeeds/preferences_window.py:131 msgid "Show full articles titles" msgstr "ê¸°ì‚¬ì˜ ì „ì²´ ì´ë¦„ 보기" #: gfeeds/preferences_window.py:136 msgid "Show full feeds names" msgstr "í”¼ë“œì˜ ì „ì²´ ì´ë¦„ 보기" #: gfeeds/preferences_window.py:143 msgid "Font preferences" msgstr "글꼴 기본 설정" #: gfeeds/preferences_window.py:145 msgid "Use system font for titles" msgstr "ì œëª©ì— ì‹œìŠ¤í…œ 글꼴 사용" #: gfeeds/preferences_window.py:149 msgid "Use system font for paragraphs" msgstr "단ë½ì— 시스템 글꼴 사용" #: gfeeds/preferences_window.py:153 msgid "Custom title font" msgstr "ì‚¬ìš©ìž ì§€ì • 제목 글꼴" #: gfeeds/preferences_window.py:157 msgid "Custom paragraph font" msgstr "ì‚¬ìš©ìž ì§€ì • ë‹¨ë½ ê¸€ê¼´" #: gfeeds/preferences_window.py:161 msgid "Custom monospace font" msgstr "ì‚¬ìš©ìž ì§€ì • ê³ ì •í­ ê¸€ê¼´" #: gfeeds/preferences_window.py:173 msgid "Privacy" msgstr "ê°œì¸ì •ë³´" #: gfeeds/preferences_window.py:177 msgid "Privacy preferences" msgstr "ê°œì¸ì •ë³´ 설정" #: gfeeds/preferences_window.py:179 msgid "Enable JavaScript" msgstr "JavaScript 활성화" #: gfeeds/preferences_window.py:184 msgid "Try to block advertisements" msgstr "ê´‘ê³  차단 시ë„" #: gfeeds/preferences_window.py:186 gfeeds/preferences_window.py:221 msgid "Requires app restart" msgstr "í”„ë¡œê·¸ëž¨ì„ ë‹¤ì‹œ 시작해야 합니다" #: gfeeds/preferences_window.py:190 msgid "Update advertisement blocking list" msgstr "ê´‘ê³  차단 ëª©ë¡ ì—…ë°ì´íЏ" #: gfeeds/preferences_window.py:191 msgid "Updates automatically every 10 days" msgstr "매 10ì¼ë§ˆë‹¤ ìžë™ ì—…ë°ì´íЏ" #: gfeeds/preferences_window.py:192 msgid "Update" msgstr "ì—…ë°ì´íЏ" #: gfeeds/preferences_window.py:205 msgid "Advanced" msgstr "고급" #: gfeeds/preferences_window.py:208 msgid "Advanced preferences" msgstr "고급 설정" #: gfeeds/preferences_window.py:210 msgid "Maximum refresh threads" msgstr "최대 새로고침 스레드" #: gfeeds/preferences_window.py:212 msgid "How many threads to use for feeds refresh" msgstr "피드를 새로 ê³ ì¹  스레드 수" #: gfeeds/preferences_window.py:219 msgid "Experimental GtkListView for articles list" msgstr "기사 목ë¡ì— ì‹¤í—˜ì  GtkListView 사용" #: gfeeds/preferences_window.py:227 msgid "Troubleshooting" msgstr "문제해결" #: gfeeds/preferences_window.py:229 msgid "Export Configuration as JSON" msgstr "JSON 파ì¼ë¡œ 설정 내보내기" #: gfeeds/preferences_window.py:230 msgid "Attach this when reporting bugs" msgstr "버그 ë³´ê³ í•  때 첨부합니다" #: gfeeds/preferences_window.py:231 msgid "Export" msgstr "내보내기" #. type: ignore #: gfeeds/preferences_window.py:244 msgid "Feeds Configuration" msgstr "피드 설정" #: gfeeds/preferences_window.py:248 msgid "_Close" msgstr "닫기(_C)" #: gfeeds/preferences_window.py:251 msgid "Cop_y" msgstr "복사(_Y)" #: gfeeds/util/download_manager.py:112 #, python-brace-format msgid "`{0}`: connection timed out" msgstr "`{0}`: ì—°ê²° ì‹œê°„ì´ ì´ˆê³¼ë˜ì—ˆìŠµë‹ˆë‹¤" #: gfeeds/util/download_manager.py:121 #, python-brace-format msgid "`{0}` might not be a valid address" msgstr "'{0}'ì€ ì˜¬ë°”ë¥¸ 주소가 아닙니다" #: gfeeds/util/download_manager.py:161 #, python-brace-format msgid "Error downloading `{0}`, code `{1}`" msgstr "다운로드 오류 `{0}`, 코드 `{1}`" #: gfeeds/util/get_favicon.py:48 #, python-brace-format msgid "Error downloading favicon for `{0}`" msgstr "'{0}'ì˜ íŒŒë¹„ì½˜ì„ ë°›ì•„ì˜¤ëŠ” 중 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤" #: gfeeds/util/opml_parser.py:33 msgid "Error: OPML path provided does not exist" msgstr "오류: OPML 경로가 없습니다" #: gfeeds/util/opml_parser.py:44 #, python-brace-format msgid "Error parsing OPML file `{0}`" msgstr "OPML íŒŒì¼ '{0}'ì„ íŒŒì‹±í•˜ëŠ” 중 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤" #: gfeeds/webview.py:204 msgid "Link copied to clipboard!" msgstr "ë§í¬ê°€ í´ë¦½ë³´ë“œë¡œ 복사ë˜ì—ˆìŠµë‹ˆë‹¤!" #: gfeeds/webview.py:226 msgid "Feed content not available for this article" msgstr "ì´ ë¬¸ì„œì—서 사용할 수 없는 피드 ë‚´ìš©" #~ msgid "Mark as read" #~ msgstr "ì½ìŒìœ¼ë¡œ 표시" #~ msgid "Filler View" #~ msgstr "í•„í„° 보기" #~ msgid "Use dark theme for reader mode" #~ msgstr "ì½ê¸° 모드ì—서 ì–´ë‘ìš´ 테마 사용" #~ msgid "Maximum thumbnail height" #~ msgstr "ì„¬ë„¤ì¼ ìµœëŒ€ í¬ê¸°" #~ msgid "" #~ "There were problems with some feeds.\n" #~ "Do you want to remove them?" #~ msgstr "" #~ "몇몇 í”¼ë“œì— ë¬¸ì œê°€ 있는 ê±° 같습니다.\n" #~ "삭제하시겠습니까?" #~ msgid "Loading feeds..." #~ msgstr "피드를 불러오는 중..." #~ msgid "There are some errors" #~ msgstr "몇몇 오류가 있습니다" #~ msgid "Show" #~ msgstr "보기" #~ msgid "Ignore" #~ msgstr "무시" #~ msgid "You are offline" #~ msgstr "오프ë¼ì¸ ìƒíƒœìž…니다" #~ msgid "Choose a folder" #~ msgstr "í´ë” ì„ íƒ" #~ msgid "https://..." #~ msgstr "https://..." #~ msgid "Change view mode" #~ msgstr "보기 모드 변경" #~ msgid "Share" #~ msgstr "공유" #~ msgid "Refresh articles" #~ msgstr "기사 새로고침" #~ msgid "Search articles" #~ msgstr "기사 검색" #~ msgid "@prettyname@" #~ msgstr "@prettyname@" #~ msgid "Gabriele Musco" #~ msgstr "Gabriele Musco" #~ msgid "Fixed view mode button" #~ msgstr "보기 모드 버튼 ê³ ì •" #~ msgid "Option to open YouTube links with an external media player" #~ msgstr "YouTube ë§í¬ë¥¼ 외부 미디어 재ìƒê¸°ì—서 ì—´ 수 있는 옵션 추가" #~ msgid "Feed icons improvements for high DPI screens" #~ msgstr "HiDPI 환경ì—서 피드 ì•„ì´ì½˜ í–¥ìƒ" #~ msgid "UI improvements on phones" #~ msgstr "ìŠ¤ë§ˆíŠ¸í° ë‚´ UI 개선" #~ msgid "Fixed searchbar" #~ msgstr "검색바 ê³ ì •" #~ msgid "Big UI overhaul" #~ msgstr "대대ì ì¸ UI 개편" #~ msgid "Updated translations" #~ msgstr "번역 수정" #~ msgid "OPML file association" #~ msgstr "OPML íŒŒì¼ ì—°ê²°" #~ msgid "Improved CPU utilization" #~ msgstr "í–¥ìƒëœ CPU 활용" #~ msgid "Minor bug fix" #~ msgstr "몇몇 버그 수정" #~ msgid "Added italian translation" #~ msgstr "ì´íƒˆë¦¬ì•„ì–´ 추가" #~ msgid "First release" #~ msgstr "첫 출시" gfeeds-2.2.0/po/meson.build000066400000000000000000000001271440757451400155430ustar00rootroot00000000000000message('Update translations') i18n.gettext(meson.project_name(), preset: 'glib' ) gfeeds-2.2.0/po/nl.po000066400000000000000000000354661440757451400143700ustar00rootroot00000000000000# Dutch translations for gfeeds package. # Copyright (C) 2020 THE gfeeds'S COPYRIGHT HOLDER # This file is distributed under the same license as the gfeeds package. # Heimen Stoffels , 2020. # Nathan Follens , 2022. # msgid "" msgstr "" "Project-Id-Version: gfeeds 0.14.1\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/gfeeds/issues\n" "POT-Creation-Date: 2022-02-09 10:26+0000\n" "PO-Revision-Date: 2022-03-26 23:53+0100\n" "Last-Translator: Nathan Follens \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.0.1\n" #: data/org.gabmus.gfeeds.appdata.xml.in:4 msgid "Feeds" msgstr "Feeds" #: data/org.gabmus.gfeeds.appdata.xml.in:6 data/org.gabmus.gfeeds.desktop.in:7 msgid "News reader for GNOME" msgstr "Nieuwslezer voor GNOME" #: data/org.gabmus.gfeeds.appdata.xml.in:15 msgid "" "Feeds is a minimal RSS/Atom feed reader built with speed and simplicity in " "mind." msgstr "" "Feeds is een minimale RSS-/Atom-feedlezer, met een focus op snelheid en " "eenvoud." #: data/org.gabmus.gfeeds.appdata.xml.in:16 msgid "" "It offers a simple user interface that only shows the latest news from your " "subscriptions." msgstr "" "Feeds biedt een eenvoudige gebruiksomgeving die alleen het laatste nieuws " "van uw abonnementen toont." #: data/org.gabmus.gfeeds.appdata.xml.in:17 msgid "" "Articles are shown in a web view by default, with javascript disabled for a " "faster and less intrusive user experience. There's also a reader mode " "included, built from the one GNOME Web/Epiphany uses." msgstr "" "Artikelen worden standaard in webweergave getoond, waar JavaScript is " "uitgeschakeld. Dit versnelt de weergave en zorgt voor minder afleiding. " "Daarnaast is er een leesmodus beschikbaar, gebaseerd op die van GNOME Web/" "Epiphany." #: data/org.gabmus.gfeeds.appdata.xml.in:18 msgid "Feeds can be imported and exported via OPML." msgstr "U kunt feeds importeren uit en exporteren naar OPML." #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/org.gabmus.gfeeds.desktop.in:16 msgid "rss;reader;feed;news;" msgstr "rss;lezer;feed;nieuws;" #: data/ui/extra_popover_menu.ui:19 msgid "Web View" msgstr "Webweergave" #: data/ui/extra_popover_menu.ui:26 msgid "Reader Mode" msgstr "Leesmodus" #: data/ui/extra_popover_menu.ui:33 msgid "Feed Content" msgstr "Feedinhoud" #: gfeeds/confirm_add_dialog.py:16 msgid "Do you want to import these feeds?" msgstr "Wilt u deze feeds importeren?" #: gfeeds/confirm_add_dialog.py:17 msgid "Do you want to import this feed?" msgstr "Wilt u deze feed importeren?" #: gfeeds/download_manager.py:88 #, python-brace-format msgid "`{0}`: connection timed out" msgstr "`{0}`: verbinding verlopen" #: gfeeds/download_manager.py:92 #, python-brace-format msgid "`{0}` might not be a valid address" msgstr "`{0}` is misschien geen geldig adres" #: gfeeds/download_manager.py:117 #, python-brace-format msgid "Error downloading `{0}`, code `{1}`" msgstr "Fout tijdens ophalen van `{0}` - code `{1}`" #: gfeeds/feeds_manager.py:87 #, python-brace-format msgid "Feed {0} exists already, skipping" msgstr "'{0}' bestaat al - deze wordt overgeslagen" #: gfeeds/feeds_view.py:14 msgid "All feeds" msgstr "Alle feeds" #: gfeeds/get_favicon.py:45 #, python-brace-format msgid "Error downloading favicon for `{0}`" msgstr "De favicon van `{0}` kan niet worden opgehaald" #: gfeeds/headerbar.py:171 msgid "" "There were problems with some feeds.\n" "Do you want to remove them?" msgstr "" "Er zijn problemen opgetreden met enkele feeds.\n" "Wilt u ze verwijderen?" #: gfeeds/main_leaflet.py:118 #, python-brace-format msgid "{0} new article" msgid_plural "{0} new articles" msgstr[0] "{0} nieuw artikel" msgstr[1] "{0} nieuwe artikelen" #: gfeeds/__main__.py:251 msgid "url" msgstr "URL" #: gfeeds/__main__.py:254 msgid "opml file local url or rss remote url to import" msgstr "het te importeren opmlbestand, een lokale of rss-url" #: gfeeds/manage_feeds_window.py:229 msgid "Do you want to delete these feeds?" msgstr "Weet u zeker dat u deze feeds wilt verwijderen?" #: gfeeds/manage_feeds_window.py:281 msgid "Manage Feeds" msgstr "Feeds beheren" #: gfeeds/opml_file_chooser.py:7 msgid "XML files" msgstr "XML-bestanden" #: gfeeds/opml_file_chooser.py:14 msgid "Choose an OPML file to import" msgstr "Kies het te importeren OPML-bestand" #: gfeeds/opml_file_chooser.py:18 msgid "Open" msgstr "Openen" #: gfeeds/opml_file_chooser.py:19 gfeeds/opml_file_chooser.py:31 msgid "Cancel" msgstr "Annuleren" #: gfeeds/opml_file_chooser.py:26 msgid "Choose where to save the exported OPML file" msgstr "Kies een locatie voor het OPML-bestand" #: gfeeds/opml_file_chooser.py:30 msgid "Save" msgstr "Opslaan" #: gfeeds/opml_manager.py:42 msgid "Error: OPML path provided does not exist" msgstr "Fout: het opgegeven OPML-pad bestaat niet" #: gfeeds/opml_manager.py:53 #, python-brace-format msgid "Error parsing OPML file `{0}`" msgstr "Fout tijdens verwerken van `{0}`" #: gfeeds/preferences_window.py:22 msgid "General" msgstr "Algemeen" #: gfeeds/preferences_window.py:25 msgid "General preferences" msgstr "Algemene voorkeuren" #: gfeeds/preferences_window.py:27 msgid "Show newer articles first" msgstr "Nieuwste artikelen bovenaan" #: gfeeds/preferences_window.py:32 msgid "Open links in your browser" msgstr "Links openen in webbrowser" #: gfeeds/preferences_window.py:36 msgid "Use external video player for YouTube" msgstr "Externe videospeler gebruiken voor YouTube" #: gfeeds/preferences_window.py:38 msgid "Requires youtube-dl and a compatible video player" msgstr "Vereist youtube-dl en een compatibele videospeler" #: gfeeds/preferences_window.py:44 msgid "Preferred video player" msgstr "Voorkeursvideospeler" #: gfeeds/preferences_window.py:48 msgid "Maximum article age" msgstr "Maximale artikelouderdom" #: gfeeds/preferences_window.py:49 msgid "In days" msgstr "In dagen" #: gfeeds/preferences_window.py:56 msgid "Refresh preferences" msgstr "Voorkeuren bijwerken" #: gfeeds/preferences_window.py:58 msgid "Refresh articles on startup" msgstr "Artikelen verversen na opstarten" #: gfeeds/preferences_window.py:62 msgid "New articles notification" msgstr "Melding voor nieuwe artikelen" #: gfeeds/preferences_window.py:66 msgid "Enable auto-refresh" msgstr "Automatisch verversen inschakelen" #: gfeeds/preferences_window.py:70 msgid "Auto-refresh interval" msgstr "Interval voor automatisch verversen" #: gfeeds/preferences_window.py:71 msgid "In seconds" msgstr "In seconden" #: gfeeds/preferences_window.py:78 msgid "Cache" msgstr "Cache" #: gfeeds/preferences_window.py:80 msgid "Clear caches" msgstr "Caches legen" #: gfeeds/preferences_window.py:81 msgid "Clear" msgstr "Wissen" #: gfeeds/preferences_window.py:109 msgid "Appearance" msgstr "Weergave" #: gfeeds/preferences_window.py:112 msgid "Appearance preferences" msgstr "Weergavevoorkeuren" #: gfeeds/preferences_window.py:114 msgid "Dark mode" msgstr "Donkere modus" #: gfeeds/preferences_window.py:118 msgid "Use dark theme for reader mode" msgstr "Donker thema gebruiken in leesmodus" #: gfeeds/preferences_window.py:122 msgid "Show article thumbnails" msgstr "Miniaturen van artikelen tonen" #: gfeeds/preferences_window.py:127 msgid "Maximum thumbnail height" msgstr "Maximale hoogte van miniaturen" #: gfeeds/preferences_window.py:133 msgid "Show full articles titles" msgstr "Volledige artikelkoppen tonen" #: gfeeds/preferences_window.py:138 msgid "Show full feeds names" msgstr "Volledige feednamen tonen" #: gfeeds/preferences_window.py:145 msgid "Font preferences" msgstr "Lettertypevoorkeuren" #: gfeeds/preferences_window.py:147 msgid "Use system font for titles" msgstr "Systeemlettertype gebruiken voor titels" #: gfeeds/preferences_window.py:151 msgid "Use system font for paragraphs" msgstr "Systeemlettertype gebruiken voor alinea’s" #: gfeeds/preferences_window.py:155 msgid "Custom title font" msgstr "Aangepast titellettertype" #: gfeeds/preferences_window.py:159 msgid "Custom paragraph font" msgstr "Aangepast alinealettertype" #: gfeeds/preferences_window.py:163 msgid "Custom monospace font" msgstr "Aangepast lettertype met vaste breedte" #: gfeeds/preferences_window.py:175 msgid "Privacy" msgstr "Privacy" #: gfeeds/preferences_window.py:178 msgid "Privacy preferences" msgstr "Privacyvoorkeuren" #: gfeeds/preferences_window.py:180 msgid "Enable JavaScript" msgstr "JavaScript inschakelen" #: gfeeds/preferences_window.py:185 msgid "Try to block advertisements" msgstr "Probeer advertenties te blokkeren" #: gfeeds/preferences_window.py:187 gfeeds/preferences_window.py:222 msgid "Requires app restart" msgstr "Vereist dat de toepassing opnieuw gestart wordt" #: gfeeds/preferences_window.py:191 msgid "Update advertisement blocking list" msgstr "Lijst met geblokkeerde reclame bijwerken" #: gfeeds/preferences_window.py:192 msgid "Updates automatically every 10 days" msgstr "Wordt elke 10 dagen automatisch bijgewerkt" #: gfeeds/preferences_window.py:193 msgid "Update" msgstr "Bijwerken" #: gfeeds/preferences_window.py:206 msgid "Advanced" msgstr "Geavanceerd" #: gfeeds/preferences_window.py:209 msgid "Advanced preferences" msgstr "Geavanceerde voorkeuren" #: gfeeds/preferences_window.py:211 msgid "Maximum refresh threads" msgstr "Maximumaantal verversprocessen" #: gfeeds/preferences_window.py:213 msgid "How many threads to use for feeds refresh" msgstr "Hoeveel processen mogen gebruikt worden om feeds te verversen" #: gfeeds/preferences_window.py:220 msgid "Experimental GtkListView for articles list" msgstr "Experimentele GtkListView voor de artikellijst" #: gfeeds/rss_parser.py:67 #, python-brace-format msgid "Error: unable to parse datetime {0} for feeditem {1}" msgstr "Fout: kan de datum en tijd {0} van feeditem {1} niet verwerken" #: gfeeds/rss_parser.py:148 #, python-brace-format msgid "Errors while parsing feed `{0}`" msgstr "Fouten tijdens het verwerken van `{0}`" #: gfeeds/rss_parser.py:175 #, python-brace-format msgid "`{0}` may not be an RSS or Atom feed" msgstr "`{0}` is mogelijk geen RSS- of Atom-feed" #: gfeeds/sidebar.py:23 msgid "Loading feeds..." msgstr "Bezig met laden van feeds…" #: gfeeds/sidebar_row_popover.py:31 gfeeds/sidebar_row_popover.py:58 msgid "Mark as unread" msgstr "Markeren als ongelezen" #: gfeeds/sidebar_row_popover.py:38 gfeeds/sidebar_row_popover.py:50 msgid "Mark as read" msgstr "Markeren als gelezen" #: gfeeds/suggestion_bar.py:37 msgid "There are some errors" msgstr "Er zijn fouten opgetreden" #: gfeeds/suggestion_bar.py:46 msgid "Show" msgstr "Tonen" #: gfeeds/suggestion_bar.py:47 msgid "Ignore" msgstr "Negeren" #: gfeeds/suggestion_bar.py:70 msgid "There were problems with some feeds. Do you want to remove them?" msgstr "Er zijn problemen opgetreden met enkele feeds. Wilt u ze verwijderen?" #: gfeeds/suggestion_bar.py:97 msgid "You are offline" msgstr "U hebt geen interverbinding" #: gfeeds/webview.py:183 msgid "Link copied to clipboard!" msgstr "De link is gekopieerd naar het klembord!" #: gfeeds/webview.py:205 msgid "Feed content not available for this article" msgstr "Geen feedinhoud beschikbaar bij dit artikel" #~ msgid "Add new feed" #~ msgstr "Feed toevoegen" #~ msgid "Filler View" #~ msgstr "Vullende weergave" #~ msgid "" #~ "Error resizing favicon for feed {0}. Probably not an image.\n" #~ "Trying downloading favicon from an article." #~ msgstr "" #~ "De faviconafmetingen van {0} kunnen niet worden aangepast. Mogelijk is " #~ "het geen afbeelding.\n" #~ "Haal een favicon op bij een artikel." #~ msgid "" #~ "Error resizing favicon from article for feed {0}.\n" #~ "Deleting invalid favicon." #~ msgstr "" #~ "De faviconafmetingen van {0} kunnen niet worden aangepast.\n" #~ "De favicon wordt verwijderd." #~ msgid "Thumbnail" #~ msgstr "Miniatuurvoorbeeld" #~ msgid "Feed" #~ msgstr "Feed" #~ msgid "Select/Unselect all" #~ msgstr "Alles/Niets selecteren" #~ msgid "Delete selected feeds" #~ msgstr "Geselecteerde feeds verwijderen" #~ msgid "Manage tags for selected feeds" #~ msgstr "Labels van geselecteerde feeds beheren" #~ msgid "General Settings" #~ msgstr "Algemene instellingen" #~ msgid "Clear all caches" #~ msgstr "Alle caches legen" #~ msgid "View" #~ msgstr "Weergave" #~ msgid "View Settings" #~ msgstr "Weergave-instellingen" #~ msgid "Advanced Settings" #~ msgstr "Geavanceerde instellingen" #~ msgid "`{0}` is not an URL" #~ msgstr "`{0}` is geen url" #~ msgid "Open Keyboard Shortcuts" #~ msgstr "Sneltoetsoverzicht tonen" #~ msgid "Quit" #~ msgstr "Afsluiten" #~ msgid "Refresh articles" #~ msgstr "Artikelen verversen" #~ msgid "Search articles" #~ msgstr "Zoeken naar artikelen" #~ msgid "Previous article" #~ msgstr "Vorig artikel" #~ msgid "Show/Hide read articles" #~ msgstr "Gelezen artikelen tonen/verbergen" #~ msgid "Zoom in" #~ msgstr "Inzoomen" #~ msgid "Zoom out" #~ msgstr "Uitzoomen" #~ msgid "Reset zoom" #~ msgstr "Standaard zoomniveau" #~ msgid "Select an article" #~ msgstr "Selecteer een artikel" #~ msgid "Show read articles" #~ msgstr "Gelezen artikelen tonen" #~ msgid "Mark all as read" #~ msgstr "Alles markeren als gelezen" #~ msgid "Mark all as unread" #~ msgstr "Alles markeren als ongelezen" #~ msgid "Import OPML" #~ msgstr "OPML-bestand importeren" #~ msgid "Export OPML" #~ msgstr "OPML-bestand exporteren" #~ msgid "Keyboard Shortcuts" #~ msgstr "Sneltoetsen" #~ msgid "About Feeds" #~ msgstr "Over Feeds" #~ msgid "Menu" #~ msgstr "Menu" #~ msgid "Filter by feed" #~ msgstr "Filteren op feed" #~ msgid "Search" #~ msgstr "Zoeken" #~ msgid "Back to articles" #~ msgstr "Terug naar artikeloverzicht" #~ msgid "Change view mode" #~ msgstr "Weergavemodus aanpassen" #~ msgid "Share" #~ msgstr "Delen" #~ msgid "Open externally" #~ msgstr "Extern openen" #~ msgid "Let's get started" #~ msgstr "Aan de slag" #~ msgid "Add new feeds via URL" #~ msgstr "Feeds toevoegen middels url" #~ msgid "Import an OPML file" #~ msgstr "OPML-bestand importeren" #~ msgid "Enter feed address to add" #~ msgstr "Voer een feedadres in" #~ msgid "https://..." #~ msgstr "https://..." #~ msgid "Add" #~ msgstr "Toevoegen" #~ msgid "You're already subscribed to that feed!" #~ msgstr "U bent al geabonneerd op deze feed!" #~ msgid "View mode" #~ msgstr "Weergavemodus" #~ msgid "label" #~ msgstr "label" #~ msgid "New tag name..." #~ msgstr "Nieuwe labelnaam..." #~ msgid "Add tag" #~ msgstr "Label toekennen" #~ msgid "There are no tags yet" #~ msgstr "Er zijn nog geen labels toegekend" #~ msgid "Add some using the entry above" #~ msgstr "Voeg labels toe middels het vak hierboven" #~ msgid "page0" #~ msgstr "pagina0" #~ msgid "page1" #~ msgstr "pagina1" #~ msgid "Save article" #~ msgstr "Artikel opslaan" #~ msgid "@prettyname@" #~ msgstr "@prettyname@" #~ msgid "@appid@" #~ msgstr "@appid@" gfeeds-2.2.0/po/org.gabmus.gfeeds.pot000066400000000000000000000641751440757451400174420ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the gfeeds package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: gfeeds 2.2.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-03-25 14:38+0100\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" "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" #: ../gfeeds/feeds_view.py:13 msgid "All feeds" msgstr "" #: ../gfeeds/feed_item.py:62 #, python-brace-format msgid "Error: unable to parse datetime {0} for feeditem {1}" msgstr "" #: ../gfeeds/feeds_manager.py:83 #, python-brace-format msgid "Feed {0} exists already, skipping" msgstr "" #: ../gfeeds/preferences_window.py:24 msgid "General" msgstr "" #: ../gfeeds/preferences_window.py:27 msgid "General preferences" msgstr "" #: ../gfeeds/preferences_window.py:29 msgid "Show newer articles first" msgstr "" #: ../gfeeds/preferences_window.py:34 msgid "Open links in your browser" msgstr "" #: ../gfeeds/preferences_window.py:38 msgid "Use external video player for YouTube" msgstr "" #: ../gfeeds/preferences_window.py:40 msgid "Requires youtube-dl and a compatible video player" msgstr "" #: ../gfeeds/preferences_window.py:46 msgid "Preferred video player" msgstr "" #: ../gfeeds/preferences_window.py:50 msgid "Maximum article age" msgstr "" #: ../gfeeds/preferences_window.py:51 msgid "In days" msgstr "" #: ../gfeeds/preferences_window.py:58 msgid "Refresh preferences" msgstr "" #: ../gfeeds/preferences_window.py:60 msgid "Refresh articles on startup" msgstr "" #: ../gfeeds/preferences_window.py:64 msgid "New articles notification" msgstr "" #: ../gfeeds/preferences_window.py:68 msgid "Enable auto-refresh" msgstr "" #: ../gfeeds/preferences_window.py:72 msgid "Auto-refresh interval" msgstr "" #: ../gfeeds/preferences_window.py:73 msgid "In seconds" msgstr "" #: ../gfeeds/preferences_window.py:80 msgid "Cache" msgstr "" #: ../gfeeds/preferences_window.py:82 msgid "Clear caches" msgstr "" #: ../gfeeds/preferences_window.py:83 msgid "Clear" msgstr "" #: ../gfeeds/preferences_window.py:109 msgid "Appearance" msgstr "" #: ../gfeeds/preferences_window.py:112 msgid "Appearance preferences" msgstr "" #: ../gfeeds/preferences_window.py:114 msgid "Dark mode" msgstr "" #: ../gfeeds/preferences_window.py:118 msgid "Reader mode theme" msgstr "" #: ../gfeeds/preferences_window.py:122 msgid "Automatic" msgstr "" #: ../gfeeds/preferences_window.py:122 msgid "Light" msgstr "" #: ../gfeeds/preferences_window.py:122 msgid "Dark" msgstr "" #: ../gfeeds/preferences_window.py:126 msgid "Show article thumbnails" msgstr "" #: ../gfeeds/preferences_window.py:131 msgid "Show full articles titles" msgstr "" #: ../gfeeds/preferences_window.py:136 msgid "Show full feeds names" msgstr "" #: ../gfeeds/preferences_window.py:143 msgid "Font preferences" msgstr "" #: ../gfeeds/preferences_window.py:145 msgid "Use system font for titles" msgstr "" #: ../gfeeds/preferences_window.py:149 msgid "Use system font for paragraphs" msgstr "" #: ../gfeeds/preferences_window.py:153 msgid "Custom title font" msgstr "" #: ../gfeeds/preferences_window.py:157 msgid "Custom paragraph font" msgstr "" #: ../gfeeds/preferences_window.py:161 msgid "Custom monospace font" msgstr "" #: ../gfeeds/preferences_window.py:173 msgid "Privacy" msgstr "" #: ../gfeeds/preferences_window.py:177 msgid "Privacy preferences" msgstr "" #: ../gfeeds/preferences_window.py:179 msgid "Enable JavaScript" msgstr "" #: ../gfeeds/preferences_window.py:184 msgid "Try to block advertisements" msgstr "" #: ../gfeeds/preferences_window.py:186 ../gfeeds/preferences_window.py:221 msgid "Requires app restart" msgstr "" #: ../gfeeds/preferences_window.py:190 msgid "Update advertisement blocking list" msgstr "" #: ../gfeeds/preferences_window.py:191 msgid "Updates automatically every 10 days" msgstr "" #: ../gfeeds/preferences_window.py:192 msgid "Update" msgstr "" #: ../gfeeds/preferences_window.py:205 msgid "Advanced" msgstr "" #: ../gfeeds/preferences_window.py:208 msgid "Advanced preferences" msgstr "" #: ../gfeeds/preferences_window.py:210 msgid "Maximum refresh threads" msgstr "" #: ../gfeeds/preferences_window.py:212 msgid "How many threads to use for feeds refresh" msgstr "" #: ../gfeeds/preferences_window.py:219 msgid "Experimental GtkListView for articles list" msgstr "" #: ../gfeeds/preferences_window.py:227 msgid "Troubleshooting" msgstr "" #: ../gfeeds/preferences_window.py:229 msgid "Export Configuration as JSON" msgstr "" #: ../gfeeds/preferences_window.py:230 msgid "Attach this when reporting bugs" msgstr "" #: ../gfeeds/preferences_window.py:231 msgid "Export" msgstr "" #: ../gfeeds/preferences_window.py:244 msgid "Feeds Configuration" msgstr "" #: ../gfeeds/preferences_window.py:248 msgid "_Close" msgstr "" #: ../gfeeds/preferences_window.py:251 msgid "Cop_y" msgstr "" #: ../gfeeds/feed_parser.py:61 #, python-brace-format msgid "Errors while parsing feed `{0}`, URL: `{1}`" msgstr "" #: ../gfeeds/feed_parser.py:75 #, python-brace-format msgid "Error decoding unicode data from feed `{0}`, URL: `{1}`" msgstr "" #: ../gfeeds/feed_parser.py:82 #, python-brace-format msgid "Error extracting data from feed `{0}`, URL: `{1}`" msgstr "" #: ../gfeeds/feed_parser.py:90 #, python-brace-format msgid "`{0}` may not be an RSS or Atom feed" msgstr "" #: ../gfeeds/webview.py:200 msgid "Link copied to clipboard!" msgstr "" #: ../gfeeds/webview.py:222 msgid "Feed content not available for this article" msgstr "" #: ../gfeeds/main_leaflet.py:114 #, python-brace-format msgid "{0} new article" msgid_plural "{0} new articles" msgstr[0] "" msgstr[1] "" #: ../gfeeds/opml_file_chooser.py:7 msgid "XML files" msgstr "" #: ../gfeeds/opml_file_chooser.py:14 msgid "Choose an OPML file to import" msgstr "" #: ../gfeeds/opml_file_chooser.py:18 msgid "Open" msgstr "" #: ../gfeeds/opml_file_chooser.py:19 ../gfeeds/opml_file_chooser.py:31 msgid "Cancel" msgstr "" #: ../gfeeds/opml_file_chooser.py:26 msgid "Choose where to save the exported OPML file" msgstr "" #: ../gfeeds/opml_file_chooser.py:30 msgid "Save" msgstr "" #: ../gfeeds/manage_feeds_window.py:257 msgid "Manage Feeds" msgstr "" #: ../gfeeds/manage_feeds_window.py:321 msgid "Do you want to delete these feeds?" msgstr "" #: ../gfeeds/manage_feeds_window.py:324 ../gfeeds/__main__.py:239 #: ../gfeeds/__main__.py:273 msgid "_Cancel" msgstr "" #: ../gfeeds/manage_feeds_window.py:326 msgid "_Delete" msgstr "" #: ../gfeeds/headerbar.py:197 msgid "There were problems with some feeds. Do you want to remove them?" msgstr "" #: ../gfeeds/headerbar.py:202 msgid "_Keep" msgstr "" #: ../gfeeds/headerbar.py:204 msgid "_Remove" msgstr "" #: ../gfeeds/__main__.py:232 msgid "Do you want to import these feeds?" msgstr "" #: ../gfeeds/__main__.py:242 ../gfeeds/__main__.py:276 msgid "_Import" msgstr "" #: ../gfeeds/__main__.py:269 msgid "Do you want to import this feed?" msgstr "" #: ../gfeeds/__main__.py:301 msgid "url" msgstr "" #: ../gfeeds/__main__.py:304 msgid "opml file local url or rss remote url to import" msgstr "" #: ../gfeeds/util/opml_parser.py:33 msgid "Error: OPML path provided does not exist" msgstr "" #: ../gfeeds/util/opml_parser.py:44 #, python-brace-format msgid "Error parsing OPML file `{0}`" msgstr "" #: ../gfeeds/util/build_reader_html.py:104 #, python-brace-format msgid "Author: {1}" msgstr "" #: ../gfeeds/util/build_reader_html.py:108 #, python-brace-format msgid "Author: {0}" msgstr "" #: ../gfeeds/util/download_manager.py:112 #, python-brace-format msgid "`{0}`: connection timed out" msgstr "" #: ../gfeeds/util/download_manager.py:121 #, python-brace-format msgid "`{0}` might not be a valid address" msgstr "" #: ../gfeeds/util/download_manager.py:161 #, python-brace-format msgid "Error downloading `{0}`, code `{1}`" msgstr "" #: ../gfeeds/util/get_favicon.py:48 #, python-brace-format msgid "Error downloading favicon for `{0}`" msgstr "" #: ../data/ui/main_leaflet.blp:40 msgid "Offline" msgstr "" #: ../data/ui/left_headerbar.blp:6 msgid "_Show Read Articles" msgstr "" #: ../data/ui/left_headerbar.blp:7 msgid "Mark All as Read" msgstr "" #: ../data/ui/left_headerbar.blp:8 msgid "Mark All as _Unread" msgstr "" #: ../data/ui/left_headerbar.blp:11 msgid "Show _Empty Feeds" msgstr "" #: ../data/ui/left_headerbar.blp:12 msgid "_Manage Feeds" msgstr "" #: ../data/ui/left_headerbar.blp:13 msgid "_Import OPML" msgstr "" #: ../data/ui/left_headerbar.blp:14 msgid "E_xport OPML" msgstr "" #: ../data/ui/left_headerbar.blp:17 msgid "P_references" msgstr "" #: ../data/ui/left_headerbar.blp:18 msgid "_Keyboard Shortcuts" msgstr "" #: ../data/ui/left_headerbar.blp:19 msgid "_About Feeds" msgstr "" #: ../data/ui/left_headerbar.blp:28 msgid "Filter" msgstr "" #: ../data/ui/left_headerbar.blp:32 msgid "Add Feed" msgstr "" #: ../data/ui/left_headerbar.blp:36 msgid "Menu" msgstr "" #: ../data/ui/left_headerbar.blp:41 ../data/ui/shortcutsWindow.blp:35 msgid "Refresh" msgstr "" #: ../data/ui/left_headerbar.blp:46 ../data/ui/shortcutsWindow.blp:39 msgid "Search" msgstr "" #: ../data/ui/left_headerbar.blp:50 msgid "There Are Errors" msgstr "" #: ../data/ui/sidebar_listbox_row.blp:5 msgid "Mark as Read/Unread" msgstr "" #: ../data/ui/sidebar_listbox_row.blp:6 ../data/ui/shortcutsWindow.blp:74 msgid "Open in Browser" msgstr "" #: ../data/ui/manage_feeds_headerbar.blp:11 msgid "Manage Tags for Selected Feeds" msgstr "" #: ../data/ui/manage_feeds_headerbar.blp:16 msgid "Select/Unselect All" msgstr "" #: ../data/ui/manage_feeds_headerbar.blp:21 msgid "Delete Selected Feeds" msgstr "" #: ../data/ui/right_headerbar.blp:9 msgid "Open in _Browser" msgstr "" #: ../data/ui/right_headerbar.blp:10 msgid "Open in External Media _Player" msgstr "" #: ../data/ui/right_headerbar.blp:11 msgid "_Copy Article Link" msgstr "" #: ../data/ui/right_headerbar.blp:17 ../data/ui/right_headerbar.blp:96 msgid "View Mode" msgstr "" #: ../data/ui/right_headerbar.blp:19 msgid "Web View" msgstr "" #: ../data/ui/right_headerbar.blp:24 msgid "Reader Mode" msgstr "" #: ../data/ui/right_headerbar.blp:29 msgid "Feed Content" msgstr "" #: ../data/ui/right_headerbar.blp:44 ../data/ui/shortcutsWindow.blp:66 msgid "Zoom Out" msgstr "" #: ../data/ui/right_headerbar.blp:51 ../data/ui/shortcutsWindow.blp:70 msgid "Reset Zoom" msgstr "" #: ../data/ui/right_headerbar.blp:57 ../data/ui/shortcutsWindow.blp:62 msgid "Zoom In" msgstr "" #: ../data/ui/right_headerbar.blp:90 msgid "Back to Articles" msgstr "" #: ../data/ui/empty_state.blp:7 msgid "Let's get started" msgstr "" #: ../data/ui/empty_state.blp:22 msgid "Add new feeds via URL" msgstr "" #: ../data/ui/empty_state.blp:27 msgid "Import an OPML file" msgstr "" #: ../data/ui/shortcutsWindow.blp:12 msgid "Open Keyboard Shortcuts" msgstr "" #: ../data/ui/shortcutsWindow.blp:16 msgid "Open Menu" msgstr "" #: ../data/ui/shortcutsWindow.blp:20 msgid "Open Preferences" msgstr "" #: ../data/ui/shortcutsWindow.blp:24 msgid "Open Filter" msgstr "" #: ../data/ui/shortcutsWindow.blp:28 msgid "Quit" msgstr "" #: ../data/ui/shortcutsWindow.blp:32 msgid "Article List" msgstr "" #: ../data/ui/shortcutsWindow.blp:43 msgid "Next" msgstr "" #: ../data/ui/shortcutsWindow.blp:47 msgid "Previous" msgstr "" #: ../data/ui/shortcutsWindow.blp:51 msgid "Show/Hide Read Articles" msgstr "" #: ../data/ui/shortcutsWindow.blp:55 msgid "Mark All Read" msgstr "" #: ../data/ui/shortcutsWindow.blp:59 msgid "Article" msgstr "" #: ../data/ui/add_feed_popover.blp:11 msgid "Enter feed address to add" msgstr "" #: ../data/ui/add_feed_popover.blp:26 msgid "Add" msgstr "" #: ../data/ui/add_feed_popover.blp:32 msgid "You're already subscribed to that feed!" msgstr "" #: ../data/ui/manage_tags_content.blp:17 msgid "New tag name…" msgstr "" #: ../data/ui/manage_tags_content.blp:24 msgid "Add Tag" msgstr "" #: ../data/ui/manage_tags_content.blp:39 msgid "There are no tags yet" msgstr "" #: ../data/ui/manage_tags_content.blp:40 msgid "Add some using the entry above" msgstr "" #: ../data/ui/webview.blp:12 msgid "Select an article" msgstr "" #: ../data/ui/aboutdialog.ui.in:10 msgid "translator-credits" msgstr "" #: ../data/org.gabmus.gfeeds.desktop.in:6 msgid "@prettyname@" msgstr "" #: ../data/org.gabmus.gfeeds.desktop.in:7 msgid "News reader for GNOME" msgstr "" #: ../data/org.gabmus.gfeeds.desktop.in:16 msgid "rss;reader;feed;news;" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:4 msgid "Feeds" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:15 msgid "" "Feeds is a minimal RSS/Atom feed reader built with speed and simplicity in " "mind." msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:16 msgid "" "It offers a simple user interface that only shows the latest news from your " "subscriptions." msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:17 msgid "" "Articles are shown in a web view by default, with javascript disabled for a " "faster and less intrusive user experience. There's also a reader mode " "included, built from the one GNOME Web/Epiphany uses." msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:18 msgid "Feeds can be imported and exported via OPML." msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:59 msgid "Article author in reader mode" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:60 msgid "Updated WebKit to API version 6.0" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:68 msgid "Improved configuration management" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:69 msgid "Refactoring around GObject property binding" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:70 msgid "Removed top/bottom margin in reader mode" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:71 msgid "Catch text decoding errors" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:79 msgid "Fix divide by zero issue when adding the first feed" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:87 msgid "Reader mode color scheme can adapt to system theme" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:88 msgid "Fix high CPU usage in web view" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:89 msgid "New message dialog" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:90 msgid "Can open articles in browser from right click menu" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:91 msgid "Added a progress bar to show loading state" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:92 msgid "Small UI improvements" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:93 msgid "Fixes for thumbnail extraction" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:94 msgid "Fix OPML export edge cases" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:95 #: ../data/org.gabmus.gfeeds.appdata.xml.in:245 msgid "Various improvements and bug fixes" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:103 msgid "Links in the web view show a preview of the destination URL" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:104 msgid "Stability improvements related to article thumbnails" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:105 msgid "Reworked dialog windows" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:106 msgid "Fixes for non-unicode character encodings" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:107 msgid "Fixes for importing OPML" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:108 msgid "Various bug fixes and improvements" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:109 msgid "Code refactoring" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:117 #: ../data/org.gabmus.gfeeds.appdata.xml.in:125 msgid "Flatpak dependency fixes" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:133 msgid "Brand new look powered by GTK4 and Libadwaita" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:134 msgid "Articles can have thumbnails" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:135 msgid "New advertisement blocking feature" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:136 msgid "Human friendly article date and time" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:137 msgid "Less intrusive feed error notification" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:138 msgid "Customizable reader mode fonts" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:139 msgid "Empty feeds can be hidden" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:140 msgid "New lightning fast C++ powered backend for feed parsing" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:141 msgid "Experimental article list implementation using GtkListView" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:142 msgid "Removed saved articles feature" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:150 msgid "Fixed view mode button" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:151 msgid "Option to open YouTube links with an external media player" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:152 msgid "" "Saved articles are no longer stored inside the cache directory, avoiding " "accidental deletion" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:160 msgid "Feed icons improvements for high DPI screens" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:168 msgid "UI improvements on phones" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:176 msgid "Switched to the new libhandy Avatar widget" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:177 msgid "Added Dutch translation courtesy of Heimen Stoffels" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:184 msgid "Fixed searchbar" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:192 msgid "" "New tags feature! You can now categorize your feeds by creating custom tags" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:193 msgid "RSS links can now be opened directly in Feeds to be imported" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:194 msgid "Mark as read now only marks the currently visible feeds" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:195 msgid "Added support for the latest version of libhandy" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:196 msgid "Improved message dialogs" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:197 msgid "Performance improvements when importing OPML files" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:198 msgid "Removed option to disable client side decoration" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:205 msgid "" "Don't remove feeds automatically if they have errors, instead ask the user " "what to do" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:206 #: ../data/org.gabmus.gfeeds.appdata.xml.in:228 msgid "Updated Italian translation" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:213 msgid "Updated French translation" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:220 msgid "Bug fixes" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:227 msgid "Updated version number" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:235 msgid "You can now add some feeds by just using the website URL" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:236 msgid "New generated placeholder icon for feeds without one" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:237 msgid "Improved reader mode" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:238 msgid "Swipe left on your touchscreen to move back from an article" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:239 msgid "Code blocks in articles now have syntax highlighting" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:240 msgid "Added French translation" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:241 msgid "Removed the colored border left of the articles" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:242 msgid "More keyboard shortcuts" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:243 msgid "Added option to refresh articles on startup" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:244 msgid "Updated to the GNOME 3.36 runtime" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:252 msgid "Added loading progress bar" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:253 msgid "Added Spanish translation" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:254 #: ../data/org.gabmus.gfeeds.appdata.xml.in:265 #: ../data/org.gabmus.gfeeds.appdata.xml.in:279 msgid "Various UI improvements" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:255 #: ../data/org.gabmus.gfeeds.appdata.xml.in:266 msgid "Performance improvements" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:256 #: ../data/org.gabmus.gfeeds.appdata.xml.in:267 #: ../data/org.gabmus.gfeeds.appdata.xml.in:280 #: ../data/org.gabmus.gfeeds.appdata.xml.in:290 #: ../data/org.gabmus.gfeeds.appdata.xml.in:305 #: ../data/org.gabmus.gfeeds.appdata.xml.in:316 #: ../data/org.gabmus.gfeeds.appdata.xml.in:369 msgid "Various bug fixes" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:263 msgid "Load cached articles on startup" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:264 msgid "Added new view mode menu" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:268 msgid "Added Brazilian Portuguese translation" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:269 msgid "Added Russian translation" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:276 msgid "Option to ellipsize article titles for a more compact view" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:277 msgid "Added a search function" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:278 msgid "Updated dependencies" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:287 msgid "Errors with feeds are now shown in the UI" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:288 msgid "Big UI overhaul" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:289 msgid "Updated translations" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:297 msgid "OPML file association" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:298 msgid "Changed left headerbar button order" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:299 msgid "Optimization for updating feeds" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:300 msgid "Redesigned right click/longpress menu" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:301 msgid "Option to show/hide read articles" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:302 msgid "Reworked suggestion bar" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:303 msgid "Changed name to Feeds" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:304 msgid "Improved CPU utilization" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:312 msgid "New right click or longpress menu for articles" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:313 msgid "You can now save articles offline" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:314 msgid "Initial suggestion to add feeds is now less intrusive" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:315 msgid "Read articles are now greyed out" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:323 msgid "Concurrent feeds refresh, with customizable thread count" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:324 msgid "Added German translation (thanks @Etamuk)" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:331 msgid "Fix bugs in reader mode" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:338 msgid "Minor bug fix" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:345 msgid "Improved date and time parsing and display" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:346 msgid "Reader mode can now work on websites without an article tag" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:347 msgid "Slight improvements to the icon" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:348 msgid "New feature to filter articles by feed" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:355 msgid "Improved favicon download" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:356 msgid "Fixed refresh duplicating articles" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:363 msgid "Added option to disable client side decoration" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:364 msgid "Brought primary menu in line with GNOME HIG" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:365 msgid "Added placeholder icon for feeds without an icon" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:366 msgid "Migrated some widgets to Glade templates" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:367 msgid "Option to use reader mode by default" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:368 msgid "Option to show article content from the feed" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:376 msgid "Fixed labels alignment" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:377 msgid "Changed app name to Feeds" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:378 msgid "Added separators for the two sections of the app" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:379 msgid "Using links as feed titles when there is no title" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:380 msgid "Added preference for maximum article age" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:381 msgid "Added zoom keyboard shortcuts" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:382 msgid "Added preference to enable JavaScript" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:383 msgid "Fix window control positions when they are on the left" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:390 msgid "Feeds for websites without favicons will now work" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:397 msgid "Fixed bug with adding new feeds" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:404 msgid "Switched to native file chooser" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:405 msgid "Added empty state initial screen for sidebar" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:406 msgid "Added italian translation" msgstr "" #: ../data/org.gabmus.gfeeds.appdata.xml.in:413 msgid "First release" msgstr "" gfeeds-2.2.0/po/pl.po000066400000000000000000000425251440757451400143640ustar00rootroot00000000000000# Polish translation for gfeeds. # Copyright © 2022-2023 the gfeeds authors. # This file is distributed under the same license as the gfeeds package. # Piotr DrÄ…g , 2022-2023. # Aviary.pl , 2022-2023. # msgid "" msgstr "" "Project-Id-Version: gfeeds\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/gfeeds/issues\n" "POT-Creation-Date: 2023-03-11 08:34+0000\n" "PO-Revision-Date: 2023-03-12 15:00+0100\n" "Last-Translator: Piotr DrÄ…g \n" "Language-Team: Polish \n" "Language: 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" #: data/org.gabmus.gfeeds.appdata.xml.in:4 msgid "Feeds" msgstr "Feeds" #: data/org.gabmus.gfeeds.appdata.xml.in:6 data/org.gabmus.gfeeds.desktop.in:7 msgid "News reader for GNOME" msgstr "Czytnik aktualnoÅ›ci dla Å›rodowiska GNOME" #: data/org.gabmus.gfeeds.appdata.xml.in:15 msgid "" "Feeds is a minimal RSS/Atom feed reader built with speed and simplicity in " "mind." msgstr "" "Minimalistyczny czytnik kanałów RSS/Atom tworzony z myÅ›lÄ… o wydajnoÅ›ci " "i prostocie." #: data/org.gabmus.gfeeds.appdata.xml.in:16 msgid "" "It offers a simple user interface that only shows the latest news from your " "subscriptions." msgstr "" "Ma prosty interfejs użytkownika, który wyÅ›wietla tylko najnowsze aktualnoÅ›ci " "z subskrybowanych kanałów." #: data/org.gabmus.gfeeds.appdata.xml.in:17 msgid "" "Articles are shown in a web view by default, with javascript disabled for a " "faster and less intrusive user experience. There's also a reader mode " "included, built from the one GNOME Web/Epiphany uses." msgstr "" "ArtykuÅ‚y sÄ… domyÅ›lnie wyÅ›wietlane w trybie WWW z wyłączonÄ… obsÅ‚ugÄ… " "JavaScript, aby przyspieszyć i uÅ‚atwić czytanie. DostÄ™pny jest także tryb " "poprawiania czytelnoÅ›ci, zbudowany na podstawie trybu znanego z przeglÄ…darki " "WWW dla Å›rodowiska GNOME (Epiphany)." #: data/org.gabmus.gfeeds.appdata.xml.in:18 msgid "Feeds can be imported and exported via OPML." msgstr "Można importować i eksportować kanaÅ‚y za pomocÄ… formatu OPML." #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/org.gabmus.gfeeds.desktop.in:16 msgid "rss;reader;feed;news;" msgstr "" "rss;atom;czytnik;reader;kanaÅ‚y;feeds;aktualnoÅ›ci;wiadomoÅ›ci;news;newsy;niusy;" #: data/ui/aboutdialog.ui.in:10 msgid "translator-credits" msgstr "" "Piotr DrÄ…g , 2022-2023\n" "Aviary.pl , 2022-2023" #: data/ui/add_feed_popover.blp:11 msgid "Enter feed address to add" msgstr "Adres kanaÅ‚u do dodania" #: data/ui/add_feed_popover.blp:26 msgid "Add" msgstr "Dodaj" #: data/ui/add_feed_popover.blp:32 msgid "You're already subscribed to that feed!" msgstr "Ten kanaÅ‚ jest już subskrybowany." #: data/ui/empty_state.blp:7 msgid "Let's get started" msgstr "Pierwsze kroki" #: data/ui/empty_state.blp:22 msgid "Add new feeds via URL" msgstr "Dodaj kanaÅ‚y za pomocÄ… adresu URL" #: data/ui/empty_state.blp:27 msgid "Import an OPML file" msgstr "Zaimportuj plik OPML" #: data/ui/left_headerbar.blp:6 msgid "_Show Read Articles" msgstr "_WyÅ›wietl przeczytane artykuÅ‚y" #: data/ui/left_headerbar.blp:7 msgid "Mark All as Read" msgstr "Oznacz wszystkie jako przeczytane" #: data/ui/left_headerbar.blp:8 msgid "Mark All as _Unread" msgstr "Oznacz wszystkie jako _nieprzeczytane" #: data/ui/left_headerbar.blp:11 msgid "Show _Empty Feeds" msgstr "WyÅ›wietl p_uste kanaÅ‚y" #: data/ui/left_headerbar.blp:12 msgid "_Manage Feeds" msgstr "_ZarzÄ…dzaj kanaÅ‚ami" #: data/ui/left_headerbar.blp:13 msgid "_Import OPML" msgstr "Zai_mportuj plik OPML" #: data/ui/left_headerbar.blp:14 msgid "E_xport OPML" msgstr "Wy_eksportuj plik OPML" #: data/ui/left_headerbar.blp:17 msgid "P_references" msgstr "_Preferencje" #: data/ui/left_headerbar.blp:18 msgid "_Keyboard Shortcuts" msgstr "_Skróty klawiszowe" #: data/ui/left_headerbar.blp:19 msgid "_About Feeds" msgstr "_O programie" #: data/ui/left_headerbar.blp:28 msgid "Filter" msgstr "Filtruje" #: data/ui/left_headerbar.blp:32 msgid "Add Feed" msgstr "Dodaje kanaÅ‚" #: data/ui/left_headerbar.blp:36 msgid "Menu" msgstr "Menu" #: data/ui/left_headerbar.blp:41 data/ui/shortcutsWindow.blp:35 msgid "Refresh" msgstr "OdÅ›wieża" #: data/ui/left_headerbar.blp:46 data/ui/shortcutsWindow.blp:39 msgid "Search" msgstr "Wyszukuje" #: data/ui/left_headerbar.blp:50 msgid "There Are Errors" msgstr "WystÄ…piÅ‚y błędy" #: data/ui/main_leaflet.blp:40 msgid "Offline" msgstr "Offline" #: data/ui/manage_feeds_headerbar.blp:7 gfeeds/manage_feeds_window.py:257 msgid "Manage Feeds" msgstr "ZarzÄ…dzanie kanaÅ‚ami" #: data/ui/manage_feeds_headerbar.blp:11 msgid "Manage Tags for Selected Feeds" msgstr "ZarzÄ…dza etykietami zaznaczonych kanałów" #: data/ui/manage_feeds_headerbar.blp:16 msgid "Select/Unselect All" msgstr "Zaznacza/odznacza wszystkie" #: data/ui/manage_feeds_headerbar.blp:21 msgid "Delete Selected Feeds" msgstr "Usuwa zaznaczone kanaÅ‚y" #: data/ui/manage_tags_content.blp:17 msgid "New tag name…" msgstr "Nazwa nowej etykiety…" #: data/ui/manage_tags_content.blp:24 msgid "Add Tag" msgstr "Dodaje etykietÄ™" #: data/ui/manage_tags_content.blp:39 msgid "There are no tags yet" msgstr "Nie ma jeszcze etykiet" #: data/ui/manage_tags_content.blp:40 msgid "Add some using the entry above" msgstr "Można jakieÅ› dodać powyżej" #: data/ui/right_headerbar.blp:9 msgid "Open in _Browser" msgstr "_Otwórz w przeglÄ…darce" #: data/ui/right_headerbar.blp:10 msgid "Open in External Media _Player" msgstr "Otwórz w zewnÄ™trznym odtwarzaczu _multimediów" #: data/ui/right_headerbar.blp:11 msgid "_Copy Article Link" msgstr "S_kopiuj odnoÅ›nik do artykuÅ‚u" #: data/ui/right_headerbar.blp:17 data/ui/right_headerbar.blp:96 msgid "View Mode" msgstr "Tryb wyÅ›wietlania" #: data/ui/right_headerbar.blp:19 msgid "Web View" msgstr "Tryb WWW" #: data/ui/right_headerbar.blp:24 msgid "Reader Mode" msgstr "Tryb poprawiania czytelnoÅ›ci" #: data/ui/right_headerbar.blp:29 msgid "Feed Content" msgstr "Treść kanaÅ‚u" #: data/ui/right_headerbar.blp:44 data/ui/shortcutsWindow.blp:66 msgid "Zoom Out" msgstr "Oddala" #: data/ui/right_headerbar.blp:51 data/ui/shortcutsWindow.blp:70 msgid "Reset Zoom" msgstr "Przywraca powiÄ™kszenie" #: data/ui/right_headerbar.blp:57 data/ui/shortcutsWindow.blp:62 msgid "Zoom In" msgstr "Przybliża" #: data/ui/right_headerbar.blp:90 msgid "Back to Articles" msgstr "Wraca do artykułów" #: data/ui/shortcutsWindow.blp:9 gfeeds/preferences_window.py:24 msgid "General" msgstr "Ogólne" #: data/ui/shortcutsWindow.blp:12 msgid "Open Keyboard Shortcuts" msgstr "Otwiera skróty klawiszowe" #: data/ui/shortcutsWindow.blp:16 msgid "Open Menu" msgstr "Otwiera menu" #: data/ui/shortcutsWindow.blp:20 msgid "Open Preferences" msgstr "Otwiera preferencje" #: data/ui/shortcutsWindow.blp:24 msgid "Open Filter" msgstr "Otwiera filtry" #: data/ui/shortcutsWindow.blp:28 msgid "Quit" msgstr "KoÅ„czy dziaÅ‚anie" #: data/ui/shortcutsWindow.blp:32 msgid "Article List" msgstr "Lista artykułów" #: data/ui/shortcutsWindow.blp:43 msgid "Next" msgstr "Dalej" #: data/ui/shortcutsWindow.blp:47 msgid "Previous" msgstr "Wstecz" #: data/ui/shortcutsWindow.blp:51 msgid "Show/Hide Read Articles" msgstr "WyÅ›wietla/ukrywa przeczytane artykuÅ‚y" #: data/ui/shortcutsWindow.blp:55 msgid "Mark All Read" msgstr "Oznacza wszystkie jako przeczytane" #: data/ui/shortcutsWindow.blp:59 msgid "Article" msgstr "ArtykuÅ‚" #: data/ui/shortcutsWindow.blp:74 data/ui/sidebar_listbox_row.blp:6 msgid "Open in Browser" msgstr "Otwórz w przeglÄ…darce" #: data/ui/sidebar_listbox_row.blp:5 msgid "Mark as Read/Unread" msgstr "Oznacz jako przeczytane/nieprzeczytane" #: data/ui/webview.blp:12 msgid "Select an article" msgstr "Wybór artykuÅ‚u" #: gfeeds/feed_item.py:59 #, python-brace-format msgid "Error: unable to parse datetime {0} for feeditem {1}" msgstr "Błąd: nie można przetworzyć daty i czasu {0} dla elementu kanaÅ‚u {1}" #: gfeeds/feed_parser.py:61 #, python-brace-format msgid "Errors while parsing feed `{0}`, URL: `{1}`" msgstr "Błędy podczas przetwarzania kanaÅ‚u „{0}â€, adres URL: „{1}â€" #: gfeeds/feed_parser.py:75 #, python-brace-format msgid "Error decoding unicode data from feed `{0}`, URL: `{1}`" msgstr "" "Błąd podczas dekodowania danych Unicode z kanaÅ‚u „{0}â€, adres URL: „{1}â€" #: gfeeds/feed_parser.py:82 #, python-brace-format msgid "Error extracting data from feed `{0}`, URL: `{1}`" msgstr "Błąd podczas rozpakowywania danych z kanaÅ‚u „{0}â€, adres URL: „{1}â€" #: gfeeds/feed_parser.py:90 #, python-brace-format msgid "`{0}` may not be an RSS or Atom feed" msgstr "„{0}†może nie być kanaÅ‚em RSS ani Atom" #: gfeeds/feeds_manager.py:83 #, python-brace-format msgid "Feed {0} exists already, skipping" msgstr "KanaÅ‚ {0} już istnieje, pomijanie" #: gfeeds/feeds_view.py:13 msgid "All feeds" msgstr "Wszystkie kanaÅ‚y" #: gfeeds/headerbar.py:197 msgid "There were problems with some feeds. Do you want to remove them?" msgstr "WystÄ…piÅ‚y problemy z częściÄ… kanałów. Usunąć je?" #: gfeeds/headerbar.py:202 msgid "_Keep" msgstr "_Nie usuwaj" #: gfeeds/headerbar.py:204 msgid "_Remove" msgstr "_UsuÅ„" #: gfeeds/main_leaflet.py:114 #, python-brace-format msgid "{0} new article" msgid_plural "{0} new articles" msgstr[0] "{0} nowy artykuÅ‚" msgstr[1] "{0} nowe artykuÅ‚y" msgstr[2] "{0} nowych artykułów" #: gfeeds/__main__.py:232 msgid "Do you want to import these feeds?" msgstr "Zaimportować te kanaÅ‚y?" #: gfeeds/__main__.py:239 gfeeds/__main__.py:273 #: gfeeds/manage_feeds_window.py:324 msgid "_Cancel" msgstr "_Anuluj" #: gfeeds/__main__.py:242 gfeeds/__main__.py:276 msgid "_Import" msgstr "Zai_mportuj" #: gfeeds/__main__.py:269 msgid "Do you want to import this feed?" msgstr "Zaimportować ten kanaÅ‚?" #: gfeeds/__main__.py:301 msgid "url" msgstr "URL" #: gfeeds/__main__.py:304 msgid "opml file local url or rss remote url to import" msgstr "" "adres URL lokalnego pliku OPML lub zdalnego kanaÅ‚u RSS do zaimportowania" #: gfeeds/manage_feeds_window.py:321 msgid "Do you want to delete these feeds?" msgstr "Usunąć te kanaÅ‚y?" #: gfeeds/manage_feeds_window.py:326 msgid "_Delete" msgstr "_UsuÅ„" #: gfeeds/opml_file_chooser.py:7 msgid "XML files" msgstr "Pliki XML" #: gfeeds/opml_file_chooser.py:14 msgid "Choose an OPML file to import" msgstr "Wybór pliku OPML do zaimportowania" #: gfeeds/opml_file_chooser.py:18 msgid "Open" msgstr "Otwórz" #: gfeeds/opml_file_chooser.py:19 gfeeds/opml_file_chooser.py:31 msgid "Cancel" msgstr "Anuluj" #: gfeeds/opml_file_chooser.py:26 msgid "Choose where to save the exported OPML file" msgstr "Wybór miejsca zapisania wyeksportowanego pliku OPML" #: gfeeds/opml_file_chooser.py:30 msgid "Save" msgstr "Zapisz" #: gfeeds/preferences_window.py:27 msgid "General preferences" msgstr "Ogólne preferencje" #: gfeeds/preferences_window.py:29 msgid "Show newer articles first" msgstr "Najpierw nowsze artykuÅ‚y" #: gfeeds/preferences_window.py:34 msgid "Open links in your browser" msgstr "Otwieranie odnoÅ›ników w przeglÄ…darce" #: gfeeds/preferences_window.py:38 msgid "Use external video player for YouTube" msgstr "ZewnÄ™trzny odtwarzacz filmów dla serwisu YouTube" #: gfeeds/preferences_window.py:40 msgid "Requires youtube-dl and a compatible video player" msgstr "Wymaga programu youtube-dl i zgodnego odtwarzacza filmów" #: gfeeds/preferences_window.py:46 msgid "Preferred video player" msgstr "Preferowany odtwarzacz filmów" #: gfeeds/preferences_window.py:50 msgid "Maximum article age" msgstr "Maksymalny wiek artykułów" #: gfeeds/preferences_window.py:51 msgid "In days" msgstr "W dniach" #: gfeeds/preferences_window.py:58 msgid "Refresh preferences" msgstr "Preferencje odÅ›wieżania" #: gfeeds/preferences_window.py:60 msgid "Refresh articles on startup" msgstr "OdÅ›wieżanie artykułów po uruchomieniu" #: gfeeds/preferences_window.py:64 msgid "New articles notification" msgstr "Powiadomienia o nowych artykuÅ‚ach" #: gfeeds/preferences_window.py:68 msgid "Enable auto-refresh" msgstr "Automatyczne odÅ›wieżanie" #: gfeeds/preferences_window.py:72 msgid "Auto-refresh interval" msgstr "Czas miÄ™dzy automatycznymi odÅ›wieżeniami" #: gfeeds/preferences_window.py:73 msgid "In seconds" msgstr "W sekundach" #: gfeeds/preferences_window.py:80 msgid "Cache" msgstr "Pamięć podrÄ™czna" #: gfeeds/preferences_window.py:82 msgid "Clear caches" msgstr "Czyszczenie pamiÄ™ci podrÄ™cznej" #: gfeeds/preferences_window.py:83 msgid "Clear" msgstr "Wyczyść" #: gfeeds/preferences_window.py:109 msgid "Appearance" msgstr "WyglÄ…d" #: gfeeds/preferences_window.py:112 msgid "Appearance preferences" msgstr "Preferencje wyglÄ…du" #: gfeeds/preferences_window.py:114 msgid "Dark mode" msgstr "Tryb ciemny" #: gfeeds/preferences_window.py:118 msgid "Reader mode theme" msgstr "Motyw trybu poprawiania czytelnoÅ›ci" #: gfeeds/preferences_window.py:122 msgid "Automatic" msgstr "Automatyczny" #: gfeeds/preferences_window.py:122 msgid "Light" msgstr "Jasny" #: gfeeds/preferences_window.py:122 msgid "Dark" msgstr "Ciemny" #: gfeeds/preferences_window.py:126 msgid "Show article thumbnails" msgstr "Miniatury artykułów" #: gfeeds/preferences_window.py:131 msgid "Show full articles titles" msgstr "PeÅ‚ne tytuÅ‚y artykułów" #: gfeeds/preferences_window.py:136 msgid "Show full feeds names" msgstr "PeÅ‚ne nazwy kanałów" #: gfeeds/preferences_window.py:143 msgid "Font preferences" msgstr "Preferencje czcionki" #: gfeeds/preferences_window.py:145 msgid "Use system font for titles" msgstr "Czcionka systemowa tytułów" #: gfeeds/preferences_window.py:149 msgid "Use system font for paragraphs" msgstr "Czcionka systemowa tekstu" #: gfeeds/preferences_window.py:153 msgid "Custom title font" msgstr "Niestandardowa czcionka tytułów" #: gfeeds/preferences_window.py:157 msgid "Custom paragraph font" msgstr "Niestandardowa czcionka tekstu" #: gfeeds/preferences_window.py:161 msgid "Custom monospace font" msgstr "Niestandardowa czcionka o staÅ‚ej szerokoÅ›ci" #: gfeeds/preferences_window.py:173 msgid "Privacy" msgstr "Prywatność" #: gfeeds/preferences_window.py:177 msgid "Privacy preferences" msgstr "Preferencje prywatnoÅ›ci" #: gfeeds/preferences_window.py:179 msgid "Enable JavaScript" msgstr "ObsÅ‚uga JavaScript" #: gfeeds/preferences_window.py:184 msgid "Try to block advertisements" msgstr "Blokowanie reklam" #: gfeeds/preferences_window.py:186 gfeeds/preferences_window.py:221 msgid "Requires app restart" msgstr "Wymaga ponownego uruchomienia programu" #: gfeeds/preferences_window.py:190 msgid "Update advertisement blocking list" msgstr "Aktualizowanie listy blokowanych reklam" #: gfeeds/preferences_window.py:191 msgid "Updates automatically every 10 days" msgstr "Automatycznie aktualizuje co 10 dni" #: gfeeds/preferences_window.py:192 msgid "Update" msgstr "Zaktualizuj" #: gfeeds/preferences_window.py:205 msgid "Advanced" msgstr "Zaawansowane" #: gfeeds/preferences_window.py:208 msgid "Advanced preferences" msgstr "Zaawansowane preferencje" #: gfeeds/preferences_window.py:210 msgid "Maximum refresh threads" msgstr "Maksymalna liczba wÄ…tków odÅ›wieżania" #: gfeeds/preferences_window.py:212 msgid "How many threads to use for feeds refresh" msgstr "Ile wÄ…tków używać do odÅ›wieżania kanałów" #: gfeeds/preferences_window.py:219 msgid "Experimental GtkListView for articles list" msgstr "Eksperymentalny widżet GtkListView dla listy artykułów" #: gfeeds/preferences_window.py:227 msgid "Troubleshooting" msgstr "RozwiÄ…zywanie problemów" #: gfeeds/preferences_window.py:229 msgid "Export Configuration as JSON" msgstr "Eksport konfiguracji do pliku JSON" #: gfeeds/preferences_window.py:230 msgid "Attach this when reporting bugs" msgstr "ProszÄ™ go dołączyć podczas zgÅ‚aszania błędów" #: gfeeds/preferences_window.py:231 msgid "Export" msgstr "Wyeksportuj" #. type: ignore #: gfeeds/preferences_window.py:244 msgid "Feeds Configuration" msgstr "Konfiguracja" #: gfeeds/preferences_window.py:248 msgid "_Close" msgstr "Za_mknij" #: gfeeds/preferences_window.py:251 msgid "Cop_y" msgstr "S_kopiuj" #: gfeeds/util/download_manager.py:112 #, python-brace-format msgid "`{0}`: connection timed out" msgstr "„{0}â€: połączenie przekroczyÅ‚o czas oczekiwania" #: gfeeds/util/download_manager.py:121 #, python-brace-format msgid "`{0}` might not be a valid address" msgstr "„{0}†może nie być prawidÅ‚owym adresem" #: gfeeds/util/download_manager.py:161 #, python-brace-format msgid "Error downloading `{0}`, code `{1}`" msgstr "Błąd podczas pobierania „{0}â€, kod „{1}â€" #: gfeeds/util/get_favicon.py:48 #, python-brace-format msgid "Error downloading favicon for `{0}`" msgstr "Błąd podczas pobierania ikony dla „{0}â€" #: gfeeds/util/opml_parser.py:33 msgid "Error: OPML path provided does not exist" msgstr "Błąd: podana Å›cieżka do pliku OPML nie istnieje" #: gfeeds/util/opml_parser.py:44 #, python-brace-format msgid "Error parsing OPML file `{0}`" msgstr "Błąd podczas przetwarzania pliku OPML „{0}â€" #: gfeeds/webview.py:204 msgid "Link copied to clipboard!" msgstr "Skopiowano odnoÅ›nik do schowka" #: gfeeds/webview.py:226 msgid "Feed content not available for this article" msgstr "Treść kanaÅ‚u jest niedostÄ™pna dla tego artykuÅ‚u" gfeeds-2.2.0/po/pt_BR.po000066400000000000000000000267751440757451400147700ustar00rootroot00000000000000# Portuguese translations for gfeeds package. # Copyright (C) 2022 THE gfeeds'S COPYRIGHT HOLDER # This file is distributed under the same license as the gfeeds package. # Gleisson Jesuino Joaquim Cardoso , 2019. # Matheus Barbosa , 2022. # Rafael Fontenelle , 2021-2022. # Enrico Nicoletto , 2022. msgid "" msgstr "" "Project-Id-Version: gfeeds master\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/gfeeds/issues\n" "POT-Creation-Date: 2022-09-08 17:37+0000\n" "PO-Revision-Date: 2022-09-10 16:15-0300\n" "Last-Translator: Enrico Nicoletto \n" "Language-Team: Brazilian Portuguese \n" "Language: pt_BR\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" #: data/org.gabmus.gfeeds.appdata.xml.in:4 msgid "Feeds" msgstr "Feeds" #: data/org.gabmus.gfeeds.appdata.xml.in:6 data/org.gabmus.gfeeds.desktop.in:7 msgid "News reader for GNOME" msgstr "Leitor de notícias para o GNOME" #: data/org.gabmus.gfeeds.appdata.xml.in:15 msgid "" "Feeds is a minimal RSS/Atom feed reader built with speed and simplicity in " "mind." msgstr "" "Feeds é um leitor minimalista de notícias RSS / Atom construído para ser " "rápido e simples." #: data/org.gabmus.gfeeds.appdata.xml.in:16 msgid "" "It offers a simple user interface that only shows the latest news from your " "subscriptions." msgstr "" "Ele oferece uma interface simples que mostra apenas as últimas notícias de " "suas assinaturas." #: data/org.gabmus.gfeeds.appdata.xml.in:17 msgid "" "Articles are shown in a web view by default, with javascript disabled for a " "faster and less intrusive user experience. There's also a reader mode " "included, built from the one GNOME Web/Epiphany uses." msgstr "" "Os artigos são mostrados em uma visualização Web por padrão, com o " "javascript desativado para uma experiência mais rápida e menos invasiva. Há " "também um modo de leitor, construído a partir do que o GNOME Web / Epiphany " "usa." #: data/org.gabmus.gfeeds.appdata.xml.in:18 msgid "Feeds can be imported and exported via OPML." msgstr "As fontes RSS podem ser importadas e exportadas via OPML." #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/org.gabmus.gfeeds.desktop.in:16 msgid "rss;reader;feed;news;" msgstr "leitor, feed, notícias;" #: gfeeds/feed_item.py:55 #, python-brace-format msgid "Error: unable to parse datetime {0} for feeditem {1}" msgstr "Erro: Não é possível analisar a data e hora {0} para o item {1}" #: gfeeds/feed_parser.py:61 #, python-brace-format msgid "Errors while parsing feed `{0}`, URL: `{1}`" msgstr "Erros ao analisar a fonte RSS `{0}`, URL: `{1}`" #: gfeeds/feed_parser.py:71 #, python-brace-format msgid "`{0}` may not be an RSS or Atom feed" msgstr "`{0}` pode não ser uma fonte RSS ou Atom" #: gfeeds/feeds_manager.py:89 #, python-brace-format msgid "Feed {0} exists already, skipping" msgstr "A fonte RSS {0} já existe, pulando" #: gfeeds/feeds_view.py:13 msgid "All feeds" msgstr "Mostrar todos" #: gfeeds/headerbar.py:198 msgid "There were problems with some feeds. Do you want to remove them?" msgstr "Ocorreram problemas com alguns feeds. Você quer removê-los?" #: gfeeds/headerbar.py:203 msgid "_Keep" msgstr "Man_ter" #: gfeeds/headerbar.py:205 msgid "_Remove" msgstr "_Remover" #: gfeeds/main_leaflet.py:122 #, python-brace-format msgid "{0} new article" msgid_plural "{0} new articles" msgstr[0] "{0} novo artigo" msgstr[1] "{0} novos artigos" #: gfeeds/__main__.py:225 msgid "Do you want to import these feeds?" msgstr "Deseja importar essas fontes RSS ?" #: gfeeds/__main__.py:252 msgid "Do you want to import this feed?" msgstr "Deseja importar a fonte RSS ?" #: gfeeds/__main__.py:281 msgid "url" msgstr "url" #: gfeeds/__main__.py:284 msgid "opml file local url or rss remote url to import" msgstr "url local do arquivo opml ou URL remoto rss para importar" #: gfeeds/manage_feeds_window.py:263 msgid "Manage Feeds" msgstr "Gerenciar fontes RSS" #: gfeeds/manage_feeds_window.py:318 msgid "Do you want to delete these feeds?" msgstr "Deseja excluir ?" #: gfeeds/opml_file_chooser.py:7 msgid "XML files" msgstr "Arquivos XML" #: gfeeds/opml_file_chooser.py:14 msgid "Choose an OPML file to import" msgstr "Escolha um arquivo OPML para importar" #: gfeeds/opml_file_chooser.py:18 msgid "Open" msgstr "Abrir" #: gfeeds/opml_file_chooser.py:19 gfeeds/opml_file_chooser.py:31 msgid "Cancel" msgstr "Cancelar" #: gfeeds/opml_file_chooser.py:26 msgid "Choose where to save the exported OPML file" msgstr "Escolha onde salvar o arquivo OPML exportado" #: gfeeds/opml_file_chooser.py:30 msgid "Save" msgstr "Salvar" #: gfeeds/preferences_window.py:24 msgid "General" msgstr "Geral" #: gfeeds/preferences_window.py:27 msgid "General preferences" msgstr "Preferências gerais" #: gfeeds/preferences_window.py:29 msgid "Show newer articles first" msgstr "Mostrar novos artigos primeiros" #: gfeeds/preferences_window.py:34 msgid "Open links in your browser" msgstr "Abrir links no navegador" #: gfeeds/preferences_window.py:38 msgid "Use external video player for YouTube" msgstr "Usar reprodutor de vídeo externo para o YouTube" #: gfeeds/preferences_window.py:40 msgid "Requires youtube-dl and a compatible video player" msgstr "Exibe youtube-dl e um reprodutor de vídeo compatível" #: gfeeds/preferences_window.py:46 msgid "Preferred video player" msgstr "Reprodutor de vídeo preferido" #: gfeeds/preferences_window.py:50 msgid "Maximum article age" msgstr "Data máxima do artigo" #: gfeeds/preferences_window.py:51 msgid "In days" msgstr "Em dias" #: gfeeds/preferences_window.py:58 msgid "Refresh preferences" msgstr "Atualizar preferências" #: gfeeds/preferences_window.py:60 msgid "Refresh articles on startup" msgstr "Atualiza artigos no início" #: gfeeds/preferences_window.py:64 msgid "New articles notification" msgstr "Notificação de novos artigos" #: gfeeds/preferences_window.py:68 msgid "Enable auto-refresh" msgstr "Habilitar atualização automática" #: gfeeds/preferences_window.py:72 msgid "Auto-refresh interval" msgstr "Intervalo de atualização" #: gfeeds/preferences_window.py:73 msgid "In seconds" msgstr "Em segundos" #: gfeeds/preferences_window.py:80 msgid "Cache" msgstr "Histórico" #: gfeeds/preferences_window.py:82 msgid "Clear caches" msgstr "Limpar histórico" #: gfeeds/preferences_window.py:83 msgid "Clear" msgstr "Limpar" #: gfeeds/preferences_window.py:109 msgid "Appearance" msgstr "Aparência" #: gfeeds/preferences_window.py:112 msgid "Appearance preferences" msgstr "Preferências de aparência" #: gfeeds/preferences_window.py:114 msgid "Dark mode" msgstr "Modo noturno" #: gfeeds/preferences_window.py:118 msgid "Reader mode theme" msgstr "Tema do modo de leitura" #: gfeeds/preferences_window.py:122 msgid "Automatic" msgstr "Automático" #: gfeeds/preferences_window.py:122 msgid "Light" msgstr "Claro" #: gfeeds/preferences_window.py:122 msgid "Dark" msgstr "Escuro" #: gfeeds/preferences_window.py:126 msgid "Show article thumbnails" msgstr "Mostrar miniaturas de artigos" #: gfeeds/preferences_window.py:131 msgid "Show full articles titles" msgstr "Mostrar todo o título dos artigos" #: gfeeds/preferences_window.py:136 msgid "Show full feeds names" msgstr "Mostrar nome completo do feed" #: gfeeds/preferences_window.py:143 msgid "Font preferences" msgstr "Preferências de fonte" #: gfeeds/preferences_window.py:145 msgid "Use system font for titles" msgstr "Usar a fonte do sistema para títulos" #: gfeeds/preferences_window.py:149 msgid "Use system font for paragraphs" msgstr "Usar a fonte do sistema para parágrafos" #: gfeeds/preferences_window.py:153 msgid "Custom title font" msgstr "Fonte de título personalizada" #: gfeeds/preferences_window.py:157 msgid "Custom paragraph font" msgstr "Fonte de parágrafo personalizada" #: gfeeds/preferences_window.py:161 msgid "Custom monospace font" msgstr "Fonte monoespaçada personalizada" #: gfeeds/preferences_window.py:173 msgid "Privacy" msgstr "Privacidade" #: gfeeds/preferences_window.py:176 msgid "Privacy preferences" msgstr "Preferências de privacidade" #: gfeeds/preferences_window.py:178 msgid "Enable JavaScript" msgstr "Ativar JavaScript" #: gfeeds/preferences_window.py:183 msgid "Try to block advertisements" msgstr "Tentar bloquear anúncios" #: gfeeds/preferences_window.py:185 gfeeds/preferences_window.py:220 msgid "Requires app restart" msgstr "Exibe reinicialização do aplicativo" #: gfeeds/preferences_window.py:189 msgid "Update advertisement blocking list" msgstr "Atualizar lista de bloqueio de anúncios" #: gfeeds/preferences_window.py:190 msgid "Updates automatically every 10 days" msgstr "Atualizar automaticamente a cada 10 dias" #: gfeeds/preferences_window.py:191 msgid "Update" msgstr "Atualizar" #: gfeeds/preferences_window.py:204 msgid "Advanced" msgstr "Avançado" #: gfeeds/preferences_window.py:207 msgid "Advanced preferences" msgstr "Preferências avançadas" #: gfeeds/preferences_window.py:209 msgid "Maximum refresh threads" msgstr "Máximo de tópicos atualizados" #: gfeeds/preferences_window.py:211 msgid "How many threads to use for feeds refresh" msgstr "Quantas threads usar para a atualização de feeds" #: gfeeds/preferences_window.py:218 msgid "Experimental GtkListView for articles list" msgstr "GtkListView experimental para a lista de artigos" #: gfeeds/preferences_window.py:226 msgid "Troubleshooting" msgstr "Resolução de problemas" #: gfeeds/preferences_window.py:228 msgid "Export Configuration as JSON" msgstr "Exportar Configuração como JSON" #: gfeeds/preferences_window.py:229 msgid "Attach this when reporting bugs" msgstr "Anexe isto ao relatar problemas" #: gfeeds/preferences_window.py:230 msgid "Export" msgstr "Exportar" #. type: ignore #: gfeeds/preferences_window.py:243 msgid "Feeds Configuration" msgstr "Configuração de Feeds" #: gfeeds/preferences_window.py:247 msgid "_Close" msgstr "_Fechar" #: gfeeds/preferences_window.py:250 msgid "Cop_y" msgstr "Cop_iar" #: gfeeds/sidebar.py:21 msgid "Loading feeds..." msgstr "Carregando feeds..." #: gfeeds/sidebar_row_popover.py:31 gfeeds/sidebar_row_popover.py:58 msgid "Mark as unread" msgstr "Marcar como não lido" #: gfeeds/sidebar_row_popover.py:38 gfeeds/sidebar_row_popover.py:50 msgid "Mark as read" msgstr "Marcar como lido" #: gfeeds/util/download_manager.py:112 #, python-brace-format msgid "`{0}`: connection timed out" msgstr "`{0}`: tempo de conexão excedido" #: gfeeds/util/download_manager.py:121 #, python-brace-format msgid "`{0}` might not be a valid address" msgstr "`{0}` pode não ser um endereço válido" #: gfeeds/util/download_manager.py:157 #, python-brace-format msgid "Error downloading `{0}`, code `{1}`" msgstr "Erro ao baixar `{0}`, código `{1}`" #: gfeeds/util/get_favicon.py:48 #, python-brace-format msgid "Error downloading favicon for `{0}`" msgstr "Erro ao baixar o favicon para `{0}`" #: gfeeds/util/opml_parser.py:31 msgid "Error: OPML path provided does not exist" msgstr "Erro: O caminho OPML fornecido não existe" #: gfeeds/util/opml_parser.py:42 #, python-brace-format msgid "Error parsing OPML file `{0}`" msgstr "Erro ao analisar o arquivo OPML `{0}`" #: gfeeds/webview.py:201 msgid "Link copied to clipboard!" msgstr "Copiado para a área de transferência !" #: gfeeds/webview.py:223 msgid "Feed content not available for this article" msgstr "Conteúdo do feed não disponível para este artigo" gfeeds-2.2.0/po/ru.po000066400000000000000000000544751440757451400144060ustar00rootroot00000000000000# Russian translations for GFeeds package. # Copyright (C) 2019 THE GFeeds'S COPYRIGHT HOLDER # This file is distributed under the same license as the GFeeds package. # Alessandra Gallia , 2019. # msgid "" msgstr "" "Project-Id-Version: GFeeds 0.9\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-09-11 20:52+0200\n" "PO-Revision-Date: 2019-10-03 22:01+0200\n" "Last-Translator: Alessandra Gallia \n" "Language-Team: Russian \n" "Language: ru\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<10 || n%100>=20) ? 1 : 2);\n" "X-Generator: Poedit 2.2.1\n" #: ../gfeeds/opml_file_chooser.py:6 msgid "Choose an OPML file to import" msgstr "Выберите файл OPML Ð´Ð»Ñ Ð¸Ð¼Ð¿Ð¾Ñ€Ñ‚Ð°" #: ../gfeeds/opml_file_chooser.py:13 ../gfeeds/opml_file_chooser.py:30 msgid "XML files" msgstr "Файлы XML" #: ../gfeeds/opml_file_chooser.py:21 msgid "Choose where to save the exported OPML file" msgstr "Выберите меÑто Ð´Ð»Ñ ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ ÑкÑпортированного файла OPML" #: ../gfeeds/rss_parser.py:60 #, python-brace-format msgid "Error: unable to parse datetime {0} for feeditem {1}" msgstr "Ошибка: не удаетÑÑ Ñ€Ð°Ð·Ð±Ð¸Ñ€Ð°Ñ‚ÑŒÑÑ Ð´Ð°Ñ‚Ñƒ и Ð²Ñ€ÐµÐ¼Ñ {0} Ð´Ð»Ñ Ñлемента фида {1}" #: ../gfeeds/rss_parser.py:172 #, python-brace-format msgid "`{0}` may not be an RSS or Atom feed" msgstr "`{0}` не может быть RSS или Atom фид" #: ../gfeeds/rss_parser.py:197 #, python-brace-format msgid "" "Error resizing favicon for feed {0}. Probably not an image.\n" "Trying downloading favicon from an article." msgstr "" "Ошибка Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñ€Ð°Ð·Ð¼ÐµÑ€Ð° фавикона Ð´Ð»Ñ Ñ„Ð¸Ð´Ð° {0}. Ðаверное, не ÑвлÑетÑÑ " "изображением.\n" "Попытка загрузки фавикона из Ñтатьи." #: ../gfeeds/rss_parser.py:206 #, python-brace-format msgid "" "Error resizing favicon from article for feed {0}.\n" "Deleting invalid favicon." msgstr "" "Ошибка Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñ€Ð°Ð·Ð¼ÐµÑ€Ð° фавикона из Ñтатьи Ð´Ð»Ñ Ñ„Ð¸Ð´Ð° {0}.\n" "Удаление неверного фавикона." #: ../gfeeds/feeds_manager.py:60 #, python-brace-format msgid "Feed {0} exists already, skipping" msgstr "Фид {0} уже ÑущеÑтвует, пропуÑкание" #: ../gfeeds/headerbar.py:154 msgid "Add new feed" msgstr "Добавить новый фид" #: ../gfeeds/get_favicon.py:61 #, python-brace-format msgid "Error downloading favicon for `{0}`" msgstr "Ошибка при загрузке фавикона Ð´Ð»Ñ `{0}`" #: ../gfeeds/feeds_view.py:15 msgid "All feeds" msgstr "Ð’Ñе фиды" #: ../gfeeds/webview.py:68 msgid "Web View" msgstr "Веб-проÑмотр" #: ../gfeeds/webview.py:69 msgid "Filler View" msgstr "Filler View" #: ../gfeeds/webview.py:137 msgid "RSS content or summary not available for this article" msgstr "Содержимое или Ñводка RSS-каналов недоÑтупны Ð´Ð»Ñ Ñтой Ñтатьи" #: ../gfeeds/build_reader_html.py:397 msgid "Reader mode unavailable for this site" msgstr "Режим Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ð½ÐµÐ´Ð¾Ñтупен Ð´Ð»Ñ Ñтого Ñайта" #: ../gfeeds/sidebar.py:166 msgid "Feed" msgstr "Фид" #: ../gfeeds/sidebar.py:172 msgid "Saved" msgstr "Сохранено" #: ../gfeeds/__main__.py:277 msgid "url" msgstr "url" #: ../gfeeds/__main__.py:280 msgid "opml file local url or rss remote url to import" msgstr "OPML файл, локальный URL или удаленный URL RSS-каналов Ð´Ð»Ñ Ð¸Ð¼Ð¿Ð¾Ñ€Ñ‚Ð°" #: ../gfeeds/download_manager.py:38 #, python-brace-format msgid "`{0}` is not an URL" msgstr "`{0}` не ÑвлÑетÑÑ URL-адреÑом" #: ../gfeeds/download_manager.py:56 #, python-brace-format msgid "Error downloading `{0}`, code `{1}`" msgstr "Ошибка при загрузке `{0}`, код `{1}`" #: ../gfeeds/settings_window.py:123 msgid "General" msgstr "ОÑновные" #: ../gfeeds/settings_window.py:128 msgid "General Settings" msgstr "ОÑновные наÑтройки" #: ../gfeeds/settings_window.py:131 msgid "Show newer articles first" msgstr "Вначале отображать новые Ñтатьи" #: ../gfeeds/settings_window.py:136 msgid "Use reader mode by default" msgstr "ИÑпользовать режим Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ð¿Ð¾ умолчанию" #: ../gfeeds/settings_window.py:141 msgid "Use content from the RSS feed" msgstr "ИÑпользовать Ñодержимое RSS фида" #: ../gfeeds/settings_window.py:151 msgid "Maximum article age" msgstr "МакÑимальный возраÑÑ‚ Ñтатьи" #: ../gfeeds/settings_window.py:155 msgid "In days" msgstr "Через неÑколько дней" #: ../gfeeds/settings_window.py:161 msgid "Cache" msgstr "КÑш" #: ../gfeeds/settings_window.py:164 msgid "Clear all caches" msgstr "ОчиÑтить веÑÑŒ кÑш" #: ../gfeeds/settings_window.py:165 msgid "Clear caches" msgstr "ОчиÑтить кÑш" #: ../gfeeds/settings_window.py:203 msgid "View" msgstr "Вид" #: ../gfeeds/settings_window.py:208 msgid "View Settings" msgstr "ПоÑмотрить ÐаÑтройки" #: ../gfeeds/settings_window.py:211 msgid "Show colored border" msgstr "Отображать цветную границу" #: ../gfeeds/settings_window.py:216 msgid "Show full articles titles" msgstr "Отображать полные заголовки Ñтатьи" #: ../gfeeds/settings_window.py:221 msgid "Use dark theme for reader mode" msgstr "ИÑпользовать темную тему Ð´Ð»Ñ Ñ€ÐµÐ¶Ð¸Ð¼Ð° чтениÑ" #: ../gfeeds/settings_window.py:226 msgid "Enable JavaScript" msgstr "Включить JavaScript" #: ../gfeeds/settings_window.py:231 msgid "Enable client side decoration" msgstr "Включить оформление на Ñтороне клиента" #: ../gfeeds/settings_window.py:247 msgid "Advanced" msgstr "Дополнительно" #: ../gfeeds/settings_window.py:252 msgid "Advanced Settings" msgstr "Дополнительные ÐаÑтройки" #: ../gfeeds/settings_window.py:255 msgid "Maximum refresh threads" msgstr "МакÑимальные потоки обновлениÑ" #: ../gfeeds/settings_window.py:260 msgid "How many threads to refresh feeds" msgstr "Сколько потоков Ð´Ð»Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ñ„Ð¸Ð´Ð¾Ð²" #: ../gfeeds/settings_window.py:298 msgid "Preferences" msgstr "ПерÑональные наÑтройки" #: ../gfeeds/manage_feeds_window.py:17 ../gfeeds/manage_feeds_window.py:107 msgid "Manage Feeds" msgstr "Управление Фидами" #: ../gfeeds/manage_feeds_window.py:24 msgid "Select/Unselect all" msgstr "Выбрать/Отменить вÑе" #: ../gfeeds/manage_feeds_window.py:30 msgid "Delete selected feeds" msgstr "Удалить выбранные фиды" #: ../gfeeds/manage_feeds_window.py:79 msgid "Do you want to delete these feeds?" msgstr "Ð’Ñ‹ дейÑтвительно хотите удалить Ñти фиды?" #: ../gfeeds/spinner_button.py:15 msgid "Refresh feeds" msgstr "Обновить фиды" #: ../gfeeds/confirm_add_dialog.py:14 msgid "Do you want to import these feeds?" msgstr "Ð’Ñ‹ хотите импортировать Ñти фиды?" #: ../gfeeds/confirm_add_dialog.py:15 msgid "Do you want to import this feed?" msgstr "Ð’Ñ‹ хотите импортировать Ñтот фид?" #: ../gfeeds/opml_manager.py:8 msgid "Error: OPML path provided does not exist" msgstr "Ошибка: указанный путь OPML не ÑущеÑтвует" #: ../gfeeds/opml_manager.py:15 #, python-brace-format msgid "Error parsing OPML file `{0}`" msgstr "Сбой разбора файла OPML `{0}`" #: ../gfeeds/suggestion_bar.py:33 msgid "There are some errors" msgstr "ЯвлÑÑŽÑ‚ÑÑ Ð½ÐµÑколько ошибок" #: ../gfeeds/suggestion_bar.py:40 msgid "Show" msgstr "Отображать" #: ../gfeeds/suggestion_bar.py:41 msgid "Ignore" msgstr "Игнорировать" #: ../gfeeds/suggestion_bar.py:59 msgid "There were problems with some feeds" msgstr "ЯвлÑлиÑÑŒ проблемы Ñ Ð½ÐµÑколькими фидами" #: ../gfeeds/suggestion_bar.py:71 msgid "You are offline" msgstr "Ð’Ñ‹ офлайн" #: ../gfeeds/sidebar_row_popover.py:45 ../gfeeds/sidebar_row_popover.py:90 msgid "Mark as unread" msgstr "Отметить как непрочитанное" #: ../gfeeds/sidebar_row_popover.py:53 ../gfeeds/sidebar_row_popover.py:80 msgid "Mark as read" msgstr "Отметить как прочитанное" #: ../data/ui/menu.xml:6 msgid "Show read articles" msgstr "Отображать прочитанные Ñтатьи" #: ../data/ui/menu.xml:10 msgid "Mark all as read" msgstr "Отметить вÑе как прочитанное" #: ../data/ui/menu.xml:14 msgid "Mark all as unread" msgstr "Отметить вÑе как непрочитанное" #: ../data/ui/menu.xml:24 msgid "Import OPML" msgstr "Импортировать OPML" #: ../data/ui/menu.xml:28 msgid "Export OPML" msgstr "ЭкÑпортировать OPML" #: ../data/ui/menu.xml:38 msgid "Keyboard Shortcuts" msgstr "Ð¡Ð¾Ñ‡ÐµÑ‚Ð°Ð½Ð¸Ñ ÐšÐ»Ð°Ð²Ð¸Ñˆ" #: ../data/ui/menu.xml:42 msgid "About Feeds" msgstr "О Feeds" #: ../data/ui/empty_state.glade:42 msgid "Let's get started" msgstr "Давайте начнем" #: ../data/ui/empty_state.glade:88 msgid "Add new feeds via URL" msgstr "Добавить новые фиды через URL" #: ../data/ui/empty_state.glade:100 msgid "Import an OPML file" msgstr "Импортируйте файл OPML" #: ../data/ui/shortcutsWindow.xml:13 msgid "Quit" msgstr "Выйти" #: ../data/ui/shortcutsWindow.xml:19 msgid "Next article" msgstr "Ð¡Ð»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ ÑтатьÑ" #: ../data/ui/shortcutsWindow.xml:25 msgid "Previous article" msgstr "ÐŸÑ€ÐµÐ´Ñ‹Ð´ÑƒÑ‰Ð°Ñ ÑтатьÑ" #: ../data/ui/shortcutsWindow.xml:31 msgid "Show/Hide read articles" msgstr "Отображать/Скрыть прочитанные Ñтатьи" #: ../data/ui/shortcutsWindow.xml:37 msgid "Refresh articles" msgstr "Обновить Ñтатьи" #: ../data/ui/shortcutsWindow.xml:43 msgid "Zoom in" msgstr "Увеличить" #: ../data/ui/shortcutsWindow.xml:49 msgid "Zoom out" msgstr "Уменьшить" #: ../data/ui/shortcutsWindow.xml:55 msgid "Reset zoom" msgstr "СброÑить маÑштаб" #: ../data/ui/spinner_button.glade:22 msgid "page0" msgstr "Ñтраница0" #: ../data/ui/spinner_button.glade:33 msgid "page1" msgstr "Ñтраница1" #: ../data/ui/add_feed_box.glade:20 msgid "Enter feed address to add" msgstr "Введите Ð°Ð´Ñ€ÐµÑ Ñ„Ð¸Ð´Ð° Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ" #: ../data/ui/add_feed_box.glade:41 msgid "https://..." msgstr "https://..." #: ../data/ui/add_feed_box.glade:61 msgid "Add" msgstr "Добавить" #: ../data/ui/add_feed_box.glade:91 msgid "You're already subscribed to that feed!" msgstr "Ð’Ñ‹ уже подпиÑаны на Ñтот фид!" #: ../data/ui/article_right_click_popover_content.glade:48 msgid "Save article" msgstr "Сохранить Ñтатью" #: ../data/ui/headerbar.glade:44 msgid "Menu" msgstr "Меню" #: ../data/ui/headerbar.glade:64 msgid "Filter by feed" msgstr "Фильтр по фиду" #: ../data/ui/headerbar.glade:87 msgid "Back to articles" msgstr "ВернутьÑÑ Ðº ÑтатьÑм" #: ../data/ui/headerbar.glade:104 msgid "Reader mode" msgstr "Режим чтениÑ" #: ../data/ui/headerbar.glade:123 msgid "Load RSS content" msgstr "Загрузить Ñодержимое RSS" #: ../data/ui/headerbar.glade:142 msgid "Share" msgstr "ПоделитьÑÑ" #: ../data/ui/headerbar.glade:189 msgid "Open externally" msgstr "Открыть Ñнаружи" #: ../data/ui/webview_with_notification.glade:51 msgid "Link copied to clipboard!" msgstr "СÑылка Ñкопирована в буфер обмена!" #: ../data/ui/webview_filler.glade:42 msgid "Select an article" msgstr "Выберите Ñтатью" #: ../data/org.gabmus.gfeeds.desktop.in:3 msgid "@prettyname@" msgstr "@prettyname@" #: ../data/org.gabmus.gfeeds.desktop.in:4 msgid "News reader for GNOME" msgstr "Ридер новоÑтей Ð´Ð»Ñ GNOME" #: ../data/org.gabmus.gfeeds.desktop.in:6 msgid "@appid@" msgstr "@appid@" #: ../data/org.gabmus.gfeeds.desktop.in:12 msgid "rss;reader;feed;news;" msgstr "rss;ридер;фид;новоÑти;" #: ../data/org.gabmus.gfeeds.appdata.xml.in:4 msgid "Feeds" msgstr "Feeds" #: ../data/org.gabmus.gfeeds.appdata.xml.in:5 msgid "Gabriele Musco" msgstr "Габриеле МуÑко" #: ../data/org.gabmus.gfeeds.appdata.xml.in:10 msgid "" "Feeds is a minimal RSS/Atom feed reader built with speed and simplicity in " "mind." msgstr "" "Feeds - Ñто минимальный ридер RSS/Atom фидов, поÑтроенный Ñ ÑƒÑ‡ÐµÑ‚Ð¾Ð¼ ÑкороÑти " "и проÑтоты." #: ../data/org.gabmus.gfeeds.appdata.xml.in:11 msgid "" "It offers a simple user interface that only shows the latest news from your " "subscriptions." msgstr "" "Предлагает проÑтой Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ, который отображает только " "поÑледние новоÑти из ваших подпиÑок." #: ../data/org.gabmus.gfeeds.appdata.xml.in:12 msgid "" "Articles are shown in a web view by default, with javascript disabled for a " "faster and less intrusive user experience. There's also a reader mode " "included, built from the one GNOME Web/Epiphany uses." msgstr "" "Статьи отображаютÑÑ Ð² веб-проÑмотре по умолчанию, Ñ Ð²Ñ‹ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ‹Ð¼ javascript " "за более быÑтрым и менее навÑзчивым опытом пользователÑ. ЯвлÑетÑÑ Ñ‚Ð¾Ð¶Ðµ " "включенный режим чтениÑ, поÑтроенный из того, что иÑпользует GNOME Web/" "Epiphany." #: ../data/org.gabmus.gfeeds.appdata.xml.in:13 msgid "Feeds can be imported and exported via OPML." msgstr "Можно импортировать и ÑкÑпортировать фиды через OPML." #: ../data/org.gabmus.gfeeds.appdata.xml.in:54 msgid "Errors with feeds are now shown in the UI" msgstr "Ошибки фидов теперь отображаютÑÑ Ð² ИП" #: ../data/org.gabmus.gfeeds.appdata.xml.in:55 msgid "Big UI overhaul" msgstr "Большое преображение ИП" #: ../data/org.gabmus.gfeeds.appdata.xml.in:56 msgid "Updated translations" msgstr "Обновленные переводы" #: ../data/org.gabmus.gfeeds.appdata.xml.in:57 #: ../data/org.gabmus.gfeeds.appdata.xml.in:72 #: ../data/org.gabmus.gfeeds.appdata.xml.in:83 #: ../data/org.gabmus.gfeeds.appdata.xml.in:136 msgid "Various bug fixes" msgstr "Разные иÑÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¾ÑˆÐ¸Ð±Ð¾Ðº" #: ../data/org.gabmus.gfeeds.appdata.xml.in:64 msgid "OPML file association" msgstr "ÐÑÑÐ¾Ñ†Ð¸Ð°Ñ†Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð² OPML" #: ../data/org.gabmus.gfeeds.appdata.xml.in:65 msgid "Changed left headerbar button order" msgstr "Изменен порÑдок левой кнопки Ñтроки заголовка" #: ../data/org.gabmus.gfeeds.appdata.xml.in:66 msgid "Optimization for updating feeds" msgstr "ÐžÐ¿Ñ‚Ð¸Ð¼Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð´Ð»Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ñ„Ð¸Ð´Ð¾Ð²" #: ../data/org.gabmus.gfeeds.appdata.xml.in:67 msgid "Redesigned right click/longpress menu" msgstr "Переработано меню при правом щелчке/длинном нажатии" #: ../data/org.gabmus.gfeeds.appdata.xml.in:68 msgid "Option to show/hide read articles" msgstr "Параметр Ð´Ð»Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ/ÑÐºÑ€Ñ‹Ð²Ð°Ð½Ð¸Ñ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ‹Ñ… Ñтатей" #: ../data/org.gabmus.gfeeds.appdata.xml.in:69 msgid "Reworked suggestion bar" msgstr "Переработана Ñтрока предложениÑ" #: ../data/org.gabmus.gfeeds.appdata.xml.in:70 msgid "Changed name to Feeds" msgstr "Изменено Ð¸Ð¼Ñ Feeds" #: ../data/org.gabmus.gfeeds.appdata.xml.in:71 msgid "Improved CPU utilization" msgstr "Улучшено иÑпользование ЦПУ" #: ../data/org.gabmus.gfeeds.appdata.xml.in:79 msgid "New right click or longpress menu for articles" msgstr "Ðовое меню при правом щелчке или длинном нажатии Ð´Ð»Ñ Ñтатей" #: ../data/org.gabmus.gfeeds.appdata.xml.in:80 msgid "You can now save articles offline" msgstr "Теперь можно Ñохранить Ñтатьи в режиме офлайн" #: ../data/org.gabmus.gfeeds.appdata.xml.in:81 msgid "Initial suggestion to add feeds is now less intrusive" msgstr "Ðачальное предложение Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ñ„Ð¸Ð´Ð¾Ð² теперь менее навÑзчивое" #: ../data/org.gabmus.gfeeds.appdata.xml.in:82 msgid "Read articles are now greyed out" msgstr "Прочитанные Ñтатьи теперь выделены Ñерым цветом" #: ../data/org.gabmus.gfeeds.appdata.xml.in:90 msgid "Concurrent feeds refresh, with customizable thread count" msgstr "Одновременное обновление фиды Ñ Ð½Ð°Ñтраиваемым количеÑтвом потоков" #: ../data/org.gabmus.gfeeds.appdata.xml.in:91 msgid "Added German translation (thanks @Etamuk)" msgstr "Добавлен перевод на немецкий Ñзык (ÑпаÑибо @Etamuk)" #: ../data/org.gabmus.gfeeds.appdata.xml.in:98 msgid "Fix bugs in reader mode" msgstr "ИÑправить ошибки в режиме чтениÑ" #: ../data/org.gabmus.gfeeds.appdata.xml.in:105 msgid "Minor bug fix" msgstr "ИÑправление незначительных ошибок" #: ../data/org.gabmus.gfeeds.appdata.xml.in:112 msgid "Improved date and time parsing and display" msgstr "Улучшены разбирание даты и времени, и Ñкран" #: ../data/org.gabmus.gfeeds.appdata.xml.in:113 msgid "Reader mode can now work on websites without an article tag" msgstr "Теперь режим Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð¶ÐµÑ‚ работать на веб-Ñайтах без тега Ñтатьи" #: ../data/org.gabmus.gfeeds.appdata.xml.in:114 msgid "Slight improvements to the icon" msgstr "Ðебольшие ÑƒÐ»ÑƒÑ‡ÑˆÐµÐ½Ð¸Ñ Ð·Ð½Ð°Ñ‡ÐºÐ°" #: ../data/org.gabmus.gfeeds.appdata.xml.in:115 msgid "New feature to filter articles by feed" msgstr "ÐÐ¾Ð²Ð°Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ñ„Ð¸Ð»ÑŒÑ‚Ñ€Ð° Ñтатей по фиду" #: ../data/org.gabmus.gfeeds.appdata.xml.in:122 msgid "Improved favicon download" msgstr "Улучшена загрузка фавикона" #: ../data/org.gabmus.gfeeds.appdata.xml.in:123 msgid "Fixed refresh duplicating articles" msgstr "ИÑправлено обновление дублирующих Ñтатей" #: ../data/org.gabmus.gfeeds.appdata.xml.in:130 msgid "Added option to disable client side decoration" msgstr "Добавлен параметр Ð´Ð»Ñ Ð²Ñ‹ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¾Ñ„Ð¾Ñ€Ð¼Ð»ÐµÐ½Ð¸Ðµ на Ñтороне клиента" #: ../data/org.gabmus.gfeeds.appdata.xml.in:131 msgid "Brought primary menu in line with GNOME HIG" msgstr "Главное меню в ÑоответÑтвии Ñ GNOME HIG" #: ../data/org.gabmus.gfeeds.appdata.xml.in:132 msgid "Added placeholder icon for feeds without an icon" msgstr "Добавлен значок-заполнитель Ð´Ð»Ñ Ñ„Ð¸Ð´Ð¾Ð² без значка" #: ../data/org.gabmus.gfeeds.appdata.xml.in:133 msgid "Migrated some widgets to Glade templates" msgstr "ÐеÑколько виджетов переноÑые в шаблоны Glade" #: ../data/org.gabmus.gfeeds.appdata.xml.in:134 msgid "Option to use reader mode by default" msgstr "Параметр Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ€ÐµÐ¶Ð¸Ð¼Ð° Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ð¿Ð¾ умолчанию" #: ../data/org.gabmus.gfeeds.appdata.xml.in:135 msgid "Option to show article content from the feed" msgstr "Параметр Ð´Ð»Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ñодержимого Ñтатьи через фиды" #: ../data/org.gabmus.gfeeds.appdata.xml.in:143 msgid "Fixed labels alignment" msgstr "ИÑправлено выравнивание меток" #: ../data/org.gabmus.gfeeds.appdata.xml.in:144 msgid "Changed app name to Feeds" msgstr "Изменено Ð¸Ð¼Ñ Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ñ Feeds" #: ../data/org.gabmus.gfeeds.appdata.xml.in:145 msgid "Added separators for the two sections of the app" msgstr "Добавлены разделители Ð´Ð»Ñ Ð´Ð²ÑƒÑ… разделов приложениÑ" #: ../data/org.gabmus.gfeeds.appdata.xml.in:146 msgid "Using links as feed titles when there is no title" msgstr "ИÑпользование ÑÑылок как заголовок фидов, когда нет заголовка" #: ../data/org.gabmus.gfeeds.appdata.xml.in:147 msgid "Added preference for maximum article age" msgstr "Добавлено предпочтение Ð´Ð»Ñ Ð¼Ð°ÐºÑимального возраÑта Ñтатьи" #: ../data/org.gabmus.gfeeds.appdata.xml.in:148 msgid "Added zoom keyboard shortcuts" msgstr "Добавлен маÑштаб Ñочетаний клавиш" #: ../data/org.gabmus.gfeeds.appdata.xml.in:149 msgid "Added preference to enable JavaScript" msgstr "Добавлено предпочтение Ð´Ð»Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ JavaScript" #: ../data/org.gabmus.gfeeds.appdata.xml.in:150 msgid "Fix window control positions when they are on the left" msgstr "ИÑправить позиции ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¾ÐºÐ½Ð¾Ð¼, когда оно находитÑÑ Ñлева" #: ../data/org.gabmus.gfeeds.appdata.xml.in:157 msgid "Feeds for websites without favicons will now work" msgstr "Теперь фиды Ñайтов без фавиконов будут работать" #: ../data/org.gabmus.gfeeds.appdata.xml.in:164 msgid "Fixed bug with adding new feeds" msgstr "ИÑправлена ошибка при добавлении новых фидов" #: ../data/org.gabmus.gfeeds.appdata.xml.in:171 msgid "Switched to native file chooser" msgstr "Переключено на выбор ÑобÑтвенных файлов" #: ../data/org.gabmus.gfeeds.appdata.xml.in:172 msgid "Added empty state initial screen for sidebar" msgstr "Добавлено пуÑтое ÑоÑтоÑние как начальный Ñкран на Ð±Ð¾ÐºÐ¾Ð²Ð°Ñ Ð¿Ð°Ð½ÐµÐ»ÑŒ" #: ../data/org.gabmus.gfeeds.appdata.xml.in:173 msgid "Added italian translation" msgstr "Добавлен перевод на итальÑнÑкий Ñзык" #: ../data/org.gabmus.gfeeds.appdata.xml.in:180 msgid "First release" msgstr "Первый релиз" gfeeds-2.2.0/po/sl.po000066400000000000000000000220711440757451400143610ustar00rootroot00000000000000# Slovenian translation for gfeeds. # Copyright (C) 2022 gfeeds's COPYRIGHT HOLDER # This file is distributed under the same license as the gfeeds package. # # Matej UrbanÄiÄ , 2022–. # msgid "" msgstr "" "Project-Id-Version: gfeeds master\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/gfeeds/issues\n" "POT-Creation-Date: 2022-01-14 19:58+0000\n" "PO-Revision-Date: 2022-01-17 21:42+0100\n" "Last-Translator: Matej UrbanÄiÄ \n" "Language-Team: Slovenian GNOME Translation Team \n" "Language: sl_SI\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%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n" "%100==4 ? 3 : 0);\n" "X-Poedit-SourceCharset: utf-8\n" "X-Generator: Poedit 3.0\n" #: data/org.gabmus.gfeeds.appdata.xml.in:4 msgid "Feeds" msgstr "Viri" #: data/org.gabmus.gfeeds.appdata.xml.in:6 data/org.gabmus.gfeeds.desktop.in:7 msgid "News reader for GNOME" msgstr "Bralnik virov za namizje GNOME" #: data/org.gabmus.gfeeds.appdata.xml.in:15 msgid "" "Feeds is a minimal RSS/Atom feed reader built with speed and simplicity in " "mind." msgstr "" #: data/org.gabmus.gfeeds.appdata.xml.in:16 msgid "" "It offers a simple user interface that only shows the latest news from your " "subscriptions." msgstr "" #: data/org.gabmus.gfeeds.appdata.xml.in:17 msgid "" "Articles are shown in a web view by default, with javascript disabled for a " "faster and less intrusive user experience. There's also a reader mode " "included, built from the one GNOME Web/Epiphany uses." msgstr "" #: data/org.gabmus.gfeeds.appdata.xml.in:18 msgid "Feeds can be imported and exported via OPML." msgstr "" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/org.gabmus.gfeeds.desktop.in:16 msgid "rss;reader;feed;news;" msgstr "rss;reader;feed;news;novice;viri;atom;sporoÄila;" #: data/ui/extra_popover_menu.ui:19 msgid "Web View" msgstr "Spletni pogled" #: data/ui/extra_popover_menu.ui:26 msgid "Reader Mode" msgstr "Bralni naÄin" #: data/ui/extra_popover_menu.ui:33 msgid "Feed Content" msgstr "Vsebina vira" #: gfeeds/base_preferences.py:106 msgid "Choose a folder" msgstr "Izbor mape" #: gfeeds/confirm_add_dialog.py:16 msgid "Do you want to import these feeds?" msgstr "" #: gfeeds/confirm_add_dialog.py:17 msgid "Do you want to import this feed?" msgstr "" #: gfeeds/download_manager.py:85 #, python-brace-format msgid "`{0}`: connection timed out" msgstr "" #: gfeeds/download_manager.py:89 #, python-brace-format msgid "`{0}` might not be a valid address" msgstr "" #: gfeeds/download_manager.py:114 #, python-brace-format msgid "Error downloading `{0}`, code `{1}`" msgstr "" #: gfeeds/feeds_manager.py:83 #, python-brace-format msgid "Feed {0} exists already, skipping" msgstr "" #: gfeeds/feeds_view.py:18 msgid "All feeds" msgstr "Vsi viri" #: gfeeds/get_favicon.py:45 #, python-brace-format msgid "Error downloading favicon for `{0}`" msgstr "" #: gfeeds/headerbar.py:171 msgid "" "There were problems with some feeds.\n" "Do you want to remove them?" msgstr "" #: gfeeds/main_leaflet.py:119 #, python-brace-format msgid "{0} new article" msgid_plural "{0} new articles" msgstr[0] "" msgstr[1] "" msgstr[2] "" msgstr[3] "" #: gfeeds/__main__.py:241 msgid "url" msgstr "Naslov URL" #: gfeeds/__main__.py:244 msgid "opml file local url or rss remote url to import" msgstr "" #: gfeeds/manage_feeds_window.py:247 msgid "Do you want to delete these feeds?" msgstr "" #: gfeeds/manage_feeds_window.py:299 msgid "Manage Feeds" msgstr "" #: gfeeds/opml_file_chooser.py:7 msgid "XML files" msgstr "Datoteke XML" #: gfeeds/opml_file_chooser.py:14 msgid "Choose an OPML file to import" msgstr "" #: gfeeds/opml_file_chooser.py:18 msgid "Open" msgstr "Odpri" #: gfeeds/opml_file_chooser.py:19 gfeeds/opml_file_chooser.py:31 msgid "Cancel" msgstr "PrekliÄi" #: gfeeds/opml_file_chooser.py:26 msgid "Choose where to save the exported OPML file" msgstr "" #: gfeeds/opml_file_chooser.py:30 msgid "Save" msgstr "Shrani" #: gfeeds/opml_manager.py:44 msgid "Error: OPML path provided does not exist" msgstr "" #: gfeeds/opml_manager.py:55 #, python-brace-format msgid "Error parsing OPML file `{0}`" msgstr "" #: gfeeds/preferences_window.py:22 msgid "General" msgstr "SploÅ¡no" #: gfeeds/preferences_window.py:25 msgid "General preferences" msgstr "" #: gfeeds/preferences_window.py:27 msgid "Show newer articles first" msgstr "Najprej pokaži novejÅ¡e posnetke" #: gfeeds/preferences_window.py:32 msgid "Open links in your browser" msgstr "" #: gfeeds/preferences_window.py:36 msgid "Use external video player for YouTube" msgstr "" #: gfeeds/preferences_window.py:38 msgid "Requires youtube-dl and a compatible video player" msgstr "" #: gfeeds/preferences_window.py:44 msgid "Preferred video player" msgstr "" #: gfeeds/preferences_window.py:48 msgid "Maximum article age" msgstr "NajveÄja starost prispevka" #: gfeeds/preferences_window.py:49 msgid "In days" msgstr "" #: gfeeds/preferences_window.py:56 msgid "Refresh preferences" msgstr "Osveži lastnosti" #: gfeeds/preferences_window.py:58 msgid "Refresh articles on startup" msgstr "Ob zagonu osveži prispevke" #: gfeeds/preferences_window.py:62 msgid "New articles notification" msgstr "" #: gfeeds/preferences_window.py:66 msgid "Enable auto-refresh" msgstr "" #: gfeeds/preferences_window.py:70 msgid "Auto-refresh interval" msgstr "" #: gfeeds/preferences_window.py:71 msgid "In seconds" msgstr "" #: gfeeds/preferences_window.py:78 msgid "Cache" msgstr "Predpomnilnik" #: gfeeds/preferences_window.py:80 msgid "Clear caches" msgstr "" #: gfeeds/preferences_window.py:81 msgid "Clear" msgstr "PoÄisti" #: gfeeds/preferences_window.py:109 msgid "Appearance" msgstr "Videz" #: gfeeds/preferences_window.py:112 msgid "Appearance preferences" msgstr "" #: gfeeds/preferences_window.py:114 msgid "Dark mode" msgstr "Temna tema" #: gfeeds/preferences_window.py:118 msgid "Use dark theme for reader mode" msgstr "" #: gfeeds/preferences_window.py:122 msgid "Show article thumbnails" msgstr "" #: gfeeds/preferences_window.py:127 msgid "Maximum thumbnail height" msgstr "" #: gfeeds/preferences_window.py:133 msgid "Show full articles titles" msgstr "" #: gfeeds/preferences_window.py:138 msgid "Show full feeds names" msgstr "" #: gfeeds/preferences_window.py:145 msgid "Font preferences" msgstr "" #: gfeeds/preferences_window.py:147 msgid "Use system font for titles" msgstr "" #: gfeeds/preferences_window.py:151 msgid "Use system font for paragraphs" msgstr "" #: gfeeds/preferences_window.py:155 msgid "Custom title font" msgstr "" #: gfeeds/preferences_window.py:159 msgid "Custom paragraph font" msgstr "" #: gfeeds/preferences_window.py:163 msgid "Custom monospace font" msgstr "Pisava enotne Å¡irine po meri" #: gfeeds/preferences_window.py:175 msgid "Privacy" msgstr "Zasebnost" #: gfeeds/preferences_window.py:178 msgid "Privacy preferences" msgstr "" #: gfeeds/preferences_window.py:180 msgid "Enable JavaScript" msgstr "OmogoÄi JavaScript" #: gfeeds/preferences_window.py:185 msgid "Try to block advertisements" msgstr "" #: gfeeds/preferences_window.py:187 gfeeds/preferences_window.py:222 msgid "Requires app restart" msgstr "" #: gfeeds/preferences_window.py:191 msgid "Update advertisement blocking list" msgstr "" #: gfeeds/preferences_window.py:192 msgid "Updates automatically every 10 days" msgstr "" #: gfeeds/preferences_window.py:193 msgid "Update" msgstr "Posodobi" #: gfeeds/preferences_window.py:206 msgid "Advanced" msgstr "Napredno" #: gfeeds/preferences_window.py:209 msgid "Advanced preferences" msgstr "" #: gfeeds/preferences_window.py:211 msgid "Maximum refresh threads" msgstr "" #: gfeeds/preferences_window.py:213 msgid "How many threads to use for feeds refresh" msgstr "" #: gfeeds/preferences_window.py:220 msgid "Experimental GtkListView for articles list" msgstr "" #: gfeeds/rss_parser.py:57 #, python-brace-format msgid "Error: unable to parse datetime {0} for feeditem {1}" msgstr "" #: gfeeds/rss_parser.py:104 #, python-brace-format msgid "Errors while parsing feed `{0}`" msgstr "" #: gfeeds/rss_parser.py:134 #, python-brace-format msgid "`{0}` may not be an RSS or Atom feed" msgstr "" #: gfeeds/sidebar.py:21 msgid "Loading feeds..." msgstr "" #: gfeeds/sidebar_row_popover.py:31 gfeeds/sidebar_row_popover.py:58 msgid "Mark as unread" msgstr "OznaÄi kot neprebrano" #: gfeeds/sidebar_row_popover.py:38 gfeeds/sidebar_row_popover.py:50 msgid "Mark as read" msgstr "OznaÄi kot prebrano" #: gfeeds/suggestion_bar.py:37 msgid "There are some errors" msgstr "" #: gfeeds/suggestion_bar.py:46 msgid "Show" msgstr "Pokaži" #: gfeeds/suggestion_bar.py:47 msgid "Ignore" msgstr "Prezri" #: gfeeds/suggestion_bar.py:70 msgid "There were problems with some feeds. Do you want to remove them?" msgstr "" #: gfeeds/suggestion_bar.py:97 msgid "You are offline" msgstr "" #: gfeeds/webview.py:183 msgid "Link copied to clipboard!" msgstr "" #: gfeeds/webview.py:205 msgid "Feed content not available for this article" msgstr "" gfeeds-2.2.0/po/sr.po000066400000000000000000000504661440757451400144000ustar00rootroot00000000000000# Serbian translation for gfeeds. # Copyright © 2022 gfeeds's COPYRIGHT HOLDER # This file is distributed under the same license as the gfeeds package. # МироÑлав Ðиколић , 2022. # msgid "" msgstr "" "Project-Id-Version: gfeeds master\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/gfeeds/issues\n" "POT-Creation-Date: 2022-10-02 17:13+0000\n" "PO-Revision-Date: 2022-10-26 12:32+0200\n" "Last-Translator: МироÑлав Ðиколић \n" "Language-Team: Serbian <ÑрпÑки >\n" "Language: sr\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? 3 : n%10==1 && n%100!=11 ? 0 : n" "%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2\n" "X-Generator: Gtranslator 3.36.0\n" #: data/org.gabmus.gfeeds.appdata.xml.in:4 msgid "Feeds" msgstr "Токовник" #: data/org.gabmus.gfeeds.appdata.xml.in:6 data/org.gabmus.gfeeds.desktop.in:7 msgid "News reader for GNOME" msgstr "Читач веÑти за Гном" #: data/org.gabmus.gfeeds.appdata.xml.in:15 msgid "" "Feeds is a minimal RSS/Atom feed reader built with speed and simplicity in " "mind." msgstr "" "Токовник је најмањи РСС/Ðтом читач токова изграђен Ñа брзином и " "једноÑтавношћу на уму." #: data/org.gabmus.gfeeds.appdata.xml.in:16 msgid "" "It offers a simple user interface that only shows the latest news from your " "subscriptions." msgstr "" "Ðуди једноÑтавно кориÑничко Ñучеље које приказује Ñамо најновије веÑти Ñа " "ваших претплата." #: data/org.gabmus.gfeeds.appdata.xml.in:17 msgid "" "Articles are shown in a web view by default, with javascript disabled for a " "faster and less intrusive user experience. There's also a reader mode " "included, built from the one GNOME Web/Epiphany uses." msgstr "" "Чланци Ñе приказју у веб прегледу по оÑнови, Ñа иÑкљученим јава Ñкриптом " "зарад бржег и мање нападног кориÑничког иÑкуÑтва. ПоÑтоји такође и укључен " "режим читача, изграђен из једног коришћења Гномовог Веба/Спознаје." #: data/org.gabmus.gfeeds.appdata.xml.in:18 msgid "Feeds can be imported and exported via OPML." msgstr "Токови Ñе могу увеÑти и извеÑти путем ОПМЛ-а." #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/org.gabmus.gfeeds.desktop.in:16 msgid "rss;reader;feed;news;" msgstr "Ñ€ÑÑ;читач;ток;веÑти;rss;reader;feed;news;" #: data/ui/aboutdialog.ui.in:10 msgid "translator-credits" msgstr "МироÑлав Ðиколић " #: data/ui/add_feed_popover.blp:11 msgid "Enter feed address to add" msgstr "УнеÑите адреÑу тока за додавање" #: data/ui/add_feed_popover.blp:26 msgid "Add" msgstr "Додај" #: data/ui/add_feed_popover.blp:32 msgid "You're already subscribed to that feed!" msgstr "Већ Ñте Ñе претплатили на тај ток!" #: data/ui/empty_state.blp:7 msgid "Let's get started" msgstr "Хајде да почнемо" #: data/ui/empty_state.blp:22 msgid "Add new feeds via URL" msgstr "Додајте нове токове путем адреÑе" #: data/ui/empty_state.blp:27 #| msgid "Error parsing OPML file `{0}`" msgid "Import an OPML file" msgstr "Увезите ОПМЛ датотеку" #: data/ui/left_headerbar.blp:6 #| msgid "Show newer articles first" msgid "_Show Read Articles" msgstr "_Прикажи чланке за читање" #: data/ui/left_headerbar.blp:7 #| msgid "Mark as read" msgid "Mark All as Read" msgstr "Означи Ñве као прочитано" #: data/ui/left_headerbar.blp:8 #| msgid "Mark as unread" msgid "Mark All as _Unread" msgstr "Означи Ñве као _непрочитано" #: data/ui/left_headerbar.blp:11 msgid "Show _Empty Feeds" msgstr "Прикажи _празне токове" #: data/ui/left_headerbar.blp:12 #| msgid "Manage Feeds" msgid "_Manage Feeds" msgstr "Управљај _токовима" #: data/ui/left_headerbar.blp:13 msgid "_Import OPML" msgstr "_Увези ОПМЛ" #: data/ui/left_headerbar.blp:14 msgid "E_xport OPML" msgstr "_Извези ОПМЛ" #: data/ui/left_headerbar.blp:17 #| msgid "Font preferences" msgid "P_references" msgstr "_ПоÑтавке" #: data/ui/left_headerbar.blp:18 msgid "_Keyboard Shortcuts" msgstr "Пречице _таÑтатуре" #: data/ui/left_headerbar.blp:19 msgid "_About Feeds" msgstr "_О Токовнику" #: data/ui/left_headerbar.blp:28 msgid "Filter" msgstr "Филтрирај" #: data/ui/left_headerbar.blp:32 #| msgid "Feeds" msgid "Add Feed" msgstr "Додај ток" #: data/ui/left_headerbar.blp:36 msgid "Menu" msgstr "Изборник" #: data/ui/left_headerbar.blp:41 data/ui/shortcutsWindow.blp:35 msgid "Refresh" msgstr "ОÑвежи" #: data/ui/left_headerbar.blp:46 data/ui/shortcutsWindow.blp:39 msgid "Search" msgstr "Тражи" #: data/ui/left_headerbar.blp:51 #| msgid "There are some errors" msgid "There Are Errors" msgstr "ПоÑтоје грешке" #: data/ui/main_leaflet.blp:40 msgid "Offline" msgstr "Ван мреже" #: data/ui/manage_feeds_headerbar.blp:7 gfeeds/manage_feeds_window.py:263 msgid "Manage Feeds" msgstr "Управљај токовима" #: data/ui/manage_feeds_headerbar.blp:11 msgid "Manage Tags for Selected Feeds" msgstr "Управљај ознакама за изабране токове" #: data/ui/manage_feeds_headerbar.blp:16 msgid "Select/Unselect All" msgstr "Изабери/поништи Ñве" #: data/ui/manage_feeds_headerbar.blp:21 msgid "Delete Selected Feeds" msgstr "Обриши изабране токове" #: data/ui/manage_tags_content.blp:17 msgid "New tag name…" msgstr "Ðови назив ознаке…" #: data/ui/manage_tags_content.blp:24 msgid "Add Tag" msgstr "Додај ознаку" #: data/ui/manage_tags_content.blp:39 #| msgid "There are some errors" msgid "There are no tags yet" msgstr "Још нема ознака" #: data/ui/manage_tags_content.blp:40 msgid "Add some using the entry above" msgstr "Додајте неку кориÑтећи ÑƒÐ½Ð¾Ñ Ð¸Ð·Ð½Ð°Ð´" #: data/ui/right_headerbar.blp:9 #| msgid "Open links in your browser" msgid "Open in _Browser" msgstr "Отвори у _прегледнику" #: data/ui/right_headerbar.blp:10 msgid "Open in External Media _Player" msgstr "Отвори у Ñпољном медијÑком _пуштачу" #: data/ui/right_headerbar.blp:11 msgid "_Copy Article Link" msgstr "_Умножи везу чланка" #: data/ui/right_headerbar.blp:17 data/ui/right_headerbar.blp:96 msgid "View Mode" msgstr "Режим прегледа" #: data/ui/right_headerbar.blp:19 msgid "Web View" msgstr "Веб преглед" #: data/ui/right_headerbar.blp:24 #| msgid "Reader mode theme" msgid "Reader Mode" msgstr "Режим читача" #: data/ui/right_headerbar.blp:29 msgid "Feed Content" msgstr "Садржај тока" #: data/ui/right_headerbar.blp:44 data/ui/shortcutsWindow.blp:66 msgid "Zoom Out" msgstr "Одзумирај" #: data/ui/right_headerbar.blp:51 data/ui/shortcutsWindow.blp:70 msgid "Reset Zoom" msgstr "Врати зум" #: data/ui/right_headerbar.blp:57 data/ui/shortcutsWindow.blp:62 msgid "Zoom In" msgstr "Зумирај" #: data/ui/right_headerbar.blp:90 msgid "Back to Articles" msgstr "Ðазад на чланке" #: data/ui/shortcutsWindow.blp:9 gfeeds/preferences_window.py:24 msgid "General" msgstr "Опште" #: data/ui/shortcutsWindow.blp:12 msgid "Open Keyboard Shortcuts" msgstr "Отвори прећице таÑтатуре" #: data/ui/shortcutsWindow.blp:16 #| msgid "Open" msgid "Open Menu" msgstr "Отвори изборник" #: data/ui/shortcutsWindow.blp:20 #| msgid "Font preferences" msgid "Open Preferences" msgstr "Отвори поÑтавке" #: data/ui/shortcutsWindow.blp:24 msgid "Open Filter" msgstr "Отвори филтер" #: data/ui/shortcutsWindow.blp:28 msgid "Quit" msgstr "Изађи" #: data/ui/shortcutsWindow.blp:32 msgid "Article List" msgstr "СпиÑак чланака" #: data/ui/shortcutsWindow.blp:43 msgid "Next" msgstr "Следеће" #: data/ui/shortcutsWindow.blp:47 msgid "Previous" msgstr "Претходно" #: data/ui/shortcutsWindow.blp:51 msgid "Show/Hide Read Articles" msgstr "Прикажи/Ñакриј чланке за читање" #: data/ui/shortcutsWindow.blp:55 #| msgid "Mark as read" msgid "Mark All Read" msgstr "Означи Ñве као прочитано" #: data/ui/shortcutsWindow.blp:59 msgid "Article" msgstr "Чланак" #: data/ui/shortcutsWindow.blp:74 data/ui/sidebar_listbox_row.blp:6 #| msgid "Open links in your browser" msgid "Open in Browser" msgstr "Отвори у прегледнику" #: data/ui/sidebar_listbox_row.blp:5 #| msgid "Mark as unread" msgid "Mark as Read/Unread" msgstr "Означи као прочитано/непрочитано" #: data/ui/webview.blp:12 #| msgid "{0} new article" #| msgid_plural "{0} new articles" msgid "Select an article" msgstr "Изаберите чланак" #: gfeeds/feed_item.py:57 #, python-brace-format msgid "Error: unable to parse datetime {0} for feeditem {1}" msgstr "Грешка: не могу да обрадим време датума „{0}“ за Ñтавку тока „{1}“" #: gfeeds/feed_parser.py:61 #, python-brace-format msgid "Errors while parsing feed `{0}`, URL: `{1}`" msgstr "Грешка приликом обраде тока „{0}“, адреÑа „{1}“" #: gfeeds/feed_parser.py:71 #, python-brace-format msgid "`{0}` may not be an RSS or Atom feed" msgstr "„{0}“ не може бити РСС или Ðтом ток" #: gfeeds/feeds_manager.py:97 #, python-brace-format msgid "Feed {0} exists already, skipping" msgstr "Већ поÑтоји ток „{0}“, преÑкачем" #: gfeeds/feeds_view.py:13 msgid "All feeds" msgstr "Сви токови" #: gfeeds/headerbar.py:197 msgid "There were problems with some feeds. Do you want to remove them?" msgstr "Било је проблема Ñа неким токовима. Да ли желите да их уклоните?" #: gfeeds/headerbar.py:202 msgid "_Keep" msgstr "_Задржи" #: gfeeds/headerbar.py:204 msgid "_Remove" msgstr "_Уклони" #: gfeeds/main_leaflet.py:122 #, python-brace-format msgid "{0} new article" msgid_plural "{0} new articles" msgstr[0] "{0} нови чланак" msgstr[1] "{0} нова чланка" msgstr[2] "{0} нових чланака" msgstr[3] "Један нови чланак" #: gfeeds/__main__.py:232 msgid "Do you want to import these feeds?" msgstr "Да ли желите да увезете ове токове?" #: gfeeds/__main__.py:239 gfeeds/__main__.py:273 #: gfeeds/manage_feeds_window.py:330 #| msgid "Cancel" msgid "_Cancel" msgstr "_Откажи" #: gfeeds/__main__.py:242 gfeeds/__main__.py:276 msgid "_Import" msgstr "_Увези" #: gfeeds/__main__.py:269 msgid "Do you want to import this feed?" msgstr "Да ли желите да увезете овај ток?" #: gfeeds/__main__.py:301 msgid "url" msgstr "адреÑа" #: gfeeds/__main__.py:304 msgid "opml file local url or rss remote url to import" msgstr "локална адреÑа опм датотеке или адреÑа удаљеног Ñ€ÑÑ-а за увоз" #: gfeeds/manage_feeds_window.py:327 msgid "Do you want to delete these feeds?" msgstr "Да ли желите да обришете ове токове?" #: gfeeds/manage_feeds_window.py:332 msgid "_Delete" msgstr "_Обриши" #: gfeeds/opml_file_chooser.py:7 msgid "XML files" msgstr "ХМЛ датотеке" #: gfeeds/opml_file_chooser.py:14 msgid "Choose an OPML file to import" msgstr "Изаберите ОПМЛ датотеку за увоз" #: gfeeds/opml_file_chooser.py:18 msgid "Open" msgstr "Отвори" #: gfeeds/opml_file_chooser.py:19 gfeeds/opml_file_chooser.py:31 msgid "Cancel" msgstr "Откажи" #: gfeeds/opml_file_chooser.py:26 msgid "Choose where to save the exported OPML file" msgstr "Изаберите где ћете Ñачувати извезену ОПМЛ датотеку" #: gfeeds/opml_file_chooser.py:30 msgid "Save" msgstr "Сачувај" #: gfeeds/preferences_window.py:27 msgid "General preferences" msgstr "Опште поÑтавке" #: gfeeds/preferences_window.py:29 msgid "Show newer articles first" msgstr "Прикажи прво новије чланке" #: gfeeds/preferences_window.py:34 msgid "Open links in your browser" msgstr "Отвори везе у прегледнику" #: gfeeds/preferences_window.py:38 msgid "Use external video player for YouTube" msgstr "КориÑти Ñпољни видео пуштач за Јутјуб" #: gfeeds/preferences_window.py:40 msgid "Requires youtube-dl and a compatible video player" msgstr "Захтева „youtube-dl“ и ÑаглаÑан видео пуштач" #: gfeeds/preferences_window.py:46 msgid "Preferred video player" msgstr "Омиљени видео пуштач" #: gfeeds/preferences_window.py:50 msgid "Maximum article age" msgstr "Ðајвећа ÑтароÑÑ‚ чланка" #: gfeeds/preferences_window.py:51 msgid "In days" msgstr "У данима" #: gfeeds/preferences_window.py:58 msgid "Refresh preferences" msgstr "ОÑвежи поÑтавке" #: gfeeds/preferences_window.py:60 msgid "Refresh articles on startup" msgstr "ОÑвежи чланке при покретању" #: gfeeds/preferences_window.py:64 msgid "New articles notification" msgstr "Обавештење нових чланака" #: gfeeds/preferences_window.py:68 msgid "Enable auto-refresh" msgstr "Укључи Ñамо-оÑвежавање" #: gfeeds/preferences_window.py:72 msgid "Auto-refresh interval" msgstr "Период Ñамо-оÑвежавања" #: gfeeds/preferences_window.py:73 msgid "In seconds" msgstr "У Ñекундама" #: gfeeds/preferences_window.py:80 msgid "Cache" msgstr "ОÑтава" #: gfeeds/preferences_window.py:82 msgid "Clear caches" msgstr "ОчиÑти оÑтаву" #: gfeeds/preferences_window.py:83 msgid "Clear" msgstr "ОчиÑти" #: gfeeds/preferences_window.py:109 msgid "Appearance" msgstr "Изглед" #: gfeeds/preferences_window.py:112 msgid "Appearance preferences" msgstr "ПоÑтавке изгледа" #: gfeeds/preferences_window.py:114 msgid "Dark mode" msgstr "Тамни режим" #: gfeeds/preferences_window.py:118 msgid "Reader mode theme" msgstr "Режим теме читача" #: gfeeds/preferences_window.py:122 msgid "Automatic" msgstr "СамоÑтално" #: gfeeds/preferences_window.py:122 msgid "Light" msgstr "Светла" #: gfeeds/preferences_window.py:122 msgid "Dark" msgstr "Тамна" #: gfeeds/preferences_window.py:126 msgid "Show article thumbnails" msgstr "Прикажи Ñличице чланка" #: gfeeds/preferences_window.py:131 msgid "Show full articles titles" msgstr "Прикажи пун наÑлов чланака" #: gfeeds/preferences_window.py:136 msgid "Show full feeds names" msgstr "Прикажи пуне називе токова" #: gfeeds/preferences_window.py:143 msgid "Font preferences" msgstr "ПоÑтавке Ñлова" #: gfeeds/preferences_window.py:145 msgid "Use system font for titles" msgstr "КориÑти Ñлова ÑиÑтема за наÑлове" #: gfeeds/preferences_window.py:149 msgid "Use system font for paragraphs" msgstr "КориÑти Ñлова ÑиÑтема за паÑуÑе" #: gfeeds/preferences_window.py:153 msgid "Custom title font" msgstr "Произвољна Ñлова наÑлова" #: gfeeds/preferences_window.py:157 msgid "Custom paragraph font" msgstr "Произвољна Ñлова паÑуÑа" #: gfeeds/preferences_window.py:161 msgid "Custom monospace font" msgstr "Произвољна Ñлова Ñталне ширине" #: gfeeds/preferences_window.py:173 msgid "Privacy" msgstr "ПриватноÑÑ‚" #: gfeeds/preferences_window.py:177 msgid "Privacy preferences" msgstr "ПоÑтавке приватноÑти" #: gfeeds/preferences_window.py:179 msgid "Enable JavaScript" msgstr "Укључи Јава Ñкрипт" #: gfeeds/preferences_window.py:184 msgid "Try to block advertisements" msgstr "Покушај да блокираш оглашавања" #: gfeeds/preferences_window.py:186 gfeeds/preferences_window.py:221 msgid "Requires app restart" msgstr "Захтева поновно покретање" #: gfeeds/preferences_window.py:190 msgid "Update advertisement blocking list" msgstr "ОÑвежи ÑпиÑак блокирања оглашавања" #: gfeeds/preferences_window.py:191 msgid "Updates automatically every 10 days" msgstr "Сам оÑвежи Ñваких 10 дана" #: gfeeds/preferences_window.py:192 msgid "Update" msgstr "ОÑвежи" #: gfeeds/preferences_window.py:205 msgid "Advanced" msgstr "Ðапредно" #: gfeeds/preferences_window.py:208 msgid "Advanced preferences" msgstr "Ðапредне поÑтавке" #: gfeeds/preferences_window.py:210 msgid "Maximum refresh threads" msgstr "Ðајвише нити оÑвежавања" #: gfeeds/preferences_window.py:212 msgid "How many threads to use for feeds refresh" msgstr "Колико ће нити кориÑтити за оÑвежавање токова" #: gfeeds/preferences_window.py:219 msgid "Experimental GtkListView for articles list" msgstr "ЕкÑпериментални „GtkListView“ за ÑпиÑак чланака" #: gfeeds/preferences_window.py:227 msgid "Troubleshooting" msgstr "Решавање проблема" #: gfeeds/preferences_window.py:229 msgid "Export Configuration as JSON" msgstr "Извези подешавање као ЈСОÐ" #: gfeeds/preferences_window.py:230 msgid "Attach this when reporting bugs" msgstr "Приложите ово приликом пријављивања грешака" #: gfeeds/preferences_window.py:231 msgid "Export" msgstr "Извези" #. type: ignore #: gfeeds/preferences_window.py:244 #| msgid "Feed Content" msgid "Feeds Configuration" msgstr "Подешавање токова" #: gfeeds/preferences_window.py:248 msgid "_Close" msgstr "_Затвори" #: gfeeds/preferences_window.py:251 msgid "Cop_y" msgstr "_Умножи" #: gfeeds/util/download_manager.py:112 #, python-brace-format msgid "`{0}`: connection timed out" msgstr "„{0}“: иÑтекло је време повезивања" #: gfeeds/util/download_manager.py:121 #, python-brace-format msgid "`{0}` might not be a valid address" msgstr "„{0}“ не може бити иÑправна адреÑа" #: gfeeds/util/download_manager.py:161 #, python-brace-format msgid "Error downloading `{0}`, code `{1}`" msgstr "Грешка преузимања „{0}“, шифра „{1}“" #: gfeeds/util/get_favicon.py:48 #, python-brace-format msgid "Error downloading favicon for `{0}`" msgstr "Грешка преузимања фавиконице за „{0}“" #: gfeeds/util/opml_parser.py:33 msgid "Error: OPML path provided does not exist" msgstr "Грешка: доÑтављена ОПМЛ путања не поÑтоји" #: gfeeds/util/opml_parser.py:44 #, python-brace-format msgid "Error parsing OPML file `{0}`" msgstr "Грешка обраде ОПМЛ датотеке „{0}“" #: gfeeds/webview.py:204 msgid "Link copied to clipboard!" msgstr "Веза је умножена у оÑтаву!" #: gfeeds/webview.py:226 msgid "Feed content not available for this article" msgstr "Садржај тока није доÑтупан за овај чланак" #~ msgid "" #~ "There were problems with some feeds.\n" #~ "Do you want to remove them?" #~ msgstr "" #~ "Било је проблема Ñа неким токовима.\n" #~ "Да ли желите да их уклоните?" #~ msgid "Loading feeds..." #~ msgstr "Учитавам токове..." #~ msgid "Use dark theme for reader mode" #~ msgstr "КориÑти тамну тему за режим читача" #~ msgid "Maximum thumbnail height" #~ msgstr "Ðајвећа виÑина Ñличице" #~ msgid "Show" #~ msgstr "Прикажи" #~ msgid "Ignore" #~ msgstr "Занемари" #~ msgid "You are offline" #~ msgstr "Ван мреже Ñте" gfeeds-2.2.0/po/sv.po000066400000000000000000000425431440757451400144010ustar00rootroot00000000000000# Swedish translations for gfeeds package. # Copyright © 2021-2023 gfeeds's COPYRIGHT HOLDER # This file is distributed under the same license as the gfeeds package. # Ã…ke Engelbrektson , 2021. # Anders Jonsson , 2021, 2022, 2023. # msgid "" msgstr "" "Project-Id-Version: gfeeds master\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/gfeeds/issues\n" "POT-Creation-Date: 2023-03-11 08:34+0000\n" "PO-Revision-Date: 2023-03-11 13:36+0100\n" "Last-Translator: Anders Jonsson \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.2.2\n" #: data/org.gabmus.gfeeds.appdata.xml.in:4 msgid "Feeds" msgstr "Feeds" #: data/org.gabmus.gfeeds.appdata.xml.in:6 data/org.gabmus.gfeeds.desktop.in:7 msgid "News reader for GNOME" msgstr "Nyhetsläsare för GNOME" #: data/org.gabmus.gfeeds.appdata.xml.in:15 msgid "" "Feeds is a minimal RSS/Atom feed reader built with speed and simplicity in " "mind." msgstr "" "Feeds är en minimal RSS-/Atom-flödesläsare byggd med hastighet och enkelhet " "i Ã¥tanke." #: data/org.gabmus.gfeeds.appdata.xml.in:16 msgid "" "It offers a simple user interface that only shows the latest news from your " "subscriptions." msgstr "" "Den erbjuder ett enkelt användargränssnitt som bara visar de senaste " "nyheterna frÃ¥n dina prenumerationer." #: data/org.gabmus.gfeeds.appdata.xml.in:17 msgid "" "Articles are shown in a web view by default, with javascript disabled for a " "faster and less intrusive user experience. There's also a reader mode " "included, built from the one GNOME Web/Epiphany uses." msgstr "" "Artiklar visas i en webbvy som standard, med javascript aktiverat för en " "snabbare och mindre inkräktande användarupplevelse. Det finns ocksÃ¥ ett " "läsläge inkluderat, byggt pÃ¥ detsamma som GNOME Webb/Epiphany använder." #: data/org.gabmus.gfeeds.appdata.xml.in:18 msgid "Feeds can be imported and exported via OPML." msgstr "Flöden kan importeras och exporteras via OPML." #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/org.gabmus.gfeeds.desktop.in:16 msgid "rss;reader;feed;news;" msgstr "rss;läsare;flöde;nyheter;" #: data/ui/aboutdialog.ui.in:10 msgid "translator-credits" msgstr "" "Anders Jonsson \n" "\n" "Skicka synpunkter pÃ¥ översättningen till\n" "" #: data/ui/add_feed_popover.blp:11 msgid "Enter feed address to add" msgstr "Ange flödesadress att lägga till" #: data/ui/add_feed_popover.blp:26 msgid "Add" msgstr "Lägg till" #: data/ui/add_feed_popover.blp:32 msgid "You're already subscribed to that feed!" msgstr "Du prenumererar redan pÃ¥ det flödet!" #: data/ui/empty_state.blp:7 msgid "Let's get started" msgstr "Kom igÃ¥ng" #: data/ui/empty_state.blp:22 msgid "Add new feeds via URL" msgstr "Lägg till nya flöden via URL" #: data/ui/empty_state.blp:27 msgid "Import an OPML file" msgstr "Importera en OPML-fil" #: data/ui/left_headerbar.blp:6 msgid "_Show Read Articles" msgstr "_Visa lästa artiklar" #: data/ui/left_headerbar.blp:7 msgid "Mark All as Read" msgstr "Märk alla som lästa" #: data/ui/left_headerbar.blp:8 msgid "Mark All as _Unread" msgstr "Märk alla som _olästa" #: data/ui/left_headerbar.blp:11 msgid "Show _Empty Feeds" msgstr "Visa _tomma flöden" #: data/ui/left_headerbar.blp:12 msgid "_Manage Feeds" msgstr "_Hantera flöden" #: data/ui/left_headerbar.blp:13 msgid "_Import OPML" msgstr "_Importera OPML" #: data/ui/left_headerbar.blp:14 msgid "E_xport OPML" msgstr "E_xportera OPML" #: data/ui/left_headerbar.blp:17 msgid "P_references" msgstr "_Inställningar" #: data/ui/left_headerbar.blp:18 msgid "_Keyboard Shortcuts" msgstr "_Tangentbordsgenvägar" #: data/ui/left_headerbar.blp:19 msgid "_About Feeds" msgstr "_Om Feeds" #: data/ui/left_headerbar.blp:28 msgid "Filter" msgstr "Filtrera" #: data/ui/left_headerbar.blp:32 msgid "Add Feed" msgstr "Lägg till flöde" #: data/ui/left_headerbar.blp:36 msgid "Menu" msgstr "Meny" #: data/ui/left_headerbar.blp:41 data/ui/shortcutsWindow.blp:35 msgid "Refresh" msgstr "Uppdatera" #: data/ui/left_headerbar.blp:46 data/ui/shortcutsWindow.blp:39 msgid "Search" msgstr "Sök" #: data/ui/left_headerbar.blp:50 msgid "There Are Errors" msgstr "Det finns fel" #: data/ui/main_leaflet.blp:40 msgid "Offline" msgstr "FrÃ¥nkopplad" #: data/ui/manage_feeds_headerbar.blp:7 gfeeds/manage_feeds_window.py:257 msgid "Manage Feeds" msgstr "Hantera flöden" #: data/ui/manage_feeds_headerbar.blp:11 msgid "Manage Tags for Selected Feeds" msgstr "Hantera taggar för markerade flöden" #: data/ui/manage_feeds_headerbar.blp:16 msgid "Select/Unselect All" msgstr "Markera/avmarkera alla" #: data/ui/manage_feeds_headerbar.blp:21 msgid "Delete Selected Feeds" msgstr "Ta bort markerade flöden" #: data/ui/manage_tags_content.blp:17 msgid "New tag name…" msgstr "Nytt taggnamn…" #: data/ui/manage_tags_content.blp:24 msgid "Add Tag" msgstr "Lägg till tagg" #: data/ui/manage_tags_content.blp:39 msgid "There are no tags yet" msgstr "Det finns ännu inte nÃ¥gra taggar" #: data/ui/manage_tags_content.blp:40 msgid "Add some using the entry above" msgstr "Lägg till nÃ¥gra med fältet ovan" #: data/ui/right_headerbar.blp:9 msgid "Open in _Browser" msgstr "Öppna i _webbläsare" #: data/ui/right_headerbar.blp:10 msgid "Open in External Media _Player" msgstr "Öppna i e_xtern mediaspelare" #: data/ui/right_headerbar.blp:11 msgid "_Copy Article Link" msgstr "_Kopiera artikellänk" #: data/ui/right_headerbar.blp:17 data/ui/right_headerbar.blp:96 msgid "View Mode" msgstr "Visningsläge" #: data/ui/right_headerbar.blp:19 msgid "Web View" msgstr "Webbvy" #: data/ui/right_headerbar.blp:24 msgid "Reader Mode" msgstr "Läsläge" #: data/ui/right_headerbar.blp:29 msgid "Feed Content" msgstr "FlödesinnehÃ¥ll" #: data/ui/right_headerbar.blp:44 data/ui/shortcutsWindow.blp:66 msgid "Zoom Out" msgstr "Zooma ut" #: data/ui/right_headerbar.blp:51 data/ui/shortcutsWindow.blp:70 msgid "Reset Zoom" msgstr "Ã…terställ zoomnivÃ¥" #: data/ui/right_headerbar.blp:57 data/ui/shortcutsWindow.blp:62 msgid "Zoom In" msgstr "Zooma in" #: data/ui/right_headerbar.blp:90 msgid "Back to Articles" msgstr "Tillbaka till artiklar" #: data/ui/shortcutsWindow.blp:9 gfeeds/preferences_window.py:24 msgid "General" msgstr "Allmänt" #: data/ui/shortcutsWindow.blp:12 msgid "Open Keyboard Shortcuts" msgstr "Öppna tangentbordsgenvägar" #: data/ui/shortcutsWindow.blp:16 msgid "Open Menu" msgstr "Öppna meny" #: data/ui/shortcutsWindow.blp:20 msgid "Open Preferences" msgstr "Öppna inställningar" #: data/ui/shortcutsWindow.blp:24 msgid "Open Filter" msgstr "Öppna filter" #: data/ui/shortcutsWindow.blp:28 msgid "Quit" msgstr "Avsluta" #: data/ui/shortcutsWindow.blp:32 msgid "Article List" msgstr "Artikellista" #: data/ui/shortcutsWindow.blp:43 msgid "Next" msgstr "Nästa" #: data/ui/shortcutsWindow.blp:47 msgid "Previous" msgstr "FöregÃ¥ende" #: data/ui/shortcutsWindow.blp:51 msgid "Show/Hide Read Articles" msgstr "Visa/dölj lästa artiklar" #: data/ui/shortcutsWindow.blp:55 msgid "Mark All Read" msgstr "Märk alla som lästa" #: data/ui/shortcutsWindow.blp:59 msgid "Article" msgstr "Artikel" #: data/ui/shortcutsWindow.blp:74 data/ui/sidebar_listbox_row.blp:6 msgid "Open in Browser" msgstr "Öppna i webbläsare" #: data/ui/sidebar_listbox_row.blp:5 msgid "Mark as Read/Unread" msgstr "Märk som läst/oläst" #: data/ui/webview.blp:12 msgid "Select an article" msgstr "Välj en artikel" #: gfeeds/feed_item.py:59 #, python-brace-format msgid "Error: unable to parse datetime {0} for feeditem {1}" msgstr "Fel: Kan inte tolka datumtid {0} för flödesobjekt {1}" #: gfeeds/feed_parser.py:61 #, python-brace-format msgid "Errors while parsing feed `{0}`, URL: `{1}`" msgstr "Fel vid tolkning av flödet \"{0}\", URL: \"{1}\"" #: gfeeds/feed_parser.py:75 #, python-brace-format msgid "Error decoding unicode data from feed `{0}`, URL: `{1}`" msgstr "Fel vid avkodning av Unicode-data frÃ¥n flödet \"{0}\", URL: \"{1}\"" #: gfeeds/feed_parser.py:82 #, python-brace-format msgid "Error extracting data from feed `{0}`, URL: `{1}`" msgstr "Fel vid extraktion av data frÃ¥n flödet \"{0}\", URL: \"{1}\"" #: gfeeds/feed_parser.py:90 #, python-brace-format msgid "`{0}` may not be an RSS or Atom feed" msgstr "\"{0}\" kanske inte är ett RSS- eller Atom-flöde" #: gfeeds/feeds_manager.py:83 #, python-brace-format msgid "Feed {0} exists already, skipping" msgstr "Flödet {0} finns redan, hoppar över" #: gfeeds/feeds_view.py:13 msgid "All feeds" msgstr "Alla flöden" #: gfeeds/headerbar.py:197 msgid "There were problems with some feeds. Do you want to remove them?" msgstr "Det uppstod problem med nÃ¥gra flöden. Vill du ta bort dem?" #: gfeeds/headerbar.py:202 msgid "_Keep" msgstr "_BehÃ¥ll" #: gfeeds/headerbar.py:204 msgid "_Remove" msgstr "_Ta bort" #: gfeeds/main_leaflet.py:114 #, python-brace-format msgid "{0} new article" msgid_plural "{0} new articles" msgstr[0] "{0} ny artikel" msgstr[1] "{0} nya artiklar" #: gfeeds/__main__.py:232 msgid "Do you want to import these feeds?" msgstr "Vill du importera dessa flöden?" #: gfeeds/__main__.py:239 gfeeds/__main__.py:273 #: gfeeds/manage_feeds_window.py:324 msgid "_Cancel" msgstr "A_vbryt" #: gfeeds/__main__.py:242 gfeeds/__main__.py:276 msgid "_Import" msgstr "_Importera" #: gfeeds/__main__.py:269 msgid "Do you want to import this feed?" msgstr "Vill du importera detta flöde?" #: gfeeds/__main__.py:301 msgid "url" msgstr "URL" #: gfeeds/__main__.py:304 msgid "opml file local url or rss remote url to import" msgstr "OPML-fil, lokal URL eller RSS-URL för att importera" #: gfeeds/manage_feeds_window.py:321 msgid "Do you want to delete these feeds?" msgstr "Vill du ta bort dessa flöden?" #: gfeeds/manage_feeds_window.py:326 msgid "_Delete" msgstr "Ta _bort" #: gfeeds/opml_file_chooser.py:7 msgid "XML files" msgstr "XML-filer" #: gfeeds/opml_file_chooser.py:14 msgid "Choose an OPML file to import" msgstr "Välj en OPML-fil att importera" #: gfeeds/opml_file_chooser.py:18 msgid "Open" msgstr "Öppna" #: gfeeds/opml_file_chooser.py:19 gfeeds/opml_file_chooser.py:31 msgid "Cancel" msgstr "Avbryt" #: gfeeds/opml_file_chooser.py:26 msgid "Choose where to save the exported OPML file" msgstr "Välj var den exporterade OPML-filen skall sparas" #: gfeeds/opml_file_chooser.py:30 msgid "Save" msgstr "Spara" #: gfeeds/preferences_window.py:27 msgid "General preferences" msgstr "Allmänna inställningar" #: gfeeds/preferences_window.py:29 msgid "Show newer articles first" msgstr "Visa nyare artiklar först" #: gfeeds/preferences_window.py:34 msgid "Open links in your browser" msgstr "Öppna länkar i webbläsaren" #: gfeeds/preferences_window.py:38 msgid "Use external video player for YouTube" msgstr "Använd en extern videospelare för YouTube" #: gfeeds/preferences_window.py:40 msgid "Requires youtube-dl and a compatible video player" msgstr "Kräver youtube-dl och en kompatibel videospelare" #: gfeeds/preferences_window.py:46 msgid "Preferred video player" msgstr "Föredragen videospelare" #: gfeeds/preferences_window.py:50 msgid "Maximum article age" msgstr "Maximal artikelÃ¥lder" #: gfeeds/preferences_window.py:51 msgid "In days" msgstr "I dagar" #: gfeeds/preferences_window.py:58 msgid "Refresh preferences" msgstr "Uppdatera inställningar" #: gfeeds/preferences_window.py:60 msgid "Refresh articles on startup" msgstr "Uppdatera artiklar vid programstart" #: gfeeds/preferences_window.py:64 msgid "New articles notification" msgstr "Avisering för nya artiklar" #: gfeeds/preferences_window.py:68 msgid "Enable auto-refresh" msgstr "Aktivera automatisk uppdatering" #: gfeeds/preferences_window.py:72 msgid "Auto-refresh interval" msgstr "Intervall för automatisk uppdatering" #: gfeeds/preferences_window.py:73 msgid "In seconds" msgstr "I sekunder" #: gfeeds/preferences_window.py:80 msgid "Cache" msgstr "Cache" #: gfeeds/preferences_window.py:82 msgid "Clear caches" msgstr "Rensa cache-lagrat" #: gfeeds/preferences_window.py:83 msgid "Clear" msgstr "Töm" #: gfeeds/preferences_window.py:109 msgid "Appearance" msgstr "Utseende" #: gfeeds/preferences_window.py:112 msgid "Appearance preferences" msgstr "Utseendeinställningar" #: gfeeds/preferences_window.py:114 msgid "Dark mode" msgstr "Mörkt läge" #: gfeeds/preferences_window.py:118 msgid "Reader mode theme" msgstr "Tema för läsläge" #: gfeeds/preferences_window.py:122 msgid "Automatic" msgstr "Automatiskt" #: gfeeds/preferences_window.py:122 msgid "Light" msgstr "Ljust" #: gfeeds/preferences_window.py:122 msgid "Dark" msgstr "Mörkt" #: gfeeds/preferences_window.py:126 msgid "Show article thumbnails" msgstr "Visa miniatyrbilder för artiklar" #: gfeeds/preferences_window.py:131 msgid "Show full articles titles" msgstr "Visa fullständiga artikeltitlar" #: gfeeds/preferences_window.py:136 msgid "Show full feeds names" msgstr "Visa fullständiga flödesnamn" #: gfeeds/preferences_window.py:143 msgid "Font preferences" msgstr "Typsnittsinställningar" #: gfeeds/preferences_window.py:145 msgid "Use system font for titles" msgstr "Använd systemtypsnitt för titlar" #: gfeeds/preferences_window.py:149 msgid "Use system font for paragraphs" msgstr "Använd systemtypsnitt för stycken" #: gfeeds/preferences_window.py:153 msgid "Custom title font" msgstr "Anpassat typsnitt för titel" #: gfeeds/preferences_window.py:157 msgid "Custom paragraph font" msgstr "Anpassat typsnitt för stycke" #: gfeeds/preferences_window.py:161 msgid "Custom monospace font" msgstr "Anpassat typsnitt med fast breddslag" #: gfeeds/preferences_window.py:173 msgid "Privacy" msgstr "Sekretess" #: gfeeds/preferences_window.py:177 msgid "Privacy preferences" msgstr "Sekretessinställningar" #: gfeeds/preferences_window.py:179 msgid "Enable JavaScript" msgstr "Aktivera JavaScript" #: gfeeds/preferences_window.py:184 msgid "Try to block advertisements" msgstr "Försök blockera annonser" #: gfeeds/preferences_window.py:186 gfeeds/preferences_window.py:221 msgid "Requires app restart" msgstr "Kräver omstart av programmet" #: gfeeds/preferences_window.py:190 msgid "Update advertisement blocking list" msgstr "Uppdatera annonsblockeringslista" #: gfeeds/preferences_window.py:191 msgid "Updates automatically every 10 days" msgstr "Uppdateras automatiskt var 10:e dag" #: gfeeds/preferences_window.py:192 msgid "Update" msgstr "Uppdatera" #: gfeeds/preferences_window.py:205 msgid "Advanced" msgstr "Avancerat" #: gfeeds/preferences_window.py:208 msgid "Advanced preferences" msgstr "Avancerade inställningar" #: gfeeds/preferences_window.py:210 msgid "Maximum refresh threads" msgstr "Max antal uppdateringstrÃ¥dar" #: gfeeds/preferences_window.py:212 msgid "How many threads to use for feeds refresh" msgstr "Hur mÃ¥nga trÃ¥dar att använda för att uppdatera flöden" #: gfeeds/preferences_window.py:219 msgid "Experimental GtkListView for articles list" msgstr "Experimentell GtkListView för artikellista" #: gfeeds/preferences_window.py:227 msgid "Troubleshooting" msgstr "Problemlösning" #: gfeeds/preferences_window.py:229 msgid "Export Configuration as JSON" msgstr "Exportera konfiguration som JSON" #: gfeeds/preferences_window.py:230 msgid "Attach this when reporting bugs" msgstr "Bifoga denna när du rapporterar fel" #: gfeeds/preferences_window.py:231 msgid "Export" msgstr "Exportera" #. type: ignore #: gfeeds/preferences_window.py:244 msgid "Feeds Configuration" msgstr "Flödeskonfiguration" #: gfeeds/preferences_window.py:248 msgid "_Close" msgstr "S_täng" #: gfeeds/preferences_window.py:251 msgid "Cop_y" msgstr "_Kopiera" #: gfeeds/util/download_manager.py:112 #, python-brace-format msgid "`{0}`: connection timed out" msgstr "\"{0}\": Anslutningen överskred tidsgränsen" #: gfeeds/util/download_manager.py:121 #, python-brace-format msgid "`{0}` might not be a valid address" msgstr "\"{0}\" kanske inte är en giltig adress" #: gfeeds/util/download_manager.py:161 #, python-brace-format msgid "Error downloading `{0}`, code `{1}`" msgstr "Kunde inte hämta \"{0}\", kod \"{1}\"" #: gfeeds/util/get_favicon.py:48 #, python-brace-format msgid "Error downloading favicon for `{0}`" msgstr "Kunde inte hämta favikon för \"{0}\"" #: gfeeds/util/opml_parser.py:33 msgid "Error: OPML path provided does not exist" msgstr "Fel: Angiven OPML-sökväg finns inte" #: gfeeds/util/opml_parser.py:44 #, python-brace-format msgid "Error parsing OPML file `{0}`" msgstr "Kunde inte tolka OPML-fil \"{0}\"" #: gfeeds/webview.py:204 msgid "Link copied to clipboard!" msgstr "Länk kopierad till urklipp!" #: gfeeds/webview.py:226 msgid "Feed content not available for this article" msgstr "FlödesinnehÃ¥ll ej tillgängligt för den här artikeln" #~ msgid "Loading feeds..." #~ msgstr "Läser in flöden…" #~ msgid "" #~ "There were problems with some feeds.\n" #~ "Do you want to remove them?" #~ msgstr "" #~ "Det uppstod problem med nÃ¥gra flöden.\n" #~ "Vill du ta bort dem?" #~ msgid "Choose a folder" #~ msgstr "Välj en mapp" #~ msgid "Use dark theme for reader mode" #~ msgstr "Använd mörkt tema för läsläge" #~ msgid "Maximum thumbnail height" #~ msgstr "Maximal höjd pÃ¥ miniatyrbild" #~ msgid "Show" #~ msgstr "Visa" #~ msgid "Ignore" #~ msgstr "Ignorera" #~ msgid "You are offline" #~ msgstr "Du är frÃ¥nkopplad" gfeeds-2.2.0/po/tr.po000066400000000000000000000421151440757451400143710ustar00rootroot00000000000000# Turkish translations for gfeeds package. # Copyright (C) 2021-2022 gfeeds' COPYRIGHT HOLDER # This file is distributed under the same license as the gfeeds package. # # Veli Tasalı , 2021. # Sabri Ünal , 2022. # Emin Tufan Çetin , 2022. # msgid "" msgstr "" "Project-Id-Version: gfeeds 0.16.2\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/gfeeds/issues\n" "POT-Creation-Date: 2023-03-12 18:06+0000\n" "PO-Revision-Date: 2023-03-13 05:49+0300\n" "Last-Translator: Sabri Ünal \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" "X-Generator: Poedit 3.1.1\n" #: data/org.gabmus.gfeeds.appdata.xml.in:4 msgid "Feeds" msgstr "Beslemeler" #: data/org.gabmus.gfeeds.appdata.xml.in:6 data/org.gabmus.gfeeds.desktop.in:7 msgid "News reader for GNOME" msgstr "GNOME için haber okuyucusu" #: data/org.gabmus.gfeeds.appdata.xml.in:15 msgid "" "Feeds is a minimal RSS/Atom feed reader built with speed and simplicity in " "mind." msgstr "" "Beslemeler, hız ve basitlik göz önünde bulundurularak oluÅŸturulmuÅŸ minimal " "bir RSS/Atom besleme okuyucusudur." #: data/org.gabmus.gfeeds.appdata.xml.in:16 msgid "" "It offers a simple user interface that only shows the latest news from your " "subscriptions." msgstr "" "Aboneliklerinizden en son haberleri gösteren basit kullanıcı arayüzü sunar." #: data/org.gabmus.gfeeds.appdata.xml.in:17 msgid "" "Articles are shown in a web view by default, with javascript disabled for a " "faster and less intrusive user experience. There's also a reader mode " "included, built from the one GNOME Web/Epiphany uses." msgstr "" "Makaleler, daha hızlı ve daha az kesintili kullanıcı deneyimi için öntanımlı " "olarak web görünümünde javascript devre dışı bırakılarak gösterilir. Ayrıca " "GNOME Web/Epiphany uygulamasını baz alarak oluÅŸturulmuÅŸ okuyucu kipi de " "vardır." #: data/org.gabmus.gfeeds.appdata.xml.in:18 msgid "Feeds can be imported and exported via OPML." msgstr "Beslemeler, OPML kullanılarak içeri veya dışarı aktarılabilir." #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/org.gabmus.gfeeds.desktop.in:16 msgid "rss;reader;feed;news;" msgstr "rss;okuyucu;besleme;haberler;feed;" #: data/ui/aboutdialog.ui.in:10 msgid "translator-credits" msgstr "" "Veli Tasalı \n" "Sabri Ünal \n" "Emin Tufan Çetin " #: data/ui/add_feed_popover.blp:11 msgid "Enter feed address to add" msgstr "Eklenecek besleme adresini giriniz" #: data/ui/add_feed_popover.blp:26 msgid "Add" msgstr "Ekle" #: data/ui/add_feed_popover.blp:32 msgid "You're already subscribed to that feed!" msgstr "Bu beslemeye zaten abonesiniz!" #: data/ui/empty_state.blp:7 msgid "Let's get started" msgstr "Hadi baÅŸlayalım" #: data/ui/empty_state.blp:22 msgid "Add new feeds via URL" msgstr "URL kullanarak yeni beslemeler ekleyiniz" #: data/ui/empty_state.blp:27 msgid "Import an OPML file" msgstr "OPML dosyası içeri aktar" #: data/ui/left_headerbar.blp:6 msgid "_Show Read Articles" msgstr "OkunmuÅŸ Makaleleri _Göster" #: data/ui/left_headerbar.blp:7 msgid "Mark All as Read" msgstr "Tümünü Okundu İmle" #: data/ui/left_headerbar.blp:8 msgid "Mark All as _Unread" msgstr "Tümünü _Okunmadı İmle" #: data/ui/left_headerbar.blp:11 msgid "Show _Empty Feeds" msgstr "_BoÅŸ Beslemeleri Göster" #: data/ui/left_headerbar.blp:12 msgid "_Manage Feeds" msgstr "Beslemeleri _Yönet" #: data/ui/left_headerbar.blp:13 msgid "_Import OPML" msgstr "OPML _İçeri Aktar" #: data/ui/left_headerbar.blp:14 msgid "E_xport OPML" msgstr "OPML _Dışarı Aktar" #: data/ui/left_headerbar.blp:17 msgid "P_references" msgstr "_Tercihler" #: data/ui/left_headerbar.blp:18 msgid "_Keyboard Shortcuts" msgstr "_Klavye Kısayolları" #: data/ui/left_headerbar.blp:19 msgid "_About Feeds" msgstr "Beslemeler _Hakkında" #: data/ui/left_headerbar.blp:28 msgid "Filter" msgstr "Süz" #: data/ui/left_headerbar.blp:32 msgid "Add Feed" msgstr "Besleme Ekle" #: data/ui/left_headerbar.blp:36 msgid "Menu" msgstr "Menü" #: data/ui/left_headerbar.blp:41 data/ui/shortcutsWindow.blp:35 msgid "Refresh" msgstr "Yenile" #: data/ui/left_headerbar.blp:46 data/ui/shortcutsWindow.blp:39 msgid "Search" msgstr "Ara" #: data/ui/left_headerbar.blp:50 msgid "There Are Errors" msgstr "Hatalar Var" #: data/ui/main_leaflet.blp:40 msgid "Offline" msgstr "Çevrim Dışı" #: data/ui/manage_feeds_headerbar.blp:7 gfeeds/manage_feeds_window.py:257 msgid "Manage Feeds" msgstr "Beslemeleri Yönet" #: data/ui/manage_feeds_headerbar.blp:11 msgid "Manage Tags for Selected Feeds" msgstr "Seçili Beslemeler İçin Etiketleri Yönet" #: data/ui/manage_feeds_headerbar.blp:16 msgid "Select/Unselect All" msgstr "Tümünü Seç/Seçme" #: data/ui/manage_feeds_headerbar.blp:21 msgid "Delete Selected Feeds" msgstr "Seçili Beslemeleri Sil" #: data/ui/manage_tags_content.blp:17 msgid "New tag name…" msgstr "Yeni etiket adı…" #: data/ui/manage_tags_content.blp:24 msgid "Add Tag" msgstr "Etiket Ekle" #: data/ui/manage_tags_content.blp:39 msgid "There are no tags yet" msgstr "Henüz etiket yok" #: data/ui/manage_tags_content.blp:40 msgid "Add some using the entry above" msgstr "Yukarıdaki girdiyi kullanarak birkaç tane ekleyin" #: data/ui/right_headerbar.blp:9 msgid "Open in _Browser" msgstr "_Tarayıcıda Aç" #: data/ui/right_headerbar.blp:10 msgid "Open in External Media _Player" msgstr "Dış Ortam _Oynatıcıda Aç" #: data/ui/right_headerbar.blp:11 msgid "_Copy Article Link" msgstr "Makale BaÄŸlantısını _Kopyala" #: data/ui/right_headerbar.blp:17 data/ui/right_headerbar.blp:96 msgid "View Mode" msgstr "Görüntüleme Kipi" #: data/ui/right_headerbar.blp:19 msgid "Web View" msgstr "Web Görünümü" #: data/ui/right_headerbar.blp:24 msgid "Reader Mode" msgstr "Okuyucu Kipi" #: data/ui/right_headerbar.blp:29 msgid "Feed Content" msgstr "Besleme İçeriÄŸi" #: data/ui/right_headerbar.blp:44 data/ui/shortcutsWindow.blp:66 msgid "Zoom Out" msgstr "UzaklaÅŸtır" #: data/ui/right_headerbar.blp:51 data/ui/shortcutsWindow.blp:70 msgid "Reset Zoom" msgstr "YakınlaÅŸtırmayı Sıfırla" #: data/ui/right_headerbar.blp:57 data/ui/shortcutsWindow.blp:62 msgid "Zoom In" msgstr "YakınlaÅŸtır" #: data/ui/right_headerbar.blp:90 msgid "Back to Articles" msgstr "Makalelere Geri Dön" #: data/ui/shortcutsWindow.blp:9 gfeeds/preferences_window.py:24 msgid "General" msgstr "Genel" #: data/ui/shortcutsWindow.blp:12 msgid "Open Keyboard Shortcuts" msgstr "Klavye Kısayollarını Aç" #: data/ui/shortcutsWindow.blp:16 msgid "Open Menu" msgstr "Menüyü Aç" #: data/ui/shortcutsWindow.blp:20 msgid "Open Preferences" msgstr "Tercihleri Aç" #: data/ui/shortcutsWindow.blp:24 msgid "Open Filter" msgstr "Süzgeci Aç" #: data/ui/shortcutsWindow.blp:28 msgid "Quit" msgstr "Çık" #: data/ui/shortcutsWindow.blp:32 msgid "Article List" msgstr "Makale Listesi" #: data/ui/shortcutsWindow.blp:43 msgid "Next" msgstr "Sonraki" #: data/ui/shortcutsWindow.blp:47 msgid "Previous" msgstr "Önceki" #: data/ui/shortcutsWindow.blp:51 msgid "Show/Hide Read Articles" msgstr "OkunmuÅŸ Makaleleri Göster/Gizle" #: data/ui/shortcutsWindow.blp:55 msgid "Mark All Read" msgstr "Tümünü Okundu İmle" #: data/ui/shortcutsWindow.blp:59 msgid "Article" msgstr "Makale" #: data/ui/shortcutsWindow.blp:74 data/ui/sidebar_listbox_row.blp:6 msgid "Open in Browser" msgstr "Tarayıcıda Aç" #: data/ui/sidebar_listbox_row.blp:5 msgid "Mark as Read/Unread" msgstr "Okundu/Okunmadı İmle" #: data/ui/webview.blp:12 msgid "Select an article" msgstr "Makale seç" #: gfeeds/feed_item.py:59 #, python-brace-format msgid "Error: unable to parse datetime {0} for feeditem {1}" msgstr "Hata: feeditem {1} için datetime verisi {0} ayrıştırılamadı" #: gfeeds/feed_parser.py:61 #, python-brace-format msgid "Errors while parsing feed `{0}`, URL: `{1}`" msgstr "`{0}`, URL: `{1}` beslemesi ayrıştırılırken hata oluÅŸtu" #: gfeeds/feed_parser.py:75 #, python-brace-format msgid "Error decoding unicode data from feed `{0}`, URL: `{1}`" msgstr "" "`{0}` beslemesinden unikod verisi ayrıştırılırken hata oluÅŸtu, URL: `{1}`" #: gfeeds/feed_parser.py:82 #, python-brace-format msgid "Error extracting data from feed `{0}`, URL: `{1}`" msgstr "`{0}` beslemesinden veri ayrıştırılırken hata oluÅŸtu, URL: `{1}`" #: gfeeds/feed_parser.py:90 #, python-brace-format msgid "`{0}` may not be an RSS or Atom feed" msgstr "`{0}` bir RSS veya Atom beslemesi olmayabilir" #: gfeeds/feeds_manager.py:83 #, python-brace-format msgid "Feed {0} exists already, skipping" msgstr "{0} beslemesi zaten var, atlanıyor" #: gfeeds/feeds_view.py:13 msgid "All feeds" msgstr "Tüm beslemeler" #: gfeeds/headerbar.py:197 msgid "There were problems with some feeds. Do you want to remove them?" msgstr "Bazı beslemelerde sorun var. Hatalı olanları kaldırmak ister misiniz?" #: gfeeds/headerbar.py:202 msgid "_Keep" msgstr "_Koru" #: gfeeds/headerbar.py:204 msgid "_Remove" msgstr "Kaldı_r" #: gfeeds/main_leaflet.py:114 #, python-brace-format msgid "{0} new article" msgid_plural "{0} new articles" msgstr[0] "{0} yeni makale" #: gfeeds/__main__.py:232 msgid "Do you want to import these feeds?" msgstr "Bu beslemeleri içeri aktarmak istiyor musunuz?" #: gfeeds/__main__.py:239 gfeeds/__main__.py:273 #: gfeeds/manage_feeds_window.py:324 msgid "_Cancel" msgstr "_İptal Et" #: gfeeds/__main__.py:242 gfeeds/__main__.py:276 msgid "_Import" msgstr "_İçe Aktar" #: gfeeds/__main__.py:269 msgid "Do you want to import this feed?" msgstr "Bu beslemeyi içeri aktarmak istiyor musunuz?" #: gfeeds/__main__.py:301 msgid "url" msgstr "url" #: gfeeds/__main__.py:304 msgid "opml file local url or rss remote url to import" msgstr "İçeri aktarılacak yerel ompl dosyası url’si veya uzak rss url’si" #: gfeeds/manage_feeds_window.py:321 msgid "Do you want to delete these feeds?" msgstr "Bu beslemeleri silmek istiyor musunuz?" #: gfeeds/manage_feeds_window.py:326 msgid "_Delete" msgstr "_Sil" #: gfeeds/opml_file_chooser.py:7 msgid "XML files" msgstr "XML dosyaları" #: gfeeds/opml_file_chooser.py:14 msgid "Choose an OPML file to import" msgstr "İçe aktarılacak OPML dosyası seçiniz" #: gfeeds/opml_file_chooser.py:18 msgid "Open" msgstr "Aç" #: gfeeds/opml_file_chooser.py:19 gfeeds/opml_file_chooser.py:31 msgid "Cancel" msgstr "İptal Et" #: gfeeds/opml_file_chooser.py:26 msgid "Choose where to save the exported OPML file" msgstr "Dışarı aktarılan OPML dosyasının nereye kaydedileceÄŸini seçiniz" #: gfeeds/opml_file_chooser.py:30 msgid "Save" msgstr "Kaydet" #: gfeeds/preferences_window.py:27 msgid "General preferences" msgstr "Genel tercihler" #: gfeeds/preferences_window.py:29 msgid "Show newer articles first" msgstr "Daha yeni makaleleri önce göster" #: gfeeds/preferences_window.py:34 msgid "Open links in your browser" msgstr "BaÄŸlantıları tarayıcınızda açın" #: gfeeds/preferences_window.py:38 msgid "Use external video player for YouTube" msgstr "YouTube için dış video oynatıcı kullan" #: gfeeds/preferences_window.py:40 msgid "Requires youtube-dl and a compatible video player" msgstr "youtube-dl ve uyumlu video oynatıcı gerektirir" #: gfeeds/preferences_window.py:46 msgid "Preferred video player" msgstr "YeÄŸlenen video oynatıcı" #: gfeeds/preferences_window.py:50 msgid "Maximum article age" msgstr "En eski makale yaşı" #: gfeeds/preferences_window.py:51 msgid "In days" msgstr "Gün olarak" #: gfeeds/preferences_window.py:58 msgid "Refresh preferences" msgstr "Yenileme tercihleri" #: gfeeds/preferences_window.py:60 msgid "Refresh articles on startup" msgstr "BaÅŸlangıçta makaleleri yenile" #: gfeeds/preferences_window.py:64 msgid "New articles notification" msgstr "Yeni makale bildirimi" #: gfeeds/preferences_window.py:68 msgid "Enable auto-refresh" msgstr "KendiliÄŸinden yenilemeyi etkinleÅŸtir" #: gfeeds/preferences_window.py:72 msgid "Auto-refresh interval" msgstr "KendiliÄŸinden yenileme sıklığı" #: gfeeds/preferences_window.py:73 msgid "In seconds" msgstr "Saniye" #: gfeeds/preferences_window.py:80 msgid "Cache" msgstr "Önbellek" #: gfeeds/preferences_window.py:82 msgid "Clear caches" msgstr "Önbellekleri temizle" #: gfeeds/preferences_window.py:83 msgid "Clear" msgstr "Temizle" #: gfeeds/preferences_window.py:109 msgid "Appearance" msgstr "Görünüm" #: gfeeds/preferences_window.py:112 msgid "Appearance preferences" msgstr "Görünüm tercihleri" #: gfeeds/preferences_window.py:114 msgid "Dark mode" msgstr "Karanlık kip" #: gfeeds/preferences_window.py:118 msgid "Reader mode theme" msgstr "Okuma kipi teması" #: gfeeds/preferences_window.py:122 msgid "Automatic" msgstr "KendiliÄŸinden" #: gfeeds/preferences_window.py:122 msgid "Light" msgstr "Aydınlık" #: gfeeds/preferences_window.py:122 msgid "Dark" msgstr "Karanlık" #: gfeeds/preferences_window.py:126 msgid "Show article thumbnails" msgstr "Makale küçük resimlerini göster" #: gfeeds/preferences_window.py:131 msgid "Show full articles titles" msgstr "Makalelerin baÅŸlıklarını tümüyle göster" #: gfeeds/preferences_window.py:136 msgid "Show full feeds names" msgstr "Beslemelerin adlarını tümüyle göster" #: gfeeds/preferences_window.py:143 msgid "Font preferences" msgstr "Yazı tipi tercihleri" #: gfeeds/preferences_window.py:145 msgid "Use system font for titles" msgstr "BaÅŸlıklar için sistem yazı tipini kullan" #: gfeeds/preferences_window.py:149 msgid "Use system font for paragraphs" msgstr "Paragraflar için sistem yazı tipini kullan" #: gfeeds/preferences_window.py:153 msgid "Custom title font" msgstr "Özel baÅŸlık yazı tipi" #: gfeeds/preferences_window.py:157 msgid "Custom paragraph font" msgstr "Özel paragraf yazı tipi" #: gfeeds/preferences_window.py:161 msgid "Custom monospace font" msgstr "Özel eÅŸaralıklı yazı tipi" #: gfeeds/preferences_window.py:173 msgid "Privacy" msgstr "Gizlilik" #: gfeeds/preferences_window.py:177 msgid "Privacy preferences" msgstr "Gizlilik tercihleri" #: gfeeds/preferences_window.py:179 msgid "Enable JavaScript" msgstr "JavaScript’i etkinleÅŸtir" #: gfeeds/preferences_window.py:184 msgid "Try to block advertisements" msgstr "Reklamları engellemeye çalış" #: gfeeds/preferences_window.py:186 gfeeds/preferences_window.py:221 msgid "Requires app restart" msgstr "Uygulamanın yeniden baÅŸlatmasını gerektirir" #: gfeeds/preferences_window.py:190 msgid "Update advertisement blocking list" msgstr "Reklam engelleme listesini güncelle" #: gfeeds/preferences_window.py:191 msgid "Updates automatically every 10 days" msgstr "10 günde bir kendiliÄŸinden güncellenir" #: gfeeds/preferences_window.py:192 msgid "Update" msgstr "Güncelle" #: gfeeds/preferences_window.py:205 msgid "Advanced" msgstr "GeliÅŸmiÅŸ" #: gfeeds/preferences_window.py:208 msgid "Advanced preferences" msgstr "GeliÅŸmiÅŸ tercihler" #: gfeeds/preferences_window.py:210 msgid "Maximum refresh threads" msgstr "En çok yenileme iÅŸ parçacığı" #: gfeeds/preferences_window.py:212 msgid "How many threads to use for feeds refresh" msgstr "Beslemeler yenilenirken kaç adet iÅŸ parçacığı yürütülsün" #: gfeeds/preferences_window.py:219 msgid "Experimental GtkListView for articles list" msgstr "Makale listesi için deneysel GtkListView" #: gfeeds/preferences_window.py:227 msgid "Troubleshooting" msgstr "Sorun Giderme" #: gfeeds/preferences_window.py:229 msgid "Export Configuration as JSON" msgstr "Yapılandırmayı JSON Olarak Dışa Aktar" #: gfeeds/preferences_window.py:230 msgid "Attach this when reporting bugs" msgstr "Hataları bildirirken bunu ekleyin" #: gfeeds/preferences_window.py:231 msgid "Export" msgstr "Dışa Aktar" #. type: ignore #: gfeeds/preferences_window.py:244 msgid "Feeds Configuration" msgstr "Beslemeler Yapılandırması" #: gfeeds/preferences_window.py:248 msgid "_Close" msgstr "_Kapat" #: gfeeds/preferences_window.py:251 msgid "Cop_y" msgstr "Kop_yala" #: gfeeds/util/download_manager.py:112 #, python-brace-format msgid "`{0}`: connection timed out" msgstr "`{0}`: zaman aşımına uÄŸradı" #: gfeeds/util/download_manager.py:121 #, python-brace-format msgid "`{0}` might not be a valid address" msgstr "`{0}` geçerli bir adres olmayabilir" #: gfeeds/util/download_manager.py:161 #, python-brace-format msgid "Error downloading `{0}`, code `{1}`" msgstr "`{0}` indirilirken hata, kod `{1}`" #: gfeeds/util/get_favicon.py:48 #, python-brace-format msgid "Error downloading favicon for `{0}`" msgstr "`{0}` için simge indirilirken hata" #: gfeeds/util/opml_parser.py:33 msgid "Error: OPML path provided does not exist" msgstr "Hata: Verilen OPML yolu yok" #: gfeeds/util/opml_parser.py:44 #, python-brace-format msgid "Error parsing OPML file `{0}`" msgstr "`{0}` OPML dosyası ayrıştırılırken hata oluÅŸtu" #: gfeeds/webview.py:204 msgid "Link copied to clipboard!" msgstr "BaÄŸlantı panoya kopyalandı!" #: gfeeds/webview.py:226 msgid "Feed content not available for this article" msgstr "Besleme içeriÄŸi bu makale için kullanılamıyor" gfeeds-2.2.0/po/uk.po000066400000000000000000000526661440757451400143770ustar00rootroot00000000000000# Ukrainian translation for gfeeds. # Copyright (C) 2021 gfeeds's COPYRIGHT HOLDER # This file is distributed under the same license as the gfeeds package. # # Yuri Chornoivan , 2021, 2022, 2023. msgid "" msgstr "" "Project-Id-Version: gfeeds master\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/gfeeds/issues\n" "POT-Creation-Date: 2023-03-11 08:34+0000\n" "PO-Revision-Date: 2023-03-12 20:06+0200\n" "Last-Translator: Yuri Chornoivan \n" "Language-Team: Ukrainian \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=4; plural=n==1 ? 3 : n%10==1 && n%100!=11 ? 0 : n" "%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Generator: Lokalize 20.12.0\n" #: data/org.gabmus.gfeeds.appdata.xml.in:4 msgid "Feeds" msgstr "Стрічки" #: data/org.gabmus.gfeeds.appdata.xml.in:6 data/org.gabmus.gfeeds.desktop.in:7 msgid "News reader for GNOME" msgstr "Програма Ð´Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð½Ð¾Ð²Ð¸Ð½ у GNOME" #: data/org.gabmus.gfeeds.appdata.xml.in:15 msgid "" "Feeds is a minimal RSS/Atom feed reader built with speed and simplicity in " "mind." msgstr "" "«Стрічки» — мінімаліÑтична програма Ð´Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ñтрічок новин RSS/Atom. " "Ðкцент зроблено на швидкіÑть Ñ– проÑтоту." #: data/org.gabmus.gfeeds.appdata.xml.in:16 msgid "" "It offers a simple user interface that only shows the latest news from your " "subscriptions." msgstr "" "Програма пропонує вам ÑкориÑтатиÑÑ Ð¿Ñ€Ð¾Ñтим інтерфейÑом кориÑтувача, у Ñкому " "показано лише найÑвіжіші новини з ваших підпиÑок." #: data/org.gabmus.gfeeds.appdata.xml.in:17 msgid "" "Articles are shown in a web view by default, with javascript disabled for a " "faster and less intrusive user experience. There's also a reader mode " "included, built from the one GNOME Web/Epiphany uses." msgstr "" "Типово, Ñтатті показано на вебпанелі із вимкненим javascript Ð´Ð»Ñ " "Ð¿Ñ€Ð¸ÑˆÐ²Ð¸Ð´ÑˆÐµÐ½Ð½Ñ Ñ‚Ð° меншого Ð²Ñ‚Ñ€ÑƒÑ‡Ð°Ð½Ð½Ñ Ñƒ дії кориÑтувача. Також реалізовано режим " "читача, Ñкий побудовано на оÑнові того, що викориÑтовуєтьÑÑ Ñƒ «Тенетах " "GNOME»/Epiphany." #: data/org.gabmus.gfeeds.appdata.xml.in:18 msgid "Feeds can be imported and exported via OPML." msgstr "Стрічки можна імпортувати або екÑпортувати у форматі OPML." #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/org.gabmus.gfeeds.desktop.in:16 msgid "rss;reader;feed;news;" msgstr "rss;reader;feed;news;Ñ€ÑÑ;читаннÑ;Ñтрічка;подача;новини;" #: data/ui/aboutdialog.ui.in:10 msgid "translator-credits" msgstr "Юрій Чорноіван , 2022" #: data/ui/add_feed_popover.blp:11 msgid "Enter feed address to add" msgstr "Введіть адреÑу Ñтрічки Ð´Ð»Ñ Ð´Ð¾Ð´Ð°Ð²Ð°Ð½Ð½Ñ" #: data/ui/add_feed_popover.blp:26 msgid "Add" msgstr "Додати" #: data/ui/add_feed_popover.blp:32 msgid "You're already subscribed to that feed!" msgstr "Ви вже підпиÑані на цю Ñтрічку!" #: data/ui/empty_state.blp:7 msgid "Let's get started" msgstr "Почнімо" #: data/ui/empty_state.blp:22 msgid "Add new feeds via URL" msgstr "Додати нові Ñтрічки за адреÑою" #: data/ui/empty_state.blp:27 msgid "Import an OPML file" msgstr "Імпортувати файл OPML" #: data/ui/left_headerbar.blp:6 msgid "_Show Read Articles" msgstr "_Показати прочитані Ñтатті" #: data/ui/left_headerbar.blp:7 msgid "Mark All as Read" msgstr "Позначити вÑÑ– Ñк прочитані" #: data/ui/left_headerbar.blp:8 msgid "Mark All as _Unread" msgstr "Позначити вÑÑ– Ñк _непрочитані" #: data/ui/left_headerbar.blp:11 msgid "Show _Empty Feeds" msgstr "Показати поро_жні Ñтрічки" #: data/ui/left_headerbar.blp:12 msgid "_Manage Feeds" msgstr "_ÐšÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ñтрічками" #: data/ui/left_headerbar.blp:13 msgid "_Import OPML" msgstr "_Імпортувати OPML" #: data/ui/left_headerbar.blp:14 msgid "E_xport OPML" msgstr "_ЕкÑпортувати OPML" #: data/ui/left_headerbar.blp:17 msgid "P_references" msgstr "Ðа_лаштуваннÑ" #: data/ui/left_headerbar.blp:18 msgid "_Keyboard Shortcuts" msgstr "Кл_авіатурні ÑкороченнÑ" #: data/ui/left_headerbar.blp:19 msgid "_About Feeds" msgstr "П_ро «Стрічки»" #: data/ui/left_headerbar.blp:28 msgid "Filter" msgstr "Фільтрувати" #: data/ui/left_headerbar.blp:32 msgid "Add Feed" msgstr "Додати Ñтрічку" #: data/ui/left_headerbar.blp:36 msgid "Menu" msgstr "Меню" #: data/ui/left_headerbar.blp:41 data/ui/shortcutsWindow.blp:35 msgid "Refresh" msgstr "ОÑвіжити" #: data/ui/left_headerbar.blp:46 data/ui/shortcutsWindow.blp:39 msgid "Search" msgstr "Пошук" #: data/ui/left_headerbar.blp:50 msgid "There Are Errors" msgstr "СталиÑÑ ÑкіÑÑŒ помилки" #: data/ui/main_leaflet.blp:40 msgid "Offline" msgstr "Поза мережею" #: data/ui/manage_feeds_headerbar.blp:7 gfeeds/manage_feeds_window.py:257 msgid "Manage Feeds" msgstr "ÐšÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ñтрічками" #: data/ui/manage_feeds_headerbar.blp:11 msgid "Manage Tags for Selected Feeds" msgstr "ÐšÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð¼Ñ–Ñ‚ÐºÐ°Ð¼Ð¸ Ð´Ð»Ñ Ð¿Ð¾Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ… Ñтрічок" #: data/ui/manage_feeds_headerbar.blp:16 msgid "Select/Unselect All" msgstr "Позначити уÑÑ–/ЗнÑти Ð¿Ð¾Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð· уÑÑ–Ñ…" #: data/ui/manage_feeds_headerbar.blp:21 msgid "Delete Selected Feeds" msgstr "Вилучити позначені Ñтрічки" #: data/ui/manage_tags_content.blp:17 msgid "New tag name…" msgstr "Ðазва нової мітки…" #: data/ui/manage_tags_content.blp:24 msgid "Add Tag" msgstr "Додати мітку" #: data/ui/manage_tags_content.blp:39 msgid "There are no tags yet" msgstr "Міток ще немає" #: data/ui/manage_tags_content.blp:40 msgid "Add some using the entry above" msgstr "Додайте ÑкіÑÑŒ за допомогою наведеного вище запиÑу" #: data/ui/right_headerbar.blp:9 msgid "Open in _Browser" msgstr "Відкрити у _браузері" #: data/ui/right_headerbar.blp:10 msgid "Open in External Media _Player" msgstr "Відкрити у зовнішньому про_гравачі" #: data/ui/right_headerbar.blp:11 msgid "_Copy Article Link" msgstr "_Копіювати поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° Ñтаттю" #: data/ui/right_headerbar.blp:17 data/ui/right_headerbar.blp:96 msgid "View Mode" msgstr "Режим переглÑду" #: data/ui/right_headerbar.blp:19 msgid "Web View" msgstr "Вебпанель" #: data/ui/right_headerbar.blp:24 msgid "Reader Mode" msgstr "Режим читача" #: data/ui/right_headerbar.blp:29 msgid "Feed Content" msgstr "ВміÑÑ‚ Ñтрічки" #: data/ui/right_headerbar.blp:44 data/ui/shortcutsWindow.blp:66 msgid "Zoom Out" msgstr "Зменшити" #: data/ui/right_headerbar.blp:51 data/ui/shortcutsWindow.blp:70 msgid "Reset Zoom" msgstr "Відновити маÑштаб" #: data/ui/right_headerbar.blp:57 data/ui/shortcutsWindow.blp:62 msgid "Zoom In" msgstr "Збільшити" #: data/ui/right_headerbar.blp:90 msgid "Back to Articles" msgstr "Ðазад до Ñтатей" #: data/ui/shortcutsWindow.blp:9 gfeeds/preferences_window.py:24 msgid "General" msgstr "Загальне" #: data/ui/shortcutsWindow.blp:12 msgid "Open Keyboard Shortcuts" msgstr "Відкрити вікно клавіатурних Ñкорочень" #: data/ui/shortcutsWindow.blp:16 msgid "Open Menu" msgstr "Відкрити меню" #: data/ui/shortcutsWindow.blp:20 msgid "Open Preferences" msgstr "Відкрити налаштуваннÑ" #: data/ui/shortcutsWindow.blp:24 msgid "Open Filter" msgstr "Відкрити фільтр" #: data/ui/shortcutsWindow.blp:28 msgid "Quit" msgstr "Вийти" #: data/ui/shortcutsWindow.blp:32 msgid "Article List" msgstr "СпиÑок Ñтатей" #: data/ui/shortcutsWindow.blp:43 msgid "Next" msgstr "Далі" #: data/ui/shortcutsWindow.blp:47 msgid "Previous" msgstr "Ðазад" #: data/ui/shortcutsWindow.blp:51 msgid "Show/Hide Read Articles" msgstr "Показати/Приховати прочитані Ñтатті" #: data/ui/shortcutsWindow.blp:55 msgid "Mark All Read" msgstr "Позначити вÑÑ– Ñк прочитані" #: data/ui/shortcutsWindow.blp:59 msgid "Article" msgstr "СтаттÑ" #: data/ui/shortcutsWindow.blp:74 data/ui/sidebar_listbox_row.blp:6 msgid "Open in Browser" msgstr "Відкрити у браузері" #: data/ui/sidebar_listbox_row.blp:5 msgid "Mark as Read/Unread" msgstr "Позначити Ñк прочитане/непрочитане" #: data/ui/webview.blp:12 msgid "Select an article" msgstr "Виберіть Ñтаттю" #: gfeeds/feed_item.py:59 #, python-brace-format msgid "Error: unable to parse datetime {0} for feeditem {1}" msgstr "Помилка: не вдалоÑÑ Ð¾Ð±Ñ€Ð¾Ð±Ð¸Ñ‚Ð¸ позначку чаÑу {0} Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñу Ñтрічки {1}" #: gfeeds/feed_parser.py:61 #, python-brace-format msgid "Errors while parsing feed `{0}`, URL: `{1}`" msgstr "Помилки під Ñ‡Ð°Ñ Ð¾Ð±Ñ€Ð¾Ð±ÐºÐ¸ Ñтрічки «{0}», адреÑа: «{1}»" #: gfeeds/feed_parser.py:75 #, python-brace-format #| msgid "Errors while parsing feed `{0}`, URL: `{1}`" msgid "Error decoding unicode data from feed `{0}`, URL: `{1}`" msgstr "" "Помилка під Ñ‡Ð°Ñ Ð´ÐµÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… Unicode зі Ñтрічки «{0}», адреÑа: «{1}»" #: gfeeds/feed_parser.py:82 #, python-brace-format #| msgid "Errors while parsing feed `{0}`, URL: `{1}`" msgid "Error extracting data from feed `{0}`, URL: `{1}`" msgstr "Помилки під Ñ‡Ð°Ñ Ð²Ð¸Ð´Ð¾Ð±ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… зі Ñтрічки «{0}», адреÑа: «{1}»" #: gfeeds/feed_parser.py:90 #, python-brace-format msgid "`{0}` may not be an RSS or Atom feed" msgstr "«{0}», можливо, не Ñ” Ñтрічкою RSS або Atom" #: gfeeds/feeds_manager.py:83 #, python-brace-format msgid "Feed {0} exists already, skipping" msgstr "Ð—Ð°Ð¿Ð¸Ñ Ñтрічки {0} вже Ñ–Ñнує, пропуÑкаємо" #: gfeeds/feeds_view.py:13 msgid "All feeds" msgstr "Ð’ÑÑ– Ñтрічки" #: gfeeds/headerbar.py:197 msgid "There were problems with some feeds. Do you want to remove them?" msgstr "З деÑкими Ñтрічками виникли проблеми. Хочете вилучити Ñ—Ñ…?" #: gfeeds/headerbar.py:202 msgid "_Keep" msgstr "З_берегти" #: gfeeds/headerbar.py:204 msgid "_Remove" msgstr "Ви_лучити" #: gfeeds/main_leaflet.py:114 #, python-brace-format msgid "{0} new article" msgid_plural "{0} new articles" msgstr[0] "{0} нова ÑтаттÑ" msgstr[1] "{0} нові Ñтатті" msgstr[2] "{0} нових Ñтатей" msgstr[3] "{0} нова ÑтаттÑ" #: gfeeds/__main__.py:232 msgid "Do you want to import these feeds?" msgstr "Хочете імпортувати ці Ñтрічки?" #: gfeeds/__main__.py:239 gfeeds/__main__.py:273 #: gfeeds/manage_feeds_window.py:324 msgid "_Cancel" msgstr "_СкаÑувати" #: gfeeds/__main__.py:242 gfeeds/__main__.py:276 msgid "_Import" msgstr "_Імпортувати" #: gfeeds/__main__.py:269 msgid "Do you want to import this feed?" msgstr "Хочете імпортувати цю Ñтрічку?" #: gfeeds/__main__.py:301 msgid "url" msgstr "адреÑа" #: gfeeds/__main__.py:304 msgid "opml file local url or rss remote url to import" msgstr "" "локальна адреÑа файла opml або віддалена адреÑа rss Ð´Ð»Ñ Ñ–Ð¼Ð¿Ð¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ…" #: gfeeds/manage_feeds_window.py:321 msgid "Do you want to delete these feeds?" msgstr "Хочете вилучити ці Ñтрічки?" #: gfeeds/manage_feeds_window.py:326 msgid "_Delete" msgstr "Ð’_илучити" #: gfeeds/opml_file_chooser.py:7 msgid "XML files" msgstr "файли XML" #: gfeeds/opml_file_chooser.py:14 msgid "Choose an OPML file to import" msgstr "Виберіть файл OPML Ð´Ð»Ñ Ñ–Ð¼Ð¿Ð¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ" #: gfeeds/opml_file_chooser.py:18 msgid "Open" msgstr "Відкрити" #: gfeeds/opml_file_chooser.py:19 gfeeds/opml_file_chooser.py:31 msgid "Cancel" msgstr "СкаÑувати" #: gfeeds/opml_file_chooser.py:26 msgid "Choose where to save the exported OPML file" msgstr "Виберіть міÑце Ð·Ð±ÐµÑ€Ñ–Ð³Ð°Ð½Ð½Ñ ÐµÐºÑпортованого файла OPML" #: gfeeds/opml_file_chooser.py:30 msgid "Save" msgstr "Зберегти" #: gfeeds/preferences_window.py:27 msgid "General preferences" msgstr "Загальні параметри" #: gfeeds/preferences_window.py:29 msgid "Show newer articles first" msgstr "Показати Ñпочатку новіші Ñтатті" #: gfeeds/preferences_window.py:34 msgid "Open links in your browser" msgstr "Відкривати поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ñƒ вашому браузері" #: gfeeds/preferences_window.py:38 msgid "Use external video player for YouTube" msgstr "Зовнішній відеопрогравач Ð´Ð»Ñ YouTube" #: gfeeds/preferences_window.py:40 msgid "Requires youtube-dl and a compatible video player" msgstr "Потребує youtube-dl Ñ– ÑуміÑного відеопрогравача" #: gfeeds/preferences_window.py:46 msgid "Preferred video player" msgstr "Бажаний відеопрогравач" #: gfeeds/preferences_window.py:50 msgid "Maximum article age" msgstr "МакÑимальний вік Ñтатей" #: gfeeds/preferences_window.py:51 msgid "In days" msgstr "За днÑми" #: gfeeds/preferences_window.py:58 msgid "Refresh preferences" msgstr "Оновити налаштуваннÑ" #: gfeeds/preferences_window.py:60 msgid "Refresh articles on startup" msgstr "Оновлювати Ñтатті під Ñ‡Ð°Ñ Ð·Ð°Ð¿ÑƒÑку" #: gfeeds/preferences_window.py:64 msgid "New articles notification" msgstr "Ð¡Ð¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ñ‰Ð¾Ð´Ð¾ нових Ñтатей" #: gfeeds/preferences_window.py:68 msgid "Enable auto-refresh" msgstr "Увімкнути автооновленнÑ" #: gfeeds/preferences_window.py:72 msgid "Auto-refresh interval" msgstr "Інтервал автооновленнÑ" #: gfeeds/preferences_window.py:73 msgid "In seconds" msgstr "У Ñекундах" #: gfeeds/preferences_window.py:80 msgid "Cache" msgstr "Кеш" #: gfeeds/preferences_window.py:82 msgid "Clear caches" msgstr "ОчиÑтити кеш" #: gfeeds/preferences_window.py:83 msgid "Clear" msgstr "ОчиÑтити" #: gfeeds/preferences_window.py:109 msgid "Appearance" msgstr "ВиглÑд" #: gfeeds/preferences_window.py:112 msgid "Appearance preferences" msgstr "Параметри виглÑду" #: gfeeds/preferences_window.py:114 msgid "Dark mode" msgstr "Темний режим" #: gfeeds/preferences_window.py:118 msgid "Reader mode theme" msgstr "Тема режиму читача" #: gfeeds/preferences_window.py:122 msgid "Automatic" msgstr "Ðвтоматично" #: gfeeds/preferences_window.py:122 msgid "Light" msgstr "Світла" #: gfeeds/preferences_window.py:122 msgid "Dark" msgstr "Темна" #: gfeeds/preferences_window.py:126 msgid "Show article thumbnails" msgstr "Показувати мініатюри Ñтатей" #: gfeeds/preferences_window.py:131 msgid "Show full articles titles" msgstr "Показувати заголовки Ñтатей повніÑтю" #: gfeeds/preferences_window.py:136 msgid "Show full feeds names" msgstr "Показувати назви Ñтрічок повніÑтю" #: gfeeds/preferences_window.py:143 msgid "Font preferences" msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ ÑˆÑ€Ð¸Ñ„Ñ‚Ñ–Ð²" #: gfeeds/preferences_window.py:145 msgid "Use system font for titles" msgstr "ВикориÑтати Ð´Ð»Ñ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÑ–Ð² загальноÑиÑтемний шрифт" #: gfeeds/preferences_window.py:149 msgid "Use system font for paragraphs" msgstr "ВикориÑтати Ð´Ð»Ñ Ð°Ð±Ð·Ð°Ñ†Ñ–Ð² загальноÑиÑтемний шрифт" #: gfeeds/preferences_window.py:153 msgid "Custom title font" msgstr "Ðетиповий шрифт заголовків" #: gfeeds/preferences_window.py:157 msgid "Custom paragraph font" msgstr "Ðетиповий шрифт абзаців" #: gfeeds/preferences_window.py:161 msgid "Custom monospace font" msgstr "Ðетиповий моноширинний шрифт" #: gfeeds/preferences_window.py:173 msgid "Privacy" msgstr "КонфіденційніÑть" #: gfeeds/preferences_window.py:177 msgid "Privacy preferences" msgstr "Параметри конфіденційноÑті" #: gfeeds/preferences_window.py:179 msgid "Enable JavaScript" msgstr "Увімкнути JavaScript" #: gfeeds/preferences_window.py:184 msgid "Try to block advertisements" msgstr "ÐамагатиÑÑ Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ñ‚Ð¸ рекламу" #: gfeeds/preferences_window.py:186 gfeeds/preferences_window.py:221 msgid "Requires app restart" msgstr "Потребує перезапуÑку програми" #: gfeeds/preferences_window.py:190 msgid "Update advertisement blocking list" msgstr "Оновити ÑпиÑок Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ñ€ÐµÐºÐ»Ð°Ð¼Ð¸" #: gfeeds/preferences_window.py:191 msgid "Updates automatically every 10 days" msgstr "Ðвтоматично оновлюєтьÑÑ ÐºÐ¾Ð¶Ð½Ñ– 10 днів" #: gfeeds/preferences_window.py:192 msgid "Update" msgstr "Оновити" #: gfeeds/preferences_window.py:205 msgid "Advanced" msgstr "Додатково" #: gfeeds/preferences_window.py:208 msgid "Advanced preferences" msgstr "Додаткові налаштуваннÑ" #: gfeeds/preferences_window.py:210 msgid "Maximum refresh threads" msgstr "МакÑимальна кількіÑть потоків оновленнÑ" #: gfeeds/preferences_window.py:212 msgid "How many threads to use for feeds refresh" msgstr "" "КількіÑть потоків обробки, Ñку можна викориÑтовувати Ð´Ð»Ñ Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñтрічок" #: gfeeds/preferences_window.py:219 msgid "Experimental GtkListView for articles list" msgstr "ЕкÑпериментальний GtkListView Ð´Ð»Ñ ÑпиÑку Ñтатей" #: gfeeds/preferences_window.py:227 msgid "Troubleshooting" msgstr "УÑÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼" #: gfeeds/preferences_window.py:229 msgid "Export Configuration as JSON" msgstr "ЕкÑпортувати Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñк JSON" #: gfeeds/preferences_window.py:230 msgid "Attach this when reporting bugs" msgstr "Долучіть ці дані при звітуванні щодо вад" #: gfeeds/preferences_window.py:231 msgid "Export" msgstr "ЕкÑпортувати" #. type: ignore #: gfeeds/preferences_window.py:244 msgid "Feeds Configuration" msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñтрічок" #: gfeeds/preferences_window.py:248 msgid "_Close" msgstr "_Закрити" #: gfeeds/preferences_window.py:251 msgid "Cop_y" msgstr "_Копіювати" #: gfeeds/util/download_manager.py:112 #, python-brace-format msgid "`{0}`: connection timed out" msgstr "`{0}`: перевищено Ñ‡Ð°Ñ Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ñ–Ð´Ð¿Ð¾Ð²Ñ–Ð´Ñ– у з'єднанні" #: gfeeds/util/download_manager.py:121 #, python-brace-format msgid "`{0}` might not be a valid address" msgstr "«{0}», ймовірно, не Ñ” коректною адреÑою" #: gfeeds/util/download_manager.py:161 #, python-brace-format msgid "Error downloading `{0}`, code `{1}`" msgstr "Помилка під Ñ‡Ð°Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Â«{0}», код «{1}»" #: gfeeds/util/get_favicon.py:48 #, python-brace-format msgid "Error downloading favicon for `{0}`" msgstr "Помилка під Ñ‡Ð°Ñ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð¿Ñ–ÐºÑ‚Ð¾Ð³Ñ€Ð°Ð¼Ð¸ Ð´Ð»Ñ Â«{0}»" #: gfeeds/util/opml_parser.py:33 msgid "Error: OPML path provided does not exist" msgstr "Помилка: вказаного шлÑху до OPML не Ñ–Ñнує" #: gfeeds/util/opml_parser.py:44 #, python-brace-format msgid "Error parsing OPML file `{0}`" msgstr "Помилка під Ñ‡Ð°Ñ Ð¾Ð±Ñ€Ð¾Ð±ÐºÐ¸ файла OPML «{0}»" #: gfeeds/webview.py:204 msgid "Link copied to clipboard!" msgstr "ПоÑÐ¸Ð»Ð°Ð½Ð½Ñ Ñкопійовано до буфера обміну!" #: gfeeds/webview.py:226 msgid "Feed content not available for this article" msgstr "Ð”Ð»Ñ Ñ†Ñ–Ñ”Ñ— Ñтатті дані Ñтрічки Ñ” недоÑтупними" #~ msgid "Loading feeds..." #~ msgstr "Завантажуємо Ñтрічки…" #~| msgid "Mark as read" #~ msgid "Mark as Read" #~ msgstr "Позначити Ñк прочитане" #~ msgid "Mark as read" #~ msgstr "Позначити Ñк прочитане" #~ msgid "" #~ "There were problems with some feeds.\n" #~ "Do you want to remove them?" #~ msgstr "" #~ "З деÑкими Ñтрічками виникли проблеми.\n" #~ "Хочете вилучити Ñ—Ñ…?" #~ msgid "Choose a folder" #~ msgstr "Виберіть теку" #~ msgid "Use dark theme for reader mode" #~ msgstr "Темна тема Ð´Ð»Ñ Ñ€ÐµÐ¶Ð¸Ð¼Ñƒ читача" #~ msgid "Maximum thumbnail height" #~ msgstr "МакÑимальна виÑота мініатюри" #~ msgid "Show" #~ msgstr "Показати" #~ msgid "Ignore" #~ msgstr "Ігнорувати" #~ msgid "You are offline" #~ msgstr "Ви поза мережею" gfeeds-2.2.0/po/update_potfiles.sh000077500000000000000000000040171440757451400171310ustar00rootroot00000000000000#!/bin/bash DOMAIN_EXTENSION="org" AUTHOR="gabmus" APPNAME="gfeeds" APPID="${DOMAIN_EXTENSION}.${AUTHOR}.${APPNAME}" if [ "$1" == "-h" ]; then echo "Usage: $0 [lang]" exit fi lang="$1" rm *.pot version=$(grep -Fm 1 "version: " ../meson.build | grep -v "meson" | grep -o "'.*'" | sed "s/'//g") find ../$APPNAME -iname "*.py" | xargs xgettext --package-name=$APPNAME --package-version=$version --from-code=UTF-8 --output=$APPNAME-python.pot # find ../data/ui -iname "*.glade" -or -iname "*.xml" -or -iname "*.ui" | xargs xgettext --package-name=$APPNAME --package-version=$version --from-code=UTF-8 --output=$APPNAME-glade.pot -L Glade find ../data/ui -iname "*.blp" | xargs xgettext --package-name=$APPNAME --package-version=$version --from-code=UTF-8 --output=$APPNAME-blueprint.pot -L Python find ../data/ui -iname "*.ui.in" | xargs xgettext --no-wrap --package-name=$APPNAME --package-version=$version --from-code=UTF-8 --output=$APPNAME-ui-xml.pot find ../data/ -iname "*.desktop.in" | xargs xgettext --package-name=$APPNAME --package-version=$version --from-code=UTF-8 --output=$APPNAME-desktop.pot -L Desktop find ../data/ -iname "*.appdata.xml.in" | xargs xgettext --no-wrap --package-name=$APPNAME --package-version=$version --from-code=UTF-8 --output=$APPNAME-appdata.pot msgcat --use-first $APPNAME-python.pot $APPNAME-blueprint.pot $APPNAME-ui-xml.pot $APPNAME-desktop.pot $APPNAME-appdata.pot > $APPID.pot sed 's/#: //g;s/:[0-9]*//g;s/\.\.\///g' <(grep -F "#: " $APPID.pot) | sort | uniq | sed 's/ /\n/g' | uniq > POTFILES.in.in cat POTFILES.in.in | sort | uniq > POTFILES.in rm POTFILES.in.in if [ ! -z "${lang}" ]; then [ -f "${lang}.po" ] && mv "${lang}.po" "${lang}.po.old" msginit --locale=$lang --input $APPID.pot if [ -f "${lang}.po.old" ]; then mv "${lang}.po" "${lang}.po.new" msgmerge -N "${lang}.po.old" "${lang}.po.new" > ${lang}.po rm "${lang}.po.old" "${lang}.po.new" fi sed -i 's/ASCII/UTF-8/' "${lang}.po" fi mv $APPID.pot $APPID.pot.bak rm *.pot mv $APPID.pot.bak $APPID.pot gfeeds-2.2.0/po/zh_CN.po000066400000000000000000000252641440757451400147530ustar00rootroot00000000000000# Chinese (China) translation for gfeeds. # Copyright (C) 2021 gfeeds's COPYRIGHT HOLDER # This file is distributed under the same license as the gfeeds package. # lumingzh , 2021-2022. # msgid "" msgstr "" "Project-Id-Version: gfeeds master\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/gfeeds/issues\n" "POT-Creation-Date: 2022-05-09 14:29+0000\n" "PO-Revision-Date: 2022-05-28 10:06-0400\n" "Last-Translator: lumingzh \n" "Language-Team: Chinese - China \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" "X-Generator: Poedit 2.4.3\n" #: data/org.gabmus.gfeeds.appdata.xml.in:4 msgid "Feeds" msgstr "订阅" #: data/org.gabmus.gfeeds.appdata.xml.in:6 data/org.gabmus.gfeeds.desktop.in:7 msgid "News reader for GNOME" msgstr "用于 GNOME 的新闻阅读器" #: data/org.gabmus.gfeeds.appdata.xml.in:15 msgid "" "Feeds is a minimal RSS/Atom feed reader built with speed and simplicity in " "mind." msgstr "è®¢é˜…æ˜¯ä»¥é€Ÿåº¦å’Œç®€ä¾¿ä¸ºè®¾è®¡æ€æƒ³æž„建的最å°åŒ– RSS/Atom 订阅阅读器。" #: data/org.gabmus.gfeeds.appdata.xml.in:16 msgid "" "It offers a simple user interface that only shows the latest news from your " "subscriptions." msgstr "它æä¾›äº†ä»…æ˜¾ç¤ºä»Žæ‚¨çš„è®¢é˜…ä¸­èŽ·å–æœ€æ–°å†…容的简å•用户界é¢ã€‚" #: data/org.gabmus.gfeeds.appdata.xml.in:17 msgid "" "Articles are shown in a web view by default, with javascript disabled for a " "faster and less intrusive user experience. There's also a reader mode " "included, built from the one GNOME Web/Epiphany uses." msgstr "" "文章默认显示在网页视图中,ç¦ç”¨ JavaScript 以获得更快速和更少干扰的用户体验。" "åŒæ—¶åŒ…å«äº†æ¥è‡ª GNOME Web/Epiphany 使用的阅读模å¼ã€‚" #: data/org.gabmus.gfeeds.appdata.xml.in:18 msgid "Feeds can be imported and exported via OPML." msgstr "订阅å¯ä»¥é€šè¿‡ OPML æ¥å¯¼å…¥å’Œå¯¼å‡ºã€‚" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/org.gabmus.gfeeds.desktop.in:16 msgid "rss;reader;feed;news;" msgstr "rss;reader;feed;news;订阅;阅读器;æ–°é—»;阅读;" #: gfeeds/feed_item.py:49 #, python-brace-format msgid "Error: unable to parse datetime {0} for feeditem {1}" msgstr "错误:无法为订阅项目 {1} è§£æžæ—¥æœŸ {0}" #: gfeeds/feed_parser.py:37 #, python-brace-format msgid "Errors while parsing feed `{0}`" msgstr "è§£æžè®¢é˜…“{0}â€æ—¶å‡ºé”™" #: gfeeds/feed_parser.py:55 #, python-brace-format msgid "`{0}` may not be an RSS or Atom feed" msgstr "“{0}â€å¯èƒ½ä¸æ˜¯ RSS 或 Atom 订阅" #: gfeeds/feeds_manager.py:88 #, python-brace-format msgid "Feed {0} exists already, skipping" msgstr "订阅 {0} 已存在,正在跳过" #: gfeeds/feeds_view.py:13 msgid "All feeds" msgstr "所有订阅" #: gfeeds/headerbar.py:184 msgid "" "There were problems with some feeds.\n" "Do you want to remove them?" msgstr "" "一些订阅存在问题。\n" "您想è¦ç§»é™¤å®ƒä»¬å—?" #: gfeeds/main_leaflet.py:119 #, python-brace-format msgid "{0} new article" msgid_plural "{0} new articles" msgstr[0] "{0} 篇新文章" #: gfeeds/__main__.py:229 msgid "Do you want to import these feeds?" msgstr "您想è¦å¯¼å…¥è¿™äº›è®¢é˜…å—?" #: gfeeds/__main__.py:256 msgid "Do you want to import this feed?" msgstr "您想è¦å¯¼å…¥è¯¥è®¢é˜…å—?" #: gfeeds/__main__.py:285 msgid "url" msgstr "网å€" #: gfeeds/__main__.py:288 msgid "opml file local url or rss remote url to import" msgstr "è¦å¯¼å…¥çš„ opml æ–‡ä»¶æœ¬åœ°åœ°å€æˆ– rss 远程地å€" #: gfeeds/manage_feeds_window.py:263 msgid "Manage Feeds" msgstr "管ç†è®¢é˜…" #: gfeeds/manage_feeds_window.py:318 msgid "Do you want to delete these feeds?" msgstr "您想è¦åˆ é™¤è¿™äº›è®¢é˜…å—?" #: gfeeds/opml_file_chooser.py:7 msgid "XML files" msgstr "XML 文件" #: gfeeds/opml_file_chooser.py:14 msgid "Choose an OPML file to import" msgstr "选择 OPML 文件æ¥å¯¼å…¥" #: gfeeds/opml_file_chooser.py:18 msgid "Open" msgstr "打开" #: gfeeds/opml_file_chooser.py:19 gfeeds/opml_file_chooser.py:31 msgid "Cancel" msgstr "å–æ¶ˆ" #: gfeeds/opml_file_chooser.py:26 msgid "Choose where to save the exported OPML file" msgstr "选择ä¿å­˜å¯¼å‡ºçš„ OPML 文件的ä½ç½®" #: gfeeds/opml_file_chooser.py:30 msgid "Save" msgstr "ä¿å­˜" #: gfeeds/opml_manager.py:42 msgid "Error: OPML path provided does not exist" msgstr "错误:指定的 OPML 路径ä¸å­˜åœ¨" #: gfeeds/opml_manager.py:53 #, python-brace-format msgid "Error parsing OPML file `{0}`" msgstr "è§£æž OPML 文件“{0}â€æ—¶å‡ºé”™" #: gfeeds/preferences_window.py:22 msgid "General" msgstr "常规" #: gfeeds/preferences_window.py:25 msgid "General preferences" msgstr "常规首选项" #: gfeeds/preferences_window.py:27 msgid "Show newer articles first" msgstr "优先显示新文章" #: gfeeds/preferences_window.py:32 msgid "Open links in your browser" msgstr "在您的æµè§ˆå™¨ä¸­æ‰“开链接" #: gfeeds/preferences_window.py:36 msgid "Use external video player for YouTube" msgstr "为 YouTube 使用外置视频播放器" #: gfeeds/preferences_window.py:38 msgid "Requires youtube-dl and a compatible video player" msgstr "éœ€è¦ youtube-dl 和兼容的视频播放器" #: gfeeds/preferences_window.py:44 msgid "Preferred video player" msgstr "首选视频播放器" #: gfeeds/preferences_window.py:48 msgid "Maximum article age" msgstr "最大文章日期" #: gfeeds/preferences_window.py:49 msgid "In days" msgstr "å•ä½å¤©" #: gfeeds/preferences_window.py:56 msgid "Refresh preferences" msgstr "刷新首选项" #: gfeeds/preferences_window.py:58 msgid "Refresh articles on startup" msgstr "å¯åŠ¨æ—¶åˆ·æ–°æ–‡ç« " #: gfeeds/preferences_window.py:62 msgid "New articles notification" msgstr "新文章æé†’" #: gfeeds/preferences_window.py:66 msgid "Enable auto-refresh" msgstr "å¯ç”¨è‡ªåŠ¨åˆ·æ–°" #: gfeeds/preferences_window.py:70 msgid "Auto-refresh interval" msgstr "自动刷新间隔" #: gfeeds/preferences_window.py:71 msgid "In seconds" msgstr "å•ä½ç§’" #: gfeeds/preferences_window.py:78 msgid "Cache" msgstr "缓存" #: gfeeds/preferences_window.py:80 msgid "Clear caches" msgstr "清空缓存" #: gfeeds/preferences_window.py:81 msgid "Clear" msgstr "清空" #: gfeeds/preferences_window.py:109 msgid "Appearance" msgstr "外观" #: gfeeds/preferences_window.py:112 msgid "Appearance preferences" msgstr "外观首选项" #: gfeeds/preferences_window.py:114 msgid "Dark mode" msgstr "暗色模å¼" #: gfeeds/preferences_window.py:118 msgid "Reader mode theme" msgstr "阅读模å¼ä¸»é¢˜" #: gfeeds/preferences_window.py:122 msgid "Automatic" msgstr "自动" #: gfeeds/preferences_window.py:122 msgid "Light" msgstr "亮色" #: gfeeds/preferences_window.py:122 msgid "Dark" msgstr "暗色" #: gfeeds/preferences_window.py:126 msgid "Show article thumbnails" msgstr "显示文章缩略图" #: gfeeds/preferences_window.py:131 msgid "Show full articles titles" msgstr "显示完整文章标题" #: gfeeds/preferences_window.py:136 msgid "Show full feeds names" msgstr "显示完整订阅åç§°" #: gfeeds/preferences_window.py:143 msgid "Font preferences" msgstr "字体首选项" #: gfeeds/preferences_window.py:145 msgid "Use system font for titles" msgstr "为标题使用系统字体" #: gfeeds/preferences_window.py:149 msgid "Use system font for paragraphs" msgstr "为段è½ä½¿ç”¨ç³»ç»Ÿå­—体" #: gfeeds/preferences_window.py:153 msgid "Custom title font" msgstr "自定义标题字体" #: gfeeds/preferences_window.py:157 msgid "Custom paragraph font" msgstr "自定义段è½å­—体" #: gfeeds/preferences_window.py:161 msgid "Custom monospace font" msgstr "自定义等宽字体" #: gfeeds/preferences_window.py:173 msgid "Privacy" msgstr "éšç§" #: gfeeds/preferences_window.py:176 msgid "Privacy preferences" msgstr "éšç§é¦–选项" #: gfeeds/preferences_window.py:178 msgid "Enable JavaScript" msgstr "å¯ç”¨ JavaScript" #: gfeeds/preferences_window.py:183 msgid "Try to block advertisements" msgstr "å°è¯•拦截广告" #: gfeeds/preferences_window.py:185 gfeeds/preferences_window.py:220 msgid "Requires app restart" msgstr "需è¦é‡å¯åº”用" #: gfeeds/preferences_window.py:189 msgid "Update advertisement blocking list" msgstr "更新广告拦截列表" #: gfeeds/preferences_window.py:190 msgid "Updates automatically every 10 days" msgstr "è‡ªåŠ¨æ¯ 10 天更新" #: gfeeds/preferences_window.py:191 msgid "Update" msgstr "æ›´æ–°" #: gfeeds/preferences_window.py:204 msgid "Advanced" msgstr "高级" #: gfeeds/preferences_window.py:207 msgid "Advanced preferences" msgstr "高级首选项" #: gfeeds/preferences_window.py:209 msgid "Maximum refresh threads" msgstr "最大刷新线程" #: gfeeds/preferences_window.py:211 msgid "How many threads to use for feeds refresh" msgstr "订阅刷新时使用多少线程" #: gfeeds/preferences_window.py:218 msgid "Experimental GtkListView for articles list" msgstr "为文章列表试用 GtkListView" #: gfeeds/sidebar.py:21 msgid "Loading feeds..." msgstr "正在加载订阅……" #: gfeeds/sidebar_row_popover.py:31 gfeeds/sidebar_row_popover.py:58 msgid "Mark as unread" msgstr "标记为未阅" #: gfeeds/sidebar_row_popover.py:38 gfeeds/sidebar_row_popover.py:50 msgid "Mark as read" msgstr "标记为已阅" #: gfeeds/util/download_manager.py:96 #, python-brace-format msgid "`{0}`: connection timed out" msgstr "“{0}â€ï¼šè¿žæŽ¥è¶…æ—¶" #: gfeeds/util/download_manager.py:105 #, python-brace-format msgid "`{0}` might not be a valid address" msgstr "“{0}â€å¯èƒ½ä¸æ˜¯æœ‰æ•ˆåœ°å€" #: gfeeds/util/download_manager.py:144 #, python-brace-format msgid "Error downloading `{0}`, code `{1}`" msgstr "下载“{0}â€æ—¶å‡ºé”™ï¼Œä»£ç â€œ{1}â€" #: gfeeds/util/get_favicon.py:53 #, python-brace-format msgid "Error downloading favicon for `{0}`" msgstr "为“{0}â€ä¸‹è½½ç½‘站图标时出错" #: gfeeds/webview.py:201 msgid "Link copied to clipboard!" msgstr "链接已å¤åˆ¶åˆ°å‰ªè´´æ¿ï¼" #: gfeeds/webview.py:223 msgid "Feed content not available for this article" msgstr "该文章无å¯ç”¨è®¢é˜…目录" #~ msgid "Web View" #~ msgstr "网页视图" #~| msgid "RSS Content" #~ msgid "Feed Content" #~ msgstr "订阅目录" #~ msgid "Choose a folder" #~ msgstr "选择文件夹" #~ msgid "Use dark theme for reader mode" #~ msgstr "为阅读模å¼ä½¿ç”¨æš—色模å¼" #~ msgid "Maximum thumbnail height" #~ msgstr "最大缩略图高度" #~ msgid "There are some errors" #~ msgstr "å‘生了一些错误" #~ msgid "Show" #~ msgstr "显示" #~ msgid "Ignore" #~ msgstr "忽略" #~ msgid "There were problems with some feeds. Do you want to remove them?" #~ msgstr "一些订阅存在问题。您想è¦ç§»é™¤å®ƒä»¬å—?" #~ msgid "You are offline" #~ msgstr "您已离线" gfeeds-2.2.0/poetry.lock000066400000000000000000001413271440757451400151670ustar00rootroot00000000000000# This file is automatically @generated by Poetry 1.4.0 and should not be changed by hand. [[package]] name = "attrs" version = "22.2.0" description = "Classes Without Boilerplate" category = "main" optional = false python-versions = ">=3.6" files = [ {file = "attrs-22.2.0-py3-none-any.whl", hash = "sha256:29e95c7f6778868dbd49170f98f8818f78f3dc5e0e37c0b1f474e3561b240836"}, {file = "attrs-22.2.0.tar.gz", hash = "sha256:c9227bfc2f01993c03f68db37d1d15c9690188323c067c641f1a35ca58185f99"}, ] [package.extras] cov = ["attrs[tests]", "coverage-enable-subprocess", "coverage[toml] (>=5.3)"] dev = ["attrs[docs,tests]"] docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope.interface"] tests = ["attrs[tests-no-zope]", "zope.interface"] tests-no-zope = ["cloudpickle", "cloudpickle", "hypothesis", "hypothesis", "mypy (>=0.971,<0.990)", "mypy (>=0.971,<0.990)", "pympler", "pympler", "pytest (>=4.3.0)", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-mypy-plugins", "pytest-xdist[psutil]", "pytest-xdist[psutil]"] [[package]] name = "beautifulsoup4" version = "4.12.0" description = "Screen-scraping library" category = "main" optional = false python-versions = ">=3.6.0" files = [ {file = "beautifulsoup4-4.12.0-py3-none-any.whl", hash = "sha256:2130a5ad7f513200fae61a17abb5e338ca980fa28c439c0571014bc0217e9591"}, {file = "beautifulsoup4-4.12.0.tar.gz", hash = "sha256:c5fceeaec29d09c84970e47c65f2f0efe57872f7cff494c9691a26ec0ff13234"}, ] [package.dependencies] soupsieve = ">1.2" [package.extras] html5lib = ["html5lib"] lxml = ["lxml"] [[package]] name = "certifi" version = "2022.12.7" description = "Python package for providing Mozilla's CA Bundle." category = "main" optional = false python-versions = ">=3.6" files = [ {file = "certifi-2022.12.7-py3-none-any.whl", hash = "sha256:4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18"}, {file = "certifi-2022.12.7.tar.gz", hash = "sha256:35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3"}, ] [[package]] name = "chardet" version = "5.1.0" description = "Universal encoding detector for Python 3" category = "main" optional = false python-versions = ">=3.7" files = [ {file = "chardet-5.1.0-py3-none-any.whl", hash = "sha256:362777fb014af596ad31334fde1e8c327dfdb076e1960d1694662d46a6917ab9"}, {file = "chardet-5.1.0.tar.gz", hash = "sha256:0d62712b956bc154f85fb0a266e2a3c5913c2967e00348701b32411d6def31e5"}, ] [[package]] name = "charset-normalizer" version = "3.1.0" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." category = "main" optional = false python-versions = ">=3.7.0" files = [ {file = "charset-normalizer-3.1.0.tar.gz", hash = "sha256:34e0a2f9c370eb95597aae63bf85eb5e96826d81e3dcf88b8886012906f509b5"}, {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e0ac8959c929593fee38da1c2b64ee9778733cdf03c482c9ff1d508b6b593b2b"}, {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d7fc3fca01da18fbabe4625d64bb612b533533ed10045a2ac3dd194bfa656b60"}, {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:04eefcee095f58eaabe6dc3cc2262f3bcd776d2c67005880894f447b3f2cb9c1"}, {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20064ead0717cf9a73a6d1e779b23d149b53daf971169289ed2ed43a71e8d3b0"}, {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1435ae15108b1cb6fffbcea2af3d468683b7afed0169ad718451f8db5d1aff6f"}, {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c84132a54c750fda57729d1e2599bb598f5fa0344085dbde5003ba429a4798c0"}, {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75f2568b4189dda1c567339b48cba4ac7384accb9c2a7ed655cd86b04055c795"}, {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11d3bcb7be35e7b1bba2c23beedac81ee893ac9871d0ba79effc7fc01167db6c"}, {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:891cf9b48776b5c61c700b55a598621fdb7b1e301a550365571e9624f270c203"}, {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:5f008525e02908b20e04707a4f704cd286d94718f48bb33edddc7d7b584dddc1"}, {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:b06f0d3bf045158d2fb8837c5785fe9ff9b8c93358be64461a1089f5da983137"}, {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:49919f8400b5e49e961f320c735388ee686a62327e773fa5b3ce6721f7e785ce"}, {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:22908891a380d50738e1f978667536f6c6b526a2064156203d418f4856d6e86a"}, {file = "charset_normalizer-3.1.0-cp310-cp310-win32.whl", hash = "sha256:12d1a39aa6b8c6f6248bb54550efcc1c38ce0d8096a146638fd4738e42284448"}, {file = "charset_normalizer-3.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:65ed923f84a6844de5fd29726b888e58c62820e0769b76565480e1fdc3d062f8"}, {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9a3267620866c9d17b959a84dd0bd2d45719b817245e49371ead79ed4f710d19"}, {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6734e606355834f13445b6adc38b53c0fd45f1a56a9ba06c2058f86893ae8017"}, {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f8303414c7b03f794347ad062c0516cee0e15f7a612abd0ce1e25caf6ceb47df"}, {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf53a6cebad0eae578f062c7d462155eada9c172bd8c4d250b8c1d8eb7f916a"}, {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3dc5b6a8ecfdc5748a7e429782598e4f17ef378e3e272eeb1340ea57c9109f41"}, {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e1b25e3ad6c909f398df8921780d6a3d120d8c09466720226fc621605b6f92b1"}, {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ca564606d2caafb0abe6d1b5311c2649e8071eb241b2d64e75a0d0065107e62"}, {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b82fab78e0b1329e183a65260581de4375f619167478dddab510c6c6fb04d9b6"}, {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bd7163182133c0c7701b25e604cf1611c0d87712e56e88e7ee5d72deab3e76b5"}, {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:11d117e6c63e8f495412d37e7dc2e2fff09c34b2d09dbe2bee3c6229577818be"}, {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:cf6511efa4801b9b38dc5546d7547d5b5c6ef4b081c60b23e4d941d0eba9cbeb"}, {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:abc1185d79f47c0a7aaf7e2412a0eb2c03b724581139193d2d82b3ad8cbb00ac"}, {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cb7b2ab0188829593b9de646545175547a70d9a6e2b63bf2cd87a0a391599324"}, {file = "charset_normalizer-3.1.0-cp311-cp311-win32.whl", hash = "sha256:c36bcbc0d5174a80d6cccf43a0ecaca44e81d25be4b7f90f0ed7bcfbb5a00909"}, {file = "charset_normalizer-3.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:cca4def576f47a09a943666b8f829606bcb17e2bc2d5911a46c8f8da45f56755"}, {file = "charset_normalizer-3.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0c95f12b74681e9ae127728f7e5409cbbef9cd914d5896ef238cc779b8152373"}, {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fca62a8301b605b954ad2e9c3666f9d97f63872aa4efcae5492baca2056b74ab"}, {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac0aa6cd53ab9a31d397f8303f92c42f534693528fafbdb997c82bae6e477ad9"}, {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3af8e0f07399d3176b179f2e2634c3ce9c1301379a6b8c9c9aeecd481da494f"}, {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a5fc78f9e3f501a1614a98f7c54d3969f3ad9bba8ba3d9b438c3bc5d047dd28"}, {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:628c985afb2c7d27a4800bfb609e03985aaecb42f955049957814e0491d4006d"}, {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:74db0052d985cf37fa111828d0dd230776ac99c740e1a758ad99094be4f1803d"}, {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1e8fcdd8f672a1c4fc8d0bd3a2b576b152d2a349782d1eb0f6b8e52e9954731d"}, {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:04afa6387e2b282cf78ff3dbce20f0cc071c12dc8f685bd40960cc68644cfea6"}, {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:dd5653e67b149503c68c4018bf07e42eeed6b4e956b24c00ccdf93ac79cdff84"}, {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d2686f91611f9e17f4548dbf050e75b079bbc2a82be565832bc8ea9047b61c8c"}, {file = "charset_normalizer-3.1.0-cp37-cp37m-win32.whl", hash = "sha256:4155b51ae05ed47199dc5b2a4e62abccb274cee6b01da5b895099b61b1982974"}, {file = "charset_normalizer-3.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:322102cdf1ab682ecc7d9b1c5eed4ec59657a65e1c146a0da342b78f4112db23"}, {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e633940f28c1e913615fd624fcdd72fdba807bf53ea6925d6a588e84e1151531"}, {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3a06f32c9634a8705f4ca9946d667609f52cf130d5548881401f1eb2c39b1e2c"}, {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7381c66e0561c5757ffe616af869b916c8b4e42b367ab29fedc98481d1e74e14"}, {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3573d376454d956553c356df45bb824262c397c6e26ce43e8203c4c540ee0acb"}, {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e89df2958e5159b811af9ff0f92614dabf4ff617c03a4c1c6ff53bf1c399e0e1"}, {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:78cacd03e79d009d95635e7d6ff12c21eb89b894c354bd2b2ed0b4763373693b"}, {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de5695a6f1d8340b12a5d6d4484290ee74d61e467c39ff03b39e30df62cf83a0"}, {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c60b9c202d00052183c9be85e5eaf18a4ada0a47d188a83c8f5c5b23252f649"}, {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f645caaf0008bacf349875a974220f1f1da349c5dbe7c4ec93048cdc785a3326"}, {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ea9f9c6034ea2d93d9147818f17c2a0860d41b71c38b9ce4d55f21b6f9165a11"}, {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:80d1543d58bd3d6c271b66abf454d437a438dff01c3e62fdbcd68f2a11310d4b"}, {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:73dc03a6a7e30b7edc5b01b601e53e7fc924b04e1835e8e407c12c037e81adbd"}, {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6f5c2e7bc8a4bf7c426599765b1bd33217ec84023033672c1e9a8b35eaeaaaf8"}, {file = "charset_normalizer-3.1.0-cp38-cp38-win32.whl", hash = "sha256:12a2b561af122e3d94cdb97fe6fb2bb2b82cef0cdca131646fdb940a1eda04f0"}, {file = "charset_normalizer-3.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:3160a0fd9754aab7d47f95a6b63ab355388d890163eb03b2d2b87ab0a30cfa59"}, {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:38e812a197bf8e71a59fe55b757a84c1f946d0ac114acafaafaf21667a7e169e"}, {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6baf0baf0d5d265fa7944feb9f7451cc316bfe30e8df1a61b1bb08577c554f31"}, {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8f25e17ab3039b05f762b0a55ae0b3632b2e073d9c8fc88e89aca31a6198e88f"}, {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3747443b6a904001473370d7810aa19c3a180ccd52a7157aacc264a5ac79265e"}, {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b116502087ce8a6b7a5f1814568ccbd0e9f6cfd99948aa59b0e241dc57cf739f"}, {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d16fd5252f883eb074ca55cb622bc0bee49b979ae4e8639fff6ca3ff44f9f854"}, {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fa558996782fc226b529fdd2ed7866c2c6ec91cee82735c98a197fae39f706"}, {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6f6c7a8a57e9405cad7485f4c9d3172ae486cfef1344b5ddd8e5239582d7355e"}, {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ac3775e3311661d4adace3697a52ac0bab17edd166087d493b52d4f4f553f9f0"}, {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:10c93628d7497c81686e8e5e557aafa78f230cd9e77dd0c40032ef90c18f2230"}, {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:6f4f4668e1831850ebcc2fd0b1cd11721947b6dc7c00bf1c6bd3c929ae14f2c7"}, {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:0be65ccf618c1e7ac9b849c315cc2e8a8751d9cfdaa43027d4f6624bd587ab7e"}, {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:53d0a3fa5f8af98a1e261de6a3943ca631c526635eb5817a87a59d9a57ebf48f"}, {file = "charset_normalizer-3.1.0-cp39-cp39-win32.whl", hash = "sha256:a04f86f41a8916fe45ac5024ec477f41f886b3c435da2d4e3d2709b22ab02af1"}, {file = "charset_normalizer-3.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:830d2948a5ec37c386d3170c483063798d7879037492540f10a475e3fd6f244b"}, {file = "charset_normalizer-3.1.0-py3-none-any.whl", hash = "sha256:3d9098b479e78c85080c98e1e35ff40b4a31d8953102bb0fd7d1b6f8a2111a3d"}, ] [[package]] name = "colorama" version = "0.4.6" description = "Cross-platform colored terminal text." category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] [[package]] name = "cssselect" version = "1.2.0" description = "cssselect parses CSS3 Selectors and translates them to XPath 1.0" category = "main" optional = false python-versions = ">=3.7" files = [ {file = "cssselect-1.2.0-py2.py3-none-any.whl", hash = "sha256:da1885f0c10b60c03ed5eccbb6b68d6eff248d91976fcde348f395d54c9fd35e"}, {file = "cssselect-1.2.0.tar.gz", hash = "sha256:666b19839cfaddb9ce9d36bfe4c969132c647b92fc9088c4e23f786b30f1b3dc"}, ] [[package]] name = "exceptiongroup" version = "1.1.1" description = "Backport of PEP 654 (exception groups)" category = "main" optional = false python-versions = ">=3.7" files = [ {file = "exceptiongroup-1.1.1-py3-none-any.whl", hash = "sha256:232c37c63e4f682982c8b6459f33a8981039e5fb8756b2074364e5055c498c9e"}, {file = "exceptiongroup-1.1.1.tar.gz", hash = "sha256:d484c3090ba2889ae2928419117447a14daf3c1231d5e30d0aae34f354f01785"}, ] [package.extras] test = ["pytest (>=6)"] [[package]] name = "humanize" version = "4.6.0" description = "Python humanize utilities" category = "main" optional = false python-versions = ">=3.7" files = [ {file = "humanize-4.6.0-py3-none-any.whl", hash = "sha256:401201aca462749773f02920139f302450cb548b70489b9b4b92be39fe3c3c50"}, {file = "humanize-4.6.0.tar.gz", hash = "sha256:5f1f22bc65911eb1a6ffe7659bd6598e33dcfeeb904eb16ee1e705a09bf75916"}, ] [package.extras] tests = ["freezegun", "pytest", "pytest-cov"] [[package]] name = "idna" version = "3.4" description = "Internationalized Domain Names in Applications (IDNA)" category = "main" optional = false python-versions = ">=3.5" files = [ {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, ] [[package]] name = "iniconfig" version = "2.0.0" description = "brain-dead simple config-ini parsing" category = "main" optional = false python-versions = ">=3.7" files = [ {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, ] [[package]] name = "lxml" version = "4.9.2" description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, != 3.4.*" files = [ {file = "lxml-4.9.2-cp27-cp27m-macosx_10_15_x86_64.whl", hash = "sha256:76cf573e5a365e790396a5cc2b909812633409306c6531a6877c59061e42c4f2"}, {file = "lxml-4.9.2-cp27-cp27m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b1f42b6921d0e81b1bcb5e395bc091a70f41c4d4e55ba99c6da2b31626c44892"}, {file = "lxml-4.9.2-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:9f102706d0ca011de571de32c3247c6476b55bb6bc65a20f682f000b07a4852a"}, {file = "lxml-4.9.2-cp27-cp27m-win32.whl", hash = "sha256:8d0b4612b66ff5d62d03bcaa043bb018f74dfea51184e53f067e6fdcba4bd8de"}, {file = "lxml-4.9.2-cp27-cp27m-win_amd64.whl", hash = "sha256:4c8f293f14abc8fd3e8e01c5bd86e6ed0b6ef71936ded5bf10fe7a5efefbaca3"}, {file = "lxml-4.9.2-cp27-cp27mu-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2899456259589aa38bfb018c364d6ae7b53c5c22d8e27d0ec7609c2a1ff78b50"}, {file = "lxml-4.9.2-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6749649eecd6a9871cae297bffa4ee76f90b4504a2a2ab528d9ebe912b101975"}, {file = "lxml-4.9.2-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:a08cff61517ee26cb56f1e949cca38caabe9ea9fbb4b1e10a805dc39844b7d5c"}, {file = "lxml-4.9.2-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:85cabf64adec449132e55616e7ca3e1000ab449d1d0f9d7f83146ed5bdcb6d8a"}, {file = "lxml-4.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:8340225bd5e7a701c0fa98284c849c9b9fc9238abf53a0ebd90900f25d39a4e4"}, {file = "lxml-4.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:1ab8f1f932e8f82355e75dda5413a57612c6ea448069d4fb2e217e9a4bed13d4"}, {file = "lxml-4.9.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:699a9af7dffaf67deeae27b2112aa06b41c370d5e7633e0ee0aea2e0b6c211f7"}, {file = "lxml-4.9.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b9cc34af337a97d470040f99ba4282f6e6bac88407d021688a5d585e44a23184"}, {file = "lxml-4.9.2-cp310-cp310-win32.whl", hash = "sha256:d02a5399126a53492415d4906ab0ad0375a5456cc05c3fc0fc4ca11771745cda"}, {file = "lxml-4.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:a38486985ca49cfa574a507e7a2215c0c780fd1778bb6290c21193b7211702ab"}, {file = "lxml-4.9.2-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:c83203addf554215463b59f6399835201999b5e48019dc17f182ed5ad87205c9"}, {file = "lxml-4.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:2a87fa548561d2f4643c99cd13131acb607ddabb70682dcf1dff5f71f781a4bf"}, {file = "lxml-4.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:d6b430a9938a5a5d85fc107d852262ddcd48602c120e3dbb02137c83d212b380"}, {file = "lxml-4.9.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3efea981d956a6f7173b4659849f55081867cf897e719f57383698af6f618a92"}, {file = "lxml-4.9.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:df0623dcf9668ad0445e0558a21211d4e9a149ea8f5666917c8eeec515f0a6d1"}, {file = "lxml-4.9.2-cp311-cp311-win32.whl", hash = "sha256:da248f93f0418a9e9d94b0080d7ebc407a9a5e6d0b57bb30db9b5cc28de1ad33"}, {file = "lxml-4.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:3818b8e2c4b5148567e1b09ce739006acfaa44ce3156f8cbbc11062994b8e8dd"}, {file = "lxml-4.9.2-cp35-cp35m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ca989b91cf3a3ba28930a9fc1e9aeafc2a395448641df1f387a2d394638943b0"}, {file = "lxml-4.9.2-cp35-cp35m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:822068f85e12a6e292803e112ab876bc03ed1f03dddb80154c395f891ca6b31e"}, {file = "lxml-4.9.2-cp35-cp35m-win32.whl", hash = "sha256:be7292c55101e22f2a3d4d8913944cbea71eea90792bf914add27454a13905df"}, {file = "lxml-4.9.2-cp35-cp35m-win_amd64.whl", hash = "sha256:998c7c41910666d2976928c38ea96a70d1aa43be6fe502f21a651e17483a43c5"}, {file = "lxml-4.9.2-cp36-cp36m-macosx_10_15_x86_64.whl", hash = "sha256:b26a29f0b7fc6f0897f043ca366142d2b609dc60756ee6e4e90b5f762c6adc53"}, {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:ab323679b8b3030000f2be63e22cdeea5b47ee0abd2d6a1dc0c8103ddaa56cd7"}, {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:689bb688a1db722485e4610a503e3e9210dcc20c520b45ac8f7533c837be76fe"}, {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:f49e52d174375a7def9915c9f06ec4e569d235ad428f70751765f48d5926678c"}, {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:36c3c175d34652a35475a73762b545f4527aec044910a651d2bf50de9c3352b1"}, {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a35f8b7fa99f90dd2f5dc5a9fa12332642f087a7641289ca6c40d6e1a2637d8e"}, {file = "lxml-4.9.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:58bfa3aa19ca4c0f28c5dde0ff56c520fbac6f0daf4fac66ed4c8d2fb7f22e74"}, {file = "lxml-4.9.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:bc718cd47b765e790eecb74d044cc8d37d58562f6c314ee9484df26276d36a38"}, {file = "lxml-4.9.2-cp36-cp36m-win32.whl", hash = "sha256:d5bf6545cd27aaa8a13033ce56354ed9e25ab0e4ac3b5392b763d8d04b08e0c5"}, {file = "lxml-4.9.2-cp36-cp36m-win_amd64.whl", hash = "sha256:3ab9fa9d6dc2a7f29d7affdf3edebf6ece6fb28a6d80b14c3b2fb9d39b9322c3"}, {file = "lxml-4.9.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:05ca3f6abf5cf78fe053da9b1166e062ade3fa5d4f92b4ed688127ea7d7b1d03"}, {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:a5da296eb617d18e497bcf0a5c528f5d3b18dadb3619fbdadf4ed2356ef8d941"}, {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:04876580c050a8c5341d706dd464ff04fd597095cc8c023252566a8826505726"}, {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:c9ec3eaf616d67db0764b3bb983962b4f385a1f08304fd30c7283954e6a7869b"}, {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2a29ba94d065945944016b6b74e538bdb1751a1db6ffb80c9d3c2e40d6fa9894"}, {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a82d05da00a58b8e4c0008edbc8a4b6ec5a4bc1e2ee0fb6ed157cf634ed7fa45"}, {file = "lxml-4.9.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:223f4232855ade399bd409331e6ca70fb5578efef22cf4069a6090acc0f53c0e"}, {file = "lxml-4.9.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d17bc7c2ccf49c478c5bdd447594e82692c74222698cfc9b5daae7ae7e90743b"}, {file = "lxml-4.9.2-cp37-cp37m-win32.whl", hash = "sha256:b64d891da92e232c36976c80ed7ebb383e3f148489796d8d31a5b6a677825efe"}, {file = "lxml-4.9.2-cp37-cp37m-win_amd64.whl", hash = "sha256:a0a336d6d3e8b234a3aae3c674873d8f0e720b76bc1d9416866c41cd9500ffb9"}, {file = "lxml-4.9.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:da4dd7c9c50c059aba52b3524f84d7de956f7fef88f0bafcf4ad7dde94a064e8"}, {file = "lxml-4.9.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:821b7f59b99551c69c85a6039c65b75f5683bdc63270fec660f75da67469ca24"}, {file = "lxml-4.9.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:e5168986b90a8d1f2f9dc1b841467c74221bd752537b99761a93d2d981e04889"}, {file = "lxml-4.9.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:8e20cb5a47247e383cf4ff523205060991021233ebd6f924bca927fcf25cf86f"}, {file = "lxml-4.9.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:13598ecfbd2e86ea7ae45ec28a2a54fb87ee9b9fdb0f6d343297d8e548392c03"}, {file = "lxml-4.9.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:880bbbcbe2fca64e2f4d8e04db47bcdf504936fa2b33933efd945e1b429bea8c"}, {file = "lxml-4.9.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:7d2278d59425777cfcb19735018d897ca8303abe67cc735f9f97177ceff8027f"}, {file = "lxml-4.9.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5344a43228767f53a9df6e5b253f8cdca7dfc7b7aeae52551958192f56d98457"}, {file = "lxml-4.9.2-cp38-cp38-win32.whl", hash = "sha256:925073b2fe14ab9b87e73f9a5fde6ce6392da430f3004d8b72cc86f746f5163b"}, {file = "lxml-4.9.2-cp38-cp38-win_amd64.whl", hash = "sha256:9b22c5c66f67ae00c0199f6055705bc3eb3fcb08d03d2ec4059a2b1b25ed48d7"}, {file = "lxml-4.9.2-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:5f50a1c177e2fa3ee0667a5ab79fdc6b23086bc8b589d90b93b4bd17eb0e64d1"}, {file = "lxml-4.9.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:090c6543d3696cbe15b4ac6e175e576bcc3f1ccfbba970061b7300b0c15a2140"}, {file = "lxml-4.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:63da2ccc0857c311d764e7d3d90f429c252e83b52d1f8f1d1fe55be26827d1f4"}, {file = "lxml-4.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:5b4545b8a40478183ac06c073e81a5ce4cf01bf1734962577cf2bb569a5b3bbf"}, {file = "lxml-4.9.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2e430cd2824f05f2d4f687701144556646bae8f249fd60aa1e4c768ba7018947"}, {file = "lxml-4.9.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6804daeb7ef69e7b36f76caddb85cccd63d0c56dedb47555d2fc969e2af6a1a5"}, {file = "lxml-4.9.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a6e441a86553c310258aca15d1c05903aaf4965b23f3bc2d55f200804e005ee5"}, {file = "lxml-4.9.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ca34efc80a29351897e18888c71c6aca4a359247c87e0b1c7ada14f0ab0c0fb2"}, {file = "lxml-4.9.2-cp39-cp39-win32.whl", hash = "sha256:6b418afe5df18233fc6b6093deb82a32895b6bb0b1155c2cdb05203f583053f1"}, {file = "lxml-4.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:f1496ea22ca2c830cbcbd473de8f114a320da308438ae65abad6bab7867fe38f"}, {file = "lxml-4.9.2-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:b264171e3143d842ded311b7dccd46ff9ef34247129ff5bf5066123c55c2431c"}, {file = "lxml-4.9.2-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:0dc313ef231edf866912e9d8f5a042ddab56c752619e92dfd3a2c277e6a7299a"}, {file = "lxml-4.9.2-pp38-pypy38_pp73-macosx_10_15_x86_64.whl", hash = "sha256:16efd54337136e8cd72fb9485c368d91d77a47ee2d42b057564aae201257d419"}, {file = "lxml-4.9.2-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:0f2b1e0d79180f344ff9f321327b005ca043a50ece8713de61d1cb383fb8ac05"}, {file = "lxml-4.9.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:7b770ed79542ed52c519119473898198761d78beb24b107acf3ad65deae61f1f"}, {file = "lxml-4.9.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:efa29c2fe6b4fdd32e8ef81c1528506895eca86e1d8c4657fda04c9b3786ddf9"}, {file = "lxml-4.9.2-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7e91ee82f4199af8c43d8158024cbdff3d931df350252288f0d4ce656df7f3b5"}, {file = "lxml-4.9.2-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:b23e19989c355ca854276178a0463951a653309fb8e57ce674497f2d9f208746"}, {file = "lxml-4.9.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:01d36c05f4afb8f7c20fd9ed5badca32a2029b93b1750f571ccc0b142531caf7"}, {file = "lxml-4.9.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7b515674acfdcadb0eb5d00d8a709868173acece5cb0be3dd165950cbfdf5409"}, {file = "lxml-4.9.2.tar.gz", hash = "sha256:2455cfaeb7ac70338b3257f41e21f0724f4b5b0c0e7702da67ee6c3640835b67"}, ] [package.extras] cssselect = ["cssselect (>=0.7)"] html5 = ["html5lib"] htmlsoup = ["BeautifulSoup4"] source = ["Cython (>=0.29.7)"] [[package]] name = "packaging" version = "23.0" description = "Core utilities for Python packages" category = "main" optional = false python-versions = ">=3.7" files = [ {file = "packaging-23.0-py3-none-any.whl", hash = "sha256:714ac14496c3e68c99c29b00845f7a2b85f3bb6f1078fd9f72fd20f0570002b2"}, {file = "packaging-23.0.tar.gz", hash = "sha256:b6ad297f8907de0fa2fe1ccbd26fdaf387f5f47c7275fedf8cce89f99446cf97"}, ] [[package]] name = "pillow" version = "9.4.0" description = "Python Imaging Library (Fork)" category = "main" optional = false python-versions = ">=3.7" files = [ {file = "Pillow-9.4.0-1-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:1b4b4e9dda4f4e4c4e6896f93e84a8f0bcca3b059de9ddf67dac3c334b1195e1"}, {file = "Pillow-9.4.0-1-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:fb5c1ad6bad98c57482236a21bf985ab0ef42bd51f7ad4e4538e89a997624e12"}, {file = "Pillow-9.4.0-1-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:f0caf4a5dcf610d96c3bd32932bfac8aee61c96e60481c2a0ea58da435e25acd"}, {file = "Pillow-9.4.0-1-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:3f4cc516e0b264c8d4ccd6b6cbc69a07c6d582d8337df79be1e15a5056b258c9"}, {file = "Pillow-9.4.0-1-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:b8c2f6eb0df979ee99433d8b3f6d193d9590f735cf12274c108bd954e30ca858"}, {file = "Pillow-9.4.0-1-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:b70756ec9417c34e097f987b4d8c510975216ad26ba6e57ccb53bc758f490dab"}, {file = "Pillow-9.4.0-1-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:43521ce2c4b865d385e78579a082b6ad1166ebed2b1a2293c3be1d68dd7ca3b9"}, {file = "Pillow-9.4.0-2-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:9d9a62576b68cd90f7075876f4e8444487db5eeea0e4df3ba298ee38a8d067b0"}, {file = "Pillow-9.4.0-2-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:87708d78a14d56a990fbf4f9cb350b7d89ee8988705e58e39bdf4d82c149210f"}, {file = "Pillow-9.4.0-2-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:8a2b5874d17e72dfb80d917213abd55d7e1ed2479f38f001f264f7ce7bae757c"}, {file = "Pillow-9.4.0-2-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:83125753a60cfc8c412de5896d10a0a405e0bd88d0470ad82e0869ddf0cb3848"}, {file = "Pillow-9.4.0-2-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:9e5f94742033898bfe84c93c831a6f552bb629448d4072dd312306bab3bd96f1"}, {file = "Pillow-9.4.0-2-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:013016af6b3a12a2f40b704677f8b51f72cb007dac785a9933d5c86a72a7fe33"}, {file = "Pillow-9.4.0-2-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:99d92d148dd03fd19d16175b6d355cc1b01faf80dae93c6c3eb4163709edc0a9"}, {file = "Pillow-9.4.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:2968c58feca624bb6c8502f9564dd187d0e1389964898f5e9e1fbc8533169157"}, {file = "Pillow-9.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c5c1362c14aee73f50143d74389b2c158707b4abce2cb055b7ad37ce60738d47"}, {file = "Pillow-9.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd752c5ff1b4a870b7661234694f24b1d2b9076b8bf337321a814c612665f343"}, {file = "Pillow-9.4.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9a3049a10261d7f2b6514d35bbb7a4dfc3ece4c4de14ef5876c4b7a23a0e566d"}, {file = "Pillow-9.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:16a8df99701f9095bea8a6c4b3197da105df6f74e6176c5b410bc2df2fd29a57"}, {file = "Pillow-9.4.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:94cdff45173b1919350601f82d61365e792895e3c3a3443cf99819e6fbf717a5"}, {file = "Pillow-9.4.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:ed3e4b4e1e6de75fdc16d3259098de7c6571b1a6cc863b1a49e7d3d53e036070"}, {file = "Pillow-9.4.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d5b2f8a31bd43e0f18172d8ac82347c8f37ef3e0b414431157718aa234991b28"}, {file = "Pillow-9.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:09b89ddc95c248ee788328528e6a2996e09eaccddeeb82a5356e92645733be35"}, {file = "Pillow-9.4.0-cp310-cp310-win32.whl", hash = "sha256:f09598b416ba39a8f489c124447b007fe865f786a89dbfa48bb5cf395693132a"}, {file = "Pillow-9.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:f6e78171be3fb7941f9910ea15b4b14ec27725865a73c15277bc39f5ca4f8391"}, {file = "Pillow-9.4.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:3fa1284762aacca6dc97474ee9c16f83990b8eeb6697f2ba17140d54b453e133"}, {file = "Pillow-9.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:eaef5d2de3c7e9b21f1e762f289d17b726c2239a42b11e25446abf82b26ac132"}, {file = "Pillow-9.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a4dfdae195335abb4e89cc9762b2edc524f3c6e80d647a9a81bf81e17e3fb6f0"}, {file = "Pillow-9.4.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6abfb51a82e919e3933eb137e17c4ae9c0475a25508ea88993bb59faf82f3b35"}, {file = "Pillow-9.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:451f10ef963918e65b8869e17d67db5e2f4ab40e716ee6ce7129b0cde2876eab"}, {file = "Pillow-9.4.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:6663977496d616b618b6cfa43ec86e479ee62b942e1da76a2c3daa1c75933ef4"}, {file = "Pillow-9.4.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:60e7da3a3ad1812c128750fc1bc14a7ceeb8d29f77e0a2356a8fb2aa8925287d"}, {file = "Pillow-9.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:19005a8e58b7c1796bc0167862b1f54a64d3b44ee5d48152b06bb861458bc0f8"}, {file = "Pillow-9.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f715c32e774a60a337b2bb8ad9839b4abf75b267a0f18806f6f4f5f1688c4b5a"}, {file = "Pillow-9.4.0-cp311-cp311-win32.whl", hash = "sha256:b222090c455d6d1a64e6b7bb5f4035c4dff479e22455c9eaa1bdd4c75b52c80c"}, {file = "Pillow-9.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:ba6612b6548220ff5e9df85261bddc811a057b0b465a1226b39bfb8550616aee"}, {file = "Pillow-9.4.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:5f532a2ad4d174eb73494e7397988e22bf427f91acc8e6ebf5bb10597b49c493"}, {file = "Pillow-9.4.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5dd5a9c3091a0f414a963d427f920368e2b6a4c2f7527fdd82cde8ef0bc7a327"}, {file = "Pillow-9.4.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef21af928e807f10bf4141cad4746eee692a0dd3ff56cfb25fce076ec3cc8abe"}, {file = "Pillow-9.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:847b114580c5cc9ebaf216dd8c8dbc6b00a3b7ab0131e173d7120e6deade1f57"}, {file = "Pillow-9.4.0-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:653d7fb2df65efefbcbf81ef5fe5e5be931f1ee4332c2893ca638c9b11a409c4"}, {file = "Pillow-9.4.0-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:46f39cab8bbf4a384ba7cb0bc8bae7b7062b6a11cfac1ca4bc144dea90d4a9f5"}, {file = "Pillow-9.4.0-cp37-cp37m-win32.whl", hash = "sha256:7ac7594397698f77bce84382929747130765f66406dc2cd8b4ab4da68ade4c6e"}, {file = "Pillow-9.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:46c259e87199041583658457372a183636ae8cd56dbf3f0755e0f376a7f9d0e6"}, {file = "Pillow-9.4.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:0e51f608da093e5d9038c592b5b575cadc12fd748af1479b5e858045fff955a9"}, {file = "Pillow-9.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:765cb54c0b8724a7c12c55146ae4647e0274a839fb6de7bcba841e04298e1011"}, {file = "Pillow-9.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:519e14e2c49fcf7616d6d2cfc5c70adae95682ae20f0395e9280db85e8d6c4df"}, {file = "Pillow-9.4.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d197df5489004db87d90b918033edbeee0bd6df3848a204bca3ff0a903bef837"}, {file = "Pillow-9.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0845adc64fe9886db00f5ab68c4a8cd933ab749a87747555cec1c95acea64b0b"}, {file = "Pillow-9.4.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:e1339790c083c5a4de48f688b4841f18df839eb3c9584a770cbd818b33e26d5d"}, {file = "Pillow-9.4.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:a96e6e23f2b79433390273eaf8cc94fec9c6370842e577ab10dabdcc7ea0a66b"}, {file = "Pillow-9.4.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:7cfc287da09f9d2a7ec146ee4d72d6ea1342e770d975e49a8621bf54eaa8f30f"}, {file = "Pillow-9.4.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d7081c084ceb58278dd3cf81f836bc818978c0ccc770cbbb202125ddabec6628"}, {file = "Pillow-9.4.0-cp38-cp38-win32.whl", hash = "sha256:df41112ccce5d47770a0c13651479fbcd8793f34232a2dd9faeccb75eb5d0d0d"}, {file = "Pillow-9.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:7a21222644ab69ddd9967cfe6f2bb420b460dae4289c9d40ff9a4896e7c35c9a"}, {file = "Pillow-9.4.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:0f3269304c1a7ce82f1759c12ce731ef9b6e95b6df829dccd9fe42912cc48569"}, {file = "Pillow-9.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cb362e3b0976dc994857391b776ddaa8c13c28a16f80ac6522c23d5257156bed"}, {file = "Pillow-9.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a2e0f87144fcbbe54297cae708c5e7f9da21a4646523456b00cc956bd4c65815"}, {file = "Pillow-9.4.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:28676836c7796805914b76b1837a40f76827ee0d5398f72f7dcc634bae7c6264"}, {file = "Pillow-9.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0884ba7b515163a1a05440a138adeb722b8a6ae2c2b33aea93ea3118dd3a899e"}, {file = "Pillow-9.4.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:53dcb50fbdc3fb2c55431a9b30caeb2f7027fcd2aeb501459464f0214200a503"}, {file = "Pillow-9.4.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:e8c5cf126889a4de385c02a2c3d3aba4b00f70234bfddae82a5eaa3ee6d5e3e6"}, {file = "Pillow-9.4.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:6c6b1389ed66cdd174d040105123a5a1bc91d0aa7059c7261d20e583b6d8cbd2"}, {file = "Pillow-9.4.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0dd4c681b82214b36273c18ca7ee87065a50e013112eea7d78c7a1b89a739153"}, {file = "Pillow-9.4.0-cp39-cp39-win32.whl", hash = "sha256:6d9dfb9959a3b0039ee06c1a1a90dc23bac3b430842dcb97908ddde05870601c"}, {file = "Pillow-9.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:54614444887e0d3043557d9dbc697dbb16cfb5a35d672b7a0fcc1ed0cf1c600b"}, {file = "Pillow-9.4.0-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:b9b752ab91e78234941e44abdecc07f1f0d8f51fb62941d32995b8161f68cfe5"}, {file = "Pillow-9.4.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d3b56206244dc8711f7e8b7d6cad4663917cd5b2d950799425076681e8766286"}, {file = "Pillow-9.4.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aabdab8ec1e7ca7f1434d042bf8b1e92056245fb179790dc97ed040361f16bfd"}, {file = "Pillow-9.4.0-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:db74f5562c09953b2c5f8ec4b7dfd3f5421f31811e97d1dbc0a7c93d6e3a24df"}, {file = "Pillow-9.4.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:e9d7747847c53a16a729b6ee5e737cf170f7a16611c143d95aa60a109a59c336"}, {file = "Pillow-9.4.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:b52ff4f4e002f828ea6483faf4c4e8deea8d743cf801b74910243c58acc6eda3"}, {file = "Pillow-9.4.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:575d8912dca808edd9acd6f7795199332696d3469665ef26163cd090fa1f8bfa"}, {file = "Pillow-9.4.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3c4ed2ff6760e98d262e0cc9c9a7f7b8a9f61aa4d47c58835cdaf7b0b8811bb"}, {file = "Pillow-9.4.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e621b0246192d3b9cb1dc62c78cfa4c6f6d2ddc0ec207d43c0dedecb914f152a"}, {file = "Pillow-9.4.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:8f127e7b028900421cad64f51f75c051b628db17fb00e099eb148761eed598c9"}, {file = "Pillow-9.4.0.tar.gz", hash = "sha256:a1c2d7780448eb93fbcc3789bf3916aa5720d942e37945f4056680317f1cd23e"}, ] [package.extras] docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-issues (>=3.0.1)", "sphinx-removed-in", "sphinxext-opengraph"] tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] [[package]] name = "pluggy" version = "1.0.0" description = "plugin and hook calling mechanisms for python" category = "main" optional = false python-versions = ">=3.6" files = [ {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, ] [package.extras] dev = ["pre-commit", "tox"] testing = ["pytest", "pytest-benchmark"] [[package]] name = "pygments" version = "2.14.0" description = "Pygments is a syntax highlighting package written in Python." category = "main" optional = false python-versions = ">=3.6" files = [ {file = "Pygments-2.14.0-py3-none-any.whl", hash = "sha256:fa7bd7bd2771287c0de303af8bfdfc731f51bd2c6a47ab69d117138893b82717"}, {file = "Pygments-2.14.0.tar.gz", hash = "sha256:b3ed06a9e8ac9a9aae5a6f5dbe78a8a58655d17b43b93c078f094ddc476ae297"}, ] [package.extras] plugins = ["importlib-metadata"] [[package]] name = "pytest" version = "7.2.2" description = "pytest: simple powerful testing with Python" category = "main" optional = false python-versions = ">=3.7" files = [ {file = "pytest-7.2.2-py3-none-any.whl", hash = "sha256:130328f552dcfac0b1cec75c12e3f005619dc5f874f0a06e8ff7263f0ee6225e"}, {file = "pytest-7.2.2.tar.gz", hash = "sha256:c99ab0c73aceb050f68929bc93af19ab6db0558791c6a0715723abe9d0ade9d4"}, ] [package.dependencies] attrs = ">=19.2.0" colorama = {version = "*", markers = "sys_platform == \"win32\""} exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} iniconfig = "*" packaging = "*" pluggy = ">=0.12,<2.0" tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} [package.extras] testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] [[package]] name = "python-dateutil" version = "2.8.2" description = "Extensions to the standard Python datetime module" category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" files = [ {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, ] [package.dependencies] six = ">=1.5" [[package]] name = "python-magic" version = "0.4.27" description = "File type identification using libmagic" category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" files = [ {file = "python-magic-0.4.27.tar.gz", hash = "sha256:c1ba14b08e4a5f5c31a302b7721239695b2f0f058d125bd5ce1ee36b9d9d3c3b"}, {file = "python_magic-0.4.27-py2.py3-none-any.whl", hash = "sha256:c212960ad306f700aa0d01e5d7a325d20548ff97eb9920dcd29513174f0294d3"}, ] [[package]] name = "pytz" version = "2022.7.1" description = "World timezone definitions, modern and historical" category = "main" optional = false python-versions = "*" files = [ {file = "pytz-2022.7.1-py2.py3-none-any.whl", hash = "sha256:78f4f37d8198e0627c5f1143240bb0206b8691d8d7ac6d78fee88b78733f8c4a"}, {file = "pytz-2022.7.1.tar.gz", hash = "sha256:01a0681c4b9684a28304615eba55d1ab31ae00bf68ec157ec3708a8182dbbcd0"}, ] [[package]] name = "readability-lxml" version = "0.8.1" description = "fast html to text parser (article readability tool) with python 3 support" category = "main" optional = false python-versions = "*" files = [ {file = "readability-lxml-0.8.1.tar.gz", hash = "sha256:e51fea56b5909aaf886d307d48e79e096293255afa567b7d08bca94d25b1a4e1"}, {file = "readability_lxml-0.8.1-py3-none-any.whl", hash = "sha256:e0d366a21b1bd6cca17de71a4e6ea16fcfaa8b0a5b4004e39e2c7eff884e6305"}, ] [package.dependencies] chardet = "*" cssselect = "*" lxml = "*" [package.extras] test = ["timeout-decorator"] [[package]] name = "requests" version = "2.28.2" description = "Python HTTP for Humans." category = "main" optional = false python-versions = ">=3.7, <4" files = [ {file = "requests-2.28.2-py3-none-any.whl", hash = "sha256:64299f4909223da747622c030b781c0d7811e359c37124b4bd368fb8c6518baa"}, {file = "requests-2.28.2.tar.gz", hash = "sha256:98b1b2782e3c6c4904938b84c0eb932721069dfdb9134313beff7c83c2df24bf"}, ] [package.dependencies] certifi = ">=2017.4.17" charset-normalizer = ">=2,<4" idna = ">=2.5,<4" urllib3 = ">=1.21.1,<1.27" [package.extras] socks = ["PySocks (>=1.5.6,!=1.5.7)"] use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "six" version = "1.16.0" description = "Python 2 and 3 compatibility utilities" category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" files = [ {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, ] [[package]] name = "soupsieve" version = "2.4" description = "A modern CSS selector implementation for Beautiful Soup." category = "main" optional = false python-versions = ">=3.7" files = [ {file = "soupsieve-2.4-py3-none-any.whl", hash = "sha256:49e5368c2cda80ee7e84da9dbe3e110b70a4575f196efb74e51b94549d921955"}, {file = "soupsieve-2.4.tar.gz", hash = "sha256:e28dba9ca6c7c00173e34e4ba57448f0688bb681b7c5e8bf4971daafc093d69a"}, ] [[package]] name = "tomli" version = "2.0.1" description = "A lil' TOML parser" category = "main" optional = false python-versions = ">=3.7" files = [ {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, ] [[package]] name = "urllib3" version = "1.26.15" description = "HTTP library with thread-safe connection pooling, file post, and more." category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" files = [ {file = "urllib3-1.26.15-py2.py3-none-any.whl", hash = "sha256:aa751d169e23c7479ce47a0cb0da579e3ede798f994f5816a74e4f4500dcea42"}, {file = "urllib3-1.26.15.tar.gz", hash = "sha256:8a388717b9476f934a21484e8c8e61875ab60644d29b9b39e11e4b9dc1c6b305"}, ] [package.extras] brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] [metadata] lock-version = "2.0" python-versions = "^3.10" content-hash = "9220b97b1b818023d7a84540263bbb16ffc99b72b30cf40cb752e00ef880353c" gfeeds-2.2.0/pyproject.toml000066400000000000000000000012061440757451400156760ustar00rootroot00000000000000[tool.poetry] name = "gfeeds" version = "1.0.2" description = "News reader for GNOME" authors = ["Gabriele Musco "] license = "GPL3" [tool.poetry.dependencies] python = "^3.10" Pillow = "^9.4.0" python-magic = "^0.4.27" requests = "^2.28.2" python-dateutil = "^2.8.2" Pygments = "^2.14.0" pytz = "^2022.7.1" readability-lxml = "^0.8.1" humanize = "^4.6.0" beautifulsoup4 = "^4.11.2" lxml = "^4.9.2" pytest = "^7.2.2" [tool.poetry.dev-dependencies] [build-system] requires = ["poetry-core>=1.0.0"] build-backend = "poetry.core.masonry.api" [tool.pytest.ini_options] pythonpath = [ "." ] [tool.pylsp-mypy] enabled = true gfeeds-2.2.0/run.sh000077500000000000000000000002431440757451400141250ustar00rootroot00000000000000#!/bin/bash export GSETTINGS_SCHEMA_DIR="$PWD/build/build/testdir/share/glib-2.0/schemas" ninja -C build ninja -C build install ./build/build/testdir/bin/gfeeds gfeeds-2.2.0/test/000077500000000000000000000000001440757451400137425ustar00rootroot00000000000000gfeeds-2.2.0/test/__init__.py000066400000000000000000000002211440757451400160460ustar00rootroot00000000000000import gi gi.require_version('Gtk', '4.0') gi.require_version('Gdk', '4.0') gi.require_version('Adw', '1') gi.require_version('WebKit2', '5.0') gfeeds-2.2.0/test/sample_rss.py000066400000000000000000000700071440757451400164700ustar00rootroot00000000000000SAMPLE_RSS = ''' GabMus's Dev Log https://gabmus.org/ Recent content on GabMus's Dev Log Hugo -- gohugo.io en-us Gabriele Musco - [Creative Commons Attribution 4.0 International License](https://creativecommons.org/licenses/by/4.0/). Mon, 14 Feb 2022 11:31:20 +0100 https://gabmus.org/logo.svg Swatch: a color palette manager https://gabmus.org/posts/swatch_a_color_palette_manager/ Mon, 14 Feb 2022 11:31:20 +0100 https://gabmus.org/posts/swatch_a_color_palette_manager/ Between one thing and the other, I found myself in need for a palette manager: something to let me categorize different palettes and easily pick and name colors depending on their use.

I had a look at some already available options, but nothing seemed to fit the bill, so (as it’s often the case) I decided to make my own.


I want to make a quick tangent on how easy it has become for me to quickly hack together build a GTK app.

A big part of the reason is reusing existing code and tooling from my other projects, as well as learning the proper way to do things.

Another big reason is the great ecosystem that’s been growing around GNOME technologies recently, particularly after the release of GTK4.

First of all, libadwaita is a huge help for building any kind of application. It ships a bunch of widgets and other useful tidbits such as pre-built style classes, implementing the rules defined in the GNOME HIG. This allows for quick building, clean code and great looks out of the box.

But libadwaita has already been praised enough by me and other developers, so that’s not really anything new.

The other incredibly useful tool that I’m using for my apps is Blueprint by James Westman. Without going into too much detail, it’s a markup language for building GTK4 UIs in a clean and simple way. You then use the blueprint compiler to compile it to regular XML without ever having to look at it yourself.


Going back to Swatch, it’s really as simple as it gets: you can create as many palettes as you want, and you can add colors to each palette. You can give custom names to everything, and you can quickly copy the color in hexadecimal (or rgb()) format. I also decided to give Swatch two view modes: list and grid, similar to what you’d see in a file manager.

And with that said, this little tool does exactly what I need. Hopefully you can find it useful as well.

The code is available on GNOME GitLab as usual, and you can try it for yourself using the latest flatpak CI build.

As for a proper release, I’m planning to tag one and submit it to Flathub as soon as the GNOME 42 runtime comes out, so stay tuned for that!

]]>
Block ads in WebKitGtk https://gabmus.org/posts/block_ads_in_webkitgtk/ Sat, 27 Nov 2021 19:08:53 +0100 https://gabmus.org/posts/block_ads_in_webkitgtk/ One of the most requested features (and for a good reason) in Feeds has always been ad blocking.

I never came around to implement it, mostly because I couldn’t find a guide or any similar resource, except for GNOME Web’s source code, and that’s not exactly easy to navigate. At least, it isn’t for me.

Today I decided to come back to it, and I found that it’s actually a rather easy task! That’s why I wanted to document this process, in hope that someone might find it useful one day.

First off, you’ll need one or more blocklists, in JSON format. I used EasyList, in particular here’s the link to the JSON block list. Blocklists should be updated frequently, so it’s advisable to have some sort of mechanism to download and update them at runtime automatically.

Let’s now jump to the code, which will be Python in this case, but hopefully can be easily adapted to other languages.

I’ll use some closures for convenience.

# have a function that downloads textdefdownload_text(url: str) ->str:
# ...# create the filter store somewhere in your code, ideally you should# only have one in your applicationmy_filter_store = WebKit2.UserContentFilterStore.new('some/cache/path')
# a name that will be used to save/retrieve blocklists from the storeBLOCKLIST_ID ='blocklist'defapply_adblock(
        webview: WebKit2.WebView,
        filter_store: WebKit2.UserContentFilterStore,
        blocklist_url: str) ->None:
# 0: Retrieve the WebKit2.UserContentManager from the WebView    content_manager = webview.get_user_content_manager()
defsave_blocklist_cb(caller, res, *args):
# 6: Once saving is done we can retrieve the newly created#    WebKit2.UserContentFilter with save_finish and finally add th#    filter to the WebKit2.UserContentManagertry:
filter= filter_store.save_finish(res)
            content_manager.add_filter(filter)
except GLib.Error:
print('Error saving blocklist')
defdownload_blocklist_cb(blocklist: str):
# 5: Now that we have the blocklist (as a string containing a json),#    we'll need to convert it to GLib.Bytes, then save it in the store.#    Yes, we need to save it even if we want to refresh it every time,#    this is just the way this works.#    This is also async and when it's done it will call continue on to#    save_blocklist_cb        filter_store.save(
            BLOCKLIST_ID, GLib.Bytes.new(blocklist.encode()), None,
            save_blocklist_cb
        )
defdownload_blocklist():
# 4: Download the blocklist and continue on to download_blocklist_cbtry:
            res = download_text(blocklist_url)
            GLib.idle_add(download_blocklist_cb, res)
except:
print('Error downloading the blocklist')
deffilter_load_cb(caller, res, *args):
# 2: load_finish will either succeed, and return a#    WebKit2.UserContentFilter object or raise a GLib.Error in case#    it cannot find the blocklist in the store (ie: on the first run)try:
filter= filter_store.load_finish(res)
            content_manager.add_filter(filter)
except GLib.Error:
# 3: If loading the blocklist from the store fails, download the#    blocklist (async to avoid blocking of course) and save itprint('blocklist store not found, downloading...')
            Thread(target=download_blocklist, daemon=True).start()
# 1: try to load the blocklist from the store, this is async and will call#    filter_load_cb when it's done    filter_store.load(BLOCKLIST_ID, None, filter_load_cb, None)

I decided to comment the example code above instead of writing disconnected descriptions here, hopefully it makes sense.

This said, if you want to look at the actual code that I’m using in Feeds, you can find it here (this is a snapshot to today’s current latest commit, in the future you may want to look at newer code). It contains some logic to automatically refresh or even remove the blocklist.

Let me know what you think in the comments, and feel free to point out any errors, or if something is unclear.

]]>
Gtk4, LibAdwaita and the new Feeds https://gabmus.org/posts/gtk4_libadwaita_and_the_new_feeds/ Sun, 21 Nov 2021 11:52:10 +0100 https://gabmus.org/posts/gtk4_libadwaita_and_the_new_feeds/ So, something big is coming for my news reader app Feeds.

Most of this year, as far as personal projects go, I spent at close contact with Gtk4, libadwaita and the awesome people over at the various matrix chat rooms.

I’ve spent this time porting What IP, HydraPaper and Giara to Gtk4+libadwaita.

What IP, HydraPaper and Giara at their latest iteration, side by side

I’m really happy of the results, and I’m even happier with how this new stack is shaping up.

The porting process for the most part has been relatively painless across the board, with only minor changes (albeit, many of them) needed for the actual porting. Along with the updated stack, I’ve been able to introduce new features and improvements, for the most part thanks to the new widgets available in libadwaita making my life a lot easier.

What IP being the simpler of the bunch didn’t really change much from its original iteration, except for some code cleanups. But hey, the theme is different and it looks amazing!

HydraPaper also stayed pretty much the same, with the exception of a new wallpaper folder selector (that you can see in the image above) in the form of a brand new widget, the mighty Flap! It’s a sidebar that can open above other widgets, mostly a glorified overlay, but with extra bells and whistles. On a regular monitor you can open it with the usual button on the headerbar, the same that opened a Popover before, but on a touchscreen you can swipe to open it! Plus, compared to the previous Popover implementation, the new Flap is part of the main window, meaning it can scale to fill the entire vertical space of the window, making this selector/filter much easier to interact with thanks to the increased size.

Giara being one of the more complex apps, received a lot more work and attention. First off, the post views have been re-implemented using ListView, a brand new (still somewhat janky) widget in Gtk4 that allows for better optimized lists, where rows get recycled instead of adding up, with performance quickly grinding to a halt. This change required a lot of work, since my usual terrible implementation of ListBox is 100% incompatible with the way ListView works. But with a lot of help and elbow grease, I managed to land it, making the whole experience of mindlessly scrolling through reddit a little less frustrating (hopefully). Also, thanks to another awesome widget, AdwCarousel, I was able to add support for image galleries. And they support touch gestures, too! Along with these changes, I also added an internal fullscreen image viewer, very much inspired by the one in telegram-desktop.


But let’s jump to the actual reason why I’m writing this post, The new Feeds.

What the new Feeds will look like

You see, I wanted to start porting Feeds to Gtk4 sooner than it ended up happening. Unfortunately, I wasn’t able to up until recently. The reason being WebKit. WebKit support for Gtk4 has been broken for a while, and just recently (not all that recently, tho) it got to a point where it was usable enough for me to start the port. At the time of writing this, you still need to enable Gtk4 support in WebKit by using custom build flags, making development possible by building WebKit myself (which, by the way, takes a lot of time), but at the same time making distribution unfeasible. Flatpak being the main way I distribute my apps, it could work in theory, but having a 1GB+ bundle for a simple news reader isn’t really a great user experience, so for now I’m holding off this release, waiting for it to become available in the GNOME runtime.

But let’s move on to what’s actually new in Feeds.

First of all, from a user facing perspective, The whole look of the app is quite different. Apart from the new Adwaita theme in libadwaita, the article list uses the new navigation-sidebar style class, with cool rounded corners for the rows and no separators between them, but still providing enough visual separation. Label sizes in the rows have also been tweaked slightly.

Oh, and of course, I added article pictures! The code is based on the custom picture widget I made for Giara, and let me tell you: they make any article that more interesting!

As for visual changes, another big one is the new filter view, again based on the Flap widget.

It’s a similar story to HydraPaper, the old Popover implementation was hard to use and unintuitive. A sidebar is a much more common pattern, plus the added vertical size makes it easier to find the feed you wanna look at.

As for the articles list, you may think ListView would be perfect here as well, and that’s what I thought as well. Unfortunately due to some technical issues with how ListView row selection and activation work at this current time, while it does work, it’s not really all that convenient. I added the ListView to Feeds, and you can enable it in the preferences, in the advanced section, but I kept the ListBox around as a default, and I also changed its API so that it’s the same as the ListView implementation. You can switch between one or the other and try them out for yourself, hopefully at some point I can get rid of the ListBox and have the ListView be the default.

With all the nice changes and cool things this port brought with it, I decided to tackle one of the most annoying issues I’ve had with Feeds: the actual feed parsing.

Up until recently I’ve been using the very popular feedparser python library, but I’ve always been dissatisfied with both its performance and its weird quirks. I came to the conclusion that it’s not the kind of library I was looking for.

I tried searching for alternatives, and I broadened my search to any language, but unfortunately I couldn’t find something I really liked.

So I decided to write my own! And for the best performance I wrote it in… C++! Maybe some of you were expecting Rust? Maybe one day, but I don’t really know Rust right now 😕

This new library is called Sydndication Domination or syndom for short (it’s a bit cheesy, I know). Syndom is tailor made for Feeds, but of course it can be used for any application.

It’s based around an awesome XML parser for C++ called pugixml, if you ever need to parse XML I suggest you take a look at it. Syndom is able to parse an RSS or Atom file and extract all the useful information a news reader would need, and most importantly, it does the heavy lifting of trying all the different places a certain information can be found in. It can also parse Opml files for importing feeds, as well as Html files for extracting other useful information from, say a blog post, like the featured image, the feed URL, the title or the description.

The whole thing comes together inside Feeds with python bindings, created using another library called pybind11.

Honestly this has probably been the biggest change to ever come to Feeds. The performance difference is enormous, it’s like night and day, and I couldn’t be happier about it.

So that’s all I wanted you to know, hopefully I can release Feeds sooner rather than later as I really, really want people to use this new version rather than the crusty old one.

If you want to try it for yourself you can download a recent snapshot I made manually from this link. Please do let me know what you think in the comments or in the matrix room if you prefer. And feel free to report any bugs you encounter along the way!

]]>
Switching to Cactus Comments https://gabmus.org/posts/switching_to_cactus_comments/ Wed, 16 Jun 2021 10:24:30 +0200 https://gabmus.org/posts/switching_to_cactus_comments/ I’ve been using Commento for a while for comments (without much adoption to be honest), and while I really love the project, and the simplicity of its approach, there’s always been one unavoidable thing I never really liked too much: if you want to comment, you have to register to my commento instance.

That’s less than ideal, considering that if I did have lots of people who wanted to comment, that’d have been quite a strain on my humble home server, where my commento instance is hosted.

Today I found this post on Mastodon (feel free to follow me there by the way) by Karmanyaah Malhotra about how he reworked his website recently. I always enjoy reading about other people’s websites, so I quickly read through it, just to find out about this comment system called Cactus Comments.

Cactus Comments uses Matrix to create a federated comment section on your website. If you have a Matrix account on any instance, you can comment on Cactus! Heck you can even use a full-fledged Matrix client to do so! That’s just great.

It’s free to use and self hostable as well, so there’s really not much of an excuse not to try it out. Plus if you already have a Matrix account you’re already halfway there.

I integrated it in my Ficurinia Hugo theme without much effort, so there’s another bonus point.

And that’s it, I’m really happy about this new comment system, it’s one less service running on my home server and due to its decentralized and federated nature it will hopefully encourage more people to leave interesting comments and get a conversation going!

]]>
Raspberry Pi Pico pinout in your terminal https://gabmus.org/posts/raspberry_pi_pico_pinout_in_your_terminal/ Tue, 09 Mar 2021 13:14:27 +0100 https://gabmus.org/posts/raspberry_pi_pico_pinout_in_your_terminal/ I’m playing around with the new Raspberry Pi Pico, and I quickly realized that I’d really love to have a quick pinout reference in my terminal.

I thought of making a man page, but I would have lost the color (I don’t know how to use arbitrary colors in groff), so I just created a simple text file with ascii escape sequences for colors and called it a day. It works, and it’s pretty!

I’m uploading it here for your convenience (and mine as well), you should be able to grab it from your *NIX box by just typing:

curl https://gabmus.org/pico_pinout

If you want to save it in a file, just add > some_file_name to the above.

]]>
''' gfeeds-2.2.0/test/test_feed_from_html.py000066400000000000000000000047141440757451400203330ustar00rootroot00000000000000from pathlib import Path from gfeeds.util.download_manager import extract_feed_url_from_html __HTML_BASE = '''

Foo bar

Lorem ipsum dolor sit amet, qui minim labore adipisicing minim sint cillum sint consectetur cupidatat.

''' def __mock(monkeypatch, html: str): def mock_download_raw(link: str, dest: str) -> None: with open(dest, 'w') as fd: fd.write(html) monkeypatch.setattr( 'gfeeds.util.download_manager.download_raw', mock_download_raw ) class MockConfManager: def __init__(self): self.cache_path = Path('/tmp/org.gabmus.gfeeds.test/cache') monkeypatch.setattr( 'gfeeds.confManager.ConfManager', MockConfManager ) def test_rss_https(monkeypatch): __mock(monkeypatch, __HTML_BASE.format( 'application/rss+xml', 'https://fake0.example.com/blog/rss.xml' )) res = extract_feed_url_from_html('https://fake0.example.com/blog') assert res == 'https://fake0.example.com/blog/rss.xml' def test_rss_abspath(monkeypatch): __mock(monkeypatch, __HTML_BASE.format( 'application/rss+xml', '/blog/rss.xml' )) res = extract_feed_url_from_html('https://fake1.example.com/blog') assert res == 'https://fake1.example.com/blog/rss.xml' def test_rss_abspath_different_dir(monkeypatch): __mock(monkeypatch, __HTML_BASE.format( 'application/rss+xml', '/another/rss.xml' )) res = extract_feed_url_from_html('https://fake2.example.com/blog') assert res == 'https://fake2.example.com/another/rss.xml' def test_rss_relpath(monkeypatch): __mock(monkeypatch, __HTML_BASE.format( 'application/rss+xml', 'rss.xml' )) res = extract_feed_url_from_html('https://fake3.example.com/blog') assert res == 'https://fake3.example.com/blog/rss.xml' def test_rss_relpath_trailing_slash(monkeypatch): __mock(monkeypatch, __HTML_BASE.format( 'application/rss+xml', 'rss.xml' )) res = extract_feed_url_from_html('https://fake4.example.com/blog/') assert res == 'https://fake4.example.com/blog/rss.xml' def test_fail(monkeypatch): __mock(monkeypatch, __HTML_BASE.replace( '', '') ) res = extract_feed_url_from_html('https://fake5.example.com/blog') assert res is None gfeeds-2.2.0/test/test_feed_item_with_html_in_title.py000066400000000000000000000044261440757451400232500ustar00rootroot00000000000000from os import remove from pathlib import Path import pytest from gfeeds.feed_item import FeedItem from gfeeds.feed_parser import parse_feed RSS_PATH = '/tmp/org.gabmus.gfeeds.test.feed_item_with_html_in_title.rss' SAMPLE_RSS = ''' GabMus's Dev Log https://gabmus.org/ Recent content on GabMus's Dev Log Hugo -- gohugo.io en-us Gabriele Musco - [Creative Commons Attribution 4.0 \ International License](https://creativecommons.org/licenses/by/4.0/).\ Mon, 14 Feb 2022 11:31:20 +0100 https://gabmus.org/logo.svg <![CDATA[<p>foo <strong>bar</strong> baz</p>]]> https://gabmus.org/posts/swatch_a_color_palette_manager/\ Mon, 14 Feb 2022 11:31:20 +0100 https://gabmus.org/posts/swatch_a_color_palette_manager/\ foo bar baz

]]>
''' @pytest.fixture(autouse=True) def run_around_tests(): with open(RSS_PATH, 'w') as fd: fd.write(SAMPLE_RSS) yield remove(RSS_PATH) class MockNConf: read_items = [] def __mock_confman(monkeypatch): class MockConfManager: def __init__(self): self.nconf = MockNConf() monkeypatch.setattr( 'gfeeds.feed_item.ConfManager', MockConfManager ) def test_feed_item_with_html_in_title(monkeypatch): __mock_confman(monkeypatch) feed = parse_feed(Path(RSS_PATH)) assert len(feed.raw_entries) == 1 fi = FeedItem(feed.raw_entries[0], feed) assert fi.title == 'foo bar baz' gfeeds-2.2.0/test/test_generate_opml.py000066400000000000000000000033601440757451400201760ustar00rootroot00000000000000from unittest.mock import MagicMock from gfeeds.util.opml_generator import feeds_list_to_opml MOCK_FEEDS = [ MagicMock(), MagicMock(), MagicMock() ] EXPECTED_OPML = ''' Subscriptions ''' def __configure_mock(): MOCK_FEEDS[0].configure_mock(**{ 'title': 'foo bar', 'description': 'bar baz', 'rss_link': 'http://example.org/rss', 'link': 'http://example.org', 'get_conf_dict.return_value': {'tags': ['t', 'tt', 'ttt']}, }) MOCK_FEEDS[1].configure_mock(**{ 'title': 'foo bar', 'description': 'bar baz', 'rss_link': 'http://example.org/rss1', 'link': 'http://example.org', 'get_conf_dict.return_value': {'tags': []}, }) MOCK_FEEDS[2].configure_mock(**{ 'title': ' ipsum\'s ', 'rss_link': 'example.org/rss2', 'link': 'example.org', 'get_conf_dict.return_value': { 'tags': ['', ''] }, }) def test_generate_opml(): __configure_mock() opml = feeds_list_to_opml(MOCK_FEEDS) assert opml == EXPECTED_OPML gfeeds-2.2.0/test/test_parse_feed.py000066400000000000000000000014101440757451400174440ustar00rootroot00000000000000from pathlib import Path from .sample_rss import SAMPLE_RSS from gfeeds.feed_parser import parse_feed from os import remove import pytest RSS_PATH = '/tmp/org.gabmus.gfeeds.test.parse_feed.rss' @pytest.fixture(autouse=True) def run_around_tests(): with open(RSS_PATH, 'w') as fd: fd.write(SAMPLE_RSS) yield remove(RSS_PATH) def test_parse_feed(): res = parse_feed(Path(RSS_PATH)) assert not res.is_null assert res.error is None assert res.title == 'GabMus\'s Dev Log' assert res.description == 'Recent content on GabMus\'s Dev Log' assert res.image_url == 'https://gabmus.org/logo.svg' assert res.link == 'https://gabmus.org/' assert res.rss_link == 'https://gabmus.org/index.xml' assert len(res.raw_entries) == 5 gfeeds-2.2.0/test/test_parse_opml.py000066400000000000000000000056111440757451400175170ustar00rootroot00000000000000from gfeeds.util.opml_parser import FeedImportData, opml_to_rss_list from os import remove import pytest OPML_PATH = '/tmp/org.gabmus.gfeeds.test.opml_parse.opml' OPML_CONTENT = ''' Peter Rukavina's Blogroll Fri, 08 May 2021 13:26:32 ''' @pytest.fixture(autouse=True) def run_around_tests(): with open(OPML_PATH, 'w') as fd: fd.write(OPML_CONTENT) yield remove(OPML_PATH) def test_opml_parse(): res = opml_to_rss_list(OPML_PATH) assert len(res) == 7 assert FeedImportData( 'https://austinkleon.com/feed/', ['Art and Design'] ) in res assert FeedImportData( 'https://www.cjchilvers.com/blog?format=rss', ['Art and Design'] ) in res assert FeedImportData( 'https://andrealedwell.com/?feed=rss2', ['Friends'] ) in res assert FeedImportData( 'https://preservecompany.com/blogs/bruces-muses.atom', ['Friends'] ) in res assert FeedImportData( 'https://kelake.org/feed/', ['Friends', 'Close'] ) in res assert FeedImportData( 'http://www.alphabettes.org/feed/', ['Letterpress and Type'] ) in res assert FeedImportData( 'https://blog.silverorange.com/feed', [] ) in res gfeeds-2.2.0/test/test_url_complete.py000066400000000000000000000062641440757451400200550ustar00rootroot00000000000000from gfeeds.util.create_full_url import create_full_url def test_create_full_url_already_full(): assert ( create_full_url('', 'https://example.org/') == 'https://example.org/' ) assert ( create_full_url('', 'https://example.org') == 'https://example.org' ) assert ( create_full_url('', 'http://example.org/') == 'http://example.org/' ) assert ( create_full_url('', 'http://example.org') == 'http://example.org' ) assert ( create_full_url('', 'https://example.org/foo') == 'https://example.org/foo' ) assert ( create_full_url('', 'https://example.org/foo/bar') == 'https://example.org/foo/bar' ) assert ( create_full_url('', 'https://example.org/foo/bar/') == 'https://example.org/foo/bar/' ) def test_create_full_url_abspath(): assert ( create_full_url('https://example.org/', '/') == 'https://example.org/' ) assert ( create_full_url('https://example.org/', '/foo') == 'https://example.org/foo' ) assert ( create_full_url('https://example.org/', '/foo/bar') == 'https://example.org/foo/bar' ) assert ( create_full_url('https://example.org/', '/foo/bar/') == 'https://example.org/foo/bar/' ) assert ( create_full_url('https://example.org', '/') == 'https://example.org/' ) assert ( create_full_url('https://example.org', '/foo') == 'https://example.org/foo' ) assert ( create_full_url('https://example.org', '/foo/bar') == 'https://example.org/foo/bar' ) assert ( create_full_url('https://example.org', '/foo/bar/') == 'https://example.org/foo/bar/' ) def test_create_full_url_relpath(): assert ( create_full_url('https://example.org/', '') == 'https://example.org/' ) assert ( create_full_url('https://example.org/', 'foo') == 'https://example.org/foo' ) assert ( create_full_url('https://example.org/', 'foo/bar') == 'https://example.org/foo/bar' ) assert ( create_full_url('https://example.org/', 'foo/bar/') == 'https://example.org/foo/bar/' ) assert ( create_full_url('https://example.org/baz/', 'foo') == 'https://example.org/baz/foo' ) assert ( create_full_url('https://example.org/baz/', 'foo/bar') == 'https://example.org/baz/foo/bar' ) assert ( create_full_url('https://example.org', '') == 'https://example.org/' ) assert ( create_full_url('https://example.org', 'foo') == 'https://example.org/foo' ) assert ( create_full_url('https://example.org', 'foo/bar') == 'https://example.org/foo/bar' ) assert ( create_full_url('https://example.org', 'foo/bar/') == 'https://example.org/foo/bar/' ) assert ( create_full_url('https://example.org/baz', 'foo') == 'https://example.org/baz/foo' ) assert ( create_full_url('https://example.org/baz', 'foo/bar') == 'https://example.org/baz/foo/bar' ) gfeeds-2.2.0/update_python_deps.sh000077500000000000000000000003751440757451400172250ustar00rootroot00000000000000#!/bin/bash set -e rm -rf __venv virtualenv __venv source __venv/bin/activate pip install requirements-parser flatpak-pip-generator --requirements-file=requirements.txt --output python-deps mv python-deps.json dist/flatpak/python-deps.json deactivate