diff --git a/COPYING-GPL b/COPYING-GPL new file mode 100644 index 00000000..f288702d --- /dev/null +++ b/COPYING-GPL @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/meson.build b/meson.build index 4ed7103f..75348b95 100644 --- a/meson.build +++ b/meson.build @@ -11,6 +11,7 @@ project('clapper', 'c', glib_req = '>= 2.76.0' gst_req = '>= 1.20.0' gtk4_req = '>= 4.10.0' +adw_req = '>= 1.4.0' clapper_version = meson.project_version().split('-')[0] version_array = clapper_version.split('.') @@ -77,6 +78,10 @@ gtk4_dep = dependency('gtk4', version: gtk4_req, required: false, ) +libadwaita_dep = dependency('libadwaita-1', + version: adw_req, + required: false, +) cc = meson.get_compiler('c') libm = cc.find_library('m', required: false) @@ -131,6 +136,7 @@ summary({ summary('clapper', build_clapper ? 'Yes' : 'No', section: 'Build') summary('clapper-gtk', build_clappergtk ? 'Yes' : 'No', section: 'Build') +summary('clapper-app', build_clapperapp ? 'Yes' : 'No', section: 'Build') summary('gst-plugin', build_gst_plugin ? 'Yes' : 'No', section: 'Build') summary('introspection', build_gir ? 'Yes' : 'No', section: 'Build') summary('vapi', build_vapi ? 'Yes' : 'No', section: 'Build') diff --git a/meson_options.txt b/meson_options.txt index 5cea2a0e..ec9cce16 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -9,6 +9,11 @@ option('clapper-gtk', value: 'auto', description: 'Build Clapper GTK integration library' ) +option('clapper-app', + type: 'feature', + value: 'auto', + description: 'Build Clapper application' +) option('gst-plugin', type: 'feature', value: 'auto', diff --git a/src/bin/clapper-app/clapper-app-about-window.c b/src/bin/clapper-app/clapper-app-about-window.c new file mode 100644 index 00000000..efa57a37 --- /dev/null +++ b/src/bin/clapper-app/clapper-app-about-window.c @@ -0,0 +1,69 @@ +/* Clapper Application + * Copyright (C) 2024 RafaÅ‚ DziÄ™giel + * + * 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 . + */ + +#include "config.h" + +#include +#include +#include + +#include "clapper-app-about-window.h" + +GtkWidget * +clapper_app_about_window_new (GtkApplication *gtk_app) +{ + AdwAboutWindow *about; + GtkWindow *window; + GString *string; + gchar *gst_ver, *debug_info; + + about = ADW_ABOUT_WINDOW (adw_about_window_new_from_appdata ( + CLAPPER_APP_RESOURCE_PREFIX "/data/metainfo/" CLAPPER_APP_ID ".metainfo.xml", + NULL)); + window = gtk_application_get_active_window (gtk_app); + + gtk_window_set_modal (GTK_WINDOW (about), TRUE); + gtk_window_set_transient_for (GTK_WINDOW (about), window); + + /* TRANSLATORS: Put your name(s) here for credits or leave untranslated */ + adw_about_window_set_translator_credits (about, _("translator-credits")); + + string = g_string_new (NULL); + + g_string_append_printf (string, "GLib %u.%u.%u\n", + glib_major_version, + glib_minor_version, + glib_micro_version); + g_string_append_printf (string, "GTK %u.%u.%u\n", + gtk_get_major_version (), + gtk_get_minor_version (), + gtk_get_micro_version ()); + g_string_append_printf (string, "Adwaita %u.%u.%u\n", + adw_get_major_version (), + adw_get_minor_version (), + adw_get_micro_version ()); + + gst_ver = gst_version_string (); + g_string_append (string, gst_ver); + g_free (gst_ver); + + debug_info = g_string_free_and_steal (string); + adw_about_window_set_debug_info (about, debug_info); + g_free (debug_info); + + return GTK_WIDGET (about); +} diff --git a/src/bin/clapper-app/clapper-app-about-window.h b/src/bin/clapper-app/clapper-app-about-window.h new file mode 100644 index 00000000..2051d0ff --- /dev/null +++ b/src/bin/clapper-app/clapper-app-about-window.h @@ -0,0 +1,29 @@ +/* Clapper Application + * Copyright (C) 2024 RafaÅ‚ DziÄ™giel + * + * 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 . + */ + +#pragma once + +#include +#include +#include + +G_BEGIN_DECLS + +G_GNUC_INTERNAL +GtkWidget * clapper_app_about_window_new (GtkApplication *gtk_app); + +G_END_DECLS diff --git a/src/bin/clapper-app/clapper-app-application.c b/src/bin/clapper-app/clapper-app-application.c new file mode 100644 index 00000000..1c9f4291 --- /dev/null +++ b/src/bin/clapper-app/clapper-app-application.c @@ -0,0 +1,585 @@ +/* Clapper Application + * Copyright (C) 2024 RafaÅ‚ DziÄ™giel + * + * 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 . + */ + +#include "config.h" + +#include +#include +#include + +#include "clapper-app-application.h" +#include "clapper-app-window.h" +#include "clapper-app-file-dialog.h" +#include "clapper-app-uri-dialog.h" +#include "clapper-app-info-window.h" +#include "clapper-app-preferences-window.h" +#include "clapper-app-about-window.h" +#include "clapper-app-utils.h" + +#define PERCENTAGE_ROUND(a) (round ((gdouble) a / 0.01) * 0.01) + +#define GST_CAT_DEFAULT clapper_app_application_debug +GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT); + +struct _ClapperAppApplication +{ + GtkApplication parent; + + GSettings *settings; + + gboolean need_init_state; +}; + +struct ClapperPluginFeatureData +{ + const gchar *name; + GstRank rank; +}; + +struct ClapperPluginData +{ + const gchar *name; + guint skip_version[3]; + struct ClapperPluginFeatureData features[10]; +}; + +typedef struct +{ + const gchar *action; + const gchar *accels[3]; +} ClapperAppShortcut; + +#define parent_class clapper_app_application_parent_class +G_DEFINE_TYPE (ClapperAppApplication, clapper_app_application, GTK_TYPE_APPLICATION); + +static inline void +_set_initial_plugin_feature_ranks (void) +{ + GstRegistry *registry = gst_registry_get (); + guint i; + + const struct ClapperPluginData plugins_data[] = { + { + .name = "va", + .skip_version = { 1, 24, 0 }, + .features = { + { "vah264dec", GST_RANK_PRIMARY + 24 }, + { "vah265dec", GST_RANK_PRIMARY + 24 }, + { "vavp8dec", GST_RANK_PRIMARY + 24 }, + { "vavp9dec", GST_RANK_PRIMARY + 24 }, + { "vaav1dec", GST_RANK_PRIMARY + 24 }, + { NULL, 0 } + } + }, + { + .name = "nvcodec", + .skip_version = { 1, 24, 0 }, + .features = { + { "nvh264dec", GST_RANK_PRIMARY + 28 }, + { "nvh265dec", GST_RANK_PRIMARY + 28 }, + { "nvvp8dec", GST_RANK_PRIMARY + 28 }, + { "nvvp9dec", GST_RANK_PRIMARY + 28 }, + { "nvav1dec", GST_RANK_PRIMARY + 28 }, + { NULL, 0 } + } + } + }; + + for (i = 0; i < G_N_ELEMENTS (plugins_data); ++i) { + GList *features; + + if (!(features = gst_registry_get_feature_list_by_plugin ( + registry, plugins_data[i].name))) + continue; + + if (g_list_length (features) > 0) { + guint j; + + for (j = 0; G_N_ELEMENTS (plugins_data[i].features); ++j) { + GstPluginFeature *feature; + + if (!plugins_data[i].features[j].name) + break; + + if (!(feature = gst_registry_lookup_feature (registry, + plugins_data[i].features[j].name))) + continue; + + if (!gst_plugin_feature_check_version (feature, + plugins_data[i].skip_version[0], + plugins_data[i].skip_version[1], + plugins_data[i].skip_version[2])) { + gst_plugin_feature_set_rank (feature, + plugins_data[i].features[j].rank); + GST_DEBUG ("Initially set \"%s\" rank to: %i", + plugins_data[i].features[j].name, + plugins_data[i].features[j].rank); + } + gst_object_unref (feature); + } + } + + gst_plugin_feature_list_free (features); + } +} + +static void +_iter_ranks_func (const gchar *feature_name, GstRank rank, + gboolean from_env, gpointer user_data G_GNUC_UNUSED) +{ + GstPluginFeature *feature; + + if ((feature = gst_registry_find_feature (gst_registry_get (), + feature_name, GST_TYPE_ELEMENT_FACTORY))) { + gst_plugin_feature_set_rank (feature, rank); + GST_INFO ("Set \"%s\" rank to: %i", feature_name, rank); + + gst_object_unref (feature); + } +} + +static void +plugin_feature_ranks_settings_changed_cb (GSettings *settings, + gchar *key G_GNUC_UNUSED, gpointer user_data G_GNUC_UNUSED) +{ + clapper_app_utils_iterate_plugin_feature_ranks (settings, + (ClapperAppUtilsIterRanks) _iter_ranks_func, NULL); +} + +static void +_assemble_initial_state (GtkWindow *window) +{ + GtkWidget *stack = gtk_window_get_child (window); + GtkBuilder *builder = gtk_builder_new_from_resource ( + CLAPPER_APP_RESOURCE_PREFIX "/ui/clapper-app-initial-state.ui"); + GtkWidget *initial_state = GTK_WIDGET (gtk_builder_get_object (builder, "initial_state")); + + gtk_stack_add_named (GTK_STACK (stack), initial_state, "initial_state"); + gtk_stack_set_visible_child (GTK_STACK (stack), initial_state); + + g_object_unref (builder); +} + +static void +add_files (GSimpleAction *action, GVariant *param, gpointer user_data) +{ + GtkApplication *gtk_app = GTK_APPLICATION (user_data); + + clapper_app_file_dialog_open_files (gtk_app); +} + +static void +add_uri (GSimpleAction *action, GVariant *param, gpointer user_data) +{ + GtkApplication *gtk_app = GTK_APPLICATION (user_data); + + clapper_app_uri_dialog_open_uri (gtk_app); +} + +static void +show_preferences (GSimpleAction *action, GVariant *param, gpointer user_data) +{ + GtkApplication *gtk_app = GTK_APPLICATION (user_data); + GtkWidget *preferences_window; + + preferences_window = clapper_app_preferences_window_new (gtk_app); + gtk_window_present (GTK_WINDOW (preferences_window)); +} + +static void +show_info (GSimpleAction *action, GVariant *param, gpointer user_data) +{ + GtkApplication *gtk_app = GTK_APPLICATION (user_data); + GtkWidget *info_window; + GtkWindow *window; + ClapperPlayer *player; + + window = gtk_application_get_active_window (gtk_app); + player = clapper_app_window_get_player (CLAPPER_APP_WINDOW (window)); + + info_window = clapper_app_info_window_new (gtk_app, player); + gtk_window_present (GTK_WINDOW (info_window)); +} + +static void +show_about (GSimpleAction *action, GVariant *param, gpointer user_data) +{ + GtkApplication *gtk_app = GTK_APPLICATION (user_data); + GtkWidget *about_window; + + about_window = clapper_app_about_window_new (gtk_app); + gtk_window_present (GTK_WINDOW (about_window)); +} + +static inline void +_restore_settings_to_window (ClapperAppApplication *self, ClapperAppWindow *app_window) +{ + ClapperPlayer *player = clapper_app_window_get_player (app_window); + ClapperQueue *queue = clapper_player_get_queue (player); + + GST_DEBUG ("Restoring saved GSettings values to: %" GST_PTR_FORMAT, app_window); + + clapper_player_set_volume (player, PERCENTAGE_ROUND (g_settings_get_double (self->settings, "volume"))); + clapper_player_set_mute (player, g_settings_get_boolean (self->settings, "mute")); + clapper_player_set_speed (player, PERCENTAGE_ROUND (g_settings_get_double (self->settings, "speed"))); + clapper_player_set_subtitles_enabled (player, g_settings_get_boolean (self->settings, "subtitles-enabled")); + clapper_queue_set_progression_mode (queue, g_settings_get_int (self->settings, "progression-mode")); + + if (g_settings_get_boolean (self->settings, "fullscreened")) + gtk_window_fullscreen (GTK_WINDOW (app_window)); + else if (g_settings_get_boolean (self->settings, "maximized")) + gtk_window_maximize (GTK_WINDOW (app_window)); + + GST_DEBUG ("Configuration restored"); +} + +static inline void +_store_settings_from_window (ClapperAppApplication *self, ClapperAppWindow *app_window) +{ + ClapperPlayer *player = clapper_app_window_get_player (app_window); + ClapperQueue *queue = clapper_player_get_queue (player); + GtkWindow *window = GTK_WINDOW (app_window); + + GST_DEBUG ("Storing current configuration to GSettings"); + + g_settings_set_double (self->settings, "volume", clapper_player_get_volume (player)); + g_settings_set_boolean (self->settings, "mute", clapper_player_get_mute (player)); + g_settings_set_double (self->settings, "speed", clapper_player_get_speed (player)); + g_settings_set_boolean (self->settings, "subtitles-enabled", clapper_player_get_subtitles_enabled (player)); + g_settings_set_int (self->settings, "progression-mode", clapper_queue_get_progression_mode (queue)); + + g_settings_set_boolean (self->settings, "maximized", gtk_window_is_maximized (window)); + g_settings_set_boolean (self->settings, "fullscreened", gtk_window_is_fullscreen (window)); + + GST_DEBUG ("Configuration stored"); +} + +GApplication * +clapper_app_application_new (void) +{ + return g_object_new (CLAPPER_APP_TYPE_APPLICATION, + "application-id", CLAPPER_APP_ID, + "flags", G_APPLICATION_HANDLES_OPEN, + NULL); +} + +static void +clapper_app_application_window_removed (GtkApplication *gtk_app, GtkWindow *window) +{ + ClapperAppApplication *self = CLAPPER_APP_APPLICATION_CAST (gtk_app); + + if (CLAPPER_APP_IS_WINDOW (window)) { + GList *win, *windows = gtk_application_get_windows (gtk_app); + gboolean has_player_windows = FALSE; + + for (win = windows; win != NULL; win = win->next) { + GtkWindow *rem_window = GTK_WINDOW (win->data); + + if ((has_player_windows = (rem_window != window + && CLAPPER_APP_IS_WINDOW (rem_window)))) + break; + } + + /* Last player window is closing, time to store settings */ + if (!has_player_windows) + _store_settings_from_window (self, CLAPPER_APP_WINDOW_CAST (window)); + } + + GTK_APPLICATION_CLASS (parent_class)->window_removed (gtk_app, window); +} + +static void +clapper_app_application_activate (GApplication *app) +{ + ClapperAppApplication *self = CLAPPER_APP_APPLICATION_CAST (app); + GtkWindow *window; + + GST_INFO ("Activate"); + G_APPLICATION_CLASS (parent_class)->activate (app); + + if (!(window = gtk_application_get_active_window (GTK_APPLICATION (app)))) { + window = GTK_WINDOW (clapper_app_window_new (GTK_APPLICATION (app))); + _restore_settings_to_window (self, CLAPPER_APP_WINDOW_CAST (window)); + } + + if (self->need_init_state) { + _assemble_initial_state (window); + self->need_init_state = FALSE; + } + + gtk_window_present (window); +} + +static gboolean +clapper_app_application_local_command_line (GApplication *app, + gchar ***arguments, gint *exit_status) +{ + gchar **argv = *arguments; + guint i; + + /* NOTE: argv is never NULL, so no need to check */ + + for (i = 0; argv[i]; ++i) { + /* Handle "-" special case as URI */ + if (strlen (argv[i]) == 1 && argv[i][0] == '-') { + g_free (argv[i]); + argv[i] = g_strdup ("fd://0"); + } + } + + return G_APPLICATION_CLASS (parent_class)->local_command_line (app, arguments, exit_status); +} + +static gboolean +_is_claps_file (GFile *file) +{ + gchar *basename = g_file_get_basename (file); + gboolean is_claps; + + is_claps = (basename && g_str_has_suffix (basename, ".claps")); + g_free (basename); + + return is_claps; +} + +static void +add_item_from_file (GFile *file, ClapperQueue *queue) +{ + ClapperMediaItem *item = clapper_media_item_new_from_file (file); + + GST_DEBUG ("Adding media item with URI: %s", + clapper_media_item_get_uri (item)); + clapper_queue_add_item (queue, item); + + gst_object_unref (item); +} + +static void +add_items_from_claps_file (GFile *file, ClapperQueue *queue) +{ + GDataInputStream *dstream = NULL; + GFileInputStream *stream; + GError *error = NULL; + gchar *line; + + if (!(stream = g_file_read (file, NULL, &error))) + goto finish; + + dstream = g_data_input_stream_new (G_INPUT_STREAM (stream)); + + while ((line = g_data_input_stream_read_line ( + dstream, NULL, NULL, &error))) { + g_strstrip (line); + + if (strlen (line) > 0) { + GFile *tmp_file = gst_uri_is_valid (line) + ? g_file_new_for_uri (line) + : g_file_new_for_path (line); + + if (_is_claps_file (tmp_file)) + add_items_from_claps_file (tmp_file, queue); + else + add_item_from_file (tmp_file, queue); + + g_object_unref (tmp_file); + } + + g_free (line); + } + +finish: + if (error) { + GST_ERROR ("Could not read \".claps\" file, reason: %s", error->message); + g_error_free (error); + } + if (stream) { + g_input_stream_close (G_INPUT_STREAM (stream), NULL, NULL); + g_object_unref (stream); + } + g_clear_object (&dstream); +} + +static void +add_item_with_subtitles (GFile *media_file, + GFile *subs_file, ClapperQueue *queue) +{ + ClapperMediaItem *item = clapper_media_item_new_from_file (media_file); + gchar *suburi = g_file_get_uri (subs_file); + + GST_DEBUG ("Adding media item with URI: %s, SUBURI: %s", + clapper_media_item_get_uri (item), GST_STR_NULL (suburi)); + clapper_media_item_set_suburi (item, suburi); + clapper_queue_add_item (queue, item); + + gst_object_unref (item); + g_free (suburi); +} + +static void +clapper_app_application_open (GApplication *app, + GFile **files, gint n_files, const gchar *hint) +{ + ClapperAppApplication *self = CLAPPER_APP_APPLICATION_CAST (app); + GtkWindow *window; + ClapperPlayer *player; + ClapperQueue *queue; + guint n_before; + gboolean add_only, handled = FALSE; + + GST_INFO ("Open"); + + /* Since we startup with media, + * no need to show initial state */ + self->need_init_state = FALSE; + + g_application_activate (app); + g_application_mark_busy (app); + + window = gtk_application_get_active_window (GTK_APPLICATION (app)); + while (window && !CLAPPER_APP_IS_WINDOW (window)) + window = gtk_window_get_transient_for (window); + + clapper_app_window_ensure_no_initial_state (CLAPPER_APP_WINDOW (window)); + + player = clapper_app_window_get_player (CLAPPER_APP_WINDOW (window)); + queue = clapper_player_get_queue (player); + + n_before = clapper_queue_get_n_items (queue); + + /* Special path for opening video with subtitles at once */ + if (n_files == 2) { + gboolean first_subs, second_subs; + + first_subs = clapper_app_utils_is_subtitles_file (files[0]); + second_subs = clapper_app_utils_is_subtitles_file (files[1]); + + if ((handled = first_subs != second_subs)) { + guint media_index, subs_index; + + media_index = (second_subs) ? 0 : 1; + subs_index = (media_index + 1) % 2; + + add_item_with_subtitles ( + files[media_index], files[subs_index], queue); + } + } + + if (!handled) { + gint i; + + for (i = 0; i < n_files; ++i) { + if (_is_claps_file (files[i])) + add_items_from_claps_file (files[i], queue); + else + add_item_from_file (files[i], queue); + } + } + + add_only = (g_strcmp0 (hint, "add-only") == 0); + + /* Select first thing from added item to play (behave like "open" should), + * when queue was empty first item is automatically selected */ + if (!add_only && n_before > 0) + clapper_queue_select_index (queue, n_before); + + g_application_unmark_busy (app); +} + +static void +clapper_app_application_init (ClapperAppApplication *self) +{ + self->need_init_state = TRUE; +} + +static void +clapper_app_application_constructed (GObject *object) +{ + ClapperAppApplication *self = CLAPPER_APP_APPLICATION_CAST (object); + GApplication *app = G_APPLICATION (self); + guint i; + + static const GActionEntry app_entries[] = { + { "add-files", add_files, NULL, NULL, NULL }, + { "add-uri", add_uri, NULL, NULL, NULL }, + { "info", show_info, NULL, NULL, NULL }, + { "preferences", show_preferences, NULL, NULL, NULL }, + { "about", show_about, NULL, NULL, NULL }, + }; + static const ClapperAppShortcut app_shortcuts[] = { + { "app.add-files", { "o", NULL, NULL }}, + { "app.add-uri", { "u", NULL, NULL }}, + { "app.info", { "i", NULL, NULL }}, + { "app.preferences", { "comma", NULL, NULL }}, + { "app.about", { "F1", NULL, NULL }}, + { "win.toggle-fullscreen", { "F11", "f", NULL }}, + { "win.show-help-overlay", { "question", NULL, NULL }}, + { "window.close", { "q", NULL, NULL }}, + }; + + /* Override initial ranks, they will be updated + * from both stored settings and env below */ + _set_initial_plugin_feature_ranks (); + + self->settings = g_settings_new (CLAPPER_APP_ID); + + g_signal_connect (self->settings, + "changed::plugin-feature-ranks", + G_CALLBACK (plugin_feature_ranks_settings_changed_cb), self); + plugin_feature_ranks_settings_changed_cb (self->settings, NULL, NULL); + + g_action_map_add_action_entries (G_ACTION_MAP (app), + app_entries, G_N_ELEMENTS (app_entries), app); + + for (i = 0; i < G_N_ELEMENTS (app_shortcuts); ++i) + gtk_application_set_accels_for_action (GTK_APPLICATION (app), app_shortcuts[i].action, app_shortcuts[i].accels); + + g_application_add_option_group (app, gst_init_get_option_group ()); + + G_OBJECT_CLASS (parent_class)->constructed (object); +} + +static void +clapper_app_application_finalize (GObject *object) +{ + ClapperAppApplication *self = CLAPPER_APP_APPLICATION_CAST (object); + + GST_TRACE ("Finalize"); + + g_object_unref (self->settings); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +clapper_app_application_class_init (ClapperAppApplicationClass *klass) +{ + GObjectClass *gobject_class = (GObjectClass *) klass; + GApplicationClass *application_class = (GApplicationClass *) klass; + GtkApplicationClass *gtk_application_class = (GtkApplicationClass *) klass; + + GST_DEBUG_CATEGORY_INIT (GST_CAT_DEFAULT, "clapperappapplication", 0, + "Clapper App Application"); + + gobject_class->constructed = clapper_app_application_constructed; + gobject_class->finalize = clapper_app_application_finalize; + + gtk_application_class->window_removed = clapper_app_application_window_removed; + + application_class->activate = clapper_app_application_activate; + application_class->local_command_line = clapper_app_application_local_command_line; + application_class->open = clapper_app_application_open; +} diff --git a/src/bin/clapper-app/clapper-app-application.h b/src/bin/clapper-app/clapper-app-application.h new file mode 100644 index 00000000..17a7e1c1 --- /dev/null +++ b/src/bin/clapper-app/clapper-app-application.h @@ -0,0 +1,34 @@ +/* Clapper Application + * Copyright (C) 2024 RafaÅ‚ DziÄ™giel + * + * 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 . + */ + +#pragma once + +#include +#include +#include + +G_BEGIN_DECLS + +#define CLAPPER_APP_TYPE_APPLICATION (clapper_app_application_get_type()) +#define CLAPPER_APP_APPLICATION_CAST(obj) ((ClapperAppApplication *)(obj)) + +G_DECLARE_FINAL_TYPE (ClapperAppApplication, clapper_app_application, CLAPPER_APP, APPLICATION, GtkApplication) + +G_GNUC_INTERNAL +GApplication * clapper_app_application_new (void); + +G_END_DECLS diff --git a/src/bin/clapper-app/clapper-app-file-dialog.c b/src/bin/clapper-app/clapper-app-file-dialog.c new file mode 100644 index 00000000..3bbf2bf6 --- /dev/null +++ b/src/bin/clapper-app/clapper-app-file-dialog.c @@ -0,0 +1,131 @@ +/* Clapper Application + * Copyright (C) 2024 RafaÅ‚ DziÄ™giel + * + * 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 . + */ + +#include + +#include "clapper-app-file-dialog.h" +#include "clapper-app-utils.h" + +static inline void +_open_files_from_model (GtkApplication *gtk_app, GListModel *files_model) +{ + GFile **files = NULL; + gint n_files = 0; + + if (clapper_app_utils_files_from_list_model (files_model, &files, &n_files)) { + g_application_open (G_APPLICATION (gtk_app), files, n_files, "add-only"); + clapper_app_utils_files_free (files); + } +} + +static void +_open_files_cb (GtkFileDialog *dialog, GAsyncResult *result, GtkApplication *gtk_app) +{ + GError *error = NULL; + GListModel *files_model = gtk_file_dialog_open_multiple_finish (dialog, result, &error); + + if (G_LIKELY (error == NULL)) { + _open_files_from_model (gtk_app, files_model); + } else { + if (error->domain != GTK_DIALOG_ERROR || error->code != GTK_DIALOG_ERROR_DISMISSED) { + g_printerr ("Error: %s\n", + (error->message) ? error->message : "Could not open file dialog"); + } + g_error_free (error); + } + g_clear_object (&files_model); +} + +static void +_open_subtitles_cb (GtkFileDialog *dialog, GAsyncResult *result, ClapperMediaItem *item) +{ + GError *error = NULL; + GFile *file = gtk_file_dialog_open_finish (dialog, result, &error); + + if (G_LIKELY (error == NULL)) { + gchar *suburi = g_file_get_uri (file); + + clapper_media_item_set_suburi (item, suburi); + g_free (suburi); + } else { + if (error->domain != GTK_DIALOG_ERROR || error->code != GTK_DIALOG_ERROR_DISMISSED) { + g_printerr ("Error: %s\n", + (error->message) ? error->message : "Could not open file dialog"); + } + g_error_free (error); + } + g_clear_object (&file); + gst_object_unref (item); // Borrowed reference +} + +static void +_dialog_add_mime_types (GtkFileDialog *dialog, const gchar *filter_name, + const gchar *const *mime_types) +{ + GListStore *filters = g_list_store_new (GTK_TYPE_FILE_FILTER); + GtkFileFilter *filter = gtk_file_filter_new (); + guint i; + + for (i = 0; mime_types[i]; ++i) + gtk_file_filter_add_mime_type (filter, mime_types[i]); + + gtk_file_filter_set_name (filter, filter_name); + g_list_store_append (filters, filter); + + gtk_file_dialog_set_filters (dialog, G_LIST_MODEL (filters)); + + g_object_unref (filters); + g_object_unref (filter); +} + +void +clapper_app_file_dialog_open_files (GtkApplication *gtk_app) +{ + GtkWindow *window = gtk_application_get_active_window (gtk_app); + GtkFileDialog *dialog = gtk_file_dialog_new (); + + _dialog_add_mime_types (dialog, "Media Files", + clapper_app_utils_get_mime_types ()); + + gtk_file_dialog_set_modal (dialog, TRUE); + gtk_file_dialog_set_title (dialog, "Add Files"); + + gtk_file_dialog_open_multiple (dialog, window, NULL, + (GAsyncReadyCallback) _open_files_cb, + gtk_app); + + g_object_unref (dialog); +} + +void +clapper_app_file_dialog_open_subtitles (GtkApplication *gtk_app, ClapperMediaItem *item) +{ + GtkWindow *window = gtk_application_get_active_window (gtk_app); + GtkFileDialog *dialog = gtk_file_dialog_new (); + + _dialog_add_mime_types (dialog, "Subtitles", + clapper_app_utils_get_subtitles_mime_types ()); + + gtk_file_dialog_set_modal (dialog, TRUE); + gtk_file_dialog_set_title (dialog, "Open Subtitles"); + + gtk_file_dialog_open (dialog, window, NULL, + (GAsyncReadyCallback) _open_subtitles_cb, + gst_object_ref (item)); + + g_object_unref (dialog); +} diff --git a/src/bin/clapper-app/clapper-app-file-dialog.h b/src/bin/clapper-app/clapper-app-file-dialog.h new file mode 100644 index 00000000..068982c6 --- /dev/null +++ b/src/bin/clapper-app/clapper-app-file-dialog.h @@ -0,0 +1,32 @@ +/* Clapper Application + * Copyright (C) 2024 RafaÅ‚ DziÄ™giel + * + * 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 . + */ + +#pragma once + +#include +#include +#include + +G_BEGIN_DECLS + +G_GNUC_INTERNAL +void clapper_app_file_dialog_open_files (GtkApplication *gtk_app); + +G_GNUC_INTERNAL +void clapper_app_file_dialog_open_subtitles (GtkApplication *gtk_app, ClapperMediaItem *item); + +G_END_DECLS diff --git a/src/bin/clapper-app/clapper-app-headerbar.c b/src/bin/clapper-app/clapper-app-headerbar.c new file mode 100644 index 00000000..dcf5179d --- /dev/null +++ b/src/bin/clapper-app/clapper-app-headerbar.c @@ -0,0 +1,185 @@ +/* Clapper Application + * Copyright (C) 2024 RafaÅ‚ DziÄ™giel + * + * 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 . + */ + +#include "config.h" + +#include +#include + +#include "clapper-app-headerbar.h" +#include "clapper-app-utils.h" + +#define GST_CAT_DEFAULT clapper_app_headerbar_debug +GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT); + +struct _ClapperAppHeaderbar +{ + ClapperGtkContainer parent; + + GtkWidget *queue_revealer; + GtkWidget *previous_item_revealer; + GtkWidget *next_item_revealer; + GtkWidget *win_buttons_revealer; + + GtkDropTarget *drop_target; + + gboolean adapt; +}; + +#define parent_class clapper_app_headerbar_parent_class +G_DEFINE_TYPE (ClapperAppHeaderbar, clapper_app_headerbar, CLAPPER_GTK_TYPE_CONTAINER); + +static void +_determine_win_buttons_reveal (ClapperAppHeaderbar *self) +{ + gboolean queue_reveal = gtk_revealer_get_reveal_child (GTK_REVEALER (self->queue_revealer)); + + gtk_revealer_set_reveal_child (GTK_REVEALER (self->win_buttons_revealer), + (queue_reveal) ? !self->adapt : TRUE); +} + +static void +container_adapt_cb (ClapperGtkContainer *container, gboolean adapt, + ClapperAppHeaderbar *self) +{ + GST_DEBUG_OBJECT (self, "Width adapted: %s", (adapt) ? "yes" : "no"); + self->adapt = adapt; + + gtk_revealer_set_reveal_child (GTK_REVEALER (self->previous_item_revealer), !adapt); + gtk_revealer_set_reveal_child (GTK_REVEALER (self->next_item_revealer), !adapt); + + _determine_win_buttons_reveal (self); +} + +static void +queue_reveal_cb (GtkRevealer *revealer, + GParamSpec *pspec G_GNUC_UNUSED, ClapperAppHeaderbar *self) +{ + _determine_win_buttons_reveal (self); +} + +static void +reveal_queue_button_clicked_cb (GtkButton *button, ClapperAppHeaderbar *self) +{ + gboolean reveal; + + GST_INFO_OBJECT (self, "Reveal queue button clicked"); + + reveal = gtk_revealer_get_reveal_child (GTK_REVEALER (self->queue_revealer)); + gtk_revealer_set_reveal_child (GTK_REVEALER (self->queue_revealer), !reveal); +} + +static void +drop_value_notify_cb (GtkDropTarget *drop_target, + GParamSpec *pspec G_GNUC_UNUSED, ClapperAppHeaderbar *self) +{ + const GValue *value = gtk_drop_target_get_value (drop_target); + + if (value && !clapper_app_utils_value_for_item_is_valid (value)) + gtk_drop_target_reject (drop_target); +} + +static gboolean +drop_cb (GtkDropTarget *drop_target, const GValue *value, + gdouble x, gdouble y, ClapperAppHeaderbar *self) +{ + GFile **files = NULL; + gint n_files = 0; + gboolean success = FALSE; + + if (clapper_app_utils_files_from_value (value, &files, &n_files)) { + ClapperPlayer *player; + + if ((player = clapper_gtk_get_player_from_ancestor (GTK_WIDGET (self)))) { + ClapperQueue *queue = clapper_player_get_queue (player); + gint i; + + for (i = 0; i < n_files; ++i) { + ClapperMediaItem *item = clapper_media_item_new_from_file (files[i]); + + clapper_queue_add_item (queue, item); + if (i == 0) // Select first added item for playback + clapper_queue_select_item (queue, item); + + gst_object_unref (item); + } + + success = TRUE; + } + + clapper_app_utils_files_free (files); + } + + return success; +} + +static void +clapper_app_headerbar_init (ClapperAppHeaderbar *self) +{ + gtk_widget_init_template (GTK_WIDGET (self)); + + gtk_drop_target_set_gtypes (self->drop_target, + (GType[3]) { GDK_TYPE_FILE_LIST, G_TYPE_FILE, G_TYPE_STRING }, 3); +} + +static void +clapper_app_headerbar_dispose (GObject *object) +{ + gtk_widget_dispose_template (GTK_WIDGET (object), CLAPPER_APP_TYPE_HEADERBAR); + + G_OBJECT_CLASS (parent_class)->dispose (object); +} + +static void +clapper_app_headerbar_finalize (GObject *object) +{ + ClapperAppHeaderbar *self = CLAPPER_APP_HEADERBAR_CAST (object); + + GST_TRACE_OBJECT (self, "Finalize"); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +clapper_app_headerbar_class_init (ClapperAppHeaderbarClass *klass) +{ + GObjectClass *gobject_class = (GObjectClass *) klass; + GtkWidgetClass *widget_class = (GtkWidgetClass *) klass; + + GST_DEBUG_CATEGORY_INIT (GST_CAT_DEFAULT, "clapperappheaderbar", 0, + "Clapper App Headerbar"); + + gobject_class->dispose = clapper_app_headerbar_dispose; + gobject_class->finalize = clapper_app_headerbar_finalize; + + gtk_widget_class_set_template_from_resource (widget_class, + CLAPPER_APP_RESOURCE_PREFIX "/ui/clapper-app-headerbar.ui"); + + gtk_widget_class_bind_template_child (widget_class, ClapperAppHeaderbar, queue_revealer); + gtk_widget_class_bind_template_child (widget_class, ClapperAppHeaderbar, previous_item_revealer); + gtk_widget_class_bind_template_child (widget_class, ClapperAppHeaderbar, next_item_revealer); + gtk_widget_class_bind_template_child (widget_class, ClapperAppHeaderbar, win_buttons_revealer); + gtk_widget_class_bind_template_child (widget_class, ClapperAppHeaderbar, drop_target); + + gtk_widget_class_bind_template_callback (widget_class, container_adapt_cb); + gtk_widget_class_bind_template_callback (widget_class, reveal_queue_button_clicked_cb); + gtk_widget_class_bind_template_callback (widget_class, queue_reveal_cb); + gtk_widget_class_bind_template_callback (widget_class, drop_value_notify_cb); + gtk_widget_class_bind_template_callback (widget_class, drop_cb); + + gtk_widget_class_set_css_name (widget_class, "clapper-app-headerbar"); +} diff --git a/src/bin/clapper-app/clapper-app-headerbar.h b/src/bin/clapper-app/clapper-app-headerbar.h new file mode 100644 index 00000000..47c9066d --- /dev/null +++ b/src/bin/clapper-app/clapper-app-headerbar.h @@ -0,0 +1,31 @@ +/* Clapper Application + * Copyright (C) 2024 RafaÅ‚ DziÄ™giel + * + * 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 . + */ + +#pragma once + +#include +#include +#include + +G_BEGIN_DECLS + +#define CLAPPER_APP_TYPE_HEADERBAR (clapper_app_headerbar_get_type()) +#define CLAPPER_APP_HEADERBAR_CAST(obj) ((ClapperAppHeaderbar *)(obj)) + +G_DECLARE_FINAL_TYPE (ClapperAppHeaderbar, clapper_app_headerbar, CLAPPER_APP, HEADERBAR, ClapperGtkContainer) + +G_END_DECLS diff --git a/src/bin/clapper-app/clapper-app-info-window.c b/src/bin/clapper-app/clapper-app-info-window.c new file mode 100644 index 00000000..74db101e --- /dev/null +++ b/src/bin/clapper-app/clapper-app-info-window.c @@ -0,0 +1,212 @@ +/* Clapper Application + * Copyright (C) 2024 RafaÅ‚ DziÄ™giel + * + * 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 . + */ + +#include "config.h" + +#include +#include +#include + +#include "clapper-app-info-window.h" +#include "clapper-app-property-row.h" +#include "clapper-app-list-item-utils.h" + +#define GST_CAT_DEFAULT clapper_app_info_window_debug +GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT); + +struct _ClapperAppInfoWindow +{ + AdwWindow parent; + + GtkWidget *vstreams_list; + GtkWidget *astreams_list; + GtkWidget *sstreams_list; + + ClapperPlayer *player; +}; + +#define parent_class clapper_app_info_window_parent_class +G_DEFINE_TYPE (ClapperAppInfoWindow, clapper_app_info_window, ADW_TYPE_WINDOW); + +enum +{ + PROP_0, + PROP_PLAYER, + PROP_LAST +}; + +static GParamSpec *param_specs[PROP_LAST] = { NULL, }; + +static gchar * +media_duration_closure (ClapperAppInfoWindow *self, gdouble duration) +{ + return g_strdup_printf ("%" CLAPPER_TIME_MS_FORMAT, CLAPPER_TIME_MS_ARGS (duration)); +} + +static gchar * +playback_element_name_closure (ClapperAppInfoWindow *self, GstElement *element) +{ + GstElementFactory *factory; + + if (!element || !(factory = gst_element_get_factory (element))) + return NULL; + + return gst_object_get_name (GST_OBJECT_CAST (factory)); +} + +static gchar * +playback_decoder_closure (ClapperAppInfoWindow *self, GstElement *decoder) +{ + GstElementFactory *factory; + gchar *el_name, *text; + gboolean is_hardware; + + if (!decoder || !(factory = gst_element_get_factory (decoder))) + return NULL; + + el_name = gst_object_get_name (GST_OBJECT_CAST (factory)); + is_hardware = gst_element_factory_list_is_type (factory, + GST_ELEMENT_FACTORY_TYPE_HARDWARE); + + text = g_strdup_printf ("%s [%s]", el_name, + (is_hardware) ? _("Hardware") : _("Software")); + g_free (el_name); + + return text; +} + +static GtkSelectionModel * +create_no_selection_closure (ClapperAppInfoWindow *self, ClapperStreamList *stream_list) +{ + return GTK_SELECTION_MODEL (gtk_no_selection_new (gst_object_ref (stream_list))); +} + +static gboolean +has_streams_closure (ClapperAppInfoWindow *self, guint n_streams) +{ + return (n_streams > 0); +} + +GtkWidget * +clapper_app_info_window_new (GtkApplication *gtk_app, ClapperPlayer *player) +{ + ClapperAppInfoWindow *window; + + window = g_object_new (CLAPPER_APP_TYPE_INFO_WINDOW, + "application", gtk_app, + "transient-for", gtk_application_get_active_window (gtk_app), + "player", player, + NULL); + + return GTK_WIDGET (window); +} + +static void +clapper_app_info_window_init (ClapperAppInfoWindow *self) +{ + gtk_widget_init_template (GTK_WIDGET (self)); + + gtk_widget_remove_css_class (self->vstreams_list, "view"); + gtk_widget_remove_css_class (self->astreams_list, "view"); + gtk_widget_remove_css_class (self->sstreams_list, "view"); +} + +static void +clapper_app_info_window_dispose (GObject *object) +{ + gtk_widget_dispose_template (GTK_WIDGET (object), CLAPPER_APP_TYPE_INFO_WINDOW); + + G_OBJECT_CLASS (parent_class)->dispose (object); +} + +static void +clapper_app_info_window_finalize (GObject *object) +{ + ClapperAppInfoWindow *self = CLAPPER_APP_INFO_WINDOW_CAST (object); + + GST_TRACE_OBJECT (self, "Finalize"); + + gst_clear_object (&self->player); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +clapper_app_info_window_get_property (GObject *object, guint prop_id, + GValue *value, GParamSpec *pspec) +{ + ClapperAppInfoWindow *self = CLAPPER_APP_INFO_WINDOW_CAST (object); + + switch (prop_id) { + case PROP_PLAYER: + g_value_set_object (value, self->player); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +clapper_app_info_window_set_property (GObject *object, guint prop_id, + const GValue *value, GParamSpec *pspec) +{ + ClapperAppInfoWindow *self = CLAPPER_APP_INFO_WINDOW_CAST (object); + + switch (prop_id) { + case PROP_PLAYER: + self->player = g_value_dup_object (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +clapper_app_info_window_class_init (ClapperAppInfoWindowClass *klass) +{ + GObjectClass *gobject_class = (GObjectClass *) klass; + GtkWidgetClass *widget_class = (GtkWidgetClass *) klass; + + GST_DEBUG_CATEGORY_INIT (GST_CAT_DEFAULT, "clapperappinfowindow", 0, + "Clapper App Info Window"); + + gobject_class->get_property = clapper_app_info_window_get_property; + gobject_class->set_property = clapper_app_info_window_set_property; + gobject_class->dispose = clapper_app_info_window_dispose; + gobject_class->finalize = clapper_app_info_window_finalize; + + gtk_widget_class_set_template_from_resource (widget_class, + CLAPPER_APP_RESOURCE_PREFIX "/ui/clapper-app-info-window.ui"); + + param_specs[PROP_PLAYER] = g_param_spec_object ("player", + NULL, NULL, CLAPPER_TYPE_PLAYER, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS); + + g_object_class_install_properties (gobject_class, PROP_LAST, param_specs); + + gtk_widget_class_bind_template_child (widget_class, ClapperAppInfoWindow, vstreams_list); + gtk_widget_class_bind_template_child (widget_class, ClapperAppInfoWindow, astreams_list); + gtk_widget_class_bind_template_child (widget_class, ClapperAppInfoWindow, sstreams_list); + + gtk_widget_class_bind_template_callback (widget_class, media_duration_closure); + gtk_widget_class_bind_template_callback (widget_class, playback_element_name_closure); + gtk_widget_class_bind_template_callback (widget_class, playback_decoder_closure); + gtk_widget_class_bind_template_callback (widget_class, create_no_selection_closure); + gtk_widget_class_bind_template_callback (widget_class, has_streams_closure); +} diff --git a/src/bin/clapper-app/clapper-app-info-window.h b/src/bin/clapper-app/clapper-app-info-window.h new file mode 100644 index 00000000..bfe73f74 --- /dev/null +++ b/src/bin/clapper-app/clapper-app-info-window.h @@ -0,0 +1,36 @@ +/* Clapper Application + * Copyright (C) 2024 RafaÅ‚ DziÄ™giel + * + * 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 . + */ + +#pragma once + +#include +#include +#include +#include +#include + +G_BEGIN_DECLS + +#define CLAPPER_APP_TYPE_INFO_WINDOW (clapper_app_info_window_get_type()) +#define CLAPPER_APP_INFO_WINDOW_CAST(obj) ((ClapperAppInfoWindow *)(obj)) + +G_DECLARE_FINAL_TYPE (ClapperAppInfoWindow, clapper_app_info_window, CLAPPER_APP, INFO_WINDOW, AdwWindow) + +G_GNUC_INTERNAL +GtkWidget * clapper_app_info_window_new (GtkApplication *gtk_app, ClapperPlayer *player); + +G_END_DECLS diff --git a/src/bin/clapper-app/clapper-app-list-item-utils.c b/src/bin/clapper-app/clapper-app-list-item-utils.c new file mode 100644 index 00000000..64870915 --- /dev/null +++ b/src/bin/clapper-app/clapper-app-list-item-utils.c @@ -0,0 +1,83 @@ +/* Clapper Application + * Copyright (C) 2024 RafaÅ‚ DziÄ™giel + * + * 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 . + */ + +#include "config.h" + +#include + +#include "clapper-app-list-item-utils.h" + +gchar * +clapper_app_list_item_make_stream_group_title (GtkListItem *list_item, ClapperStream *stream) +{ + ClapperStreamType stream_type = CLAPPER_STREAM_TYPE_UNKNOWN; + guint position = gtk_list_item_get_position (list_item); + gchar *title = NULL; + + if (stream) + stream_type = clapper_stream_get_stream_type (stream); + + switch (stream_type) { + case CLAPPER_STREAM_TYPE_VIDEO: + title = g_strdup_printf ("%s #%u", _("Video"), position); + break; + case CLAPPER_STREAM_TYPE_AUDIO: + title = g_strdup_printf ("%s #%u", _("Audio"), position); + break; + case CLAPPER_STREAM_TYPE_SUBTITLE: + title = g_strdup_printf ("%s #%u", _("Subtitles"), position); + break; + default: + break; + } + + return title; +} + +gchar * +clapper_app_list_item_make_resolution (GtkListItem *list_item, + gint width, gint height) +{ + return g_strdup_printf ("%ix%i", width, height); +} + +gchar * +clapper_app_list_item_make_bitrate (GtkListItem *list_item, guint bitrate) +{ + if (bitrate >= 1000000) + return g_strdup_printf ("%.3lf Mbps", (gdouble) bitrate / 1000000); + + return g_strdup_printf ("%u kbps", bitrate / 1000); +} + +gchar * +clapper_app_list_item_convert_int (GtkListItem *list_item, gint value) +{ + return g_strdup_printf ("%i", value); +} + +gchar * +clapper_app_list_item_convert_uint (GtkListItem *list_item, guint value) +{ + return g_strdup_printf ("%u", value); +} + +gchar * +clapper_app_list_item_convert_double (GtkListItem *list_item, gdouble value) +{ + return g_strdup_printf ("%.3lf", value); +} diff --git a/src/bin/clapper-app/clapper-app-list-item-utils.h b/src/bin/clapper-app/clapper-app-list-item-utils.h new file mode 100644 index 00000000..57aa111e --- /dev/null +++ b/src/bin/clapper-app/clapper-app-list-item-utils.h @@ -0,0 +1,38 @@ +/* Clapper Application + * Copyright (C) 2024 RafaÅ‚ DziÄ™giel + * + * 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 . + */ + +#pragma once + +#include +#include +#include + +G_BEGIN_DECLS + +gchar * clapper_app_list_item_make_stream_group_title (GtkListItem *list_item, ClapperStream *stream); + +gchar * clapper_app_list_item_make_resolution (GtkListItem *list_item, gint width, gint height); + +gchar * clapper_app_list_item_make_bitrate (GtkListItem *list_item, guint value); + +gchar * clapper_app_list_item_convert_int (GtkListItem *list_item, gint value); + +gchar * clapper_app_list_item_convert_uint (GtkListItem *list_item, guint value); + +gchar * clapper_app_list_item_convert_double (GtkListItem *list_item, gdouble value); + +G_END_DECLS diff --git a/src/bin/clapper-app/clapper-app-media-item-box.c b/src/bin/clapper-app/clapper-app-media-item-box.c new file mode 100644 index 00000000..71c1fa3f --- /dev/null +++ b/src/bin/clapper-app/clapper-app-media-item-box.c @@ -0,0 +1,106 @@ +/* Clapper Application + * Copyright (C) 2024 RafaÅ‚ DziÄ™giel + * + * 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 . + */ + +#include "clapper-app-media-item-box.h" + +struct _ClapperAppMediaItemBox +{ + GtkBox parent; + + ClapperMediaItem *media_item; +}; + +enum +{ + PROP_0, + PROP_MEDIA_ITEM, + PROP_LAST +}; + +#define parent_class clapper_app_media_item_box_parent_class +G_DEFINE_TYPE (ClapperAppMediaItemBox, clapper_app_media_item_box, GTK_TYPE_BOX); + +static GParamSpec *param_specs[PROP_LAST] = { NULL, }; + +ClapperMediaItem * +clapper_app_media_item_box_get_media_item (ClapperAppMediaItemBox *self) +{ + return self->media_item; +} + +static void +clapper_app_media_item_box_init (ClapperAppMediaItemBox *self) +{ +} + +static void +clapper_app_media_item_box_finalize (GObject *object) +{ + ClapperAppMediaItemBox *self = CLAPPER_APP_MEDIA_ITEM_BOX_CAST (object); + + gst_clear_object (&self->media_item); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +clapper_app_media_item_box_get_property (GObject *object, guint prop_id, + GValue *value, GParamSpec *pspec) +{ + ClapperAppMediaItemBox *self = CLAPPER_APP_MEDIA_ITEM_BOX_CAST (object); + + switch (prop_id) { + case PROP_MEDIA_ITEM: + g_value_set_object (value, clapper_app_media_item_box_get_media_item (self)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +clapper_app_media_item_box_set_property (GObject *object, guint prop_id, + const GValue *value, GParamSpec *pspec) +{ + ClapperAppMediaItemBox *self = CLAPPER_APP_MEDIA_ITEM_BOX_CAST (object); + + switch (prop_id) { + case PROP_MEDIA_ITEM: + gst_object_replace ((GstObject **) &self->media_item, GST_OBJECT_CAST (g_value_get_object (value))); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +clapper_app_media_item_box_class_init (ClapperAppMediaItemBoxClass *klass) +{ + GObjectClass *gobject_class = (GObjectClass *) klass; + + gobject_class->get_property = clapper_app_media_item_box_get_property; + gobject_class->set_property = clapper_app_media_item_box_set_property; + gobject_class->finalize = clapper_app_media_item_box_finalize; + + param_specs[PROP_MEDIA_ITEM] = g_param_spec_object ("media-item", + NULL, NULL, CLAPPER_TYPE_MEDIA_ITEM, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); + + g_object_class_install_properties (gobject_class, PROP_LAST, param_specs); +} diff --git a/src/bin/clapper-app/clapper-app-media-item-box.h b/src/bin/clapper-app/clapper-app-media-item-box.h new file mode 100644 index 00000000..7ca24e5a --- /dev/null +++ b/src/bin/clapper-app/clapper-app-media-item-box.h @@ -0,0 +1,35 @@ +/* Clapper Application + * Copyright (C) 2024 RafaÅ‚ DziÄ™giel + * + * 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 . + */ + +#pragma once + +#include +#include +#include +#include + +G_BEGIN_DECLS + +#define CLAPPER_APP_TYPE_MEDIA_ITEM_BOX (clapper_app_media_item_box_get_type()) +#define CLAPPER_APP_MEDIA_ITEM_BOX_CAST(obj) ((ClapperAppMediaItemBox *)(obj)) + +G_DECLARE_FINAL_TYPE (ClapperAppMediaItemBox, clapper_app_media_item_box, CLAPPER_APP, MEDIA_ITEM_BOX, GtkBox) + +G_GNUC_INTERNAL +ClapperMediaItem * clapper_app_media_item_box_get_media_item (ClapperAppMediaItemBox *box); + +G_END_DECLS diff --git a/src/bin/clapper-app/clapper-app-preferences-window.c b/src/bin/clapper-app/clapper-app-preferences-window.c new file mode 100644 index 00000000..8a707dcc --- /dev/null +++ b/src/bin/clapper-app/clapper-app-preferences-window.c @@ -0,0 +1,614 @@ +/* Clapper Application + * Copyright (C) 2024 RafaÅ‚ DziÄ™giel + * + * 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 . + */ + +#include "config.h" + +#include +#include +#include + +#include "clapper-app-preferences-window.h" +#include "clapper-app-application.h" +#include "clapper-app-utils.h" + +#define GST_CAT_DEFAULT clapper_app_preferences_window_debug +GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT); + +struct _ClapperAppPreferencesWindow +{ + AdwPreferencesWindow parent; + + AdwComboRow *seek_method_combo_row; + AdwComboRow *seek_unit_combo_row; + AdwSpinRow *seek_value_spin_row; + AdwSwitchRow *server_switch_row; + + AdwSpinRow *audio_offset_spin_row; + AdwSpinRow *subtitle_offset_spin_row; + GtkFontDialogButton *font_dialog_button; + + AdwNavigationPage *plugins_subpage; + AdwComboRow *plugins_combo_row; + AdwComboRow *features_combo_row; + AdwPreferencesGroup *overrides_group; + + GSettings *settings; + + GList *features; + GtkStringList *plugins_list; + + GPtrArray *rank_rows; + gulong ranks_setting_changed_id; + + gboolean ranking_has_plugins_model; +}; + +#define parent_class clapper_app_preferences_window_parent_class +G_DEFINE_TYPE (ClapperAppPreferencesWindow, clapper_app_preferences_window, ADW_TYPE_PREFERENCES_WINDOW); + +typedef struct +{ + ClapperAppPreferencesWindow *prefs; + GHashTable *parsed_overrides; + gboolean updated; +} ClapperAppPreferencesIterRanksData; + +enum +{ + PROP_0, + PROP_RANK_ROWS, + PROP_LAST +}; + +static GParamSpec *param_specs[PROP_LAST] = { NULL, }; + +/* Sort by plugin name and if the same, sort by element name */ +static gint +_compare_plugins_cb (gconstpointer ptr_a, gconstpointer ptr_b) +{ + GstPluginFeature *feature_a = GST_PLUGIN_FEATURE_CAST (ptr_a); + GstPluginFeature *feature_b = GST_PLUGIN_FEATURE_CAST (ptr_b); + gint result; + + result = strcmp ( + gst_plugin_feature_get_plugin_name (feature_a), + gst_plugin_feature_get_plugin_name (feature_b)); + + if (result == 0) { + result = strcmp ( + gst_plugin_feature_get_name (feature_a), + gst_plugin_feature_get_name (feature_b)); + } + + return result; +} + +static gint +_compare_names_cb (gconstpointer ptr_a, gconstpointer ptr_b) +{ + GstPluginFeature *feature = GST_PLUGIN_FEATURE_CAST (ptr_a); + const gchar *plugin_name = (const gchar *) ptr_b; + + return strcmp (gst_plugin_feature_get_plugin_name (feature), plugin_name); +} + +static gboolean +_prefs_rows_compare_func (gconstpointer ptr_a, gconstpointer ptr_b) +{ + AdwPreferencesRow *row = (AdwPreferencesRow *) ptr_a; + const gchar *name = (const gchar *) ptr_b; + + return (strcmp (adw_preferences_row_get_title (row), name) == 0); +} + +static gboolean +_find_rank_overide_for_name (ClapperAppPreferencesWindow *self, + const gchar *plugin_feature, guint *index) +{ + return g_ptr_array_find_with_equal_func (self->rank_rows, + plugin_feature, (GEqualFunc) _prefs_rows_compare_func, index); +} + +static gboolean +_plugin_feature_filter_cb (GstPluginFeature *feature, gpointer user_data G_GNUC_UNUSED) +{ + return GST_IS_ELEMENT_FACTORY (feature); +} + +static void +remove_rank_override_button_clicked_cb (GtkButton *button, ClapperAppPreferencesWindow *self) +{ + GtkWidget *spin_row; + const gchar *feature_name; + + spin_row = gtk_widget_get_ancestor (GTK_WIDGET (button), ADW_TYPE_SPIN_ROW); + feature_name = adw_preferences_row_get_title (ADW_PREFERENCES_ROW (spin_row)); + + GST_DEBUG ("Removing rank override for: %s", feature_name); + + g_ptr_array_remove (self->rank_rows, spin_row); + adw_preferences_group_remove (self->overrides_group, GTK_WIDGET (spin_row)); + + gtk_widget_set_visible (GTK_WIDGET (self->overrides_group), self->rank_rows->len > 0); + + g_object_notify_by_pspec (G_OBJECT (self), param_specs[PROP_RANK_ROWS]); +} + +static void +_add_rank_override (ClapperAppPreferencesWindow *self, + const gchar *feature_name, GstRank rank, gboolean from_env) +{ + GtkWidget *spin_row, *remove_button; + + spin_row = adw_spin_row_new_with_range (0, G_MAXINT, 1); + remove_button = gtk_button_new_from_icon_name ("user-trash-symbolic"); + + gtk_widget_set_halign (remove_button, GTK_ALIGN_CENTER); + gtk_widget_set_valign (remove_button, GTK_ALIGN_CENTER); + gtk_widget_add_css_class (remove_button, "circular"); + + adw_preferences_row_set_title (ADW_PREFERENCES_ROW (spin_row), feature_name); + adw_action_row_add_prefix (ADW_ACTION_ROW (spin_row), remove_button); + adw_spin_row_set_numeric (ADW_SPIN_ROW (spin_row), TRUE); + adw_spin_row_set_value (ADW_SPIN_ROW (spin_row), rank); + gtk_widget_set_sensitive (spin_row, !from_env); + + if (!from_env) { + g_signal_connect (remove_button, "clicked", + G_CALLBACK (remove_rank_override_button_clicked_cb), self); + } + + adw_preferences_group_add (self->overrides_group, spin_row); + g_ptr_array_add (self->rank_rows, spin_row); +} + +static void +_iter_ranks_func (const gchar *feature_name, GstRank rank, + gboolean from_env, ClapperAppPreferencesIterRanksData *data) +{ + ClapperAppPreferencesWindow *self = data->prefs; + guint index = 0; + + if (_find_rank_overide_for_name (self, feature_name, &index)) { + GtkWidget *spin_row = g_ptr_array_index (self->rank_rows, index); + + if (rank != adw_spin_row_get_value (ADW_SPIN_ROW (spin_row))) { + adw_spin_row_set_value (ADW_SPIN_ROW (spin_row), rank); + data->updated = TRUE; + } + if (from_env == gtk_widget_get_sensitive (spin_row)) { + gtk_widget_set_sensitive (spin_row, !from_env); + data->updated = TRUE; + } + } else { + _add_rank_override (self, feature_name, rank, from_env); + data->updated = TRUE; + } + g_hash_table_insert (data->parsed_overrides, + g_strdup (feature_name), GINT_TO_POINTER (rank)); +} + +static void +_update_rank_overrides (ClapperAppPreferencesWindow *self) +{ + ClapperAppPreferencesIterRanksData *data; + gint i; + + data = g_new (ClapperAppPreferencesIterRanksData, 1); + data->prefs = self; + data->parsed_overrides = g_hash_table_new (g_str_hash, g_str_equal); + data->updated = FALSE; + + GST_DEBUG ("Updating rank overrides"); + + clapper_app_utils_iterate_plugin_feature_ranks (self->settings, + (ClapperAppUtilsIterRanks) _iter_ranks_func, data); + + for (i = self->rank_rows->len - 1; i >= 0; --i) { + AdwPreferencesRow *prefs_row = ADW_PREFERENCES_ROW (g_ptr_array_index (self->rank_rows, i)); + const gchar *feature_name = adw_preferences_row_get_title (prefs_row); + + if (!g_hash_table_contains (data->parsed_overrides, feature_name)) { + g_ptr_array_remove_index (self->rank_rows, i); + adw_preferences_group_remove (self->overrides_group, GTK_WIDGET (prefs_row)); + data->updated = TRUE; + } + } + + if (data->updated) { + gtk_widget_set_visible (GTK_WIDGET (self->overrides_group), self->rank_rows->len > 0); + g_object_notify_by_pspec (G_OBJECT (self), param_specs[PROP_RANK_ROWS]); + } + + g_hash_table_unref (data->parsed_overrides); + g_free (data); +} + +static void +add_override_button_clicked_cb (GtkButton *button, ClapperAppPreferencesWindow *self) +{ + GstPluginFeature *plugin_feature; + GstRank rank; + GtkStringObject *string_obj; + const gchar *feature_name; + + string_obj = GTK_STRING_OBJECT (adw_combo_row_get_selected_item (self->features_combo_row)); + + /* Should never happen, as button is insensitive when no selection */ + if (G_UNLIKELY (string_obj == NULL)) + return; + + feature_name = gtk_string_object_get_string (string_obj); + + GST_DEBUG ("Adding rank override for: %s", feature_name); + + plugin_feature = gst_registry_lookup_feature (gst_registry_get (), feature_name); + rank = gst_plugin_feature_get_rank (plugin_feature); + + _add_rank_override (self, feature_name, rank, FALSE); + gtk_widget_set_visible (GTK_WIDGET (self->overrides_group), self->rank_rows->len > 0); + + g_object_notify_by_pspec (G_OBJECT (self), param_specs[PROP_RANK_ROWS]); + + gst_object_unref (plugin_feature); +} + +static GtkStringList * +_make_plugin_features_string_list (ClapperAppPreferencesWindow *self, const gchar *plugin_name) +{ + GList *features, *feat; + GtkStringList *features_list; + GStrvBuilder *builder; + gchar **features_names; + + GST_DEBUG ("Reading plugin features for plugin: %s", plugin_name); + + features = g_list_find_custom (self->features, plugin_name, (GCompareFunc) _compare_names_cb); + builder = g_strv_builder_new (); + + for (feat = features; feat != NULL; feat = feat->next) { + GstPluginFeature *feature = GST_PLUGIN_FEATURE_CAST (feat->data); + const gchar *feature_name = gst_plugin_feature_get_name (feature); + + if (strcmp (gst_plugin_feature_get_plugin_name (feature), plugin_name) != 0) + break; + + g_strv_builder_add (builder, feature_name); + } + + features_names = g_strv_builder_end (builder); + g_strv_builder_unref (builder); + + features_list = gtk_string_list_new ((const gchar *const *) features_names); + g_strfreev (features_names); + + GST_DEBUG ("Found plugin features: %u", g_list_model_get_n_items (G_LIST_MODEL (features_list))); + + return features_list; +} + +static GtkStringList * +ranking_features_model_closure (ClapperAppPreferencesWindow *self, GtkStringObject *string_obj) +{ + if (!string_obj || !self->ranking_has_plugins_model) + return NULL; + + return _make_plugin_features_string_list (self, gtk_string_object_get_string (string_obj)); +} + +static gboolean +add_override_button_sensitive_closure (ClapperAppPreferencesWindow *self, + GtkStringObject *string_obj, GPtrArray *rank_rows) +{ + return (string_obj && !_find_rank_overide_for_name (self, + gtk_string_object_get_string (string_obj), NULL)); +} + +static void +plugin_feature_ranks_settings_changed_cb (GSettings *settings, + gchar *key G_GNUC_UNUSED, ClapperAppPreferencesWindow *self) +{ + GST_DEBUG ("Plugin feature ranks stored setting changed"); + _update_rank_overrides (self); +} + +static void +_ensure_plugins_and_features_lists (ClapperAppPreferencesWindow *self) +{ + GList *feat; + GStrvBuilder *builder; + gchar **plugin_names; + const gchar *last_plugin_name = NULL; + + /* Return if we were here already. Features can be NULL + * when no plugins are found at specified directory */ + if (self->features || self->plugins_list) + return; + + GST_DEBUG ("Reading available plugin features..."); + + self->features = gst_registry_feature_filter (gst_registry_get (), + (GstPluginFeatureFilter) _plugin_feature_filter_cb, + FALSE, NULL); + self->features = g_list_sort (self->features, (GCompareFunc) _compare_plugins_cb); + + builder = g_strv_builder_new (); + + for (feat = self->features; feat != NULL; feat = feat->next) { + GstPluginFeature *feature = GST_PLUGIN_FEATURE_CAST (feat->data); + const gchar *plugin_name = gst_plugin_feature_get_plugin_name (feature); + + if (g_strcmp0 (plugin_name, last_plugin_name) != 0) { + g_strv_builder_add (builder, plugin_name); + last_plugin_name = plugin_name; + } + } + + plugin_names = g_strv_builder_end (builder); + g_strv_builder_unref (builder); + + GST_DEBUG ("Read all available plugin features"); + + self->plugins_list = gtk_string_list_new ((const gchar *const *) plugin_names); + g_strfreev (plugin_names); +} + +static void +plugin_ranking_activated_cb (AdwActionRow *action_row, ClapperAppPreferencesWindow *self) +{ + _ensure_plugins_and_features_lists (self); + + if (!self->ranking_has_plugins_model) { + adw_combo_row_set_model (self->plugins_combo_row, G_LIST_MODEL (self->plugins_list)); + adw_combo_row_set_selected (self->plugins_combo_row, GTK_INVALID_LIST_POSITION); + + GST_DEBUG ("Populated plugins combo row in ranking subpage"); + + /* This is needed here so we will not populate plugin features row after setting + * model and unset it again after changing back to GTK_INVALID_LIST_POSITION */ + self->ranking_has_plugins_model = TRUE; + } + + if (self->ranks_setting_changed_id == 0) { + self->ranks_setting_changed_id = g_signal_connect (self->settings, + "changed::plugin-feature-ranks", + G_CALLBACK (plugin_feature_ranks_settings_changed_cb), self); + } + _update_rank_overrides (self); + + adw_preferences_window_push_subpage (ADW_PREFERENCES_WINDOW (self), self->plugins_subpage); +} + +static void +plugin_ranking_unrealize_cb (GtkWidget *widget, ClapperAppPreferencesWindow *self) +{ + GString *string; + gchar *ranks_str; + guint i; + + /* Since we are closing ranking subpage, disconnect this + * signal as we do not need to update widgets immediately */ + if (self->ranks_setting_changed_id != 0) { + g_signal_handler_disconnect (self->settings, self->ranks_setting_changed_id); + self->ranks_setting_changed_id = 0; + } + + GST_DEBUG ("Saving current rank overrides"); + string = g_string_new (NULL); + + for (i = 0; i < self->rank_rows->len; ++i) { + GtkWidget *spin_row = g_ptr_array_index (self->rank_rows, i); + GstRank rank; + const gchar *feature_name; + + /* Insensitive are from env, we do not want to save these */ + if (!gtk_widget_get_sensitive (spin_row)) + continue; + + rank = adw_spin_row_get_value (ADW_SPIN_ROW (spin_row)); + feature_name = adw_preferences_row_get_title (ADW_PREFERENCES_ROW (spin_row)); + + if (string->len == 0) + g_string_append_printf (string, "%s:%i", feature_name, rank); + else + g_string_append_printf (string, ",%s:%i", feature_name, rank); + } + + ranks_str = g_string_free_and_steal (string); + g_settings_set_string (self->settings, "plugin-feature-ranks", ranks_str); + g_free (ranks_str); +} + +static gchar * +seek_method_name_closure (AdwEnumListItem *list_item, gpointer *user_data G_GNUC_UNUSED) +{ + switch (adw_enum_list_item_get_value (list_item)) { + case CLAPPER_PLAYER_SEEK_METHOD_ACCURATE: + return g_strdup (_("Accurate")); + case CLAPPER_PLAYER_SEEK_METHOD_NORMAL: + return g_strdup (_("Normal")); + case CLAPPER_PLAYER_SEEK_METHOD_FAST: + return g_strdup (_("Fast")); + default: + return NULL; + } +} + +static gboolean +_get_font_mapping (GValue *value, + GVariant *variant, gpointer user_data G_GNUC_UNUSED) +{ + PangoFontDescription *desc; + const gchar *desc_str = g_variant_get_string (variant, NULL); + + desc = pango_font_description_from_string (desc_str); + g_value_set_boxed (value, desc); + + pango_font_description_free (desc); + + return TRUE; +} + +static GVariant * +_set_font_mapping (const GValue *value, + const GVariantType *expected_type, gpointer user_data G_GNUC_UNUSED) +{ + PangoFontDescription *desc; + gchar *desc_str; + + desc = (PangoFontDescription *) g_value_get_boxed (value); + desc_str = pango_font_description_to_string (desc); + + return g_variant_new_take_string (desc_str); +} + +GtkWidget * +clapper_app_preferences_window_new (GtkApplication *gtk_app) +{ + ClapperAppPreferencesWindow *window; + + window = g_object_new (CLAPPER_APP_TYPE_PREFERENCES_WINDOW, + "application", gtk_app, + "transient-for", gtk_application_get_active_window (gtk_app), + NULL); + + return GTK_WIDGET (window); +} + +static void +clapper_app_preferences_window_init (ClapperAppPreferencesWindow *self) +{ + gtk_widget_init_template (GTK_WIDGET (self)); + + self->rank_rows = g_ptr_array_new (); + + self->settings = g_settings_new (CLAPPER_APP_ID); + + g_settings_bind (self->settings, "seek-method", + self->seek_method_combo_row, "selected", G_SETTINGS_BIND_DEFAULT); + g_settings_bind (self->settings, "seek-unit", + self->seek_unit_combo_row, "selected", G_SETTINGS_BIND_DEFAULT); + g_settings_bind (self->settings, "seek-value", + self->seek_value_spin_row, "value", G_SETTINGS_BIND_DEFAULT); + +#if CLAPPER_HAVE_SERVER + g_settings_bind (self->settings, "server-enabled", + self->server_switch_row, "active", G_SETTINGS_BIND_DEFAULT); +#else + gtk_widget_set_sensitive (GTK_WIDGET (self->server_switch_row), FALSE); +#endif + + g_settings_bind (self->settings, "audio-offset", + self->audio_offset_spin_row, "value", G_SETTINGS_BIND_DEFAULT); + g_settings_bind (self->settings, "subtitle-offset", + self->subtitle_offset_spin_row, "value", G_SETTINGS_BIND_DEFAULT); + g_settings_bind_with_mapping (self->settings, "subtitle-font-desc", + self->font_dialog_button, "font-desc", G_SETTINGS_BIND_DEFAULT, + (GSettingsBindGetMapping) _get_font_mapping, + (GSettingsBindSetMapping) _set_font_mapping, + NULL, NULL); +} + +static void +clapper_app_preferences_window_dispose (GObject *object) +{ + ClapperAppPreferencesWindow *self = CLAPPER_APP_PREFERENCES_WINDOW_CAST (object); + + g_clear_pointer (&self->rank_rows, g_ptr_array_unref); + gtk_widget_dispose_template (GTK_WIDGET (self), CLAPPER_APP_TYPE_PREFERENCES_WINDOW); + + G_OBJECT_CLASS (parent_class)->dispose (object); +} + +static void +clapper_app_preferences_window_finalize (GObject *object) +{ + ClapperAppPreferencesWindow *self = CLAPPER_APP_PREFERENCES_WINDOW_CAST (object); + + GST_TRACE_OBJECT (self, "Finalize"); + + g_object_unref (self->settings); + + g_clear_object (&self->plugins_list); + + if (self->features) + gst_plugin_feature_list_free (self->features); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +clapper_app_preferences_get_property (GObject *object, guint prop_id, + GValue *value, GParamSpec *pspec) +{ + ClapperAppPreferencesWindow *self = CLAPPER_APP_PREFERENCES_WINDOW_CAST (object); + + switch (prop_id) { + case PROP_RANK_ROWS: + g_value_set_boxed (value, self->rank_rows); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +clapper_app_preferences_window_class_init (ClapperAppPreferencesWindowClass *klass) +{ + GObjectClass *gobject_class = (GObjectClass *) klass; + GtkWidgetClass *widget_class = (GtkWidgetClass *) klass; + + GST_DEBUG_CATEGORY_INIT (GST_CAT_DEFAULT, "clapperapppreferenceswindow", 0, + "Clapper App Preferences Window"); + + gobject_class->get_property = clapper_app_preferences_get_property; + gobject_class->dispose = clapper_app_preferences_window_dispose; + gobject_class->finalize = clapper_app_preferences_window_finalize; + + gtk_widget_class_set_template_from_resource (widget_class, + CLAPPER_APP_RESOURCE_PREFIX "/ui/clapper-app-preferences-window.ui"); + + param_specs[PROP_RANK_ROWS] = g_param_spec_boxed ("rank-rows", + NULL, NULL, G_TYPE_PTR_ARRAY, + G_PARAM_READABLE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS); + + g_object_class_install_properties (gobject_class, PROP_LAST, param_specs); + + gtk_widget_class_bind_template_child (widget_class, ClapperAppPreferencesWindow, seek_method_combo_row); + gtk_widget_class_bind_template_child (widget_class, ClapperAppPreferencesWindow, seek_unit_combo_row); + gtk_widget_class_bind_template_child (widget_class, ClapperAppPreferencesWindow, seek_value_spin_row); + gtk_widget_class_bind_template_child (widget_class, ClapperAppPreferencesWindow, server_switch_row); + + gtk_widget_class_bind_template_child (widget_class, ClapperAppPreferencesWindow, audio_offset_spin_row); + gtk_widget_class_bind_template_child (widget_class, ClapperAppPreferencesWindow, subtitle_offset_spin_row); + gtk_widget_class_bind_template_child (widget_class, ClapperAppPreferencesWindow, font_dialog_button); + + gtk_widget_class_bind_template_child (widget_class, ClapperAppPreferencesWindow, plugins_subpage); + gtk_widget_class_bind_template_child (widget_class, ClapperAppPreferencesWindow, plugins_combo_row); + gtk_widget_class_bind_template_child (widget_class, ClapperAppPreferencesWindow, features_combo_row); + gtk_widget_class_bind_template_child (widget_class, ClapperAppPreferencesWindow, overrides_group); + + gtk_widget_class_bind_template_callback (widget_class, seek_method_name_closure); + + gtk_widget_class_bind_template_callback (widget_class, plugin_ranking_activated_cb); + gtk_widget_class_bind_template_callback (widget_class, plugin_ranking_unrealize_cb); + + gtk_widget_class_bind_template_callback (widget_class, ranking_features_model_closure); + gtk_widget_class_bind_template_callback (widget_class, add_override_button_sensitive_closure); + gtk_widget_class_bind_template_callback (widget_class, add_override_button_clicked_cb); +} diff --git a/src/bin/clapper-app/clapper-app-preferences-window.h b/src/bin/clapper-app/clapper-app-preferences-window.h new file mode 100644 index 00000000..fb45bf58 --- /dev/null +++ b/src/bin/clapper-app/clapper-app-preferences-window.h @@ -0,0 +1,35 @@ +/* Clapper Application + * Copyright (C) 2024 RafaÅ‚ DziÄ™giel + * + * 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 . + */ + +#pragma once + +#include +#include +#include +#include + +G_BEGIN_DECLS + +#define CLAPPER_APP_TYPE_PREFERENCES_WINDOW (clapper_app_preferences_window_get_type()) +#define CLAPPER_APP_PREFERENCES_WINDOW_CAST(obj) ((ClapperAppPreferencesWindow *)(obj)) + +G_DECLARE_FINAL_TYPE (ClapperAppPreferencesWindow, clapper_app_preferences_window, CLAPPER_APP, PREFERENCES_WINDOW, AdwPreferencesWindow) + +G_GNUC_INTERNAL +GtkWidget * clapper_app_preferences_window_new (GtkApplication *gtk_app); + +G_END_DECLS diff --git a/src/bin/clapper-app/clapper-app-property-row.c b/src/bin/clapper-app/clapper-app-property-row.c new file mode 100644 index 00000000..76853647 --- /dev/null +++ b/src/bin/clapper-app/clapper-app-property-row.c @@ -0,0 +1,77 @@ +/* Clapper Application + * Copyright (C) 2024 RafaÅ‚ DziÄ™giel + * + * 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 . + */ + +#include "clapper-app-property-row.h" + +struct _ClapperAppPropertyRow +{ + AdwActionRow parent; +}; + +#define parent_class clapper_app_property_row_parent_class +G_DEFINE_TYPE (ClapperAppPropertyRow, clapper_app_property_row, ADW_TYPE_ACTION_ROW); + +static inline void +_ensure_subtitle (AdwActionRow *action_row) +{ + const gchar *subtitle = adw_action_row_get_subtitle (action_row); + + if (!subtitle || strlen (subtitle) == 0) + adw_action_row_set_subtitle (action_row, "-"); +} + +static void +_subtitle_changed_cb (AdwActionRow *action_row, + GParamSpec *pspec G_GNUC_UNUSED, gpointer user_data G_GNUC_UNUSED) +{ + _ensure_subtitle (action_row); +} + +static void +clapper_app_property_row_realize (GtkWidget *widget) +{ + _ensure_subtitle (ADW_ACTION_ROW (widget)); + + g_signal_connect (widget, "notify::subtitle", + G_CALLBACK (_subtitle_changed_cb), NULL); + + GTK_WIDGET_CLASS (parent_class)->realize (widget); +} + +static void +clapper_app_property_row_unrealize (GtkWidget *widget) +{ + g_signal_handlers_disconnect_by_func (widget, + _subtitle_changed_cb, NULL); + + GTK_WIDGET_CLASS (parent_class)->unrealize (widget); +} + +static void +clapper_app_property_row_init (ClapperAppPropertyRow *self) +{ + gtk_widget_add_css_class (GTK_WIDGET (self), "property"); +} + +static void +clapper_app_property_row_class_init (ClapperAppPropertyRowClass *klass) +{ + GtkWidgetClass *widget_class = (GtkWidgetClass *) klass; + + widget_class->realize = clapper_app_property_row_realize; + widget_class->unrealize = clapper_app_property_row_unrealize; +} diff --git a/src/bin/clapper-app/clapper-app-property-row.h b/src/bin/clapper-app/clapper-app-property-row.h new file mode 100644 index 00000000..c5171691 --- /dev/null +++ b/src/bin/clapper-app/clapper-app-property-row.h @@ -0,0 +1,31 @@ +/* Clapper Application + * Copyright (C) 2024 RafaÅ‚ DziÄ™giel + * + * 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 . + */ + +#pragma once + +#include +#include +#include + +G_BEGIN_DECLS + +#define CLAPPER_APP_TYPE_PROPERTY_ROW (clapper_app_property_row_get_type()) +#define CLAPPER_APP_PROPERTY_ROW_CAST(obj) ((ClapperAppPropertyRow *)(obj)) + +G_DECLARE_FINAL_TYPE (ClapperAppPropertyRow, clapper_app_property_row, CLAPPER_APP, PROPERTY_ROW, AdwActionRow) + +G_END_DECLS diff --git a/src/bin/clapper-app/clapper-app-queue-list.c b/src/bin/clapper-app/clapper-app-queue-list.c new file mode 100644 index 00000000..eb7982c0 --- /dev/null +++ b/src/bin/clapper-app/clapper-app-queue-list.c @@ -0,0 +1,472 @@ +/* Clapper Application + * Copyright (C) 2024 RafaÅ‚ DziÄ™giel + * + * 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 . + */ + +#include "config.h" + +#include + +#include "clapper-app-queue-list.h" +#include "clapper-app-queue-selection.h" +#include "clapper-app-media-item-box.h" +#include "clapper-app-utils.h" + +#define GST_CAT_DEFAULT clapper_app_queue_list_debug +GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT); + +struct _ClapperAppQueueList +{ + GtkBox parent; + + GtkWidget *progression_drop_down; + GtkWidget *list_view; + + GtkWidget *stack; + GtkWidget *stack_default_page; + GtkWidget *stack_trash_page; + + GtkDropTarget *trash_drop_target; + GtkDropTarget *drop_target; + + GBinding *queue_progression_binding; + + GtkWidget *list_target; // store last target + gboolean drop_after; // if should drop below list_target +}; + +#define parent_class clapper_app_queue_list_parent_class +G_DEFINE_TYPE (ClapperAppQueueList, clapper_app_queue_list, GTK_TYPE_BOX); + +typedef struct +{ + ClapperMediaItem *item; + GtkWidget *widget; + GdkPaintable *paintable; + gdouble x, y; +} ClapperAppQueueListDragData; + +static GdkContentProvider * +drag_item_prepare_cb (GtkDragSource *drag_source, gdouble x, gdouble y, ClapperAppQueueList *self) +{ + GtkWidget *list_view, *pickup, *list_widget; + GdkPaintable *paintable; + ClapperMediaItem *item; + ClapperAppQueueListDragData *drag_data; + graphene_point_t p; + + /* Ensure no target yet */ + self->list_target = NULL; + + list_view = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (drag_source)); + pickup = gtk_widget_pick (list_view, x, y, GTK_PICK_DEFAULT); + + if (G_UNLIKELY (pickup == NULL) || !CLAPPER_APP_IS_MEDIA_ITEM_BOX (pickup)) + return NULL; + + list_widget = gtk_widget_get_parent (pickup); + item = clapper_app_media_item_box_get_media_item (CLAPPER_APP_MEDIA_ITEM_BOX_CAST (pickup)); + + if (G_UNLIKELY (item == NULL || list_widget == NULL)) + return NULL; + + GST_DEBUG_OBJECT (self, "Preparing drag for: %" GST_PTR_FORMAT, item); + + if (!gtk_widget_compute_point (list_view, list_widget, &GRAPHENE_POINT_INIT (x, y), &p)) + graphene_point_init (&p, x, y); + + paintable = gtk_widget_paintable_new (list_widget); + + drag_data = g_new0 (ClapperAppQueueListDragData, 1); + drag_data->item = gst_object_ref (item); + drag_data->widget = g_object_ref_sink (pickup); + drag_data->paintable = gdk_paintable_get_current_image (paintable); + drag_data->x = p.x; + drag_data->y = p.y; + + g_object_set_data (G_OBJECT (self), "drag-data", drag_data); + + g_object_unref (paintable); + + return gdk_content_provider_new_typed (GTK_TYPE_WIDGET, pickup); +} + +static void +drag_item_drag_begin_cb (GtkDragSource *drag_source, GdkDrag *drag, ClapperAppQueueList *self) +{ + ClapperAppQueueListDragData *drag_data; + GtkWidget *list_view; + + drag_data = (ClapperAppQueueListDragData *) g_object_get_data (G_OBJECT (self), "drag-data"); + + gtk_drag_source_set_icon (drag_source, drag_data->paintable, drag_data->x, drag_data->y); + gtk_widget_set_opacity (drag_data->widget, 0.3); + + list_view = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (drag_source)); + gtk_widget_add_css_class (list_view, "dnd"); + + gtk_stack_set_visible_child (GTK_STACK (self->stack), self->stack_trash_page); +} + +static void +drag_item_drag_end_cb (GtkDragSource *drag_source, GdkDrag *drag, + gboolean delete_data, ClapperAppQueueList *self) +{ + ClapperAppQueueListDragData *drag_data; + GtkWidget *list_view; + + drag_data = (ClapperAppQueueListDragData *) g_object_get_data (G_OBJECT (self), "drag-data"); + g_object_set_data (G_OBJECT (self), "drag-data", NULL); + + list_view = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (drag_source)); + gtk_widget_remove_css_class (list_view, "dnd"); + + gtk_widget_set_opacity (drag_data->widget, 1.0); + gtk_stack_set_visible_child (GTK_STACK (self->stack), self->stack_default_page); + + gst_object_unref (drag_data->item); + g_object_unref (drag_data->widget); + g_object_unref (drag_data->paintable); + g_free (drag_data); + + gtk_event_controller_reset (GTK_EVENT_CONTROLLER (drag_source)); +} + +static void +queue_drop_value_notify_cb (GtkDropTarget *drop_target, + GParamSpec *pspec G_GNUC_UNUSED, ClapperAppQueueList *self) +{ + const GValue *value = gtk_drop_target_get_value (drop_target); + + if (value && !clapper_app_utils_value_for_item_is_valid (value)) + gtk_drop_target_reject (drop_target); +} + +static GdkDragAction +queue_drop_motion_cb (GtkDropTarget *drop_target, + gdouble x, gdouble y, ClapperAppQueueList *self) +{ + GtkWidget *list_view, *pickup; + GdkDrop *drop; + + list_view = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (drop_target)); + pickup = gtk_widget_pick (list_view, x, y, GTK_PICK_DEFAULT); + + if (pickup && CLAPPER_APP_IS_MEDIA_ITEM_BOX (pickup)) { + ClapperAppQueueListDragData *drag_data; + GtkWidget *list_widget; + graphene_point_t point; + gint height, margin_top = 0, margin_bottom = 0; + + drag_data = (ClapperAppQueueListDragData *) g_object_get_data (G_OBJECT (self), "drag-data"); + + list_widget = gtk_widget_get_parent (pickup); + height = gtk_widget_get_height (list_widget); + + if ((!drag_data || pickup != drag_data->widget) + && gtk_widget_compute_point (list_view, list_widget, &GRAPHENE_POINT_INIT (x, y), &point)) { + GtkWidget *sibling = NULL; + + if (point.y < (gfloat) height / 2) { + if (drag_data) + sibling = gtk_widget_get_prev_sibling (list_widget); + + if (!sibling || gtk_widget_get_parent (drag_data->widget) != sibling) + margin_top = height; + } else { + if (drag_data) + sibling = gtk_widget_get_next_sibling (list_widget); + + if (!sibling || gtk_widget_get_parent (drag_data->widget) != sibling) + margin_bottom = height; + } + } + + if (self->list_target && self->list_target != list_widget) { + gtk_widget_set_margin_top (self->list_target, 0); + gtk_widget_set_margin_bottom (self->list_target, 0); + } + + gtk_widget_set_margin_top (list_widget, margin_top); + gtk_widget_set_margin_bottom (list_widget, margin_bottom); + + self->list_target = list_widget; + self->drop_after = (margin_bottom > margin_top); + } + + if ((drop = gtk_drop_target_get_current_drop (drop_target))) { + GdkContentFormats *formats = gdk_drop_get_formats (drop); + + /* If it is a widget we move it from one place to another */ + if (gdk_content_formats_contain_gtype (formats, GTK_TYPE_WIDGET)) + return GDK_ACTION_MOVE; + } + + return GDK_ACTION_COPY; +} + +static void +queue_drop_leave_cb (GtkDropTarget *drop_target, ClapperAppQueueList *self) +{ + if (self->list_target) { + gtk_widget_set_margin_top (self->list_target, 0); + gtk_widget_set_margin_bottom (self->list_target, 0); + } +} + +static gboolean +queue_drop_cb (GtkDropTarget *drop_target, const GValue *value, + gdouble x, gdouble y, ClapperAppQueueList *self) +{ + ClapperQueue *queue; + ClapperMediaItem *item; + GtkWidget *pickup; + guint drop_index = 0; + gboolean success = FALSE; + + if (G_UNLIKELY (self->list_target == NULL)) + return FALSE; + + pickup = gtk_widget_get_first_child (self->list_target); + + /* Reset margins on drop */ + gtk_widget_set_margin_top (self->list_target, 0); + gtk_widget_set_margin_bottom (self->list_target, 0); + self->list_target = NULL; + + if (G_UNLIKELY (pickup == NULL) || !CLAPPER_APP_IS_MEDIA_ITEM_BOX (pickup)) + return FALSE; + + item = clapper_app_media_item_box_get_media_item (CLAPPER_APP_MEDIA_ITEM_BOX_CAST (pickup)); + queue = CLAPPER_QUEUE (gst_object_get_parent (GST_OBJECT (item))); + + if (G_UNLIKELY (queue == NULL)) + return FALSE; + + if (!clapper_queue_find_item (queue, item, &drop_index)) { + gst_object_unref (queue); + return FALSE; + } + + if (self->drop_after) + drop_index++; + + /* Moving item with widget */ + if (G_VALUE_HOLDS (value, GTK_TYPE_WIDGET)) { + ClapperAppQueueListDragData *drag_data; + + drag_data = (ClapperAppQueueListDragData *) g_object_get_data (G_OBJECT (self), "drag-data"); + + /* Insert at different place */ + if (item != drag_data->item) { + guint index = 0; + + if (clapper_queue_find_item (queue, drag_data->item, &index)) { + if (drop_index > index) + drop_index--; + + clapper_queue_reposition_item (queue, drag_data->item, drop_index); + success = TRUE; + } + } + } else { + GFile **files = NULL; + gint n_files = 0; + + if (clapper_app_utils_files_from_value (value, &files, &n_files)) { + gint i; + + for (i = 0; i < n_files; ++i) { + ClapperMediaItem *new_item = clapper_media_item_new_from_file (files[i]); + + clapper_queue_insert_item (queue, new_item, drop_index + i); + gst_object_unref (new_item); + } + + clapper_app_utils_files_free (files); + success = TRUE; + } + } + + gst_object_unref (queue); + + return success; +} + +static gboolean +trash_drop_cb (GtkDropTarget *drop_target, const GValue *value, + gdouble x, gdouble y, ClapperAppQueueList *self) +{ + ClapperAppQueueListDragData *drag_data; + ClapperQueue *queue; + + drag_data = (ClapperAppQueueListDragData *) g_object_get_data (G_OBJECT (self), "drag-data"); + + if ((queue = CLAPPER_QUEUE (gst_object_get_parent (GST_OBJECT (drag_data->item))))) { + clapper_queue_remove_item (queue, drag_data->item); + gst_object_unref (queue); + } + + return TRUE; +} + +static void +_item_selected_cb (ClapperAppQueueSelection *selection, guint index, ClapperAppQueueList *self) +{ + GtkWidget *list_revealer; + + /* Auto hide queue list after selection */ + list_revealer = gtk_widget_get_ancestor (self->list_view, GTK_TYPE_REVEALER); + if (G_LIKELY (list_revealer != NULL)) + gtk_revealer_set_reveal_child (GTK_REVEALER (list_revealer), FALSE); +} + +static gboolean +_queue_progression_mode_transform_to_func (GBinding *binding, const GValue *from_value, + GValue *to_value, ClapperAppQueueList *self) +{ + ClapperQueueProgressionMode mode = g_value_get_enum (from_value); + + g_value_set_uint (to_value, (guint) mode); + return TRUE; +} + +static gboolean +_queue_progression_mode_transform_from_func (GBinding *binding, const GValue *from_value, + GValue *to_value, ClapperAppQueueList *self) +{ + guint mode = g_value_get_uint (from_value); + + if (mode == GTK_INVALID_LIST_POSITION) + return FALSE; + + g_value_set_enum (to_value, (ClapperQueueProgressionMode) mode); + return TRUE; +} + +static void +clapper_app_queue_list_realize (GtkWidget *widget) +{ + ClapperAppQueueList *self = CLAPPER_APP_QUEUE_LIST_CAST (widget); + ClapperPlayer *player; + + GTK_WIDGET_CLASS (parent_class)->realize (widget); + + GST_TRACE_OBJECT (self, "Realize"); + + if ((player = clapper_gtk_get_player_from_ancestor (widget))) { + ClapperQueue *queue = clapper_player_get_queue (player); + ClapperAppQueueSelection *selection = clapper_app_queue_selection_new (queue); + + g_signal_connect (selection, "item-selected", + G_CALLBACK (_item_selected_cb), self); + + self->queue_progression_binding = g_object_bind_property_full (queue, "progression-mode", + self->progression_drop_down, "selected", G_BINDING_SYNC_CREATE | G_BINDING_BIDIRECTIONAL, + (GBindingTransformFunc) _queue_progression_mode_transform_to_func, + (GBindingTransformFunc) _queue_progression_mode_transform_from_func, + self, NULL); + + gtk_list_view_set_model (GTK_LIST_VIEW (self->list_view), + GTK_SELECTION_MODEL (selection)); + g_object_unref (selection); + } +} + +static void +clapper_app_queue_list_unrealize (GtkWidget *widget) +{ + ClapperAppQueueList *self = CLAPPER_APP_QUEUE_LIST_CAST (widget); + + GST_TRACE_OBJECT (self, "Unrealize"); + + g_clear_pointer (&self->queue_progression_binding, g_binding_unbind); + gtk_list_view_set_model (GTK_LIST_VIEW (self->list_view), NULL); + + GTK_WIDGET_CLASS (parent_class)->unrealize (widget); +} + +static void +clapper_app_queue_list_init (ClapperAppQueueList *self) +{ + gtk_widget_init_template (GTK_WIDGET (self)); + + /* Does not work correctly with OSD */ + gtk_widget_remove_css_class (self->list_view, "view"); + + gtk_drop_target_set_gtypes (self->trash_drop_target, + (GType[1]) { GTK_TYPE_WIDGET }, 1); + gtk_drop_target_set_gtypes (self->drop_target, + (GType[4]) { GTK_TYPE_WIDGET, GDK_TYPE_FILE_LIST, G_TYPE_FILE, G_TYPE_STRING }, 4); +} + +static void +clapper_app_queue_list_dispose (GObject *object) +{ + gtk_widget_dispose_template (GTK_WIDGET (object), CLAPPER_APP_TYPE_QUEUE_LIST); + + G_OBJECT_CLASS (parent_class)->dispose (object); +} + +static void +clapper_app_queue_list_finalize (GObject *object) +{ + ClapperAppQueueList *self = CLAPPER_APP_QUEUE_LIST_CAST (object); + + GST_TRACE_OBJECT (self, "Finalize"); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +clapper_app_queue_list_class_init (ClapperAppQueueListClass *klass) +{ + GObjectClass *gobject_class = (GObjectClass *) klass; + GtkWidgetClass *widget_class = (GtkWidgetClass *) klass; + + GST_DEBUG_CATEGORY_INIT (GST_CAT_DEFAULT, "clapperappqueuelist", 0, + "Clapper App Queue List"); + + gobject_class->dispose = clapper_app_queue_list_dispose; + gobject_class->finalize = clapper_app_queue_list_finalize; + + widget_class->realize = clapper_app_queue_list_realize; + widget_class->unrealize = clapper_app_queue_list_unrealize; + + gtk_widget_class_set_template_from_resource (widget_class, + CLAPPER_APP_RESOURCE_PREFIX "/ui/clapper-app-queue-list.ui"); + + gtk_widget_class_bind_template_child (widget_class, ClapperAppQueueList, progression_drop_down); + gtk_widget_class_bind_template_child (widget_class, ClapperAppQueueList, list_view); + + gtk_widget_class_bind_template_child (widget_class, ClapperAppQueueList, stack); + gtk_widget_class_bind_template_child (widget_class, ClapperAppQueueList, stack_default_page); + gtk_widget_class_bind_template_child (widget_class, ClapperAppQueueList, stack_trash_page); + + gtk_widget_class_bind_template_child (widget_class, ClapperAppQueueList, trash_drop_target); + gtk_widget_class_bind_template_child (widget_class, ClapperAppQueueList, drop_target); + + gtk_widget_class_bind_template_callback (widget_class, drag_item_prepare_cb); + gtk_widget_class_bind_template_callback (widget_class, drag_item_drag_begin_cb); + gtk_widget_class_bind_template_callback (widget_class, drag_item_drag_end_cb); + + gtk_widget_class_bind_template_callback (widget_class, queue_drop_value_notify_cb); + gtk_widget_class_bind_template_callback (widget_class, queue_drop_motion_cb); + gtk_widget_class_bind_template_callback (widget_class, queue_drop_leave_cb); + gtk_widget_class_bind_template_callback (widget_class, queue_drop_cb); + gtk_widget_class_bind_template_callback (widget_class, trash_drop_cb); + + gtk_widget_class_set_css_name (widget_class, "clapper-app-queue-list"); +} diff --git a/src/bin/clapper-app/clapper-app-queue-list.h b/src/bin/clapper-app/clapper-app-queue-list.h new file mode 100644 index 00000000..c9069430 --- /dev/null +++ b/src/bin/clapper-app/clapper-app-queue-list.h @@ -0,0 +1,32 @@ +/* Clapper Application + * Copyright (C) 2024 RafaÅ‚ DziÄ™giel + * + * 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 . + */ + +#pragma once + +#include +#include +#include +#include + +G_BEGIN_DECLS + +#define CLAPPER_APP_TYPE_QUEUE_LIST (clapper_app_queue_list_get_type()) +#define CLAPPER_APP_QUEUE_LIST_CAST(obj) ((ClapperAppQueueList *)(obj)) + +G_DECLARE_FINAL_TYPE (ClapperAppQueueList, clapper_app_queue_list, CLAPPER_APP, QUEUE_LIST, GtkBox) + +G_END_DECLS diff --git a/src/bin/clapper-app/clapper-app-queue-progression-item.c b/src/bin/clapper-app/clapper-app-queue-progression-item.c new file mode 100644 index 00000000..308f538d --- /dev/null +++ b/src/bin/clapper-app/clapper-app-queue-progression-item.c @@ -0,0 +1,107 @@ +/* Clapper Application + * Copyright (C) 2024 RafaÅ‚ DziÄ™giel + * + * 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 . + */ + +#include + +#include "clapper-app-queue-progression-item.h" + +struct _ClapperAppQueueProgressionItem +{ + GObject parent; + + gchar *icon_name; + gchar *label; +}; + +enum +{ + PROP_0, + PROP_ICON_NAME, + PROP_LABEL, + PROP_LAST +}; + +#define parent_class clapper_app_queue_progression_item_parent_class +G_DEFINE_TYPE (ClapperAppQueueProgressionItem, clapper_app_queue_progression_item, G_TYPE_OBJECT); + +static GParamSpec *param_specs[PROP_LAST] = { NULL, }; + +ClapperAppQueueProgressionItem * +clapper_app_queue_progression_item_new (const gchar *icon_name, const gchar *label) +{ + ClapperAppQueueProgressionItem *item; + + item = g_object_new (CLAPPER_APP_TYPE_QUEUE_PROGRESSION_ITEM, NULL); + item->icon_name = g_strdup (icon_name); + item->label = g_strdup (label); + + return item; +} + +static void +clapper_app_queue_progression_item_init (ClapperAppQueueProgressionItem *self) +{ +} + +static void +clapper_app_queue_progression_item_finalize (GObject *object) +{ + ClapperAppQueueProgressionItem *self = CLAPPER_APP_QUEUE_PROGRESSION_ITEM_CAST (object); + + g_free (self->icon_name); + g_free (self->label); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +clapper_app_queue_progression_item_get_property (GObject *object, guint prop_id, + GValue *value, GParamSpec *pspec) +{ + ClapperAppQueueProgressionItem *self = CLAPPER_APP_QUEUE_PROGRESSION_ITEM_CAST (object); + + switch (prop_id) { + case PROP_ICON_NAME: + g_value_set_string (value, self->icon_name); + break; + case PROP_LABEL: + g_value_set_string (value, self->label); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +clapper_app_queue_progression_item_class_init (ClapperAppQueueProgressionItemClass *klass) +{ + GObjectClass *gobject_class = (GObjectClass *) klass; + + gobject_class->get_property = clapper_app_queue_progression_item_get_property; + gobject_class->finalize = clapper_app_queue_progression_item_finalize; + + param_specs[PROP_ICON_NAME] = g_param_spec_string ("icon-name", + NULL, NULL, NULL, + G_PARAM_READABLE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS); + + param_specs[PROP_LABEL] = g_param_spec_string ("label", + NULL, NULL, NULL, + G_PARAM_READABLE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS); + + g_object_class_install_properties (gobject_class, PROP_LAST, param_specs); +} diff --git a/src/bin/clapper-app/clapper-app-queue-progression-item.h b/src/bin/clapper-app/clapper-app-queue-progression-item.h new file mode 100644 index 00000000..b645466d --- /dev/null +++ b/src/bin/clapper-app/clapper-app-queue-progression-item.h @@ -0,0 +1,33 @@ +/* Clapper Application + * Copyright (C) 2024 RafaÅ‚ DziÄ™giel + * + * 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 . + */ + +#pragma once + +#include +#include +#include + +G_BEGIN_DECLS + +#define CLAPPER_APP_TYPE_QUEUE_PROGRESSION_ITEM (clapper_app_queue_progression_item_get_type()) +#define CLAPPER_APP_QUEUE_PROGRESSION_ITEM_CAST(obj) ((ClapperAppQueueProgressionItem *)(obj)) + +G_DECLARE_FINAL_TYPE (ClapperAppQueueProgressionItem, clapper_app_queue_progression_item, CLAPPER_APP, QUEUE_PROGRESSION_ITEM, GObject) + +ClapperAppQueueProgressionItem * clapper_app_queue_progression_item_new (const gchar *icon_name, const gchar *label); + +G_END_DECLS diff --git a/src/bin/clapper-app/clapper-app-queue-progression-model.c b/src/bin/clapper-app/clapper-app-queue-progression-model.c new file mode 100644 index 00000000..2f46e6f4 --- /dev/null +++ b/src/bin/clapper-app/clapper-app-queue-progression-model.c @@ -0,0 +1,109 @@ +/* Clapper Application + * Copyright (C) 2024 RafaÅ‚ DziÄ™giel + * + * 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 . + */ + +#include "clapper-app-queue-progression-model.h" +#include "clapper-app-queue-progression-item.h" +#include "clapper-app-utils.h" + +#define N_PROGRESSION_MODES 5 + +struct _ClapperAppQueueProgressionModel +{ + GObject parent; + + GListStore *store; +}; + +static GType +clapper_app_queue_progression_model_get_item_type (GListModel *model) +{ + return CLAPPER_APP_TYPE_QUEUE_PROGRESSION_ITEM; +} + +static guint +clapper_app_queue_progression_model_get_n_items (GListModel *model) +{ + ClapperAppQueueProgressionModel *self = CLAPPER_APP_QUEUE_PROGRESSION_MODEL_CAST (model); + + return g_list_model_get_n_items (G_LIST_MODEL (self->store)); +} + +static gpointer +clapper_app_queue_progression_model_get_item (GListModel *model, guint index) +{ + ClapperAppQueueProgressionModel *self = CLAPPER_APP_QUEUE_PROGRESSION_MODEL_CAST (model); + + return g_list_model_get_item (G_LIST_MODEL (self->store), index); +} + +static void +_list_model_iface_init (GListModelInterface *iface) +{ + iface->get_item_type = clapper_app_queue_progression_model_get_item_type; + iface->get_n_items = clapper_app_queue_progression_model_get_n_items; + iface->get_item = clapper_app_queue_progression_model_get_item; +} + +#define parent_class clapper_app_queue_progression_model_parent_class +G_DEFINE_TYPE_WITH_CODE (ClapperAppQueueProgressionModel, clapper_app_queue_progression_model, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (G_TYPE_LIST_MODEL, _list_model_iface_init)); + +static void +clapper_app_queue_progression_model_init (ClapperAppQueueProgressionModel *self) +{ + self->store = g_list_store_new (CLAPPER_APP_TYPE_QUEUE_PROGRESSION_ITEM); +} + +static void +clapper_app_queue_progression_model_constructed (GObject *object) +{ + ClapperAppQueueProgressionModel *self = CLAPPER_APP_QUEUE_PROGRESSION_MODEL_CAST (object); + guint i; + + for (i = 0; i < N_PROGRESSION_MODES; ++i) { + ClapperAppQueueProgressionItem *item; + const gchar *icon = NULL, *label = NULL; + + clapper_app_utils_parse_progression (i, &icon, &label); + + item = clapper_app_queue_progression_item_new (icon, label); + + g_list_store_append (self->store, item); + g_object_unref (item); + } + + G_OBJECT_CLASS (parent_class)->constructed (object); +} + +static void +clapper_app_queue_progression_model_finalize (GObject *object) +{ + ClapperAppQueueProgressionModel *self = CLAPPER_APP_QUEUE_PROGRESSION_MODEL_CAST (object); + + g_object_unref (self->store); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +clapper_app_queue_progression_model_class_init (ClapperAppQueueProgressionModelClass *klass) +{ + GObjectClass *gobject_class = (GObjectClass *) klass; + + gobject_class->constructed = clapper_app_queue_progression_model_constructed; + gobject_class->finalize = clapper_app_queue_progression_model_finalize; +} diff --git a/src/bin/clapper-app/clapper-app-queue-progression-model.h b/src/bin/clapper-app/clapper-app-queue-progression-model.h new file mode 100644 index 00000000..121ad3b4 --- /dev/null +++ b/src/bin/clapper-app/clapper-app-queue-progression-model.h @@ -0,0 +1,30 @@ +/* Clapper Application + * Copyright (C) 2024 RafaÅ‚ DziÄ™giel + * + * 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 . + */ + +#pragma once + +#include +#include + +G_BEGIN_DECLS + +#define CLAPPER_APP_TYPE_QUEUE_PROGRESSION_MODEL (clapper_app_queue_progression_model_get_type()) +#define CLAPPER_APP_QUEUE_PROGRESSION_MODEL_CAST(obj) ((ClapperAppQueueProgressionModel *)(obj)) + +G_DECLARE_FINAL_TYPE (ClapperAppQueueProgressionModel, clapper_app_queue_progression_model, CLAPPER_APP, QUEUE_PROGRESSION_MODEL, GObject) + +G_END_DECLS diff --git a/src/bin/clapper-app/clapper-app-queue-selection.c b/src/bin/clapper-app/clapper-app-queue-selection.c new file mode 100644 index 00000000..e6c3196c --- /dev/null +++ b/src/bin/clapper-app/clapper-app-queue-selection.c @@ -0,0 +1,364 @@ +/* Clapper Application + * Copyright (C) 2024 RafaÅ‚ DziÄ™giel + * + * 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 . + */ + +#include +#include + +#include "clapper-app-queue-selection.h" + +#define GST_CAT_DEFAULT clapper_app_queue_selection_debug +GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT); + +struct _ClapperAppQueueSelection +{ + GObject parent; + + ClapperQueue *queue; + + ClapperMediaItem *current_item; + guint current_position; +}; + +enum +{ + PROP_0, + PROP_QUEUE, + PROP_LAST +}; + +enum +{ + SIGNAL_ITEM_SELECTED, + SIGNAL_LAST +}; + +static GParamSpec *param_specs[PROP_LAST] = { NULL, }; +static guint signals[SIGNAL_LAST] = { 0, }; + +static GType +clapper_app_queue_selection_get_item_type (GListModel *model) +{ + return CLAPPER_TYPE_MEDIA_ITEM; +} + +static guint +clapper_app_queue_selection_get_n_items (GListModel *model) +{ + ClapperAppQueueSelection *self = CLAPPER_APP_QUEUE_SELECTION_CAST (model); + + return (self->queue) ? clapper_queue_get_n_items (self->queue) : 0; +} + +static gpointer +clapper_app_queue_selection_get_item (GListModel *model, guint index) +{ + ClapperAppQueueSelection *self = CLAPPER_APP_QUEUE_SELECTION_CAST (model); + + return (self->queue) ? clapper_queue_get_item (self->queue, index) : NULL; +} + +static void +_list_model_iface_init (GListModelInterface *iface) +{ + iface->get_item_type = clapper_app_queue_selection_get_item_type; + iface->get_n_items = clapper_app_queue_selection_get_n_items; + iface->get_item = clapper_app_queue_selection_get_item; +} + +static inline void +_refresh_current_selection (ClapperAppQueueSelection *self) +{ + guint position, old_position, index, n_changed; + + position = clapper_queue_get_current_index (self->queue); + + /* Clapper -> GTK expected value change. + * Should be the same, but better be safe. */ + if (position == CLAPPER_QUEUE_INVALID_POSITION) + position = GTK_INVALID_LIST_POSITION; + + /* No change */ + if (position == self->current_position) + return; + + old_position = self->current_position; + self->current_position = position; + + if (old_position == GTK_INVALID_LIST_POSITION) { + index = position; + n_changed = 1; + } else if (position == GTK_INVALID_LIST_POSITION) { + index = old_position; + n_changed = 1; + } else if (position < old_position) { + index = position; + n_changed = old_position - position + 1; + } else { + index = old_position; + n_changed = position - old_position + 1; + } + + GST_DEBUG ("Selection changed, index: %u, n_changed: %u", index, n_changed); + gtk_selection_model_selection_changed (GTK_SELECTION_MODEL (self), index, n_changed); +} + +static gboolean +clapper_app_queue_selection_is_selected (GtkSelectionModel *model, guint position) +{ + ClapperAppQueueSelection *self = CLAPPER_APP_QUEUE_SELECTION_CAST (model); + + return (position == self->current_position); +} + +static GtkBitset * +clapper_app_queue_selection_get_selection_in_range (GtkSelectionModel *model, guint position, guint n_items) +{ + ClapperAppQueueSelection *self = CLAPPER_APP_QUEUE_SELECTION_CAST (model); + GtkBitset *bitset = gtk_bitset_new_empty (); + + if (self->current_position != GTK_INVALID_LIST_POSITION + && position <= self->current_position + && position + n_items > self->current_position) + gtk_bitset_add (bitset, self->current_position); + + return bitset; +} + +static gboolean +clapper_app_queue_selection_select_item (GtkSelectionModel *model, guint position, gboolean exclusive) +{ + ClapperAppQueueSelection *self = CLAPPER_APP_QUEUE_SELECTION_CAST (model); + gboolean res = TRUE; + + if (G_UNLIKELY (self->queue == NULL)) + return FALSE; + + /* Disallow reselecting of the same item */ + if (self->current_position != position) + res = clapper_queue_select_index (self->queue, position); + + /* Need to always emit this signal when select item succeeds */ + if (G_LIKELY (res)) + g_signal_emit (self, signals[SIGNAL_ITEM_SELECTED], 0, position); + + return res; +} + +static gboolean +clapper_app_queue_selection_unselect_item (GtkSelectionModel *model, guint position) +{ + return FALSE; +} + +static void +_selection_model_iface_init (GtkSelectionModelInterface *iface) +{ + iface->is_selected = clapper_app_queue_selection_is_selected; + iface->get_selection_in_range = clapper_app_queue_selection_get_selection_in_range; + iface->select_item = clapper_app_queue_selection_select_item; + iface->unselect_item = clapper_app_queue_selection_unselect_item; +} + +#define parent_class clapper_app_queue_selection_parent_class +G_DEFINE_TYPE_WITH_CODE (ClapperAppQueueSelection, clapper_app_queue_selection, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (G_TYPE_LIST_MODEL, _list_model_iface_init) + G_IMPLEMENT_INTERFACE (GTK_TYPE_SELECTION_MODEL, _selection_model_iface_init)) + +static void +_queue_model_items_changed_cb (GListModel *model, guint position, guint removed, guint added, + ClapperAppQueueSelection *self) +{ + /* Forward event from internal model */ + g_list_model_items_changed (G_LIST_MODEL (self), position, removed, added); +} + +static void +_queue_current_index_changed_cb (ClapperQueue *queue, + GParamSpec *pspec G_GNUC_UNUSED, ClapperAppQueueSelection *self) +{ + _refresh_current_selection (self); +} + +/* + * clapper_app_queue_selection_new: + * @queue: (nullable): a #ClapperQueue + * + * Creates a new #ClapperAppQueueSelection instance. + * + * Returns: (transfer full): a new #ClapperAppQueueSelection. + */ +ClapperAppQueueSelection * +clapper_app_queue_selection_new (ClapperQueue *queue) +{ + return g_object_new (CLAPPER_APP_TYPE_QUEUE_SELECTION, "queue", queue, NULL); +} + +/* + * clapper_app_queue_selection_set_queue: + * @selection: a #ClapperAppQueueSelection + * @queue: a #ClapperQueue + * + * Set #ClapperQueue to be managed by this selection model. + */ +void +clapper_app_queue_selection_set_queue (ClapperAppQueueSelection *self, ClapperQueue *queue) +{ + guint n_before = 0, n_after = 0; + + g_return_if_fail (CLAPPER_APP_IS_QUEUE_SELECTION (self)); + g_return_if_fail (CLAPPER_IS_QUEUE (queue)); + + if (self->queue) { + g_signal_handlers_disconnect_by_func (G_LIST_MODEL (self->queue), _queue_model_items_changed_cb, self); + g_signal_handlers_disconnect_by_func (self->queue, _queue_current_index_changed_cb, self); + + n_before = clapper_queue_get_n_items (self->queue); + } + + gst_object_replace ((GstObject **) &self->queue, GST_OBJECT_CAST (queue)); + + g_signal_connect (G_LIST_MODEL (self->queue), "items-changed", + G_CALLBACK (_queue_model_items_changed_cb), self); + g_signal_connect (self->queue, "notify::current-index", + G_CALLBACK (_queue_current_index_changed_cb), self); + + g_object_notify_by_pspec (G_OBJECT (self), param_specs[PROP_QUEUE]); + + n_after = clapper_queue_get_n_items (self->queue); + + /* Refresh selected item after queue change */ + self->current_position = GTK_INVALID_LIST_POSITION; + _queue_model_items_changed_cb (G_LIST_MODEL (self->queue), 0, n_before, n_after, self); + _refresh_current_selection (self); +} + +/* + * clapper_app_queue_selection_get_queue: + * @selection: a #ClapperAppQueueSelection + * + * Get #ClapperQueue managed by this selection model. + * + * Returns: (transfer none): #ClapperQueue being managed. + */ +ClapperQueue * +clapper_app_queue_selection_get_queue (ClapperAppQueueSelection *self) +{ + g_return_val_if_fail (CLAPPER_APP_IS_QUEUE_SELECTION (self), NULL); + + return self->queue; +} + +static void +clapper_app_queue_selection_init (ClapperAppQueueSelection *self) +{ + self->current_position = GTK_INVALID_LIST_POSITION; +} + +static void +clapper_app_queue_selection_finalize (GObject *object) +{ + ClapperAppQueueSelection *self = CLAPPER_APP_QUEUE_SELECTION_CAST (object); + + if (self->queue) { + g_signal_handlers_disconnect_by_func (G_LIST_MODEL (self->queue), _queue_model_items_changed_cb, self); + g_signal_handlers_disconnect_by_func (self->queue, _queue_current_index_changed_cb, self); + + g_object_unref (self->queue); + } + g_clear_object (&self->current_item); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +clapper_app_queue_selection_get_property (GObject *object, guint prop_id, + GValue *value, GParamSpec *pspec) +{ + ClapperAppQueueSelection *self = CLAPPER_APP_QUEUE_SELECTION_CAST (object); + + switch (prop_id) { + case PROP_QUEUE: + g_value_set_object (value, clapper_app_queue_selection_get_queue (self)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +clapper_app_queue_selection_set_property (GObject *object, guint prop_id, + const GValue *value, GParamSpec *pspec) +{ + ClapperAppQueueSelection *self = CLAPPER_APP_QUEUE_SELECTION_CAST (object); + + switch (prop_id) { + case PROP_QUEUE: + clapper_app_queue_selection_set_queue (self, g_value_get_object (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +clapper_app_queue_selection_class_init (ClapperAppQueueSelectionClass *klass) +{ + GObjectClass *gobject_class = (GObjectClass *) klass; + + GST_DEBUG_CATEGORY_INIT (GST_CAT_DEFAULT, "clapperappqueueselection", 0, + "Clapper App Queue Selection"); + + gobject_class->get_property = clapper_app_queue_selection_get_property; + gobject_class->set_property = clapper_app_queue_selection_set_property; + gobject_class->finalize = clapper_app_queue_selection_finalize; + + /* + * ClapperAppQueueSelection:queue: + * + * The queue being managed. + */ + param_specs[PROP_QUEUE] = g_param_spec_object ("queue", + NULL, NULL, CLAPPER_TYPE_QUEUE, + G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS); + + /* + * ClapperAppQueueSelection::item-selected: + * @selection: a #ClapperAppQueueSelection + * @index: an index of selected item + * + * Signals when user selected item within the [iface@Gtk.SelectionModel]. + * + * Note that this signal is emitted only when item gets selected from + * the GTK side (also when the same item is reselected). If item was + * changed internally by e.g. progression of [class@Clapper.Queue], + * this signal will not be emitted. + * + * #ClapperAppQueueSelection automatically takes care of having its + * selection in sync with passed [class@Clapper.Queue], so you do not + * have to listen for the changes. This signal is useful if you need + * to differentiate what caused item selection, otherwise use either + * [signal@Gtk.SelectionModel::selection-changed] signal or listen for + * changes of [property@Clapper.Queue:current-item] property. + */ + signals[SIGNAL_ITEM_SELECTED] = g_signal_new ("item-selected", + G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, + 0, NULL, NULL, NULL, G_TYPE_NONE, 1, G_TYPE_UINT); + + g_object_class_install_properties (gobject_class, PROP_LAST, param_specs); +} diff --git a/src/bin/clapper-app/clapper-app-queue-selection.h b/src/bin/clapper-app/clapper-app-queue-selection.h new file mode 100644 index 00000000..fa7d94f6 --- /dev/null +++ b/src/bin/clapper-app/clapper-app-queue-selection.h @@ -0,0 +1,37 @@ +/* Clapper Application + * Copyright (C) 2024 RafaÅ‚ DziÄ™giel + * + * 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 . + */ + +#pragma once + +#include +#include +#include + +G_BEGIN_DECLS + +#define CLAPPER_APP_TYPE_QUEUE_SELECTION (clapper_app_queue_selection_get_type()) +#define CLAPPER_APP_QUEUE_SELECTION_CAST(obj) ((ClapperAppQueueSelection *)(obj)) + +G_DECLARE_FINAL_TYPE (ClapperAppQueueSelection, clapper_app_queue_selection, CLAPPER_APP, QUEUE_SELECTION, GObject) + +ClapperAppQueueSelection * clapper_app_queue_selection_new (ClapperQueue *queue); + +void clapper_app_queue_selection_set_queue (ClapperAppQueueSelection *selection, ClapperQueue *queue); + +ClapperQueue * clapper_app_queue_selection_get_queue (ClapperAppQueueSelection *selection); + +G_END_DECLS diff --git a/src/bin/clapper-app/clapper-app-uri-dialog.c b/src/bin/clapper-app/clapper-app-uri-dialog.c new file mode 100644 index 00000000..a452f1e7 --- /dev/null +++ b/src/bin/clapper-app/clapper-app-uri-dialog.c @@ -0,0 +1,120 @@ +/* Clapper Application + * Copyright (C) 2024 RafaÅ‚ DziÄ™giel + * + * 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 . + */ + +#include "config.h" + +#include +#include +#include + +#include "clapper-app-uri-dialog.h" +#include "clapper-app-utils.h" + +static void +_entry_text_changed_cb (GtkEntry *entry, + GParamSpec *pspec G_GNUC_UNUSED, AdwMessageDialog *dialog) +{ + GtkEntryBuffer *buffer = gtk_entry_get_buffer (entry); + guint text_length = gtk_entry_buffer_get_length (buffer); + gboolean enabled = FALSE; + + if (text_length > 0) { + const gchar *text = gtk_entry_buffer_get_text (buffer); + enabled = (text && gst_uri_is_valid (text)); + } + + adw_message_dialog_set_response_enabled (dialog, "add", enabled); +} + +static void +_open_uri_cb (AdwMessageDialog *dialog, GAsyncResult *result, GtkApplication *gtk_app) +{ + const gchar *response = adw_message_dialog_choose_finish (dialog, result); + + if (strcmp (response, "add") == 0) { + GtkWidget *extra_child = adw_message_dialog_get_extra_child (dialog); + GtkEntryBuffer *buffer = gtk_entry_get_buffer (GTK_ENTRY (extra_child)); + const gchar *text = gtk_entry_buffer_get_text (buffer); + GFile **files = NULL; + gint n_files = 0; + + if (clapper_app_utils_files_from_string (text, &files, &n_files)) { + g_application_open (G_APPLICATION (gtk_app), files, n_files, "add-only"); + clapper_app_utils_files_free (files); + } + } +} + +static void +_read_text_cb (GdkClipboard *clipboard, GAsyncResult *result, GtkWidget *extra_child) +{ + GtkEntry *entry = GTK_ENTRY (extra_child); + GError *error = NULL; + gchar *text = gdk_clipboard_read_text_finish (clipboard, result, &error); + + if (G_LIKELY (error == NULL)) { + if (gst_uri_is_valid (text)) { + gtk_editable_set_text (GTK_EDITABLE (entry), text); + gtk_editable_select_region (GTK_EDITABLE (entry), 0, -1); + } + } else { + /* Common error when clipboard is empty or has unsupported content. + * This we can safely ignore and not notify user. */ + if (error->domain != G_IO_ERROR || error->code != G_IO_ERROR_NOT_SUPPORTED) { + g_printerr ("Error: %s\n", + (error->message) ? error->message : "Could not read clipboard"); + } + g_error_free (error); + } + + g_free (text); +} + +void +clapper_app_uri_dialog_open_uri (GtkApplication *gtk_app) +{ + GtkWindow *window = gtk_application_get_active_window (gtk_app); + GtkBuilder *builder; + AdwMessageDialog *dialog; + GtkWidget *extra_child; + GdkDisplay *display; + + builder = gtk_builder_new_from_resource ( + CLAPPER_APP_RESOURCE_PREFIX "/ui/clapper-app-uri-dialog.ui"); + + dialog = ADW_MESSAGE_DIALOG (gtk_builder_get_object (builder, "dialog")); + gtk_window_set_transient_for (GTK_WINDOW (dialog), window); + + extra_child = adw_message_dialog_get_extra_child (dialog); + + g_signal_connect (GTK_ENTRY (extra_child), "notify::text", + G_CALLBACK (_entry_text_changed_cb), dialog); + + if ((display = gdk_display_get_default ())) { + GdkClipboard *clipboard = gdk_display_get_clipboard (display); + + gdk_clipboard_read_text_async (clipboard, NULL, + (GAsyncReadyCallback) _read_text_cb, extra_child); + } + + /* NOTE: Dialog will automatically unref itself after response */ + adw_message_dialog_choose (dialog, NULL, + (GAsyncReadyCallback) _open_uri_cb, + gtk_app); + + g_object_unref (builder); +} diff --git a/src/bin/clapper-app/clapper-app-uri-dialog.h b/src/bin/clapper-app/clapper-app-uri-dialog.h new file mode 100644 index 00000000..30ba1ccd --- /dev/null +++ b/src/bin/clapper-app/clapper-app-uri-dialog.h @@ -0,0 +1,28 @@ +/* Clapper Application + * Copyright (C) 2024 RafaÅ‚ DziÄ™giel + * + * 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 . + */ + +#pragma once + +#include +#include + +G_BEGIN_DECLS + +G_GNUC_INTERNAL +void clapper_app_uri_dialog_open_uri (GtkApplication *gtk_app); + +G_END_DECLS diff --git a/src/bin/clapper-app/clapper-app-utils.c b/src/bin/clapper-app/clapper-app-utils.c new file mode 100644 index 00000000..b328ef72 --- /dev/null +++ b/src/bin/clapper-app/clapper-app-utils.c @@ -0,0 +1,326 @@ +/* Clapper Application + * Copyright (C) 2024 RafaÅ‚ DziÄ™giel + * + * 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 . + */ + +#include "config.h" + +#include +#include + +#include "clapper-app-utils.h" +#include "clapper-app-media-item-box.h" + +const gchar *const * +clapper_app_utils_get_mime_types (void) +{ + static const gchar *const all_mime_types[] = { + "video/*", + "audio/*", + "application/claps", + "application/x-subrip", + "text/x-ssa", + NULL + }; + + return all_mime_types; +} + +const gchar *const * +clapper_app_utils_get_subtitles_mime_types (void) +{ + static const gchar *const subs_mime_types[] = { + "application/x-subrip", + "text/x-ssa", + NULL + }; + + return subs_mime_types; +} + +void +clapper_app_utils_parse_progression (ClapperQueueProgressionMode mode, + const gchar **icon, const gchar **label) +{ + const gchar *const icon_names[] = { + "action-unavailable-symbolic", + "media-playlist-consecutive-symbolic", + "media-playlist-repeat-song-symbolic", + "media-playlist-repeat-symbolic", + "media-playlist-shuffle-symbolic", + NULL + }; + const gchar *const labels[] = { + _("No progression"), + _("Consecutive"), + _("Repeat item"), + _("Carousel"), + _("Shuffle"), + NULL + }; + + *icon = icon_names[mode]; + *label = labels[mode]; +} + +gboolean +clapper_app_utils_is_subtitles_file (GFile *file) +{ + GFileInfo *info; + gboolean is_subs = FALSE; + + if ((info = g_file_query_info (file, + G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE "," + G_FILE_ATTRIBUTE_STANDARD_FAST_CONTENT_TYPE, + G_FILE_QUERY_INFO_NONE, + NULL, NULL))) { + is_subs = g_strv_contains ( + clapper_app_utils_get_subtitles_mime_types (), + g_file_info_get_content_type (info)); + g_object_unref (info); + } + + return is_subs; +} + +gboolean +clapper_app_utils_value_for_item_is_valid (const GValue *value) +{ + if (G_VALUE_HOLDS (value, GTK_TYPE_WIDGET)) + return CLAPPER_APP_IS_MEDIA_ITEM_BOX (g_value_get_object (value)); + + if (G_VALUE_HOLDS (value, GDK_TYPE_FILE_LIST) + || G_VALUE_HOLDS (value, G_TYPE_FILE)) + return TRUE; + + if (G_VALUE_HOLDS (value, G_TYPE_STRING)) + return gst_uri_is_valid (g_value_get_string (value)); + + return FALSE; +} + +gboolean +clapper_app_utils_files_from_list_model (GListModel *files_model, GFile ***files, gint *n_files) +{ + guint i, len = g_list_model_get_n_items (files_model); + + if (G_UNLIKELY (len == 0 || len > G_MAXINT)) + return FALSE; + + *files = g_new (GFile *, len + 1); + + if (n_files) + *n_files = (gint) len; + + for (i = 0; i < len; ++i) { + (*files)[i] = g_list_model_get_item (files_model, i); + } + (*files)[i] = NULL; + + return TRUE; +} + +gboolean +clapper_app_utils_files_from_slist (GSList *file_list, GFile ***files, gint *n_files) +{ + GSList *fl; + guint len, i = 0; + + len = g_slist_length (file_list); + + if (G_UNLIKELY (len == 0 || len > G_MAXINT)) + return FALSE; + + *files = g_new (GFile *, len + 1); + + if (n_files) + *n_files = (gint) len; + + for (fl = file_list; fl != NULL; fl = fl->next) { + (*files)[i] = (GFile *) g_object_ref (fl->data); + i++; + } + (*files)[i] = NULL; + + return TRUE; +} + +gboolean +clapper_app_utils_files_from_string (const gchar *string, GFile ***files, gint *n_files) +{ + GSList *slist = NULL; + gchar **uris = g_strsplit (string, "\n", 0); + guint i; + gboolean success; + + for (i = 0; uris[i]; ++i) { + const gchar *uri = uris[i]; + + if (!gst_uri_is_valid (uri)) + continue; + + slist = g_slist_append (slist, g_file_new_for_uri (uri)); + } + + g_strfreev (uris); + + if (!slist) + return FALSE; + + success = clapper_app_utils_files_from_slist (slist, files, n_files); + g_slist_free_full (slist, g_object_unref); + + return success; +} + +static inline gboolean +_files_from_file (GFile *file, GFile ***files, gint *n_files) +{ + *files = g_new (GFile *, 2); + + (*files)[0] = g_object_ref (file); + (*files)[1] = NULL; + + if (n_files) + *n_files = 1; + + return TRUE; +} + +gboolean +clapper_app_utils_files_from_value (const GValue *value, GFile ***files, gint *n_files) +{ + if (G_VALUE_HOLDS (value, GDK_TYPE_FILE_LIST)) { + return clapper_app_utils_files_from_slist ( + (GSList *) g_value_get_boxed (value), files, n_files); + } else if (G_VALUE_HOLDS (value, G_TYPE_FILE)) { + return _files_from_file ( + (GFile *) g_value_get_object (value), files, n_files); + } else if (G_VALUE_HOLDS (value, G_TYPE_STRING)) { + return clapper_app_utils_files_from_string ( + g_value_get_string (value), files, n_files); + } + + return FALSE; +} + +void +clapper_app_utils_files_free (GFile **files) +{ + gint i; + + for (i = 0; files[i]; ++i) + g_object_unref (files[i]); + + g_free (files); +} + +static inline gboolean +_parse_feature_name (gchar *str, const gchar **feature_name) +{ + if (!str) + return FALSE; + + g_strstrip (str); + + if (str[0] == '\0') + return FALSE; + + *feature_name = str; + return TRUE; +} + +static inline gboolean +_parse_feature_rank (gchar *str, GstRank *rank) +{ + if (!str) + return FALSE; + + g_strstrip (str); + + if (str[0] == '\0') + return FALSE; + + if (g_ascii_isdigit (str[0])) { + gulong l; + gchar *endptr; + + l = strtoul (str, &endptr, 10); + if (endptr > str && endptr[0] == 0) { + *rank = (GstRank) l; + } else { + return FALSE; + } + } else if (g_ascii_strcasecmp (str, "NONE") == 0) { + *rank = GST_RANK_NONE; + } else if (g_ascii_strcasecmp (str, "MARGINAL") == 0) { + *rank = GST_RANK_MARGINAL; + } else if (g_ascii_strcasecmp (str, "SECONDARY") == 0) { + *rank = GST_RANK_SECONDARY; + } else if (g_ascii_strcasecmp (str, "PRIMARY") == 0) { + *rank = GST_RANK_PRIMARY; + } else if (g_ascii_strcasecmp (str, "MAX") == 0) { + *rank = (GstRank) G_MAXINT; + } else { + return FALSE; + } + + return TRUE; +} + +void +clapper_app_utils_iterate_plugin_feature_ranks (GSettings *settings, + ClapperAppUtilsIterRanks callback, gpointer user_data) +{ + gchar **split, **walk, *stored_overrides; + const gchar *env_overrides; + gboolean from_env = FALSE; + + stored_overrides = g_settings_get_string (settings, "plugin-feature-ranks"); + env_overrides = g_getenv ("GST_PLUGIN_FEATURE_RANK"); + + /* Iterate from GSettings, then from ENV */ +parse_overrides: + split = g_strsplit ((from_env) ? env_overrides : stored_overrides, ",", 0); + + for (walk = split; *walk; walk++) { + gchar **values; + + if (!strchr (*walk, ':')) + continue; + + values = g_strsplit (*walk, ":", 2); + + if (g_strv_length (values) == 2) { + GstRank rank; + const gchar *feature_name; + + if (_parse_feature_name (values[0], &feature_name) + && _parse_feature_rank (values[1], &rank)) + callback (feature_name, rank, from_env, user_data); + } + + g_strfreev (values); + } + + g_strfreev (split); + + if (!from_env && env_overrides) { + from_env = TRUE; + goto parse_overrides; + } + + g_free (stored_overrides); +} diff --git a/src/bin/clapper-app/clapper-app-utils.h b/src/bin/clapper-app/clapper-app-utils.h new file mode 100644 index 00000000..cf854bd8 --- /dev/null +++ b/src/bin/clapper-app/clapper-app-utils.h @@ -0,0 +1,62 @@ +/* Clapper Application + * Copyright (C) 2024 RafaÅ‚ DziÄ™giel + * + * 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 . + */ + +#pragma once + +#include +#include +#include +#include + +G_BEGIN_DECLS + +typedef void (* ClapperAppUtilsIterRanks) (const gchar *feature_name, GstRank rank, gboolean from_env, gpointer user_data); + +G_GNUC_INTERNAL +const gchar *const * clapper_app_utils_get_mime_types (void); + +G_GNUC_INTERNAL +const gchar *const * clapper_app_utils_get_subtitles_mime_types (void); + +G_GNUC_INTERNAL +void clapper_app_utils_parse_progression (ClapperQueueProgressionMode mode, const gchar **icon, const gchar **label); + +G_GNUC_INTERNAL +gboolean clapper_app_utils_is_subtitles_file (GFile *file); + +G_GNUC_INTERNAL +gboolean clapper_app_utils_value_for_item_is_valid (const GValue *value); + +G_GNUC_INTERNAL +gboolean clapper_app_utils_files_from_list_model (GListModel *files_model, GFile ***files, gint *n_files); + +G_GNUC_INTERNAL +gboolean clapper_app_utils_files_from_slist (GSList *file_list, GFile ***files, gint *n_files); + +G_GNUC_INTERNAL +gboolean clapper_app_utils_files_from_string (const gchar *string, GFile ***files, gint *n_files); + +G_GNUC_INTERNAL +gboolean clapper_app_utils_files_from_value (const GValue *value, GFile ***files, gint *n_files); + +G_GNUC_INTERNAL +void clapper_app_utils_files_free (GFile **files); + +G_GNUC_INTERNAL +void clapper_app_utils_iterate_plugin_feature_ranks (GSettings *settings, ClapperAppUtilsIterRanks callback, gpointer user_data); + +G_END_DECLS diff --git a/src/bin/clapper-app/clapper-app-window-state-buttons.c b/src/bin/clapper-app/clapper-app-window-state-buttons.c new file mode 100644 index 00000000..85762d64 --- /dev/null +++ b/src/bin/clapper-app/clapper-app-window-state-buttons.c @@ -0,0 +1,275 @@ +/* Clapper Application + * Copyright (C) 2024 RafaÅ‚ DziÄ™giel + * + * 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 . + */ + +#include "config.h" + +#include + +#include "clapper-app-window-state-buttons.h" + +#define GST_CAT_DEFAULT clapper_app_window_state_buttons_debug +GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT); + +struct _ClapperAppWindowStateButtons +{ + GtkBox parent; + + GtkWidget *menu_button; + GtkWidget *minimize_button; + GtkWidget *maximize_button; + GtkWidget *close_button; + + gboolean has_minimize; + gboolean has_maximize; + + gboolean is_maximized; + gboolean is_fullscreen; + + GtkSettings *settings; +}; + +#define parent_class clapper_app_window_state_buttons_parent_class +G_DEFINE_TYPE (ClapperAppWindowStateButtons, clapper_app_window_state_buttons, GTK_TYPE_BOX) + +static void +minimize_button_clicked_cb (GtkButton *button, ClapperAppWindowStateButtons *self) +{ + GST_INFO_OBJECT (self, "Minimize button clicked"); + gtk_widget_activate_action (GTK_WIDGET (self), "window.minimize", NULL); +} + +static void +maximize_button_clicked_cb (GtkButton *button, ClapperAppWindowStateButtons *self) +{ + GST_INFO_OBJECT (self, "Maximize button clicked"); + gtk_widget_activate_action (GTK_WIDGET (self), "window.toggle-maximized", NULL); +} + +static void +close_button_clicked_cb (GtkButton *button, ClapperAppWindowStateButtons *self) +{ + GST_INFO_OBJECT (self, "Close button clicked"); + gtk_widget_activate_action (GTK_WIDGET (self), "window.close", NULL); +} + +static void +_refresh_min_max_visibility (ClapperAppWindowStateButtons *self) +{ + gtk_widget_set_visible (self->minimize_button, + (self->has_minimize && !self->is_fullscreen)); + gtk_widget_set_visible (self->maximize_button, + (self->has_maximize && !self->is_fullscreen)); +} + +static void +clapper_app_window_state_buttons_parse_layout (ClapperAppWindowStateButtons *self) +{ + gchar *org_layout = NULL; + gboolean has_minimize = FALSE; + gboolean has_maximize = FALSE; + gboolean has_close = FALSE; + + GST_DEBUG_OBJECT (self, "Buttons layout update"); + + g_object_get (self->settings, "gtk-decoration-layout", &org_layout, NULL); + + if (G_LIKELY (org_layout != NULL)) { + GtkWidget *last_widget = self->menu_button; + const gchar *layout = org_layout; + guint i; + + for (i = 0; layout[i]; ++i) { + GtkWidget *widget = NULL; + const gchar *next = layout + i + 1; + + if (next[0] != '\0' && next[0] != ',' && next[0] != ':') + continue; + + GST_TRACE_OBJECT (self, "Remaining layout: %s", layout); + + if (g_str_has_prefix (layout, "minimize")) { + widget = self->minimize_button; + has_minimize = TRUE; + } else if (g_str_has_prefix (layout, "maximize")) { + widget = self->maximize_button; + has_maximize = TRUE; + } else if (g_str_has_prefix (layout, "close")) { + widget = self->close_button; + has_close = TRUE; + } + + if (widget) { + gtk_box_reorder_child_after (GTK_BOX (self), widget, last_widget); + last_widget = widget; + } + + if (next[0] == '\0') + break; + + layout = next + 1; + i = 0; + } + } + + self->has_minimize = has_minimize; + self->has_maximize = has_maximize; + + gtk_widget_set_visible (self->close_button, has_close); + + GST_DEBUG_OBJECT (self, "Buttons layout parsed"); + + g_free (org_layout); +} + +static void +_decoration_layout_changed_cb (GtkSettings *settings, + GParamSpec *pspec G_GNUC_UNUSED, ClapperAppWindowStateButtons *self) +{ + clapper_app_window_state_buttons_parse_layout (self); + _refresh_min_max_visibility (self); +} + +static void +_surface_state_changed_cb (GdkSurface *surface, + GParamSpec *pspec G_GNUC_UNUSED, ClapperAppWindowStateButtons *self) +{ + GdkToplevelState state = gdk_toplevel_get_state (GDK_TOPLEVEL (surface)); + gboolean is_maximized, is_fullscreen; + + GST_LOG_OBJECT (self, "Surface state changed"); + + is_maximized = (state & GDK_TOPLEVEL_STATE_MAXIMIZED); + is_fullscreen = (state & GDK_TOPLEVEL_STATE_FULLSCREEN); + + if (self->is_maximized != is_maximized) { + self->is_maximized = is_maximized; + gtk_button_set_icon_name (GTK_BUTTON (self->maximize_button), + (self->is_maximized) ? "window-restore-symbolic" : "window-maximize-symbolic"); + } + if (self->is_fullscreen != is_fullscreen) { + self->is_fullscreen = is_fullscreen; + _refresh_min_max_visibility (self); + } +} + +static void +clapper_app_window_state_buttons_init (ClapperAppWindowStateButtons *self) +{ + gtk_widget_init_template (GTK_WIDGET (self)); +} + +static void +_clear_stored_settings (ClapperAppWindowStateButtons *self) +{ + if (self->settings) { + g_signal_handlers_disconnect_by_func (self->settings, + _decoration_layout_changed_cb, self); + g_clear_object (&self->settings); + } +} + +static void +clapper_app_window_state_buttons_realize (GtkWidget *widget) +{ + ClapperAppWindowStateButtons *self = CLAPPER_APP_WINDOW_STATE_BUTTONS_CAST (widget); + GtkSettings *settings; + GtkRoot *root; + GdkSurface *surface; + + GST_TRACE_OBJECT (self, "Realize"); + + GTK_WIDGET_CLASS (parent_class)->realize (widget); + + settings = gtk_settings_get_for_display (gtk_widget_get_display (widget)); + + if (self->settings != settings) { + _clear_stored_settings (self); + self->settings = g_object_ref (settings); + + g_signal_connect (self->settings, "notify::gtk-decoration-layout", + G_CALLBACK (_decoration_layout_changed_cb), self); + _decoration_layout_changed_cb (self->settings, NULL, self); + } + + root = gtk_widget_get_root (widget); + surface = gtk_native_get_surface (GTK_NATIVE (root)); + + g_signal_connect (surface, "notify::state", + G_CALLBACK (_surface_state_changed_cb), self); + _surface_state_changed_cb (surface, NULL, self); +} + +static void +clapper_app_window_state_buttons_unrealize (GtkWidget *widget) +{ + ClapperAppWindowStateButtons *self = CLAPPER_APP_WINDOW_STATE_BUTTONS_CAST (widget); + GtkRoot *root; + GdkSurface *surface; + + GST_TRACE_OBJECT (self, "Unrealize"); + + _clear_stored_settings (self); + + root = gtk_widget_get_root (widget); + surface = gtk_native_get_surface (GTK_NATIVE (root)); + + g_signal_handlers_disconnect_by_func (surface, + _surface_state_changed_cb, self); + + GTK_WIDGET_CLASS (parent_class)->unrealize (widget); +} + +static void +clapper_app_window_state_buttons_dispose (GObject *object) +{ + ClapperAppWindowStateButtons *self = CLAPPER_APP_WINDOW_STATE_BUTTONS_CAST (object); + + _clear_stored_settings (self); + + gtk_widget_dispose_template (GTK_WIDGET (object), CLAPPER_APP_TYPE_WINDOW_STATE_BUTTONS); + + G_OBJECT_CLASS (parent_class)->dispose (object); +} + +static void +clapper_app_window_state_buttons_class_init (ClapperAppWindowStateButtonsClass *klass) +{ + GObjectClass *gobject_class = (GObjectClass *) klass; + GtkWidgetClass *widget_class = (GtkWidgetClass *) klass; + + GST_DEBUG_CATEGORY_INIT (GST_CAT_DEFAULT, "clappergtkwindowstatebuttons", 0, + "Clapper GTK Window State Buttons"); + + gobject_class->dispose = clapper_app_window_state_buttons_dispose; + + widget_class->realize = clapper_app_window_state_buttons_realize; + widget_class->unrealize = clapper_app_window_state_buttons_unrealize; + + gtk_widget_class_set_template_from_resource (widget_class, + CLAPPER_APP_RESOURCE_PREFIX "/ui/clapper-app-window-state-buttons.ui"); + + gtk_widget_class_bind_template_child (widget_class, ClapperAppWindowStateButtons, menu_button); + gtk_widget_class_bind_template_child (widget_class, ClapperAppWindowStateButtons, minimize_button); + gtk_widget_class_bind_template_child (widget_class, ClapperAppWindowStateButtons, maximize_button); + gtk_widget_class_bind_template_child (widget_class, ClapperAppWindowStateButtons, close_button); + + gtk_widget_class_bind_template_callback (widget_class, minimize_button_clicked_cb); + gtk_widget_class_bind_template_callback (widget_class, maximize_button_clicked_cb); + gtk_widget_class_bind_template_callback (widget_class, close_button_clicked_cb); + + gtk_widget_class_set_css_name (widget_class, "clapper-app-window-state-buttons"); +} diff --git a/src/bin/clapper-app/clapper-app-window-state-buttons.h b/src/bin/clapper-app/clapper-app-window-state-buttons.h new file mode 100644 index 00000000..7cd88bd4 --- /dev/null +++ b/src/bin/clapper-app/clapper-app-window-state-buttons.h @@ -0,0 +1,31 @@ +/* Clapper Application + * Copyright (C) 2024 RafaÅ‚ DziÄ™giel + * + * 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 . + */ + +#pragma once + +#include +#include +#include + +G_BEGIN_DECLS + +#define CLAPPER_APP_TYPE_WINDOW_STATE_BUTTONS (clapper_app_window_state_buttons_get_type()) +#define CLAPPER_APP_WINDOW_STATE_BUTTONS_CAST(obj) ((ClapperAppWindowStateButtons *)(obj)) + +G_DECLARE_FINAL_TYPE (ClapperAppWindowStateButtons, clapper_app_window_state_buttons, CLAPPER_APP, WINDOW_STATE_BUTTONS, GtkBox) + +G_END_DECLS diff --git a/src/bin/clapper-app/clapper-app-window.c b/src/bin/clapper-app/clapper-app-window.c new file mode 100644 index 00000000..d1c6f4f4 --- /dev/null +++ b/src/bin/clapper-app/clapper-app-window.c @@ -0,0 +1,1150 @@ +/* Clapper Application + * Copyright (C) 2024 RafaÅ‚ DziÄ™giel + * + * 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 . + */ + +#include "config.h" + +#include +#include +#include +#include +#include +#include + +#include "clapper-app-window.h" +#include "clapper-app-file-dialog.h" +#include "clapper-app-utils.h" + +#define DEFAULT_WINDOW_WIDTH 1024 +#define DEFAULT_WINDOW_HEIGHT 576 + +#define N_PROGRESSION_MODES 5 + +#define CLAPPER_APP_SEEK_UNIT_SECOND 0 +#define CLAPPER_APP_SEEK_UNIT_MINUTE 1 +#define CLAPPER_APP_SEEK_UNIT_PERCENTAGE 2 + +#define PERCENTAGE_ROUND(a) (round ((gdouble) a / 0.01) * 0.01) +#define AXIS_WINS_OVER(a,b) ((a > 0 && a - 0.3 > b) || (a < 0 && a + 0.3 < b)) + +#define GST_CAT_DEFAULT clapper_app_window_debug +GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT); + +struct _ClapperAppWindow +{ + GtkApplicationWindow parent; + + GtkWidget *video; + ClapperGtkBillboard *billboard; + ClapperGtkSimpleControls *simple_controls; + + GtkDropTarget *drop_target; + GtkCssProvider *provider; + + ClapperMediaItem *current_item; + + GSettings *settings; + + guint seek_timeout; + + gboolean key_held; + gboolean scrolling; + gboolean seeking; + + gboolean was_playing; + gdouble pending_position; + gdouble current_duration; + + gdouble last_volume; +}; + +#define parent_class clapper_app_window_parent_class +G_DEFINE_TYPE (ClapperAppWindow, clapper_app_window, GTK_TYPE_APPLICATION_WINDOW) + +static void +_media_item_title_changed_cb (ClapperMediaItem *item, + GParamSpec *pspec G_GNUC_UNUSED, ClapperAppWindow *self) +{ + gchar *title; + + if ((title = clapper_media_item_get_title (item))) { + gtk_window_set_title (GTK_WINDOW (self), title); + g_free (title); + } else { + gtk_window_set_title (GTK_WINDOW (self), CLAPPER_APP_NAME); + } +} + +static void +_queue_current_item_changed_cb (ClapperQueue *queue, + GParamSpec *pspec G_GNUC_UNUSED, ClapperAppWindow *self) +{ + ClapperMediaItem *current_item = clapper_queue_get_current_item (queue); + + /* Disconnect signal from old item */ + if (self->current_item) { + g_signal_handlers_disconnect_by_func (self->current_item, + _media_item_title_changed_cb, self); + } + + gst_object_replace ((GstObject **) &self->current_item, GST_OBJECT_CAST (current_item)); + GST_DEBUG_OBJECT (self, "Current item changed to: %" GST_PTR_FORMAT, self->current_item); + + /* Reconnect signal to new item */ + if (self->current_item) { + g_signal_connect (self->current_item, "notify::title", + G_CALLBACK (_media_item_title_changed_cb), self); + _media_item_title_changed_cb (self->current_item, NULL, self); + } else { + gtk_window_set_title (GTK_WINDOW (self), CLAPPER_APP_NAME); + } + + gst_clear_object (¤t_item); +} + +static gboolean +_get_seek_method_mapping (GValue *value, + GVariant *variant, gpointer user_data G_GNUC_UNUSED) +{ + ClapperPlayerSeekMethod seek_method; + + seek_method = (ClapperPlayerSeekMethod) g_variant_get_int32 (variant); + g_value_set_enum (value, seek_method); + + return TRUE; +} + +static GtkWidget * +_pick_pointer_widget (ClapperAppWindow *self) +{ + GdkSurface *surface = gtk_native_get_surface (GTK_NATIVE (self)); + GdkDisplay *display = gtk_widget_get_display (GTK_WIDGET (self)); + GdkSeat *seat = gdk_display_get_default_seat (display); + GtkWidget *widget = NULL; + + if (G_LIKELY (seat != NULL)) { + GdkDevice *device = gdk_seat_get_pointer (seat); + gdouble px = 0, py = 0, native_x = 0, native_y = 0; + + if (G_LIKELY (device != NULL)) + gdk_surface_get_device_position (surface, device, &px, &py, NULL); + + gtk_native_get_surface_transform (GTK_NATIVE (self), &native_x, &native_y); + + widget = gtk_widget_pick (GTK_WIDGET (self), + px - native_x, py - native_y, GTK_PICK_DEFAULT); + } + + return widget; +} + +static void +_player_volume_changed_cb (ClapperPlayer *player, + GParamSpec *pspec G_GNUC_UNUSED, ClapperAppWindow *self) +{ + gdouble volume = PERCENTAGE_ROUND (clapper_player_get_volume (player)); + + /* Only notify when volume changes at least 1%. Remembering last volume + * also prevents us from showing volume when it is restored on startup. */ + if (volume != self->last_volume) { + clapper_gtk_billboard_announce_volume (self->billboard); + self->last_volume = volume; + } +} + +static void +_player_speed_changed_cb (ClapperPlayer *player G_GNUC_UNUSED, + GParamSpec *pspec G_GNUC_UNUSED, ClapperAppWindow *self) +{ + clapper_gtk_billboard_announce_speed (self->billboard); +} + +static void +video_toggle_fullscreen_cb (ClapperGtkVideo *video, ClapperAppWindow *self) +{ + GtkWindow *window = GTK_WINDOW (self); + + g_object_set (window, "fullscreened", !gtk_window_is_fullscreen (window), NULL); +} + +static void +video_map_cb (GtkWidget *widget, ClapperAppWindow *self) +{ + ClapperPlayer *player; + gdouble speed; + + GST_TRACE_OBJECT (self, "Video map"); + + player = clapper_gtk_video_get_player (CLAPPER_GTK_VIDEO_CAST (self->video)); + + g_signal_connect (player, "notify::volume", + G_CALLBACK (_player_volume_changed_cb), self); + g_signal_connect (player, "notify::speed", + G_CALLBACK (_player_speed_changed_cb), self); + + speed = clapper_player_get_speed (player); + + /* If we are starting with non-1x speed, notify user about it */ + if (!G_APPROX_VALUE (speed, 1.0, FLT_EPSILON)) + clapper_gtk_billboard_announce_speed (self->billboard); +} + +static void +video_unmap_cb (GtkWidget *widget, ClapperAppWindow *self) +{ + ClapperPlayer *player; + + GST_TRACE_OBJECT (self, "Video unmap"); + + player = clapper_gtk_video_get_player (CLAPPER_GTK_VIDEO_CAST (self->video)); + + g_signal_handlers_disconnect_by_func (player, _player_volume_changed_cb, self); + g_signal_handlers_disconnect_by_func (player, _player_speed_changed_cb, self); +} + +static void +_open_subtitles_cb (ClapperGtkExtraMenuButton *button G_GNUC_UNUSED, + ClapperMediaItem *item, ClapperAppWindow *self) +{ + GtkApplication *gtk_app = gtk_window_get_application (GTK_WINDOW (self)); + clapper_app_file_dialog_open_subtitles (gtk_app, item); +} + +static void +right_click_pressed_cb (GtkGestureClick *click, gint n_press, + gdouble x, gdouble y, ClapperAppWindow *self) +{ + GdkCursor *cursor; + const gchar *cursor_name = NULL; + + GST_LOG_OBJECT (self, "Right click pressed"); + + if ((cursor = gtk_widget_get_cursor (self->video))) + cursor_name = gdk_cursor_get_name (cursor); + + /* Restore cursor if faded on video */ + if (g_strcmp0 (cursor_name, "none") == 0) { + GdkCursor *new_cursor = gdk_cursor_new_from_name ("default", NULL); + + gtk_widget_set_cursor (self->video, new_cursor); + g_object_unref (new_cursor); + } +} + +static void +right_click_released_cb (GtkGestureClick *click, gint n_press, + gdouble x, gdouble y, ClapperAppWindow *self) +{ + GdkSurface *surface; + GdkEventSequence *sequence; + GdkEvent *event; + + GST_LOG_OBJECT (self, "Right click released"); + + surface = gtk_native_get_surface (GTK_NATIVE (self)); + sequence = gtk_gesture_single_get_current_sequence (GTK_GESTURE_SINGLE (click)); + event = gtk_gesture_get_last_event (GTK_GESTURE (click), sequence); + + if (G_UNLIKELY (event == NULL)) + return; + + if (!gdk_toplevel_show_window_menu (GDK_TOPLEVEL (surface), event)) + GST_FIXME_OBJECT (self, "Implement fallback context menu"); + + gtk_gesture_set_state (GTK_GESTURE (click), GTK_EVENT_SEQUENCE_CLAIMED); +} + +static void +drag_begin_cb (GtkGestureDrag *drag, + gdouble start_x, gdouble start_y, ClapperAppWindow *self) +{ + GtkWidget *widget, *pickup; + + widget = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (drag)); + pickup = gtk_widget_pick (widget, start_x, start_y, GTK_PICK_DEFAULT); + + /* We do not want to cause drag on list view as it has + * a GtkDragSource controller which acts on delay */ + if (GTK_IS_LIST_VIEW (pickup) || gtk_widget_get_ancestor (pickup, GTK_TYPE_LIST_VIEW)) { + gtk_gesture_set_state (GTK_GESTURE (drag), GTK_EVENT_SEQUENCE_DENIED); + gtk_event_controller_reset (GTK_EVENT_CONTROLLER (drag)); + + GST_DEBUG_OBJECT (self, "Window drag denied"); + } +} + +static void +drag_update_cb (GtkGestureDrag *drag, + gdouble offset_x, gdouble offset_y, ClapperAppWindow *self) +{ + GtkSettings *settings = gtk_widget_get_settings (GTK_WIDGET (self)); + gint drag_threshold = 8; // initially set to default + + g_object_get (settings, "gtk-dnd-drag-threshold", &drag_threshold, NULL); + + if (ABS (offset_x) > drag_threshold || ABS (offset_y) > drag_threshold) { + GdkSurface *surface = gtk_native_get_surface (GTK_NATIVE (self)); + gdouble start_x = 0, start_y = 0, native_x = 0, native_y = 0; + + gtk_gesture_set_state (GTK_GESTURE (drag), GTK_EVENT_SEQUENCE_CLAIMED); + gtk_gesture_drag_get_start_point (drag, &start_x, &start_y); + + gtk_native_get_surface_transform (GTK_NATIVE (self), &native_x, &native_y); + + gdk_toplevel_begin_move (GDK_TOPLEVEL (surface), + gtk_gesture_get_device (GTK_GESTURE (drag)), + GDK_BUTTON_PRIMARY, + start_x + native_x, + start_y + native_y, + gtk_event_controller_get_current_event_time (GTK_EVENT_CONTROLLER (drag))); + + gtk_event_controller_reset (GTK_EVENT_CONTROLLER (drag)); + } +} + +static inline void +_alter_volume (ClapperAppWindow *self, gdouble dy) +{ + ClapperPlayer *player = clapper_gtk_video_get_player (CLAPPER_GTK_VIDEO_CAST (self->video)); + gdouble volume = clapper_player_get_volume (player); + + /* We do not want for volume to change too suddenly */ + if (dy > 2.0) + dy = 2.0; + else if (dy < -2.0) + dy = -2.0; + + volume -= dy * 0.02; + + /* Prevent going out of range and make it easier to set exactly 100% */ + if (volume > 2.0) + volume = 2.0; + else if (volume < 0.0) + volume = 0.0; + + clapper_player_set_volume (player, PERCENTAGE_ROUND (volume)); +} + +static inline void +_alter_speed (ClapperAppWindow *self, gdouble dx) +{ + ClapperPlayer *player = clapper_gtk_video_get_player (CLAPPER_GTK_VIDEO_CAST (self->video)); + gdouble speed = clapper_player_get_speed (player); + + speed -= dx * 0.02; + + /* Prevent going out of range and make it easier to set exactly 1.0x */ + if (speed > 2.0) + speed = 2.0; + else if (speed < 0.05) + speed = 0.05; + + clapper_player_set_speed (player, PERCENTAGE_ROUND (speed)); +} + +static gboolean +_begin_seek_operation (ClapperAppWindow *self) +{ + ClapperPlayer *player; + ClapperQueue *queue; + ClapperMediaItem *current_item; + + if (self->seeking) + return FALSE; + + player = clapper_gtk_video_get_player ( + CLAPPER_GTK_VIDEO_CAST (self->video)); + queue = clapper_player_get_queue (player); + current_item = clapper_queue_get_current_item (queue); + + self->current_duration = (current_item != NULL) + ? clapper_media_item_get_duration (current_item) + : 0; + + gst_clear_object (¤t_item); + + /* Live content or not a video */ + if (self->current_duration == 0) + return FALSE; + + if ((self->was_playing = ( + clapper_player_get_state (player) == CLAPPER_PLAYER_STATE_PLAYING))) + clapper_player_pause (player); + + self->pending_position = clapper_player_get_position (player); + self->seeking = TRUE; + + return TRUE; +} + +static void +_end_seek_operation (ClapperAppWindow *self) +{ + if (self->seeking && self->current_duration > 0) { + ClapperPlayer *player = clapper_gtk_video_get_player ( + CLAPPER_GTK_VIDEO_CAST (self->video)); + + clapper_player_seek_custom (player, self->pending_position, + g_settings_get_int (self->settings, "seek-method")); + + if (self->was_playing) + clapper_player_play (player); + } + + /* Reset */ + self->was_playing = FALSE; + self->pending_position = 0; + self->current_duration = 0; + + self->seeking = FALSE; +} + +static void +_announce_current_seek_position (ClapperAppWindow *self, gboolean forward) +{ + gchar *position_str = g_strdup_printf ( + "%" CLAPPER_TIME_FORMAT " / %" CLAPPER_TIME_FORMAT, + CLAPPER_TIME_ARGS (self->pending_position), + CLAPPER_TIME_ARGS (self->current_duration)); + + clapper_gtk_billboard_post_message (self->billboard, + (forward) ? "media-seek-forward-symbolic" : "media-seek-backward-symbolic", + position_str); + + g_free (position_str); +} + +static inline void +_alter_position (ClapperAppWindow *self, gdouble dx) +{ + gboolean forward; + + /* This can only work on devices that + * can detect scrolling begin and end */ + if (!self->scrolling + || (!self->seeking && !_begin_seek_operation (self))) + return; + + forward = (dx > 0); + self->pending_position += dx; + + if (!forward) { + if (self->pending_position < 0) + self->pending_position = 0; + } else { + if (self->pending_position > self->current_duration) + self->pending_position = self->current_duration; + } + + _announce_current_seek_position (self, forward); +} + +static void +scroll_begin_cb (GtkEventControllerScroll *scroll, ClapperAppWindow *self) +{ + GST_LOG_OBJECT (self, "Scroll begin"); + + /* Assume that if device can begin, it can also end */ + self->scrolling = TRUE; +} + +static gboolean +scroll_cb (GtkEventControllerScroll *scroll, + gdouble dx, gdouble dy, ClapperAppWindow *self) +{ + GtkWidget *pickup; + GdkDevice *device; + gboolean handled; + + pickup = _pick_pointer_widget (self); + + /* We do not want to accidentally allow this controller + * to handle scrolls when hovering over scrolled window */ + if (pickup && (GTK_IS_SCROLLED_WINDOW (pickup) + || gtk_widget_get_ancestor (pickup, GTK_TYPE_SCROLLED_WINDOW))) + return FALSE; + + device = gtk_event_controller_get_current_event_device (GTK_EVENT_CONTROLLER (scroll)); + + switch (gdk_device_get_source (device)) { + case GDK_SOURCE_TOUCHPAD: + case GDK_SOURCE_TOUCHSCREEN: + dx *= -0.4; + dy *= -0.4; + break; + default: + break; + } + + if ((handled = AXIS_WINS_OVER (dy, dx))) + _alter_volume (self, dy); + else if ((handled = AXIS_WINS_OVER (dx, dy))) + _alter_position (self, dx); + + return handled; +} + +static void +scroll_end_cb (GtkEventControllerScroll *scroll, ClapperAppWindow *self) +{ + GST_LOG_OBJECT (self, "Scroll end"); + + self->scrolling = FALSE; + + if (self->seeking) + _end_seek_operation (self); +} + +static void +_handle_seek_key_press (ClapperAppWindow *self, gboolean forward) +{ + gint unit; + gdouble offset; + + if (!self->seeking && !_begin_seek_operation (self)) + return; + + offset = (gdouble) g_settings_get_int (self->settings, "seek-value"); + unit = g_settings_get_int (self->settings, "seek-unit"); + + switch (unit) { + case CLAPPER_APP_SEEK_UNIT_SECOND: + break; + case CLAPPER_APP_SEEK_UNIT_MINUTE: + offset *= 60; + break; + case CLAPPER_APP_SEEK_UNIT_PERCENTAGE: + offset = (offset / 100.) * self->current_duration; + break; + default: + g_assert_not_reached (); + break; + } + + forward ^= (gtk_widget_get_default_direction () == GTK_TEXT_DIR_RTL); + + if (forward) + self->pending_position += offset; + else + self->pending_position -= offset; + + if (!forward) { + if (self->pending_position < 0) + self->pending_position = 0; + } else { + if (self->pending_position > self->current_duration) + self->pending_position = self->current_duration; + } + + _announce_current_seek_position (self, forward); +} + +static void +_handle_chapter_key_press (ClapperAppWindow *self, gboolean forward) +{ + ClapperPlayer *player = clapper_gtk_video_get_player ( + CLAPPER_GTK_VIDEO_CAST (self->video)); + ClapperQueue *queue = clapper_player_get_queue (player); + ClapperMediaItem *current_item = clapper_queue_get_current_item (queue); + ClapperTimeline *timeline; + ClapperMarker *dest_marker = NULL; + gdouble position; + guint i; + gboolean is_rtl; + + if (!current_item) + return; + + timeline = clapper_media_item_get_timeline (current_item); + i = clapper_timeline_get_n_markers (timeline); + + /* No markers to iterate */ + if (i == 0) { + gst_object_unref (current_item); + return; + } + + is_rtl = (gtk_widget_get_default_direction () == GTK_TEXT_DIR_RTL); + forward ^= is_rtl; + position = clapper_player_get_position (player); + + /* When going backwards give small tolerance, so we can + * still go to previous one even when directly at/after marker */ + if (!forward) + position -= 1.5; + + while (i--) { + ClapperMarker *marker = clapper_timeline_get_marker (timeline, i); + ClapperMarkerType marker_type = clapper_marker_get_marker_type (marker); + gdouble start; + gboolean found = FALSE; + + /* Ignore custom markers */ + if (marker_type >= CLAPPER_MARKER_TYPE_CUSTOM_1) { + gst_object_unref (marker); + continue; + } + + start = clapper_marker_get_start (marker); + found = (start <= position); + + if (found) { + if (!forward) + dest_marker = marker; + else + gst_object_unref (marker); + + break; + } + + if (forward) + gst_object_replace ((GstObject **) &dest_marker, GST_OBJECT_CAST (marker)); + + gst_object_unref (marker); + } + + if (dest_marker) { + const gchar *title; + gdouble start, duration; + gchar *text; + + title = clapper_marker_get_title (dest_marker); + start = clapper_marker_get_start (dest_marker); + duration = clapper_media_item_get_duration (current_item); + + /* XXX: When RTL with mixed numbers and text, we have to + * switch positions of start <-> duration ourselves */ + text = g_strdup_printf ( + "%s\n%" CLAPPER_TIME_FORMAT " / %" CLAPPER_TIME_FORMAT, title, + CLAPPER_TIME_ARGS ((!is_rtl) ? start : duration), + CLAPPER_TIME_ARGS ((!is_rtl) ? duration : start)); + + clapper_gtk_billboard_post_message (self->billboard, + "user-bookmarks-symbolic", text); + clapper_player_seek (player, start); + + g_free (text); + gst_object_unref (dest_marker); + } + + gst_object_unref (current_item); +} + +static void +_handle_item_key_press (ClapperAppWindow *self, gboolean forward) +{ + ClapperPlayer *player = clapper_gtk_video_get_player ( + CLAPPER_GTK_VIDEO_CAST (self->video)); + ClapperQueue *queue = clapper_player_get_queue (player); + guint prev_index, index; + + forward ^= (gtk_widget_get_default_direction () == GTK_TEXT_DIR_RTL); + + prev_index = clapper_queue_get_current_index (queue); + gtk_widget_activate_action (self->video, + (forward) ? "video.next-item" : "video.previous-item", NULL); + index = clapper_queue_get_current_index (queue); + + /* Notify only when changed */ + if (prev_index != index) { + clapper_gtk_billboard_post_message (self->billboard, + "applications-multimedia-symbolic", + gtk_window_get_title (GTK_WINDOW (self))); + } +} + +static void +_handle_speed_key_press (ClapperAppWindow *self, gboolean forward) +{ + forward ^= (gtk_widget_get_default_direction () == GTK_TEXT_DIR_RTL); + + gtk_widget_activate_action (self->video, + (forward) ? "video.speed-up" : "video.speed-down", NULL); +} + +static inline void +_handle_progression_key_press (ClapperAppWindow *self) +{ + ClapperPlayer *player = clapper_gtk_video_get_player ( + CLAPPER_GTK_VIDEO_CAST (self->video)); + ClapperQueue *queue = clapper_player_get_queue (player); + ClapperQueueProgressionMode mode; + const gchar *icon = NULL, *label = NULL; + + mode = ((clapper_queue_get_progression_mode (queue) + 1) % N_PROGRESSION_MODES); + + clapper_app_utils_parse_progression (mode, &icon, &label); + clapper_queue_set_progression_mode (queue, mode); + + clapper_gtk_billboard_post_message (self->billboard, icon, label); +} + +static gboolean +key_pressed_cb (GtkEventControllerKey *controller, guint keyval, + guint keycode, GdkModifierType state, ClapperAppWindow *self) +{ + switch (keyval) { + case GDK_KEY_Up: + if (state == 0) + gtk_widget_activate_action (self->video, "video.volume-up", NULL); + break; + case GDK_KEY_Down: + if (state == 0) + gtk_widget_activate_action (self->video, "video.volume-down", NULL); + break; + case GDK_KEY_Left: + if (state == 0) { + _handle_seek_key_press (self, FALSE); + } else if (!self->key_held && (state & GDK_SHIFT_MASK) == GDK_SHIFT_MASK) { + _handle_chapter_key_press (self, FALSE); + } else if ((state & GDK_CONTROL_MASK) == GDK_CONTROL_MASK) { + _handle_item_key_press (self, FALSE); + } + break; + case GDK_KEY_j: + if (state == 0) + _handle_seek_key_press (self, FALSE); + break; + case GDK_KEY_Right: + if (state == 0) { + _handle_seek_key_press (self, TRUE); + } else if (!self->key_held && (state & GDK_SHIFT_MASK) == GDK_SHIFT_MASK) { + _handle_chapter_key_press (self, TRUE); + } else if ((state & GDK_CONTROL_MASK) == GDK_CONTROL_MASK) { + _handle_item_key_press (self, TRUE); + } + break; + case GDK_KEY_l: + if (state == 0) + _handle_seek_key_press (self, TRUE); + break; + case GDK_KEY_space: + case GDK_KEY_k: + if (!self->key_held) // Disable constant toggling when key held + gtk_widget_activate_action (self->video, "video.toggle-play", NULL); + break; + case GDK_KEY_less: + if (!self->key_held) // Needs seek (action is slow) + _handle_speed_key_press (self, FALSE); + break; + case GDK_KEY_greater: + if (!self->key_held) // Needs seek (action is slow) + _handle_speed_key_press (self, TRUE); + break; + case GDK_KEY_m: + gtk_widget_activate_action (self->video, "video.toggle-mute", NULL); + break; + case GDK_KEY_p: + if (!self->key_held) + _handle_progression_key_press (self); + break; + default: + return FALSE; + } + + self->key_held = TRUE; + + return TRUE; +} + +static void +key_released_cb (GtkEventControllerKey *controller, guint keyval, + guint keycode, GdkModifierType state, ClapperAppWindow *self) +{ + switch (keyval) { + case GDK_KEY_Left: + case GDK_KEY_j: + case GDK_KEY_Right: + case GDK_KEY_l: + _end_seek_operation (self); + break; + default: + break; + } + + self->key_held = FALSE; +} + +static void +_seek_delay_cb (ClapperAppWindow *self) +{ + GST_LOG_OBJECT (self, "Delayed seek handler reached"); + self->seek_timeout = 0; + + if (self->seeking) + _end_seek_operation (self); +} + +static void +video_seek_request_cb (ClapperGtkVideo *video, gboolean forward, ClapperAppWindow *self) +{ + g_clear_handle_id (&self->seek_timeout, g_source_remove); + + _handle_seek_key_press (self, forward); + + self->seek_timeout = g_timeout_add_once (500, (GSourceOnceFunc) _seek_delay_cb, self); +} + +static void +drop_value_notify_cb (GtkDropTarget *drop_target, + GParamSpec *pspec G_GNUC_UNUSED, ClapperAppWindow *self) +{ + GtkWidget *stack; + const GValue *value = gtk_drop_target_get_value (drop_target); + + if (!value) { + clapper_gtk_billboard_unpin_pinned_message (self->billboard); + return; + } + + if (!clapper_app_utils_value_for_item_is_valid (value)) { + gtk_drop_target_reject (drop_target); + return; + } + + stack = gtk_window_get_child (GTK_WINDOW (self)); + + /* Do not pin message when still in initial state */ + if (gtk_stack_get_visible_child (GTK_STACK (stack)) == self->video) { + clapper_gtk_billboard_pin_message (self->billboard, + "insert-object-symbolic", + _("Drop on title bar to play now or anywhere else to enqueue.")); + } +} + +static gboolean +drop_cb (GtkDropTarget *drop_target, const GValue *value, + gdouble x, gdouble y, ClapperAppWindow *self) +{ + GFile **files = NULL; + gint n_files = 0; + gboolean success = FALSE; + + if (clapper_app_utils_files_from_value (value, &files, &n_files)) { + ClapperPlayer *player = clapper_app_window_get_player (self); + ClapperQueue *queue = clapper_player_get_queue (player); + gint i; + + clapper_app_window_ensure_no_initial_state (self); + + for (i = 0; i < n_files; ++i) { + ClapperMediaItem *item = clapper_media_item_new_from_file (files[i]); + + clapper_queue_add_item (queue, item); + gst_object_unref (item); + } + + clapper_app_utils_files_free (files); + success = TRUE; + } + + return success; +} + +static void +toggle_fullscreen (GSimpleAction *action, GVariant *param, gpointer user_data) +{ + ClapperAppWindow *self = CLAPPER_APP_WINDOW_CAST (user_data); + + video_toggle_fullscreen_cb (CLAPPER_GTK_VIDEO_CAST (self->video), self); +} + +static void +show_help_overlay (GSimpleAction *action, GVariant *param, gpointer user_data) +{ + ClapperAppWindow *self = CLAPPER_APP_WINDOW_CAST (user_data); + GtkBuilder *builder; + GtkWidget *help_overlay; + + builder = gtk_builder_new_from_resource ( + CLAPPER_APP_RESOURCE_PREFIX "/ui/clapper-app-help-overlay.ui"); + help_overlay = GTK_WIDGET (gtk_builder_get_object (builder, "help_overlay")); + + gtk_window_set_transient_for (GTK_WINDOW (help_overlay), GTK_WINDOW (self)); + gtk_window_present (GTK_WINDOW (help_overlay)); + + g_object_unref (builder); +} + +GtkWidget * +clapper_app_window_new (GtkApplication *application) +{ + return g_object_new (CLAPPER_APP_TYPE_WINDOW, + "application", application, + NULL); +} + +GtkWidget * +clapper_app_window_get_video (ClapperAppWindow *self) +{ + return self->video; +} + +ClapperPlayer * +clapper_app_window_get_player (ClapperAppWindow *self) +{ + return clapper_gtk_video_get_player (CLAPPER_GTK_VIDEO_CAST (self->video)); +} + +void +clapper_app_window_ensure_no_initial_state (ClapperAppWindow *self) +{ + GtkWidget *stack = gtk_window_get_child (GTK_WINDOW (self)); + const gchar *child_name = gtk_stack_get_visible_child_name (GTK_STACK (stack)); + + if (g_strcmp0 (child_name, "initial_state") == 0) + gtk_stack_set_visible_child (GTK_STACK (stack), self->video); +} + +static gboolean +clapper_app_window_close_request (GtkWindow *window) +{ + ClapperAppWindow *self = CLAPPER_APP_WINDOW_CAST (window); +/* FIXME: Have GSettings again to store these values + GSettings *settings = g_settings_new (CLAPPER_APP_ID); + gint width = DEFAULT_WINDOW_WIDTH, height = DEFAULT_WINDOW_HEIGHT; +*/ + GST_DEBUG_OBJECT (self, "Close request"); +/* + gtk_window_get_default_size (window, &width, &height); + + g_settings_set (settings, "window-size", "(ii)", width, height); + g_settings_set_boolean (settings, "maximized", gtk_window_is_maximized (window)); + g_settings_set_boolean (settings, "fullscreen", gtk_window_is_fullscreen (window)); + + g_object_unref (settings); +*/ + + return GTK_WINDOW_CLASS (parent_class)->close_request (window); +} + +static void +clapper_app_window_realize (GtkWidget *widget) +{ + ClapperAppWindow *self = CLAPPER_APP_WINDOW_CAST (widget); + + GST_TRACE_OBJECT (self, "Realize"); + + GTK_WIDGET_CLASS (parent_class)->realize (widget); + + gtk_style_context_add_provider_for_display (gtk_widget_get_display (widget), + (GtkStyleProvider *) self->provider, GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); +} + +static void +clapper_app_window_unrealize (GtkWidget *widget) +{ + ClapperAppWindow *self = CLAPPER_APP_WINDOW_CAST (widget); + + GST_TRACE_OBJECT (self, "Unrealize"); + + gtk_style_context_remove_provider_for_display (gtk_widget_get_display (widget), + (GtkStyleProvider *) self->provider); + + GTK_WIDGET_CLASS (parent_class)->unrealize (widget); +} + +static void +clapper_app_window_init (ClapperAppWindow *self) +{ + GtkSettings *settings; + GtkWidget *dummy_titlebar; + gint distance = 0; + + gtk_widget_init_template (GTK_WIDGET (self)); + + /* Make double tap easier to perform */ + settings = gtk_widget_get_settings (self->video); + g_object_get (settings, "gtk-double-click-distance", &distance, NULL); + g_object_set (settings, "gtk-double-click-distance", MAX (distance, 32), NULL); + + dummy_titlebar = g_object_new (GTK_TYPE_BOX, + "can_focus", FALSE, + "focusable", FALSE, + "visible", FALSE, + NULL); + gtk_window_set_titlebar (GTK_WINDOW (self), dummy_titlebar); + gtk_window_set_title (GTK_WINDOW (self), CLAPPER_APP_NAME); + + /* Prevent GTK from redrawing background for each frame */ + gtk_widget_remove_css_class (GTK_WIDGET (self), "background"); + + gtk_drop_target_set_gtypes (self->drop_target, + (GType[3]) { GDK_TYPE_FILE_LIST, G_TYPE_FILE, G_TYPE_STRING }, 3); +} + +static void +clapper_app_window_constructed (GObject *object) +{ + ClapperAppWindow *self = CLAPPER_APP_WINDOW_CAST (object); + ClapperPlayer *player = clapper_app_window_get_player (self); + ClapperQueue *queue = clapper_player_get_queue (player); + ClapperGtkExtraMenuButton *button; + GstElement *element; + AdwStyleManager *manager; + + static const GActionEntry win_entries[] = { + { "toggle-fullscreen", toggle_fullscreen, NULL, NULL, NULL }, + { "show-help-overlay", show_help_overlay, NULL, NULL, NULL }, + }; + +#if (CLAPPER_HAVE_MPRIS || CLAPPER_HAVE_SERVER || CLAPPER_HAVE_DISCOVERER) + ClapperFeature *feature = NULL; +#endif + + self->settings = g_settings_new (CLAPPER_APP_ID); + self->last_volume = PERCENTAGE_ROUND (g_settings_get_double (self->settings, "volume")); + +#if CLAPPER_HAVE_MPRIS + feature = CLAPPER_FEATURE (clapper_mpris_new ( + "org.mpris.MediaPlayer2.Clapper", + "Clapper", CLAPPER_APP_ID)); + clapper_mpris_set_queue_controllable (CLAPPER_MPRIS (feature), TRUE); + clapper_player_add_feature (player, feature); + gst_object_unref (feature); +#endif + +#if CLAPPER_HAVE_SERVER + feature = CLAPPER_FEATURE (clapper_server_new ()); + clapper_server_set_queue_controllable (CLAPPER_SERVER (feature), TRUE); + g_settings_bind (self->settings, "server-enabled", + feature, "enabled", G_SETTINGS_BIND_GET); + clapper_player_add_feature (player, feature); + gst_object_unref (feature); +#endif + +#if CLAPPER_HAVE_DISCOVERER + feature = CLAPPER_FEATURE (clapper_discoverer_new ()); + clapper_player_add_feature (player, feature); + gst_object_unref (feature); +#endif + + /* FIXME: Allow setting sink/filter elements from prefs window + * (this should include parsing bin descriptions) */ + element = gst_element_factory_make ("scaletempo", NULL); + if (G_LIKELY (element != NULL)) + clapper_player_set_audio_filter (player, element); + + clapper_player_set_autoplay (player, TRUE); + + /* No need to also call this here, as item is selected + * after application window is contructed */ + g_signal_connect (queue, "notify::current-item", + G_CALLBACK (_queue_current_item_changed_cb), self); + + g_settings_bind (self->settings, "audio-offset", + player, "audio-offset", G_SETTINGS_BIND_GET); + g_settings_bind (self->settings, "subtitle-offset", + player, "subtitle-offset", G_SETTINGS_BIND_GET); + g_settings_bind (self->settings, "subtitle-font-desc", + player, "subtitle-font-desc", G_SETTINGS_BIND_GET); + + button = clapper_gtk_simple_controls_get_extra_menu_button ( + self->simple_controls); + + g_settings_bind_with_mapping (self->settings, "seek-method", + self->simple_controls, "seek-method", G_SETTINGS_BIND_GET, + (GSettingsBindGetMapping) _get_seek_method_mapping, + NULL, NULL, NULL); + g_signal_connect (button, "open-subtitles", + G_CALLBACK (_open_subtitles_cb), self); + clapper_gtk_extra_menu_button_set_can_open_subtitles (button, TRUE); + + manager = adw_style_manager_get_default (); + adw_style_manager_set_color_scheme (manager, ADW_COLOR_SCHEME_FORCE_DARK); + + self->provider = gtk_css_provider_new (); + gtk_css_provider_load_from_resource (self->provider, + CLAPPER_APP_RESOURCE_PREFIX "/css/styles.css"); + + g_action_map_add_action_entries (G_ACTION_MAP (self), + win_entries, G_N_ELEMENTS (win_entries), self); + + G_OBJECT_CLASS (parent_class)->constructed (object); +} + +static void +clapper_app_window_dispose (GObject *object) +{ + ClapperAppWindow *self = CLAPPER_APP_WINDOW_CAST (object); + + g_clear_handle_id (&self->seek_timeout, g_source_remove); + + gtk_widget_dispose_template (GTK_WIDGET (object), CLAPPER_APP_TYPE_WINDOW); + + gst_clear_object (&self->current_item); + + G_OBJECT_CLASS (parent_class)->dispose (object); +} + +static void +clapper_app_window_finalize (GObject *object) +{ + ClapperAppWindow *self = CLAPPER_APP_WINDOW_CAST (object); + + GST_TRACE_OBJECT (self, "Finalize"); + + g_object_unref (self->settings); + g_object_unref (self->provider); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +clapper_app_window_class_init (ClapperAppWindowClass *klass) +{ + GObjectClass *gobject_class = (GObjectClass *) klass; + GtkWidgetClass *widget_class = (GtkWidgetClass *) klass; + GtkWindowClass *window_class = (GtkWindowClass *) klass; + + GST_DEBUG_CATEGORY_INIT (GST_CAT_DEFAULT, "clapperappwindow", 0, + "Clapper App Window"); + + gobject_class->constructed = clapper_app_window_constructed; + gobject_class->dispose = clapper_app_window_dispose; + gobject_class->finalize = clapper_app_window_finalize; + + widget_class->realize = clapper_app_window_realize; + widget_class->unrealize = clapper_app_window_unrealize; + + window_class->close_request = clapper_app_window_close_request; + + gtk_widget_class_set_template_from_resource (widget_class, + CLAPPER_APP_RESOURCE_PREFIX "/ui/clapper-app-window.ui"); + + gtk_widget_class_bind_template_child (widget_class, ClapperAppWindow, video); + gtk_widget_class_bind_template_child (widget_class, ClapperAppWindow, billboard); + gtk_widget_class_bind_template_child (widget_class, ClapperAppWindow, simple_controls); + gtk_widget_class_bind_template_child (widget_class, ClapperAppWindow, drop_target); + + gtk_widget_class_bind_template_callback (widget_class, video_toggle_fullscreen_cb); + gtk_widget_class_bind_template_callback (widget_class, video_seek_request_cb); + gtk_widget_class_bind_template_callback (widget_class, video_map_cb); + gtk_widget_class_bind_template_callback (widget_class, video_unmap_cb); + gtk_widget_class_bind_template_callback (widget_class, scroll_begin_cb); + gtk_widget_class_bind_template_callback (widget_class, scroll_cb); + gtk_widget_class_bind_template_callback (widget_class, scroll_end_cb); + gtk_widget_class_bind_template_callback (widget_class, key_pressed_cb); + gtk_widget_class_bind_template_callback (widget_class, key_released_cb); + + gtk_widget_class_bind_template_callback (widget_class, right_click_pressed_cb); + gtk_widget_class_bind_template_callback (widget_class, right_click_released_cb); + gtk_widget_class_bind_template_callback (widget_class, drag_begin_cb); + gtk_widget_class_bind_template_callback (widget_class, drag_update_cb); + + gtk_widget_class_bind_template_callback (widget_class, drop_value_notify_cb); + gtk_widget_class_bind_template_callback (widget_class, drop_cb); +} diff --git a/src/bin/clapper-app/clapper-app-window.h b/src/bin/clapper-app/clapper-app-window.h new file mode 100644 index 00000000..800b14dc --- /dev/null +++ b/src/bin/clapper-app/clapper-app-window.h @@ -0,0 +1,44 @@ +/* Clapper Application + * Copyright (C) 2024 RafaÅ‚ DziÄ™giel + * + * 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 . + */ + +#pragma once + +#include +#include +#include +#include + +G_BEGIN_DECLS + +#define CLAPPER_APP_TYPE_WINDOW (clapper_app_window_get_type()) +#define CLAPPER_APP_WINDOW_CAST(obj) ((ClapperAppWindow *)(obj)) + +G_DECLARE_FINAL_TYPE (ClapperAppWindow, clapper_app_window, CLAPPER_APP, WINDOW, GtkApplicationWindow) + +G_GNUC_INTERNAL +GtkWidget * clapper_app_window_new (GtkApplication *application); + +G_GNUC_INTERNAL +GtkWidget * clapper_app_window_get_video (ClapperAppWindow *window); + +G_GNUC_INTERNAL +ClapperPlayer * clapper_app_window_get_player (ClapperAppWindow *window); + +G_GNUC_INTERNAL +void clapper_app_window_ensure_no_initial_state (ClapperAppWindow *window); + +G_END_DECLS diff --git a/src/bin/clapper-app/clapper-app.gresources.xml b/src/bin/clapper-app/clapper-app.gresources.xml new file mode 100644 index 00000000..31c9a6b2 --- /dev/null +++ b/src/bin/clapper-app/clapper-app.gresources.xml @@ -0,0 +1,21 @@ + + + + data/metainfo/com.github.rafostar.Clapper.metainfo.xml + ui/clapper-app-initial-state.ui + ui/clapper-app-uri-dialog.ui + ui/clapper-app-headerbar.ui + ui/clapper-app-help-overlay.ui + ui/clapper-app-info-window.ui + ui/clapper-app-queue-list.ui + ui/clapper-app-queue-list-item.ui + ui/clapper-app-queue-progression-item.ui + ui/clapper-app-video-stream-list-item.ui + ui/clapper-app-audio-stream-list-item.ui + ui/clapper-app-subtitle-stream-list-item.ui + ui/clapper-app-preferences-window.ui + ui/clapper-app-window.ui + ui/clapper-app-window-state-buttons.ui + css/styles.css + + diff --git a/src/bin/clapper-app/css/styles.css b/src/bin/clapper-app/css/styles.css new file mode 100644 index 00000000..5afb156c --- /dev/null +++ b/src/bin/clapper-app/css/styles.css @@ -0,0 +1,109 @@ +window.app { + min-width: 352px; + min-height: 198px; +} + +window .initialstate { + padding-left: 6px; + padding-right: 6px; + padding-top: 8px; + background-color: @dark_4; +} + +window.info .maincontent { + margin: 16px; + margin-top: 0px; +} +window.info .subcontent { + margin: 16px; + margin-top: 0px; + margin-bottom: 8px; +} +window.info .subcontent streamlist preferencesgroup { + margin-bottom: 8px; +} + +window.preferences .subcontent { + margin: 16px; +} +window.preferences .pluginssubpage .subcontent popover { + min-width: 264px; +} +window.preferences .pluginssubpage .subcontent button.pill { + margin-top: 8px; + margin-bottom: 8px; +} + +clapper-gtk-seek-bar scale trough highlight { + color: @accent_fg_color; + background-color: @accent_bg_color; +} +clapper-gtk-video .overamp trough highlight { + color: @error_fg_color; + background-color: @error_bg_color; +} + +clapper-app-headerbar .mainbox { + margin: 6px; + padding: 2px; +} +clapper-app-headerbar .titlelabel label { + margin-left: 8px; + margin-right: 8px; +} +clapper-app-headerbar clapper-app-window-state-buttons { + margin-top: 8px; +} +clapper-app-headerbar clapper-app-window-state-buttons:dir(ltr) { + padding-right: 6px; +} +clapper-app-headerbar clapper-app-window-state-buttons:dir(rtl) { + padding-left: 6px; +} + +clapper-app-queue-list .topseparator { + margin-top: 2px; + margin-bottom: 4px; +} +clapper-app-queue-list .buttonsbox { + padding-left: 6px; + padding-right: 6px; +} +clapper-app-queue-list .buttonsbox dropdown .toggle row { + background-color: transparent; +} +clapper-app-queue-list .buttonsbox .additemsbutton box { + padding-left: 6px; + padding-right: 6px; +} +clapper-app-queue-list .buttonsbox .additemsbutton box image { + margin-left: 3px; + margin-right: 3px; +} +clapper-app-queue-list .buttonsbox .progressiondropdown popover label { + min-width: 100px; +} +clapper-app-queue-list .removeitembox { + margin-left: 6px; + margin-right: 6px; + border-radius: 9999px; + background-color: alpha(@destructive_bg_color, 0.9); +} +clapper-app-queue-list .queue { + padding: 3px; +} +clapper-app-queue-list .queue listview { + padding: 2px; + padding-bottom: 0px; + border-radius: 0px 0px 19px 19px; +} +clapper-app-queue-list .queue listview row { + padding-left: 10px; + padding-right: 10px; + min-height: 30px; + border-radius: 9999px; +} +/* Disable background light on hover when doing D&D */ +clapper-app-queue-list .queue listview.dnd row.activatable:not(:selected):hover { + background: none; +} diff --git a/src/bin/clapper-app/data/applications/com.github.rafostar.Clapper.desktop b/src/bin/clapper-app/data/applications/com.github.rafostar.Clapper.desktop new file mode 100644 index 00000000..e84b8d72 --- /dev/null +++ b/src/bin/clapper-app/data/applications/com.github.rafostar.Clapper.desktop @@ -0,0 +1,16 @@ +[Desktop Entry] +Name=Clapper +GenericName=Multimedia Player +Comment=Play videos and music +Categories=GTK;GNOME;AudioVideo;Player;Video;TV; +MimeType=application/claps;application/mpeg4-iod;application/mpeg4-muxcodetable;application/mxf;application/ogg;application/ram;application/sdp;application/streamingmedia;application/vnd.apple.mpegurl;application/vnd.ms-asf;application/vnd.rn-realmedia;application/vnd.rn-realmedia-vbr;application/x-extension-m4a;application/x-extension-mp4;application/x-flac;application/x-flash-video;application/x-matroska;application/x-ogg;application/x-streamingmedia;audio/3gpp;audio/3gpp2;audio/aac;audio/ac3;audio/amr;audio/amr-wb;audio/basic;audio/dv;audio/eac3;audio/flac;audio/m4a;audio/midi;audio/mp1;audio/mp2;audio/mp3;audio/mp4;audio/mpeg;audio/mpegurl;audio/mpg;audio/ogg;audio/opus;audio/scpls;audio/vnd.dolby.heaac.1;audio/vnd.dolby.heaac.2;audio/vnd.dolby.mlp;audio/vnd.dts;audio/vnd.dts.hd;audio/vnd.rn-realaudio;audio/wav;audio/webm;audio/x-aac;audio/x-aiff;audio/x-ape;audio/x-flac;audio/x-gsm;audio/x-it;audio/x-m4a;audio/x-matroska;audio/x-mod;audio/x-mp1;audio/x-mp2;audio/x-mp3;audio/x-mpeg;audio/x-mpegurl;audio/x-mpg;audio/x-ms-asf;audio/x-ms-wma;audio/x-musepack;audio/x-pn-aiff;audio/x-pn-au;audio/x-pn-realaudio;audio/x-pn-wav;audio/x-real-audio;audio/x-realaudio;audio/x-s3m;audio/x-scpls;audio/x-shorten;audio/x-speex;audio/x-tta;audio/x-vorbis;audio/x-vorbis+ogg;audio/x-wav;audio/x-wavpack;audio/x-xm;video/3gp;video/3gpp;video/3gpp2;video/divx;video/dv;video/fli;video/flv;video/mp2t;video/mp4;video/mp4v-es;video/mpeg;video/mpeg-system;video/msvideo;video/ogg;video/quicktime;video/vnd.mpegurl;video/vnd.rn-realvideo;video/webm;video/x-avi;video/x-flc;video/x-fli;video/x-flv;video/x-m4v;video/x-matroska;video/x-mpeg;video/x-mpeg-system;video/x-mpeg2;video/x-ms-asf;video/x-ms-wm;video/x-ms-wmv;video/x-ms-wmx;video/x-msvideo;video/x-nsv;video/x-ogm+ogg;video/x-theora;video/x-theora+ogg;x-content/audio-cdda;x-content/audio-player;x-content/video-dvd;x-scheme-handler/mms;x-scheme-handler/mmsh;x-scheme-handler/rtmp;x-scheme-handler/rtp;x-scheme-handler/rtsp; +Exec=clapper %U +Icon=com.github.rafostar.Clapper +DBusActivatable=true +StartupNotify=true +Terminal=false +Type=Application +# Translators: Search terms to find this application. Do NOT translate the semicolons! +Keywords=Video;Movie;Film;Clip;Series;Player;Playlist;DVD;TV;Disc;Album;Music;GNOME;Clapper; +# Translators: Do NOT translate or transliterate this text (these are enum types)! +X-Purism-FormFactor=Workstation;Mobile; diff --git a/src/bin/clapper-app/data/dbus-1/meson.build b/src/bin/clapper-app/data/dbus-1/meson.build new file mode 100644 index 00000000..cdf80903 --- /dev/null +++ b/src/bin/clapper-app/data/dbus-1/meson.build @@ -0,0 +1 @@ +subdir('services') diff --git a/src/bin/clapper-app/data/dbus-1/services/com.github.rafostar.Clapper.service.in b/src/bin/clapper-app/data/dbus-1/services/com.github.rafostar.Clapper.service.in new file mode 100644 index 00000000..77996af7 --- /dev/null +++ b/src/bin/clapper-app/data/dbus-1/services/com.github.rafostar.Clapper.service.in @@ -0,0 +1,3 @@ +[D-BUS Service] +Name=@app_id@ +Exec=@bindir@/@bin@ --gapplication-service diff --git a/src/bin/clapper-app/data/dbus-1/services/meson.build b/src/bin/clapper-app/data/dbus-1/services/meson.build new file mode 100644 index 00000000..86efa9ed --- /dev/null +++ b/src/bin/clapper-app/data/dbus-1/services/meson.build @@ -0,0 +1,12 @@ +dbus_conf = configuration_data() +dbus_conf.set('app_id', app_id) +dbus_conf.set('bindir', join_paths(prefix, bindir)) +dbus_conf.set('bin', meson.project_name()) + +configure_file( + input: 'com.github.rafostar.Clapper.service.in', + output: 'com.github.rafostar.Clapper.service', + configuration: dbus_conf, + install: true, + install_dir: join_paths(prefix, datadir, 'dbus-1', 'services'), +) diff --git a/src/bin/clapper-app/data/glib-2.0/schemas/com.github.rafostar.Clapper.gschema.xml b/src/bin/clapper-app/data/glib-2.0/schemas/com.github.rafostar.Clapper.gschema.xml new file mode 100644 index 00000000..6acfb3ab --- /dev/null +++ b/src/bin/clapper-app/data/glib-2.0/schemas/com.github.rafostar.Clapper.gschema.xml @@ -0,0 +1,69 @@ + + + + + + 1 + Method used for seeking + + + 0 + Unit ID to use with seeking value + + + 10 + Time amount to seek with single press of arrow keys + + + false + Enable Server feature for remote playback control + + + + 0 + Offset time for audio stream relative to video + + + 0 + Offset time for subtitle stream relative to video + + + "Sans 12" + Default subtitle stream font description + + + + '' + Overrides for GStreamer plugin ranking + + + + 1.0 + Stores last volume value to apply on startup + + + false + Stores last mute state to apply on startup + + + 1.0 + Stores last speed value to apply on startup + + + 1 + Stores last queue progression mode used to apply on startup + + + true + Stores whether subtitles are enabled value to apply on startup + + + false + Stores whether window was last time maximized to restore on startup + + + false + Stores whether window was last time in fullscreen to restore on startup + + + diff --git a/src/bin/clapper-app/data/icons/hicolor/scalable/apps/com.github.rafostar.Clapper.svg b/src/bin/clapper-app/data/icons/hicolor/scalable/apps/com.github.rafostar.Clapper.svg new file mode 100644 index 00000000..2889584b --- /dev/null +++ b/src/bin/clapper-app/data/icons/hicolor/scalable/apps/com.github.rafostar.Clapper.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/bin/clapper-app/data/icons/hicolor/symbolic/apps/com.github.rafostar.Clapper-symbolic.svg b/src/bin/clapper-app/data/icons/hicolor/symbolic/apps/com.github.rafostar.Clapper-symbolic.svg new file mode 100644 index 00000000..67d4a6a3 --- /dev/null +++ b/src/bin/clapper-app/data/icons/hicolor/symbolic/apps/com.github.rafostar.Clapper-symbolic.svg @@ -0,0 +1,115 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/bin/clapper-app/data/meson.build b/src/bin/clapper-app/data/meson.build new file mode 100644 index 00000000..969d7cf0 --- /dev/null +++ b/src/bin/clapper-app/data/meson.build @@ -0,0 +1,52 @@ +if not ['linux'].contains(host_machine.system()) + subdir_done() +endif + +appstream_util = find_program('appstream-util', required: false) +if appstream_util.found() + test('Validate appstream file', + appstream_util, + args: [ + 'validate-relax', + '--nonet', + join_paths(meson.current_source_dir(), 'metainfo', 'com.github.rafostar.Clapper.metainfo.xml'), + ] + ) +endif + +glib_compile_schemas = find_program('glib-compile-schemas', required: false) +if glib_compile_schemas.found() + test('Validate gsettings schemas', + glib_compile_schemas, + args: [ + '--strict', + '--dry-run', + join_paths(meson.current_source_dir(), 'glib-2.0', 'schemas'), + ] + ) +endif + +install_subdir('icons', + install_dir: join_paths(prefix, datadir) +) +install_subdir('mime', + install_dir: join_paths(prefix, datadir) +) +install_subdir('applications', + install_dir: join_paths(prefix, datadir) +) +install_subdir('metainfo', + install_dir: join_paths(prefix, datadir) +) +install_subdir('glib-2.0', + install_dir: join_paths(prefix, datadir) +) + +subdir('dbus-1') + +gnome.post_install( + glib_compile_schemas: true, + gtk_update_icon_cache: true, + update_desktop_database: true, + update_mime_database: true, +) diff --git a/src/bin/clapper-app/data/metainfo/com.github.rafostar.Clapper.metainfo.xml b/src/bin/clapper-app/data/metainfo/com.github.rafostar.Clapper.metainfo.xml new file mode 100644 index 00000000..c98ab6e0 --- /dev/null +++ b/src/bin/clapper-app/data/metainfo/com.github.rafostar.Clapper.metainfo.xml @@ -0,0 +1,240 @@ + + + com.github.rafostar.Clapper + CC0-1.0 + GPL-3.0-or-later + Clapper + Simple and modern GNOME media player + com.github.rafostar.Clapper + com.github.rafostar.Clapper.desktop + +

+ Clapper is a GNOME media player built using GJS with GTK4 toolkit. + The media player is using GStreamer as a media backend and renders + everything via OpenGL. Player works natively on both Xorg and Wayland. + It also supports hardware acceleration through VA-API on AMD/Intel GPUs, + NVDEC on Nvidia and V4L2 on mobile devices. +

+

+ The media player has an adaptive GUI. When viewing videos in "Windowed Mode", + Clapper will use mostly unmodified GTK widgets to match your OS look nicely. + When player enters "Fullscreen Mode" all GUI elements will become darker, bigger + and semi-transparent for your viewing comfort. It also has a "Floating Mode" which + displays only video on top of all other windows for a PiP-like viewing experience. + Mobile friendly transitions are also supported. +

+
+ Rafał Dzięgiel + https://rafostar.github.io/clapper + https://github.com/Rafostar/clapper/issues + https://liberapay.com/Clapper + https://github.com/Rafostar/clapper/wiki + + AudioVideo + Video + + + + https://raw.githubusercontent.com/wiki/Rafostar/clapper/media/screenshot-windowed.png + + + https://raw.githubusercontent.com/wiki/Rafostar/clapper/media/screenshot-fullscreen.png + + + https://raw.githubusercontent.com/wiki/Rafostar/clapper/media/screenshot-floating.png + + + https://raw.githubusercontent.com/wiki/Rafostar/clapper/media/screenshot-mobile.png + + + + + +

Fixes:

+
    +
  • Fix time labels display on RTL languages
  • +
  • Improved GL/GLES context automatic selection
  • +
+

New translations:

+
    +
  • Hebrew
  • +
+
+
+ + +

+ A quick hotfix release. Fixes problems with new video sink on displays with non-100% scaling applied. + See 0.5.0 version release notes for full recent changelog. +

+
+
+ + +

Changes:

+
    +
  • Includes and uses new, improved GStreamer video sink
  • +
  • All networking ported to libsoup3
  • +
  • A lot of cleanup, including removal of unfinished web application and old YT code
  • +
  • App now supports D-Bus launching (DBusActivatable)
  • +
  • Other small fixes
  • +
+

New translations:

+
    +
  • Arabic
  • +
  • Basque
  • +
  • French
  • +
  • Japanese
  • +
  • Swedish
  • +
  • Turkish
  • +
+
+
+ + +

Fixes:

+
    +
  • Compatibility with more recent libadwaita versions
  • +
  • Toggle mute with M button alone
  • +
  • Allow handling YouTube with external GStreamer plugins
  • +
  • Fix catching errors when reading clipboard
  • +
  • Fix missing translator-credits
  • +
  • Fix missing gio-unix-2.0 dep
  • +
  • Fix playback pausing when entering fullscreen with touchscreen
  • +
  • Fix GST_PLUGIN_FEATURE_RANK env usage
  • +
  • Fix video/audio decoder change detection
  • +
  • Merge global video tags instead replacing them
  • +
  • Few other misc bug fixes
  • +
+

New translations:

+
    +
  • Chinese Simplified
  • +
  • Czech
  • +
  • Hungarian
  • +
  • Portuguese
  • +
  • Portuguese, Brazilian
  • +
  • Russian
  • +
  • Spanish
  • +
+
+
+ + +

Changes:

+
    +
  • Now uses libadwaita
  • +
  • New and adaptive preferences window
  • +
  • Improved open URI dialog
  • +
  • Few small tweaks to fullscreen UI design
  • +
  • Show current video and audio decoders in popovers (easy way to check if HW accel is used)
  • +
  • Enabled NVDEC hardware acceleration by default (requires Nvidia proprietary drivers)
  • +
  • Added option to use PipeWire for audio output (experimental)
  • +
  • Added option to use playbin3 element (experimental)
  • +
  • New PiP icon from icon development kit
  • +
  • Improved performance on devices running OpenGL ES
  • +
  • Translations support
  • +
  • Various bug fixes
  • +
+

New keyboard shortcuts:

+
    +
  • Leave fullscreen with Escape key
  • +
  • Toggle mute with Ctrl+M
  • +
+

More touchscreen gestures:

+
    +
  • Toggle playback with a long press
  • +
  • Switch playlist items via double tap on screen side
  • +
+

New translations:

+
    +
  • Catalan
  • +
  • Dutch
  • +
  • German
  • +
  • Italian
  • +
  • Polish
  • +
+
+
+ + +

Changes:

+
    +
  • Added MPRIS support
  • +
  • Added repeat modes: single video, whole playlist and shuffle
  • +
  • Support opening folders with media files
  • +
  • Append playlist items by holding Ctrl while doing Drag and Drop
  • +
  • Improved handling of keyboard shortcuts
  • +
  • Added more keyboard shortcuts
  • +
  • Added window that shows available keyboard shortcuts
  • +
  • Show black screen by default after playback (make showing last frame optional instead)
  • +
  • Added ability to export playlist to file
  • +
  • Improve handling of changing displays with different resolutions
  • +
  • Added support for EGL under x11 with GTK 4.3.1 or later
  • +
  • Added missing symbolic app icon
  • +
  • Some misc bug fixes and code cleanups
  • +
+
+
+ + +

Player:

+
    +
  • Fix missing top left menu buttons on some system configurations
  • +
  • Fix potential video sink deadlock
  • +
  • Do not show mobile controls transition on launch
  • +
  • Show tooltip with full playlist item text on hover
  • +
+

YouTube:

+
    +
  • Auto select best matching resolution for used monitor
  • +
  • Added some YouTube related preferences
  • +
  • Added support for live HLS videos
  • +
  • Added support for non-adaptive live HLS streaming
  • +
+
+
+ + +

New features:

+
    +
  • YouTube support - drag and drop videos from youtube or use open URI dialog to play them
  • +
  • Added convenient ways of opening external subtitles
  • +
+

Changes:

+
    +
  • Few GUI layout improvements
  • +
  • Simplified video sink code
  • +
  • Fixed missing Ctrl+O common keybinding
  • +
  • Fixed error when playback finishes during controls reveal animation
  • +
  • Fixed startup window size on Xorg
  • +
  • Fixed top time not showing up on fullscreen startup
  • +
  • Fixed missing file extensions in online URIs
  • +
  • Fixed some error messages not being displayed
  • +
+
+
+ + +

First stable release

+
+
+ + +

GitHub version

+
+
+
+ + + keyboard + pointing + touch + + + small + + + workstation + mobile + +
diff --git a/src/bin/clapper-app/data/mime/packages/com.github.rafostar.Clapper.xml b/src/bin/clapper-app/data/mime/packages/com.github.rafostar.Clapper.xml new file mode 100644 index 00000000..121ece0f --- /dev/null +++ b/src/bin/clapper-app/data/mime/packages/com.github.rafostar.Clapper.xml @@ -0,0 +1,8 @@ + + + + Clapper Playlist + + + + diff --git a/src/bin/clapper-app/main.c b/src/bin/clapper-app/main.c new file mode 100644 index 00000000..fe53c76e --- /dev/null +++ b/src/bin/clapper-app/main.c @@ -0,0 +1,54 @@ +/* Clapper Application + * Copyright (C) 2024 RafaÅ‚ DziÄ™giel + * + * 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 . + */ + +#include "config.h" + +#include +#include +#include +#include +#include +#include + +#include "clapper-app-application.h" + +gint +main (gint argc, gchar **argv) +{ + GApplication *application; + gint status; + + g_setenv ("GSK_RENDERER", "gl", FALSE); + + setlocale (LC_ALL, ""); + bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); + bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); + textdomain (GETTEXT_PACKAGE); + + clapper_init (&argc, &argv); + gtk_init (); + adw_init (); + + g_set_application_name ("Clapper"); + + application = clapper_app_application_new (); + + status = g_application_run (application, argc, argv); + g_object_unref (application); + + return status; +} diff --git a/src/bin/clapper-app/meson.build b/src/bin/clapper-app/meson.build new file mode 100644 index 00000000..9e50a7ac --- /dev/null +++ b/src/bin/clapper-app/meson.build @@ -0,0 +1,91 @@ +clapperapp_option = get_option('clapper-app') +app_id = 'com.github.rafostar.Clapper' +app_resource_prefix = '/com/github/rafostar/Clapper/clapper-app' +build_clapperapp = false + +if clapperapp_option.disabled() + subdir_done() +endif + +clapperapp_deps = [ + clapper_dep, + clappergtk_dep, + gst_dep, + gtk4_dep, + libadwaita_dep, + glib_dep, + gobject_dep, +] + +foreach dep : clapperapp_deps + if not dep.found() + if clapperapp_option.enabled() + error('clapper-app option was enabled, but required dependencies were not found') + endif + subdir_done() + endif +endforeach + +subdir('data') +subdir('po') + +clapperapp_resources = gnome.compile_resources( + 'clapper-app-resources', + 'clapper-app.gresources.xml', + c_name: 'clapper_app', +) + +# Include the generated headers +clapperapp_conf_inc = [ + include_directories('.'), + include_directories('..'), +] + +config_h = configuration_data() +config_h.set_quoted('GETTEXT_PACKAGE', meson.project_name() + '-gtk') +config_h.set_quoted('LOCALEDIR', join_paths (prefix, localedir)) +config_h.set_quoted('CLAPPER_APP_NAME', 'Clapper') +config_h.set_quoted('CLAPPER_APP_ID', app_id) +config_h.set_quoted('CLAPPER_APP_RESOURCE_PREFIX', app_resource_prefix) + +configure_file( + output: 'config.h', + configuration: config_h, +) + +clapperapp_sources = [ + 'clapper-app-about-window.c', + 'clapper-app-application.c', + 'clapper-app-file-dialog.c', + 'clapper-app-headerbar.c', + 'clapper-app-info-window.c', + 'clapper-app-list-item-utils.c', + 'clapper-app-media-item-box.c', + 'clapper-app-preferences-window.c', + 'clapper-app-property-row.c', + 'clapper-app-queue-list.c', + 'clapper-app-queue-progression-item.c', + 'clapper-app-queue-progression-model.c', + 'clapper-app-queue-selection.c', + 'clapper-app-uri-dialog.c', + 'clapper-app-utils.c', + 'clapper-app-window.c', + 'clapper-app-window-state-buttons.c', + 'main.c', + clapperapp_resources, +] +clapperapp_c_args = [ + '-DG_LOG_DOMAIN="ClapperApp"', + '-DGST_USE_UNSTABLE_API', +] + +executable( + meson.project_name(), + clapperapp_sources, + dependencies: clapperapp_deps, + include_directories: clapperapp_conf_inc, + c_args: clapperapp_c_args, + install: true, + install_dir: bindir, +) +build_clapperapp = true diff --git a/src/bin/clapper-app/po/LINGUAS b/src/bin/clapper-app/po/LINGUAS new file mode 100644 index 00000000..ad6fe0cf --- /dev/null +++ b/src/bin/clapper-app/po/LINGUAS @@ -0,0 +1 @@ +ar ast ca cs de es eu fa fi fr he hr hu it ja lt nl pl pt pt_BR ru sk sv tr zh_CN diff --git a/src/bin/clapper-app/po/POTFILES b/src/bin/clapper-app/po/POTFILES new file mode 100644 index 00000000..69e31e08 --- /dev/null +++ b/src/bin/clapper-app/po/POTFILES @@ -0,0 +1,17 @@ +src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui +src/bin/clapper-app/ui/clapper-app-help-overlay.ui +src/bin/clapper-app/ui/clapper-app-info-window.ui +src/bin/clapper-app/ui/clapper-app-initial-state.ui +src/bin/clapper-app/ui/clapper-app-preferences-window.ui +src/bin/clapper-app/ui/clapper-app-queue-list.ui +src/bin/clapper-app/ui/clapper-app-subtitle-stream-list-item.ui +src/bin/clapper-app/ui/clapper-app-uri-dialog.ui +src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui +src/bin/clapper-app/ui/clapper-app-window-state-buttons.ui + +src/bin/clapper-app/clapper-app-about-window.c +src/bin/clapper-app/clapper-app-info-window.c +src/bin/clapper-app/clapper-app-list-item-utils.c +src/bin/clapper-app/clapper-app-preferences-window.c +src/bin/clapper-app/clapper-app-utils.c +src/bin/clapper-app/clapper-app-window.c diff --git a/src/bin/clapper-app/po/ar.po b/src/bin/clapper-app/po/ar.po new file mode 100644 index 00000000..48acc5ad --- /dev/null +++ b/src/bin/clapper-app/po/ar.po @@ -0,0 +1,467 @@ +# Arabic translations for clapper-app package. +# Copyright (C) 2024 THE clapper-app'S COPYRIGHT HOLDER +# This file is distributed under the same license as the clapper-app package. +# Automatically generated, 2024. +# +msgid "" +msgstr "" +"Project-Id-Version: clapper-app\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-04-05 20:50+0200\n" +"PO-Revision-Date: 2024-03-07 21:34+0100\n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: ar\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:14 +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:14 +msgid "Codec" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:24 +msgid "Channels" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:36 +msgid "Sample Format" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:46 +msgid "Sample Rate" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:58 +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:51 +msgid "Bitrate" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:70 +#: src/bin/clapper-app/ui/clapper-app-subtitle-stream-list-item.ui:24 +msgid "Language" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:10 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:11 +msgid "General" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:13 +msgid "Show shortcuts" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:19 +msgid "Open preferences" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:25 +msgid "Toggle fullscreen" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:26 +msgid "Double tap | Double click" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:32 +msgid "Quit" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:40 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:32 +msgid "Media" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:43 +#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:30 +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:178 +msgid "Add Files…" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:49 +#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:40 +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:182 +msgid "Add URI…" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:57 +msgid "Queue" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:61 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:68 +msgid "Next item" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:75 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:82 +msgid "Previous item" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:88 +msgid "Change progression mode" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:96 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:76 +msgid "Playback" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:99 +msgid "Toggle play" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:100 +msgid "Tap | Left click" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:107 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:115 +msgid "Seek forward" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:108 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:132 +msgid "Double tap (right side) | Scroll right" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:116 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:124 +msgid "Double tap (left side) | Scroll left" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:123 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:131 +msgid "Seek backward" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:138 +msgid "Volume up" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:139 +msgid "Scroll up" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:145 +msgid "Volume down" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:146 +msgid "Scroll down" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:152 +msgid "Toggle mute" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:158 +msgid "Speed up" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:164 +msgid "Speed down" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:171 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:178 +msgid "Next chapter" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:185 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:192 +msgid "Previous chapter" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:13 +msgid "Info" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:35 +#: src/bin/clapper-app/ui/clapper-app-subtitle-stream-list-item.ui:14 +msgid "Title" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:49 +msgid "Container Format" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:63 +msgid "Duration" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:81 +msgid "Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:84 +#: src/bin/clapper-app/clapper-app-list-item-utils.c:36 +msgid "Video" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:107 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:80 +#: src/bin/clapper-app/clapper-app-list-item-utils.c:39 +msgid "Audio" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:130 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:100 +#: src/bin/clapper-app/clapper-app-list-item-utils.c:42 +msgid "Subtitles" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:155 +msgid "Video Playback" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:158 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:199 +msgid "Decoder" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:170 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:211 +msgid "Filter" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:182 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:223 +msgid "Sink" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:196 +msgid "Audio Playback" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:247 +msgid "Video Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:290 +msgid "Audio Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:333 +msgid "Subtitle Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:21 +msgid "Start by adding media to playback queue" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:15 +msgid "Seeking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:18 +msgid "Method" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:19 +msgid "A preferred method used for seeking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:32 +msgid "Value" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:33 +msgid "Value used for seeking forward/backward" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:46 +msgid "Unit" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:47 +msgid "An unit of a seek forward/backward value" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:51 +msgid "Second" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:52 +msgid "Minute" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:53 +msgid "Percentage" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:63 +msgid "Features" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:66 +msgid "Server" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:67 +msgid "Control player remotely" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:83 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:103 +msgid "Offset" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:84 +msgid "Synchronisation offset in seconds between the audio and video streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:104 +msgid "" +"Synchronisation offset in seconds between the subtitle and video streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:118 +msgid "Default font" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:119 +msgid "Text font used for subtitles when media does not explicitly specify one" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:137 +msgid "Tweaks" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:144 +msgid "Plugin ranking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:145 +msgid "Alter default ranks of GStreamer plugins" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:164 +msgid "Plugin Ranking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:182 +msgid "Available plugins" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:183 +msgid "" +"Select a plugin and its feature to override rank for. When multiple elements " +"have similiar capabilities, the one with highest value is preferred." +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:186 +msgid "Plugin" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:195 +msgid "Plugin feature" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:213 +msgid "Add override" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:229 +msgid "Rank overrides" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:60 +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:23 +msgid "Add" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:87 +msgid "Queue progression" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:6 +msgid "Add URI" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:7 +msgid "Insert an URI to be added to playback queue" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:18 +msgid "Enter or drop URI here" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:22 +msgid "Cancel" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:24 +msgid "Resolution" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:39 +msgid "Framerate" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:63 +msgid "Pixel Format" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-window-state-buttons.ui:57 +msgid "Preferences" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-window-state-buttons.ui:61 +msgid "Keyboard Shortcuts" +msgstr "" + +#. TRANSLATORS: Please do not translate application name +#: src/bin/clapper-app/ui/clapper-app-window-state-buttons.ui:68 +msgid "About Clapper" +msgstr "" + +#. TRANSLATORS: Put your name(s) here for credits or leave untranslated +#: src/bin/clapper-app/clapper-app-about-window.c:43 +msgid "translator-credits" +msgstr "" + +#: src/bin/clapper-app/clapper-app-info-window.c:86 +msgid "Hardware" +msgstr "" + +#: src/bin/clapper-app/clapper-app-info-window.c:86 +msgid "Software" +msgstr "" + +#: src/bin/clapper-app/clapper-app-preferences-window.c:441 +msgid "Accurate" +msgstr "" + +#: src/bin/clapper-app/clapper-app-preferences-window.c:443 +msgid "Normal" +msgstr "" + +#: src/bin/clapper-app/clapper-app-preferences-window.c:445 +msgid "Fast" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:66 +msgid "No progression" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:67 +msgid "Consecutive" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:68 +msgid "Repeat item" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:69 +msgid "Carousel" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:70 +msgid "Shuffle" +msgstr "" + +#: src/bin/clapper-app/clapper-app-window.c:824 +msgid "Drop on title bar to play now or anywhere else to enqueue." +msgstr "" diff --git a/src/bin/clapper-app/po/ast.po b/src/bin/clapper-app/po/ast.po new file mode 100644 index 00000000..c8f1efb7 --- /dev/null +++ b/src/bin/clapper-app/po/ast.po @@ -0,0 +1,467 @@ +# Asturian translations for clapper-app package. +# Copyright (C) 2024 THE clapper-app'S COPYRIGHT HOLDER +# This file is distributed under the same license as the clapper-app package. +# Automatically generated, 2024. +# +msgid "" +msgstr "" +"Project-Id-Version: clapper-app\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-04-05 20:50+0200\n" +"PO-Revision-Date: 2024-03-07 21:34+0100\n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: ast\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:14 +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:14 +msgid "Codec" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:24 +msgid "Channels" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:36 +msgid "Sample Format" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:46 +msgid "Sample Rate" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:58 +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:51 +msgid "Bitrate" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:70 +#: src/bin/clapper-app/ui/clapper-app-subtitle-stream-list-item.ui:24 +msgid "Language" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:10 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:11 +msgid "General" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:13 +msgid "Show shortcuts" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:19 +msgid "Open preferences" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:25 +msgid "Toggle fullscreen" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:26 +msgid "Double tap | Double click" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:32 +msgid "Quit" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:40 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:32 +msgid "Media" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:43 +#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:30 +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:178 +msgid "Add Files…" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:49 +#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:40 +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:182 +msgid "Add URI…" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:57 +msgid "Queue" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:61 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:68 +msgid "Next item" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:75 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:82 +msgid "Previous item" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:88 +msgid "Change progression mode" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:96 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:76 +msgid "Playback" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:99 +msgid "Toggle play" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:100 +msgid "Tap | Left click" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:107 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:115 +msgid "Seek forward" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:108 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:132 +msgid "Double tap (right side) | Scroll right" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:116 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:124 +msgid "Double tap (left side) | Scroll left" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:123 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:131 +msgid "Seek backward" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:138 +msgid "Volume up" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:139 +msgid "Scroll up" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:145 +msgid "Volume down" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:146 +msgid "Scroll down" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:152 +msgid "Toggle mute" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:158 +msgid "Speed up" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:164 +msgid "Speed down" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:171 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:178 +msgid "Next chapter" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:185 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:192 +msgid "Previous chapter" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:13 +msgid "Info" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:35 +#: src/bin/clapper-app/ui/clapper-app-subtitle-stream-list-item.ui:14 +msgid "Title" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:49 +msgid "Container Format" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:63 +msgid "Duration" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:81 +msgid "Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:84 +#: src/bin/clapper-app/clapper-app-list-item-utils.c:36 +msgid "Video" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:107 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:80 +#: src/bin/clapper-app/clapper-app-list-item-utils.c:39 +msgid "Audio" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:130 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:100 +#: src/bin/clapper-app/clapper-app-list-item-utils.c:42 +msgid "Subtitles" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:155 +msgid "Video Playback" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:158 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:199 +msgid "Decoder" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:170 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:211 +msgid "Filter" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:182 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:223 +msgid "Sink" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:196 +msgid "Audio Playback" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:247 +msgid "Video Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:290 +msgid "Audio Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:333 +msgid "Subtitle Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:21 +msgid "Start by adding media to playback queue" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:15 +msgid "Seeking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:18 +msgid "Method" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:19 +msgid "A preferred method used for seeking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:32 +msgid "Value" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:33 +msgid "Value used for seeking forward/backward" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:46 +msgid "Unit" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:47 +msgid "An unit of a seek forward/backward value" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:51 +msgid "Second" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:52 +msgid "Minute" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:53 +msgid "Percentage" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:63 +msgid "Features" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:66 +msgid "Server" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:67 +msgid "Control player remotely" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:83 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:103 +msgid "Offset" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:84 +msgid "Synchronisation offset in seconds between the audio and video streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:104 +msgid "" +"Synchronisation offset in seconds between the subtitle and video streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:118 +msgid "Default font" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:119 +msgid "Text font used for subtitles when media does not explicitly specify one" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:137 +msgid "Tweaks" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:144 +msgid "Plugin ranking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:145 +msgid "Alter default ranks of GStreamer plugins" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:164 +msgid "Plugin Ranking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:182 +msgid "Available plugins" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:183 +msgid "" +"Select a plugin and its feature to override rank for. When multiple elements " +"have similiar capabilities, the one with highest value is preferred." +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:186 +msgid "Plugin" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:195 +msgid "Plugin feature" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:213 +msgid "Add override" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:229 +msgid "Rank overrides" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:60 +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:23 +msgid "Add" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:87 +msgid "Queue progression" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:6 +msgid "Add URI" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:7 +msgid "Insert an URI to be added to playback queue" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:18 +msgid "Enter or drop URI here" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:22 +msgid "Cancel" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:24 +msgid "Resolution" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:39 +msgid "Framerate" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:63 +msgid "Pixel Format" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-window-state-buttons.ui:57 +msgid "Preferences" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-window-state-buttons.ui:61 +msgid "Keyboard Shortcuts" +msgstr "" + +#. TRANSLATORS: Please do not translate application name +#: src/bin/clapper-app/ui/clapper-app-window-state-buttons.ui:68 +msgid "About Clapper" +msgstr "" + +#. TRANSLATORS: Put your name(s) here for credits or leave untranslated +#: src/bin/clapper-app/clapper-app-about-window.c:43 +msgid "translator-credits" +msgstr "" + +#: src/bin/clapper-app/clapper-app-info-window.c:86 +msgid "Hardware" +msgstr "" + +#: src/bin/clapper-app/clapper-app-info-window.c:86 +msgid "Software" +msgstr "" + +#: src/bin/clapper-app/clapper-app-preferences-window.c:441 +msgid "Accurate" +msgstr "" + +#: src/bin/clapper-app/clapper-app-preferences-window.c:443 +msgid "Normal" +msgstr "" + +#: src/bin/clapper-app/clapper-app-preferences-window.c:445 +msgid "Fast" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:66 +msgid "No progression" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:67 +msgid "Consecutive" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:68 +msgid "Repeat item" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:69 +msgid "Carousel" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:70 +msgid "Shuffle" +msgstr "" + +#: src/bin/clapper-app/clapper-app-window.c:824 +msgid "Drop on title bar to play now or anywhere else to enqueue." +msgstr "" diff --git a/src/bin/clapper-app/po/ca.po b/src/bin/clapper-app/po/ca.po new file mode 100644 index 00000000..745428ee --- /dev/null +++ b/src/bin/clapper-app/po/ca.po @@ -0,0 +1,468 @@ +# Catalan translations for clapper-app package. +# Copyright (C) 2024 THE clapper-app'S COPYRIGHT HOLDER +# This file is distributed under the same license as the clapper-app package. +# Automatically generated, 2024. +# +msgid "" +msgstr "" +"Project-Id-Version: clapper-app\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-04-05 20:50+0200\n" +"PO-Revision-Date: 2024-03-07 21:34+0100\n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: ca\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:14 +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:14 +msgid "Codec" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:24 +msgid "Channels" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:36 +msgid "Sample Format" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:46 +msgid "Sample Rate" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:58 +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:51 +msgid "Bitrate" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:70 +#: src/bin/clapper-app/ui/clapper-app-subtitle-stream-list-item.ui:24 +msgid "Language" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:10 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:11 +msgid "General" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:13 +msgid "Show shortcuts" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:19 +msgid "Open preferences" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:25 +msgid "Toggle fullscreen" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:26 +msgid "Double tap | Double click" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:32 +msgid "Quit" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:40 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:32 +msgid "Media" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:43 +#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:30 +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:178 +msgid "Add Files…" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:49 +#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:40 +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:182 +msgid "Add URI…" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:57 +msgid "Queue" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:61 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:68 +msgid "Next item" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:75 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:82 +msgid "Previous item" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:88 +msgid "Change progression mode" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:96 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:76 +msgid "Playback" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:99 +msgid "Toggle play" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:100 +msgid "Tap | Left click" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:107 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:115 +msgid "Seek forward" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:108 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:132 +msgid "Double tap (right side) | Scroll right" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:116 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:124 +msgid "Double tap (left side) | Scroll left" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:123 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:131 +msgid "Seek backward" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:138 +msgid "Volume up" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:139 +msgid "Scroll up" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:145 +msgid "Volume down" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:146 +msgid "Scroll down" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:152 +msgid "Toggle mute" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:158 +msgid "Speed up" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:164 +msgid "Speed down" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:171 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:178 +msgid "Next chapter" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:185 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:192 +msgid "Previous chapter" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:13 +msgid "Info" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:35 +#: src/bin/clapper-app/ui/clapper-app-subtitle-stream-list-item.ui:14 +msgid "Title" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:49 +msgid "Container Format" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:63 +msgid "Duration" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:81 +msgid "Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:84 +#: src/bin/clapper-app/clapper-app-list-item-utils.c:36 +msgid "Video" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:107 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:80 +#: src/bin/clapper-app/clapper-app-list-item-utils.c:39 +msgid "Audio" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:130 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:100 +#: src/bin/clapper-app/clapper-app-list-item-utils.c:42 +msgid "Subtitles" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:155 +msgid "Video Playback" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:158 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:199 +msgid "Decoder" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:170 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:211 +msgid "Filter" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:182 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:223 +msgid "Sink" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:196 +msgid "Audio Playback" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:247 +msgid "Video Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:290 +msgid "Audio Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:333 +msgid "Subtitle Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:21 +msgid "Start by adding media to playback queue" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:15 +msgid "Seeking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:18 +msgid "Method" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:19 +msgid "A preferred method used for seeking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:32 +msgid "Value" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:33 +msgid "Value used for seeking forward/backward" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:46 +msgid "Unit" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:47 +msgid "An unit of a seek forward/backward value" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:51 +msgid "Second" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:52 +msgid "Minute" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:53 +msgid "Percentage" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:63 +msgid "Features" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:66 +msgid "Server" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:67 +msgid "Control player remotely" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:83 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:103 +msgid "Offset" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:84 +msgid "Synchronisation offset in seconds between the audio and video streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:104 +msgid "" +"Synchronisation offset in seconds between the subtitle and video streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:118 +msgid "Default font" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:119 +msgid "Text font used for subtitles when media does not explicitly specify one" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:137 +msgid "Tweaks" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:144 +msgid "Plugin ranking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:145 +msgid "Alter default ranks of GStreamer plugins" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:164 +msgid "Plugin Ranking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:182 +msgid "Available plugins" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:183 +msgid "" +"Select a plugin and its feature to override rank for. When multiple elements " +"have similiar capabilities, the one with highest value is preferred." +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:186 +msgid "Plugin" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:195 +msgid "Plugin feature" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:213 +msgid "Add override" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:229 +msgid "Rank overrides" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:60 +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:23 +msgid "Add" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:87 +msgid "Queue progression" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:6 +msgid "Add URI" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:7 +msgid "Insert an URI to be added to playback queue" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:18 +msgid "Enter or drop URI here" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:22 +msgid "Cancel" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:24 +msgid "Resolution" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:39 +msgid "Framerate" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:63 +msgid "Pixel Format" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-window-state-buttons.ui:57 +msgid "Preferences" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-window-state-buttons.ui:61 +msgid "Keyboard Shortcuts" +msgstr "" + +#. TRANSLATORS: Please do not translate application name +#: src/bin/clapper-app/ui/clapper-app-window-state-buttons.ui:68 +msgid "About Clapper" +msgstr "" + +#. TRANSLATORS: Put your name(s) here for credits or leave untranslated +#: src/bin/clapper-app/clapper-app-about-window.c:43 +msgid "translator-credits" +msgstr "" + +#: src/bin/clapper-app/clapper-app-info-window.c:86 +msgid "Hardware" +msgstr "" + +#: src/bin/clapper-app/clapper-app-info-window.c:86 +msgid "Software" +msgstr "" + +#: src/bin/clapper-app/clapper-app-preferences-window.c:441 +msgid "Accurate" +msgstr "" + +#: src/bin/clapper-app/clapper-app-preferences-window.c:443 +msgid "Normal" +msgstr "" + +#: src/bin/clapper-app/clapper-app-preferences-window.c:445 +msgid "Fast" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:66 +msgid "No progression" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:67 +msgid "Consecutive" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:68 +msgid "Repeat item" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:69 +msgid "Carousel" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:70 +msgid "Shuffle" +msgstr "" + +#: src/bin/clapper-app/clapper-app-window.c:824 +msgid "Drop on title bar to play now or anywhere else to enqueue." +msgstr "" diff --git a/src/bin/clapper-app/po/clapper-app.pot b/src/bin/clapper-app/po/clapper-app.pot new file mode 100644 index 00000000..d7aea4a3 --- /dev/null +++ b/src/bin/clapper-app/po/clapper-app.pot @@ -0,0 +1,468 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the clapper-app package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: clapper-app\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-04-05 20:50+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:14 +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:14 +msgid "Codec" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:24 +msgid "Channels" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:36 +msgid "Sample Format" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:46 +msgid "Sample Rate" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:58 +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:51 +msgid "Bitrate" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:70 +#: src/bin/clapper-app/ui/clapper-app-subtitle-stream-list-item.ui:24 +msgid "Language" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:10 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:11 +msgid "General" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:13 +msgid "Show shortcuts" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:19 +msgid "Open preferences" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:25 +msgid "Toggle fullscreen" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:26 +msgid "Double tap | Double click" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:32 +msgid "Quit" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:40 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:32 +msgid "Media" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:43 +#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:30 +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:178 +msgid "Add Files…" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:49 +#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:40 +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:182 +msgid "Add URI…" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:57 +msgid "Queue" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:61 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:68 +msgid "Next item" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:75 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:82 +msgid "Previous item" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:88 +msgid "Change progression mode" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:96 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:76 +msgid "Playback" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:99 +msgid "Toggle play" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:100 +msgid "Tap | Left click" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:107 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:115 +msgid "Seek forward" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:108 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:132 +msgid "Double tap (right side) | Scroll right" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:116 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:124 +msgid "Double tap (left side) | Scroll left" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:123 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:131 +msgid "Seek backward" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:138 +msgid "Volume up" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:139 +msgid "Scroll up" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:145 +msgid "Volume down" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:146 +msgid "Scroll down" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:152 +msgid "Toggle mute" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:158 +msgid "Speed up" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:164 +msgid "Speed down" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:171 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:178 +msgid "Next chapter" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:185 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:192 +msgid "Previous chapter" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:13 +msgid "Info" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:35 +#: src/bin/clapper-app/ui/clapper-app-subtitle-stream-list-item.ui:14 +msgid "Title" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:49 +msgid "Container Format" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:63 +msgid "Duration" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:81 +msgid "Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:84 +#: src/bin/clapper-app/clapper-app-list-item-utils.c:36 +msgid "Video" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:107 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:80 +#: src/bin/clapper-app/clapper-app-list-item-utils.c:39 +msgid "Audio" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:130 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:100 +#: src/bin/clapper-app/clapper-app-list-item-utils.c:42 +msgid "Subtitles" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:155 +msgid "Video Playback" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:158 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:199 +msgid "Decoder" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:170 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:211 +msgid "Filter" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:182 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:223 +msgid "Sink" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:196 +msgid "Audio Playback" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:247 +msgid "Video Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:290 +msgid "Audio Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:333 +msgid "Subtitle Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:21 +msgid "Start by adding media to playback queue" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:15 +msgid "Seeking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:18 +msgid "Method" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:19 +msgid "A preferred method used for seeking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:32 +msgid "Value" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:33 +msgid "Value used for seeking forward/backward" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:46 +msgid "Unit" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:47 +msgid "An unit of a seek forward/backward value" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:51 +msgid "Second" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:52 +msgid "Minute" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:53 +msgid "Percentage" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:63 +msgid "Features" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:66 +msgid "Server" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:67 +msgid "Control player remotely" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:83 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:103 +msgid "Offset" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:84 +msgid "Synchronisation offset in seconds between the audio and video streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:104 +msgid "" +"Synchronisation offset in seconds between the subtitle and video streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:118 +msgid "Default font" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:119 +msgid "Text font used for subtitles when media does not explicitly specify one" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:137 +msgid "Tweaks" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:144 +msgid "Plugin ranking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:145 +msgid "Alter default ranks of GStreamer plugins" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:164 +msgid "Plugin Ranking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:182 +msgid "Available plugins" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:183 +msgid "" +"Select a plugin and its feature to override rank for. When multiple elements " +"have similiar capabilities, the one with highest value is preferred." +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:186 +msgid "Plugin" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:195 +msgid "Plugin feature" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:213 +msgid "Add override" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:229 +msgid "Rank overrides" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:60 +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:23 +msgid "Add" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:87 +msgid "Queue progression" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:6 +msgid "Add URI" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:7 +msgid "Insert an URI to be added to playback queue" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:18 +msgid "Enter or drop URI here" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:22 +msgid "Cancel" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:24 +msgid "Resolution" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:39 +msgid "Framerate" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:63 +msgid "Pixel Format" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-window-state-buttons.ui:57 +msgid "Preferences" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-window-state-buttons.ui:61 +msgid "Keyboard Shortcuts" +msgstr "" + +#. TRANSLATORS: Please do not translate application name +#: src/bin/clapper-app/ui/clapper-app-window-state-buttons.ui:68 +msgid "About Clapper" +msgstr "" + +#. TRANSLATORS: Put your name(s) here for credits or leave untranslated +#: src/bin/clapper-app/clapper-app-about-window.c:43 +msgid "translator-credits" +msgstr "" + +#: src/bin/clapper-app/clapper-app-info-window.c:86 +msgid "Hardware" +msgstr "" + +#: src/bin/clapper-app/clapper-app-info-window.c:86 +msgid "Software" +msgstr "" + +#: src/bin/clapper-app/clapper-app-preferences-window.c:441 +msgid "Accurate" +msgstr "" + +#: src/bin/clapper-app/clapper-app-preferences-window.c:443 +msgid "Normal" +msgstr "" + +#: src/bin/clapper-app/clapper-app-preferences-window.c:445 +msgid "Fast" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:66 +msgid "No progression" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:67 +msgid "Consecutive" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:68 +msgid "Repeat item" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:69 +msgid "Carousel" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:70 +msgid "Shuffle" +msgstr "" + +#: src/bin/clapper-app/clapper-app-window.c:824 +msgid "Drop on title bar to play now or anywhere else to enqueue." +msgstr "" diff --git a/src/bin/clapper-app/po/cs.po b/src/bin/clapper-app/po/cs.po new file mode 100644 index 00000000..26a1920b --- /dev/null +++ b/src/bin/clapper-app/po/cs.po @@ -0,0 +1,468 @@ +# Czech translations for clapper-app package. +# Copyright (C) 2024 THE clapper-app'S COPYRIGHT HOLDER +# This file is distributed under the same license as the clapper-app package. +# Automatically generated, 2024. +# +msgid "" +msgstr "" +"Project-Id-Version: clapper-app\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-04-05 20:50+0200\n" +"PO-Revision-Date: 2024-03-07 21:34+0100\n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\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" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:14 +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:14 +msgid "Codec" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:24 +msgid "Channels" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:36 +msgid "Sample Format" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:46 +msgid "Sample Rate" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:58 +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:51 +msgid "Bitrate" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:70 +#: src/bin/clapper-app/ui/clapper-app-subtitle-stream-list-item.ui:24 +msgid "Language" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:10 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:11 +msgid "General" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:13 +msgid "Show shortcuts" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:19 +msgid "Open preferences" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:25 +msgid "Toggle fullscreen" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:26 +msgid "Double tap | Double click" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:32 +msgid "Quit" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:40 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:32 +msgid "Media" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:43 +#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:30 +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:178 +msgid "Add Files…" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:49 +#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:40 +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:182 +msgid "Add URI…" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:57 +msgid "Queue" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:61 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:68 +msgid "Next item" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:75 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:82 +msgid "Previous item" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:88 +msgid "Change progression mode" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:96 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:76 +msgid "Playback" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:99 +msgid "Toggle play" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:100 +msgid "Tap | Left click" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:107 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:115 +msgid "Seek forward" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:108 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:132 +msgid "Double tap (right side) | Scroll right" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:116 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:124 +msgid "Double tap (left side) | Scroll left" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:123 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:131 +msgid "Seek backward" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:138 +msgid "Volume up" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:139 +msgid "Scroll up" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:145 +msgid "Volume down" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:146 +msgid "Scroll down" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:152 +msgid "Toggle mute" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:158 +msgid "Speed up" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:164 +msgid "Speed down" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:171 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:178 +msgid "Next chapter" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:185 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:192 +msgid "Previous chapter" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:13 +msgid "Info" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:35 +#: src/bin/clapper-app/ui/clapper-app-subtitle-stream-list-item.ui:14 +msgid "Title" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:49 +msgid "Container Format" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:63 +msgid "Duration" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:81 +msgid "Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:84 +#: src/bin/clapper-app/clapper-app-list-item-utils.c:36 +msgid "Video" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:107 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:80 +#: src/bin/clapper-app/clapper-app-list-item-utils.c:39 +msgid "Audio" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:130 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:100 +#: src/bin/clapper-app/clapper-app-list-item-utils.c:42 +msgid "Subtitles" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:155 +msgid "Video Playback" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:158 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:199 +msgid "Decoder" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:170 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:211 +msgid "Filter" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:182 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:223 +msgid "Sink" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:196 +msgid "Audio Playback" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:247 +msgid "Video Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:290 +msgid "Audio Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:333 +msgid "Subtitle Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:21 +msgid "Start by adding media to playback queue" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:15 +msgid "Seeking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:18 +msgid "Method" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:19 +msgid "A preferred method used for seeking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:32 +msgid "Value" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:33 +msgid "Value used for seeking forward/backward" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:46 +msgid "Unit" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:47 +msgid "An unit of a seek forward/backward value" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:51 +msgid "Second" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:52 +msgid "Minute" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:53 +msgid "Percentage" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:63 +msgid "Features" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:66 +msgid "Server" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:67 +msgid "Control player remotely" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:83 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:103 +msgid "Offset" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:84 +msgid "Synchronisation offset in seconds between the audio and video streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:104 +msgid "" +"Synchronisation offset in seconds between the subtitle and video streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:118 +msgid "Default font" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:119 +msgid "Text font used for subtitles when media does not explicitly specify one" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:137 +msgid "Tweaks" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:144 +msgid "Plugin ranking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:145 +msgid "Alter default ranks of GStreamer plugins" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:164 +msgid "Plugin Ranking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:182 +msgid "Available plugins" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:183 +msgid "" +"Select a plugin and its feature to override rank for. When multiple elements " +"have similiar capabilities, the one with highest value is preferred." +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:186 +msgid "Plugin" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:195 +msgid "Plugin feature" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:213 +msgid "Add override" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:229 +msgid "Rank overrides" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:60 +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:23 +msgid "Add" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:87 +msgid "Queue progression" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:6 +msgid "Add URI" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:7 +msgid "Insert an URI to be added to playback queue" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:18 +msgid "Enter or drop URI here" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:22 +msgid "Cancel" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:24 +msgid "Resolution" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:39 +msgid "Framerate" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:63 +msgid "Pixel Format" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-window-state-buttons.ui:57 +msgid "Preferences" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-window-state-buttons.ui:61 +msgid "Keyboard Shortcuts" +msgstr "" + +#. TRANSLATORS: Please do not translate application name +#: src/bin/clapper-app/ui/clapper-app-window-state-buttons.ui:68 +msgid "About Clapper" +msgstr "" + +#. TRANSLATORS: Put your name(s) here for credits or leave untranslated +#: src/bin/clapper-app/clapper-app-about-window.c:43 +msgid "translator-credits" +msgstr "" + +#: src/bin/clapper-app/clapper-app-info-window.c:86 +msgid "Hardware" +msgstr "" + +#: src/bin/clapper-app/clapper-app-info-window.c:86 +msgid "Software" +msgstr "" + +#: src/bin/clapper-app/clapper-app-preferences-window.c:441 +msgid "Accurate" +msgstr "" + +#: src/bin/clapper-app/clapper-app-preferences-window.c:443 +msgid "Normal" +msgstr "" + +#: src/bin/clapper-app/clapper-app-preferences-window.c:445 +msgid "Fast" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:66 +msgid "No progression" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:67 +msgid "Consecutive" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:68 +msgid "Repeat item" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:69 +msgid "Carousel" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:70 +msgid "Shuffle" +msgstr "" + +#: src/bin/clapper-app/clapper-app-window.c:824 +msgid "Drop on title bar to play now or anywhere else to enqueue." +msgstr "" diff --git a/src/bin/clapper-app/po/de.po b/src/bin/clapper-app/po/de.po new file mode 100644 index 00000000..1acc2054 --- /dev/null +++ b/src/bin/clapper-app/po/de.po @@ -0,0 +1,468 @@ +# German translations for clapper-app package. +# Copyright (C) 2024 THE clapper-app'S COPYRIGHT HOLDER +# This file is distributed under the same license as the clapper-app package. +# Automatically generated, 2024. +# +msgid "" +msgstr "" +"Project-Id-Version: clapper-app\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-04-05 20:50+0200\n" +"PO-Revision-Date: 2024-03-07 21:34+0100\n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\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" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:14 +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:14 +msgid "Codec" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:24 +msgid "Channels" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:36 +msgid "Sample Format" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:46 +msgid "Sample Rate" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:58 +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:51 +msgid "Bitrate" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:70 +#: src/bin/clapper-app/ui/clapper-app-subtitle-stream-list-item.ui:24 +msgid "Language" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:10 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:11 +msgid "General" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:13 +msgid "Show shortcuts" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:19 +msgid "Open preferences" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:25 +msgid "Toggle fullscreen" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:26 +msgid "Double tap | Double click" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:32 +msgid "Quit" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:40 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:32 +msgid "Media" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:43 +#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:30 +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:178 +msgid "Add Files…" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:49 +#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:40 +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:182 +msgid "Add URI…" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:57 +msgid "Queue" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:61 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:68 +msgid "Next item" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:75 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:82 +msgid "Previous item" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:88 +msgid "Change progression mode" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:96 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:76 +msgid "Playback" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:99 +msgid "Toggle play" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:100 +msgid "Tap | Left click" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:107 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:115 +msgid "Seek forward" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:108 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:132 +msgid "Double tap (right side) | Scroll right" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:116 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:124 +msgid "Double tap (left side) | Scroll left" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:123 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:131 +msgid "Seek backward" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:138 +msgid "Volume up" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:139 +msgid "Scroll up" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:145 +msgid "Volume down" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:146 +msgid "Scroll down" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:152 +msgid "Toggle mute" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:158 +msgid "Speed up" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:164 +msgid "Speed down" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:171 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:178 +msgid "Next chapter" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:185 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:192 +msgid "Previous chapter" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:13 +msgid "Info" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:35 +#: src/bin/clapper-app/ui/clapper-app-subtitle-stream-list-item.ui:14 +msgid "Title" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:49 +msgid "Container Format" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:63 +msgid "Duration" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:81 +msgid "Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:84 +#: src/bin/clapper-app/clapper-app-list-item-utils.c:36 +msgid "Video" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:107 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:80 +#: src/bin/clapper-app/clapper-app-list-item-utils.c:39 +msgid "Audio" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:130 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:100 +#: src/bin/clapper-app/clapper-app-list-item-utils.c:42 +msgid "Subtitles" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:155 +msgid "Video Playback" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:158 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:199 +msgid "Decoder" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:170 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:211 +msgid "Filter" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:182 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:223 +msgid "Sink" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:196 +msgid "Audio Playback" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:247 +msgid "Video Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:290 +msgid "Audio Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:333 +msgid "Subtitle Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:21 +msgid "Start by adding media to playback queue" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:15 +msgid "Seeking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:18 +msgid "Method" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:19 +msgid "A preferred method used for seeking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:32 +msgid "Value" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:33 +msgid "Value used for seeking forward/backward" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:46 +msgid "Unit" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:47 +msgid "An unit of a seek forward/backward value" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:51 +msgid "Second" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:52 +msgid "Minute" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:53 +msgid "Percentage" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:63 +msgid "Features" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:66 +msgid "Server" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:67 +msgid "Control player remotely" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:83 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:103 +msgid "Offset" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:84 +msgid "Synchronisation offset in seconds between the audio and video streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:104 +msgid "" +"Synchronisation offset in seconds between the subtitle and video streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:118 +msgid "Default font" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:119 +msgid "Text font used for subtitles when media does not explicitly specify one" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:137 +msgid "Tweaks" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:144 +msgid "Plugin ranking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:145 +msgid "Alter default ranks of GStreamer plugins" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:164 +msgid "Plugin Ranking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:182 +msgid "Available plugins" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:183 +msgid "" +"Select a plugin and its feature to override rank for. When multiple elements " +"have similiar capabilities, the one with highest value is preferred." +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:186 +msgid "Plugin" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:195 +msgid "Plugin feature" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:213 +msgid "Add override" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:229 +msgid "Rank overrides" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:60 +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:23 +msgid "Add" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:87 +msgid "Queue progression" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:6 +msgid "Add URI" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:7 +msgid "Insert an URI to be added to playback queue" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:18 +msgid "Enter or drop URI here" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:22 +msgid "Cancel" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:24 +msgid "Resolution" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:39 +msgid "Framerate" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:63 +msgid "Pixel Format" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-window-state-buttons.ui:57 +msgid "Preferences" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-window-state-buttons.ui:61 +msgid "Keyboard Shortcuts" +msgstr "" + +#. TRANSLATORS: Please do not translate application name +#: src/bin/clapper-app/ui/clapper-app-window-state-buttons.ui:68 +msgid "About Clapper" +msgstr "" + +#. TRANSLATORS: Put your name(s) here for credits or leave untranslated +#: src/bin/clapper-app/clapper-app-about-window.c:43 +msgid "translator-credits" +msgstr "" + +#: src/bin/clapper-app/clapper-app-info-window.c:86 +msgid "Hardware" +msgstr "" + +#: src/bin/clapper-app/clapper-app-info-window.c:86 +msgid "Software" +msgstr "" + +#: src/bin/clapper-app/clapper-app-preferences-window.c:441 +msgid "Accurate" +msgstr "" + +#: src/bin/clapper-app/clapper-app-preferences-window.c:443 +msgid "Normal" +msgstr "" + +#: src/bin/clapper-app/clapper-app-preferences-window.c:445 +msgid "Fast" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:66 +msgid "No progression" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:67 +msgid "Consecutive" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:68 +msgid "Repeat item" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:69 +msgid "Carousel" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:70 +msgid "Shuffle" +msgstr "" + +#: src/bin/clapper-app/clapper-app-window.c:824 +msgid "Drop on title bar to play now or anywhere else to enqueue." +msgstr "" diff --git a/src/bin/clapper-app/po/es.po b/src/bin/clapper-app/po/es.po new file mode 100644 index 00000000..2f239f34 --- /dev/null +++ b/src/bin/clapper-app/po/es.po @@ -0,0 +1,468 @@ +# Spanish translations for clapper-app package. +# Copyright (C) 2024 THE clapper-app'S COPYRIGHT HOLDER +# This file is distributed under the same license as the clapper-app package. +# Automatically generated, 2024. +# +msgid "" +msgstr "" +"Project-Id-Version: clapper-app\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-04-05 20:50+0200\n" +"PO-Revision-Date: 2024-03-07 21:34+0100\n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\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" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:14 +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:14 +msgid "Codec" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:24 +msgid "Channels" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:36 +msgid "Sample Format" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:46 +msgid "Sample Rate" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:58 +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:51 +msgid "Bitrate" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:70 +#: src/bin/clapper-app/ui/clapper-app-subtitle-stream-list-item.ui:24 +msgid "Language" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:10 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:11 +msgid "General" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:13 +msgid "Show shortcuts" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:19 +msgid "Open preferences" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:25 +msgid "Toggle fullscreen" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:26 +msgid "Double tap | Double click" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:32 +msgid "Quit" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:40 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:32 +msgid "Media" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:43 +#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:30 +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:178 +msgid "Add Files…" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:49 +#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:40 +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:182 +msgid "Add URI…" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:57 +msgid "Queue" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:61 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:68 +msgid "Next item" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:75 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:82 +msgid "Previous item" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:88 +msgid "Change progression mode" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:96 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:76 +msgid "Playback" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:99 +msgid "Toggle play" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:100 +msgid "Tap | Left click" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:107 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:115 +msgid "Seek forward" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:108 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:132 +msgid "Double tap (right side) | Scroll right" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:116 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:124 +msgid "Double tap (left side) | Scroll left" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:123 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:131 +msgid "Seek backward" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:138 +msgid "Volume up" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:139 +msgid "Scroll up" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:145 +msgid "Volume down" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:146 +msgid "Scroll down" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:152 +msgid "Toggle mute" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:158 +msgid "Speed up" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:164 +msgid "Speed down" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:171 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:178 +msgid "Next chapter" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:185 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:192 +msgid "Previous chapter" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:13 +msgid "Info" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:35 +#: src/bin/clapper-app/ui/clapper-app-subtitle-stream-list-item.ui:14 +msgid "Title" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:49 +msgid "Container Format" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:63 +msgid "Duration" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:81 +msgid "Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:84 +#: src/bin/clapper-app/clapper-app-list-item-utils.c:36 +msgid "Video" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:107 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:80 +#: src/bin/clapper-app/clapper-app-list-item-utils.c:39 +msgid "Audio" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:130 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:100 +#: src/bin/clapper-app/clapper-app-list-item-utils.c:42 +msgid "Subtitles" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:155 +msgid "Video Playback" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:158 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:199 +msgid "Decoder" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:170 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:211 +msgid "Filter" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:182 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:223 +msgid "Sink" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:196 +msgid "Audio Playback" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:247 +msgid "Video Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:290 +msgid "Audio Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:333 +msgid "Subtitle Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:21 +msgid "Start by adding media to playback queue" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:15 +msgid "Seeking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:18 +msgid "Method" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:19 +msgid "A preferred method used for seeking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:32 +msgid "Value" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:33 +msgid "Value used for seeking forward/backward" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:46 +msgid "Unit" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:47 +msgid "An unit of a seek forward/backward value" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:51 +msgid "Second" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:52 +msgid "Minute" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:53 +msgid "Percentage" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:63 +msgid "Features" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:66 +msgid "Server" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:67 +msgid "Control player remotely" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:83 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:103 +msgid "Offset" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:84 +msgid "Synchronisation offset in seconds between the audio and video streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:104 +msgid "" +"Synchronisation offset in seconds between the subtitle and video streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:118 +msgid "Default font" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:119 +msgid "Text font used for subtitles when media does not explicitly specify one" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:137 +msgid "Tweaks" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:144 +msgid "Plugin ranking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:145 +msgid "Alter default ranks of GStreamer plugins" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:164 +msgid "Plugin Ranking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:182 +msgid "Available plugins" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:183 +msgid "" +"Select a plugin and its feature to override rank for. When multiple elements " +"have similiar capabilities, the one with highest value is preferred." +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:186 +msgid "Plugin" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:195 +msgid "Plugin feature" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:213 +msgid "Add override" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:229 +msgid "Rank overrides" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:60 +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:23 +msgid "Add" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:87 +msgid "Queue progression" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:6 +msgid "Add URI" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:7 +msgid "Insert an URI to be added to playback queue" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:18 +msgid "Enter or drop URI here" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:22 +msgid "Cancel" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:24 +msgid "Resolution" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:39 +msgid "Framerate" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:63 +msgid "Pixel Format" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-window-state-buttons.ui:57 +msgid "Preferences" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-window-state-buttons.ui:61 +msgid "Keyboard Shortcuts" +msgstr "" + +#. TRANSLATORS: Please do not translate application name +#: src/bin/clapper-app/ui/clapper-app-window-state-buttons.ui:68 +msgid "About Clapper" +msgstr "" + +#. TRANSLATORS: Put your name(s) here for credits or leave untranslated +#: src/bin/clapper-app/clapper-app-about-window.c:43 +msgid "translator-credits" +msgstr "" + +#: src/bin/clapper-app/clapper-app-info-window.c:86 +msgid "Hardware" +msgstr "" + +#: src/bin/clapper-app/clapper-app-info-window.c:86 +msgid "Software" +msgstr "" + +#: src/bin/clapper-app/clapper-app-preferences-window.c:441 +msgid "Accurate" +msgstr "" + +#: src/bin/clapper-app/clapper-app-preferences-window.c:443 +msgid "Normal" +msgstr "" + +#: src/bin/clapper-app/clapper-app-preferences-window.c:445 +msgid "Fast" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:66 +msgid "No progression" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:67 +msgid "Consecutive" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:68 +msgid "Repeat item" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:69 +msgid "Carousel" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:70 +msgid "Shuffle" +msgstr "" + +#: src/bin/clapper-app/clapper-app-window.c:824 +msgid "Drop on title bar to play now or anywhere else to enqueue." +msgstr "" diff --git a/src/bin/clapper-app/po/eu.po b/src/bin/clapper-app/po/eu.po new file mode 100644 index 00000000..8111911b --- /dev/null +++ b/src/bin/clapper-app/po/eu.po @@ -0,0 +1,467 @@ +# Basque translations for clapper-app package. +# Copyright (C) 2024 THE clapper-app'S COPYRIGHT HOLDER +# This file is distributed under the same license as the clapper-app package. +# Automatically generated, 2024. +# +msgid "" +msgstr "" +"Project-Id-Version: clapper-app\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-04-05 20:50+0200\n" +"PO-Revision-Date: 2024-03-07 21:34+0100\n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: eu\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:14 +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:14 +msgid "Codec" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:24 +msgid "Channels" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:36 +msgid "Sample Format" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:46 +msgid "Sample Rate" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:58 +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:51 +msgid "Bitrate" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:70 +#: src/bin/clapper-app/ui/clapper-app-subtitle-stream-list-item.ui:24 +msgid "Language" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:10 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:11 +msgid "General" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:13 +msgid "Show shortcuts" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:19 +msgid "Open preferences" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:25 +msgid "Toggle fullscreen" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:26 +msgid "Double tap | Double click" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:32 +msgid "Quit" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:40 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:32 +msgid "Media" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:43 +#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:30 +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:178 +msgid "Add Files…" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:49 +#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:40 +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:182 +msgid "Add URI…" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:57 +msgid "Queue" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:61 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:68 +msgid "Next item" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:75 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:82 +msgid "Previous item" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:88 +msgid "Change progression mode" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:96 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:76 +msgid "Playback" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:99 +msgid "Toggle play" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:100 +msgid "Tap | Left click" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:107 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:115 +msgid "Seek forward" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:108 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:132 +msgid "Double tap (right side) | Scroll right" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:116 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:124 +msgid "Double tap (left side) | Scroll left" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:123 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:131 +msgid "Seek backward" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:138 +msgid "Volume up" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:139 +msgid "Scroll up" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:145 +msgid "Volume down" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:146 +msgid "Scroll down" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:152 +msgid "Toggle mute" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:158 +msgid "Speed up" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:164 +msgid "Speed down" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:171 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:178 +msgid "Next chapter" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:185 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:192 +msgid "Previous chapter" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:13 +msgid "Info" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:35 +#: src/bin/clapper-app/ui/clapper-app-subtitle-stream-list-item.ui:14 +msgid "Title" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:49 +msgid "Container Format" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:63 +msgid "Duration" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:81 +msgid "Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:84 +#: src/bin/clapper-app/clapper-app-list-item-utils.c:36 +msgid "Video" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:107 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:80 +#: src/bin/clapper-app/clapper-app-list-item-utils.c:39 +msgid "Audio" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:130 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:100 +#: src/bin/clapper-app/clapper-app-list-item-utils.c:42 +msgid "Subtitles" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:155 +msgid "Video Playback" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:158 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:199 +msgid "Decoder" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:170 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:211 +msgid "Filter" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:182 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:223 +msgid "Sink" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:196 +msgid "Audio Playback" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:247 +msgid "Video Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:290 +msgid "Audio Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:333 +msgid "Subtitle Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:21 +msgid "Start by adding media to playback queue" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:15 +msgid "Seeking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:18 +msgid "Method" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:19 +msgid "A preferred method used for seeking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:32 +msgid "Value" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:33 +msgid "Value used for seeking forward/backward" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:46 +msgid "Unit" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:47 +msgid "An unit of a seek forward/backward value" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:51 +msgid "Second" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:52 +msgid "Minute" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:53 +msgid "Percentage" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:63 +msgid "Features" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:66 +msgid "Server" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:67 +msgid "Control player remotely" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:83 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:103 +msgid "Offset" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:84 +msgid "Synchronisation offset in seconds between the audio and video streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:104 +msgid "" +"Synchronisation offset in seconds between the subtitle and video streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:118 +msgid "Default font" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:119 +msgid "Text font used for subtitles when media does not explicitly specify one" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:137 +msgid "Tweaks" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:144 +msgid "Plugin ranking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:145 +msgid "Alter default ranks of GStreamer plugins" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:164 +msgid "Plugin Ranking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:182 +msgid "Available plugins" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:183 +msgid "" +"Select a plugin and its feature to override rank for. When multiple elements " +"have similiar capabilities, the one with highest value is preferred." +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:186 +msgid "Plugin" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:195 +msgid "Plugin feature" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:213 +msgid "Add override" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:229 +msgid "Rank overrides" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:60 +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:23 +msgid "Add" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:87 +msgid "Queue progression" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:6 +msgid "Add URI" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:7 +msgid "Insert an URI to be added to playback queue" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:18 +msgid "Enter or drop URI here" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:22 +msgid "Cancel" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:24 +msgid "Resolution" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:39 +msgid "Framerate" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:63 +msgid "Pixel Format" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-window-state-buttons.ui:57 +msgid "Preferences" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-window-state-buttons.ui:61 +msgid "Keyboard Shortcuts" +msgstr "" + +#. TRANSLATORS: Please do not translate application name +#: src/bin/clapper-app/ui/clapper-app-window-state-buttons.ui:68 +msgid "About Clapper" +msgstr "" + +#. TRANSLATORS: Put your name(s) here for credits or leave untranslated +#: src/bin/clapper-app/clapper-app-about-window.c:43 +msgid "translator-credits" +msgstr "" + +#: src/bin/clapper-app/clapper-app-info-window.c:86 +msgid "Hardware" +msgstr "" + +#: src/bin/clapper-app/clapper-app-info-window.c:86 +msgid "Software" +msgstr "" + +#: src/bin/clapper-app/clapper-app-preferences-window.c:441 +msgid "Accurate" +msgstr "" + +#: src/bin/clapper-app/clapper-app-preferences-window.c:443 +msgid "Normal" +msgstr "" + +#: src/bin/clapper-app/clapper-app-preferences-window.c:445 +msgid "Fast" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:66 +msgid "No progression" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:67 +msgid "Consecutive" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:68 +msgid "Repeat item" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:69 +msgid "Carousel" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:70 +msgid "Shuffle" +msgstr "" + +#: src/bin/clapper-app/clapper-app-window.c:824 +msgid "Drop on title bar to play now or anywhere else to enqueue." +msgstr "" diff --git a/src/bin/clapper-app/po/fa.po b/src/bin/clapper-app/po/fa.po new file mode 100644 index 00000000..8b4c8b59 --- /dev/null +++ b/src/bin/clapper-app/po/fa.po @@ -0,0 +1,467 @@ +# Persian translations for clapper-app package. +# Copyright (C) 2024 THE clapper-app'S COPYRIGHT HOLDER +# This file is distributed under the same license as the clapper-app package. +# Automatically generated, 2024. +# +msgid "" +msgstr "" +"Project-Id-Version: clapper-app\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-04-05 20:50+0200\n" +"PO-Revision-Date: 2024-03-07 21:34+0100\n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: fa\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:14 +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:14 +msgid "Codec" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:24 +msgid "Channels" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:36 +msgid "Sample Format" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:46 +msgid "Sample Rate" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:58 +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:51 +msgid "Bitrate" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:70 +#: src/bin/clapper-app/ui/clapper-app-subtitle-stream-list-item.ui:24 +msgid "Language" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:10 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:11 +msgid "General" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:13 +msgid "Show shortcuts" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:19 +msgid "Open preferences" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:25 +msgid "Toggle fullscreen" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:26 +msgid "Double tap | Double click" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:32 +msgid "Quit" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:40 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:32 +msgid "Media" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:43 +#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:30 +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:178 +msgid "Add Files…" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:49 +#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:40 +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:182 +msgid "Add URI…" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:57 +msgid "Queue" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:61 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:68 +msgid "Next item" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:75 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:82 +msgid "Previous item" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:88 +msgid "Change progression mode" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:96 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:76 +msgid "Playback" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:99 +msgid "Toggle play" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:100 +msgid "Tap | Left click" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:107 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:115 +msgid "Seek forward" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:108 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:132 +msgid "Double tap (right side) | Scroll right" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:116 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:124 +msgid "Double tap (left side) | Scroll left" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:123 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:131 +msgid "Seek backward" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:138 +msgid "Volume up" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:139 +msgid "Scroll up" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:145 +msgid "Volume down" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:146 +msgid "Scroll down" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:152 +msgid "Toggle mute" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:158 +msgid "Speed up" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:164 +msgid "Speed down" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:171 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:178 +msgid "Next chapter" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:185 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:192 +msgid "Previous chapter" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:13 +msgid "Info" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:35 +#: src/bin/clapper-app/ui/clapper-app-subtitle-stream-list-item.ui:14 +msgid "Title" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:49 +msgid "Container Format" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:63 +msgid "Duration" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:81 +msgid "Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:84 +#: src/bin/clapper-app/clapper-app-list-item-utils.c:36 +msgid "Video" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:107 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:80 +#: src/bin/clapper-app/clapper-app-list-item-utils.c:39 +msgid "Audio" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:130 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:100 +#: src/bin/clapper-app/clapper-app-list-item-utils.c:42 +msgid "Subtitles" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:155 +msgid "Video Playback" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:158 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:199 +msgid "Decoder" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:170 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:211 +msgid "Filter" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:182 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:223 +msgid "Sink" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:196 +msgid "Audio Playback" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:247 +msgid "Video Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:290 +msgid "Audio Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:333 +msgid "Subtitle Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:21 +msgid "Start by adding media to playback queue" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:15 +msgid "Seeking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:18 +msgid "Method" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:19 +msgid "A preferred method used for seeking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:32 +msgid "Value" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:33 +msgid "Value used for seeking forward/backward" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:46 +msgid "Unit" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:47 +msgid "An unit of a seek forward/backward value" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:51 +msgid "Second" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:52 +msgid "Minute" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:53 +msgid "Percentage" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:63 +msgid "Features" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:66 +msgid "Server" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:67 +msgid "Control player remotely" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:83 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:103 +msgid "Offset" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:84 +msgid "Synchronisation offset in seconds between the audio and video streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:104 +msgid "" +"Synchronisation offset in seconds between the subtitle and video streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:118 +msgid "Default font" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:119 +msgid "Text font used for subtitles when media does not explicitly specify one" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:137 +msgid "Tweaks" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:144 +msgid "Plugin ranking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:145 +msgid "Alter default ranks of GStreamer plugins" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:164 +msgid "Plugin Ranking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:182 +msgid "Available plugins" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:183 +msgid "" +"Select a plugin and its feature to override rank for. When multiple elements " +"have similiar capabilities, the one with highest value is preferred." +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:186 +msgid "Plugin" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:195 +msgid "Plugin feature" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:213 +msgid "Add override" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:229 +msgid "Rank overrides" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:60 +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:23 +msgid "Add" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:87 +msgid "Queue progression" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:6 +msgid "Add URI" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:7 +msgid "Insert an URI to be added to playback queue" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:18 +msgid "Enter or drop URI here" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:22 +msgid "Cancel" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:24 +msgid "Resolution" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:39 +msgid "Framerate" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:63 +msgid "Pixel Format" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-window-state-buttons.ui:57 +msgid "Preferences" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-window-state-buttons.ui:61 +msgid "Keyboard Shortcuts" +msgstr "" + +#. TRANSLATORS: Please do not translate application name +#: src/bin/clapper-app/ui/clapper-app-window-state-buttons.ui:68 +msgid "About Clapper" +msgstr "" + +#. TRANSLATORS: Put your name(s) here for credits or leave untranslated +#: src/bin/clapper-app/clapper-app-about-window.c:43 +msgid "translator-credits" +msgstr "" + +#: src/bin/clapper-app/clapper-app-info-window.c:86 +msgid "Hardware" +msgstr "" + +#: src/bin/clapper-app/clapper-app-info-window.c:86 +msgid "Software" +msgstr "" + +#: src/bin/clapper-app/clapper-app-preferences-window.c:441 +msgid "Accurate" +msgstr "" + +#: src/bin/clapper-app/clapper-app-preferences-window.c:443 +msgid "Normal" +msgstr "" + +#: src/bin/clapper-app/clapper-app-preferences-window.c:445 +msgid "Fast" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:66 +msgid "No progression" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:67 +msgid "Consecutive" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:68 +msgid "Repeat item" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:69 +msgid "Carousel" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:70 +msgid "Shuffle" +msgstr "" + +#: src/bin/clapper-app/clapper-app-window.c:824 +msgid "Drop on title bar to play now or anywhere else to enqueue." +msgstr "" diff --git a/src/bin/clapper-app/po/fi.po b/src/bin/clapper-app/po/fi.po new file mode 100644 index 00000000..8b1011f1 --- /dev/null +++ b/src/bin/clapper-app/po/fi.po @@ -0,0 +1,468 @@ +# Finnish translations for clapper-app package. +# Copyright (C) 2024 THE clapper-app'S COPYRIGHT HOLDER +# This file is distributed under the same license as the clapper-app package. +# Automatically generated, 2024. +# +msgid "" +msgstr "" +"Project-Id-Version: clapper-app\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-04-05 20:50+0200\n" +"PO-Revision-Date: 2024-03-07 21:34+0100\n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\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" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:14 +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:14 +msgid "Codec" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:24 +msgid "Channels" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:36 +msgid "Sample Format" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:46 +msgid "Sample Rate" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:58 +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:51 +msgid "Bitrate" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:70 +#: src/bin/clapper-app/ui/clapper-app-subtitle-stream-list-item.ui:24 +msgid "Language" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:10 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:11 +msgid "General" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:13 +msgid "Show shortcuts" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:19 +msgid "Open preferences" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:25 +msgid "Toggle fullscreen" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:26 +msgid "Double tap | Double click" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:32 +msgid "Quit" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:40 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:32 +msgid "Media" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:43 +#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:30 +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:178 +msgid "Add Files…" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:49 +#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:40 +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:182 +msgid "Add URI…" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:57 +msgid "Queue" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:61 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:68 +msgid "Next item" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:75 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:82 +msgid "Previous item" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:88 +msgid "Change progression mode" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:96 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:76 +msgid "Playback" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:99 +msgid "Toggle play" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:100 +msgid "Tap | Left click" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:107 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:115 +msgid "Seek forward" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:108 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:132 +msgid "Double tap (right side) | Scroll right" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:116 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:124 +msgid "Double tap (left side) | Scroll left" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:123 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:131 +msgid "Seek backward" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:138 +msgid "Volume up" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:139 +msgid "Scroll up" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:145 +msgid "Volume down" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:146 +msgid "Scroll down" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:152 +msgid "Toggle mute" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:158 +msgid "Speed up" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:164 +msgid "Speed down" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:171 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:178 +msgid "Next chapter" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:185 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:192 +msgid "Previous chapter" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:13 +msgid "Info" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:35 +#: src/bin/clapper-app/ui/clapper-app-subtitle-stream-list-item.ui:14 +msgid "Title" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:49 +msgid "Container Format" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:63 +msgid "Duration" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:81 +msgid "Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:84 +#: src/bin/clapper-app/clapper-app-list-item-utils.c:36 +msgid "Video" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:107 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:80 +#: src/bin/clapper-app/clapper-app-list-item-utils.c:39 +msgid "Audio" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:130 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:100 +#: src/bin/clapper-app/clapper-app-list-item-utils.c:42 +msgid "Subtitles" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:155 +msgid "Video Playback" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:158 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:199 +msgid "Decoder" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:170 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:211 +msgid "Filter" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:182 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:223 +msgid "Sink" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:196 +msgid "Audio Playback" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:247 +msgid "Video Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:290 +msgid "Audio Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:333 +msgid "Subtitle Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:21 +msgid "Start by adding media to playback queue" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:15 +msgid "Seeking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:18 +msgid "Method" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:19 +msgid "A preferred method used for seeking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:32 +msgid "Value" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:33 +msgid "Value used for seeking forward/backward" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:46 +msgid "Unit" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:47 +msgid "An unit of a seek forward/backward value" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:51 +msgid "Second" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:52 +msgid "Minute" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:53 +msgid "Percentage" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:63 +msgid "Features" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:66 +msgid "Server" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:67 +msgid "Control player remotely" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:83 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:103 +msgid "Offset" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:84 +msgid "Synchronisation offset in seconds between the audio and video streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:104 +msgid "" +"Synchronisation offset in seconds between the subtitle and video streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:118 +msgid "Default font" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:119 +msgid "Text font used for subtitles when media does not explicitly specify one" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:137 +msgid "Tweaks" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:144 +msgid "Plugin ranking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:145 +msgid "Alter default ranks of GStreamer plugins" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:164 +msgid "Plugin Ranking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:182 +msgid "Available plugins" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:183 +msgid "" +"Select a plugin and its feature to override rank for. When multiple elements " +"have similiar capabilities, the one with highest value is preferred." +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:186 +msgid "Plugin" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:195 +msgid "Plugin feature" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:213 +msgid "Add override" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:229 +msgid "Rank overrides" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:60 +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:23 +msgid "Add" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:87 +msgid "Queue progression" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:6 +msgid "Add URI" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:7 +msgid "Insert an URI to be added to playback queue" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:18 +msgid "Enter or drop URI here" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:22 +msgid "Cancel" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:24 +msgid "Resolution" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:39 +msgid "Framerate" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:63 +msgid "Pixel Format" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-window-state-buttons.ui:57 +msgid "Preferences" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-window-state-buttons.ui:61 +msgid "Keyboard Shortcuts" +msgstr "" + +#. TRANSLATORS: Please do not translate application name +#: src/bin/clapper-app/ui/clapper-app-window-state-buttons.ui:68 +msgid "About Clapper" +msgstr "" + +#. TRANSLATORS: Put your name(s) here for credits or leave untranslated +#: src/bin/clapper-app/clapper-app-about-window.c:43 +msgid "translator-credits" +msgstr "" + +#: src/bin/clapper-app/clapper-app-info-window.c:86 +msgid "Hardware" +msgstr "" + +#: src/bin/clapper-app/clapper-app-info-window.c:86 +msgid "Software" +msgstr "" + +#: src/bin/clapper-app/clapper-app-preferences-window.c:441 +msgid "Accurate" +msgstr "" + +#: src/bin/clapper-app/clapper-app-preferences-window.c:443 +msgid "Normal" +msgstr "" + +#: src/bin/clapper-app/clapper-app-preferences-window.c:445 +msgid "Fast" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:66 +msgid "No progression" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:67 +msgid "Consecutive" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:68 +msgid "Repeat item" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:69 +msgid "Carousel" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:70 +msgid "Shuffle" +msgstr "" + +#: src/bin/clapper-app/clapper-app-window.c:824 +msgid "Drop on title bar to play now or anywhere else to enqueue." +msgstr "" diff --git a/src/bin/clapper-app/po/fr.po b/src/bin/clapper-app/po/fr.po new file mode 100644 index 00000000..ab62a0ae --- /dev/null +++ b/src/bin/clapper-app/po/fr.po @@ -0,0 +1,468 @@ +# French translations for clapper-app package. +# Copyright (C) 2024 THE clapper-app'S COPYRIGHT HOLDER +# This file is distributed under the same license as the clapper-app package. +# Automatically generated, 2024. +# +msgid "" +msgstr "" +"Project-Id-Version: clapper-app\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-04-05 20:50+0200\n" +"PO-Revision-Date: 2024-03-07 21:34+0100\n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\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" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:14 +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:14 +msgid "Codec" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:24 +msgid "Channels" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:36 +msgid "Sample Format" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:46 +msgid "Sample Rate" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:58 +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:51 +msgid "Bitrate" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:70 +#: src/bin/clapper-app/ui/clapper-app-subtitle-stream-list-item.ui:24 +msgid "Language" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:10 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:11 +msgid "General" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:13 +msgid "Show shortcuts" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:19 +msgid "Open preferences" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:25 +msgid "Toggle fullscreen" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:26 +msgid "Double tap | Double click" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:32 +msgid "Quit" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:40 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:32 +msgid "Media" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:43 +#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:30 +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:178 +msgid "Add Files…" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:49 +#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:40 +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:182 +msgid "Add URI…" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:57 +msgid "Queue" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:61 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:68 +msgid "Next item" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:75 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:82 +msgid "Previous item" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:88 +msgid "Change progression mode" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:96 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:76 +msgid "Playback" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:99 +msgid "Toggle play" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:100 +msgid "Tap | Left click" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:107 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:115 +msgid "Seek forward" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:108 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:132 +msgid "Double tap (right side) | Scroll right" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:116 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:124 +msgid "Double tap (left side) | Scroll left" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:123 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:131 +msgid "Seek backward" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:138 +msgid "Volume up" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:139 +msgid "Scroll up" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:145 +msgid "Volume down" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:146 +msgid "Scroll down" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:152 +msgid "Toggle mute" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:158 +msgid "Speed up" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:164 +msgid "Speed down" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:171 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:178 +msgid "Next chapter" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:185 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:192 +msgid "Previous chapter" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:13 +msgid "Info" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:35 +#: src/bin/clapper-app/ui/clapper-app-subtitle-stream-list-item.ui:14 +msgid "Title" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:49 +msgid "Container Format" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:63 +msgid "Duration" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:81 +msgid "Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:84 +#: src/bin/clapper-app/clapper-app-list-item-utils.c:36 +msgid "Video" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:107 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:80 +#: src/bin/clapper-app/clapper-app-list-item-utils.c:39 +msgid "Audio" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:130 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:100 +#: src/bin/clapper-app/clapper-app-list-item-utils.c:42 +msgid "Subtitles" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:155 +msgid "Video Playback" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:158 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:199 +msgid "Decoder" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:170 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:211 +msgid "Filter" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:182 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:223 +msgid "Sink" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:196 +msgid "Audio Playback" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:247 +msgid "Video Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:290 +msgid "Audio Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:333 +msgid "Subtitle Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:21 +msgid "Start by adding media to playback queue" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:15 +msgid "Seeking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:18 +msgid "Method" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:19 +msgid "A preferred method used for seeking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:32 +msgid "Value" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:33 +msgid "Value used for seeking forward/backward" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:46 +msgid "Unit" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:47 +msgid "An unit of a seek forward/backward value" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:51 +msgid "Second" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:52 +msgid "Minute" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:53 +msgid "Percentage" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:63 +msgid "Features" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:66 +msgid "Server" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:67 +msgid "Control player remotely" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:83 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:103 +msgid "Offset" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:84 +msgid "Synchronisation offset in seconds between the audio and video streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:104 +msgid "" +"Synchronisation offset in seconds between the subtitle and video streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:118 +msgid "Default font" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:119 +msgid "Text font used for subtitles when media does not explicitly specify one" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:137 +msgid "Tweaks" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:144 +msgid "Plugin ranking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:145 +msgid "Alter default ranks of GStreamer plugins" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:164 +msgid "Plugin Ranking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:182 +msgid "Available plugins" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:183 +msgid "" +"Select a plugin and its feature to override rank for. When multiple elements " +"have similiar capabilities, the one with highest value is preferred." +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:186 +msgid "Plugin" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:195 +msgid "Plugin feature" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:213 +msgid "Add override" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:229 +msgid "Rank overrides" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:60 +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:23 +msgid "Add" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:87 +msgid "Queue progression" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:6 +msgid "Add URI" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:7 +msgid "Insert an URI to be added to playback queue" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:18 +msgid "Enter or drop URI here" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:22 +msgid "Cancel" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:24 +msgid "Resolution" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:39 +msgid "Framerate" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:63 +msgid "Pixel Format" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-window-state-buttons.ui:57 +msgid "Preferences" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-window-state-buttons.ui:61 +msgid "Keyboard Shortcuts" +msgstr "" + +#. TRANSLATORS: Please do not translate application name +#: src/bin/clapper-app/ui/clapper-app-window-state-buttons.ui:68 +msgid "About Clapper" +msgstr "" + +#. TRANSLATORS: Put your name(s) here for credits or leave untranslated +#: src/bin/clapper-app/clapper-app-about-window.c:43 +msgid "translator-credits" +msgstr "" + +#: src/bin/clapper-app/clapper-app-info-window.c:86 +msgid "Hardware" +msgstr "" + +#: src/bin/clapper-app/clapper-app-info-window.c:86 +msgid "Software" +msgstr "" + +#: src/bin/clapper-app/clapper-app-preferences-window.c:441 +msgid "Accurate" +msgstr "" + +#: src/bin/clapper-app/clapper-app-preferences-window.c:443 +msgid "Normal" +msgstr "" + +#: src/bin/clapper-app/clapper-app-preferences-window.c:445 +msgid "Fast" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:66 +msgid "No progression" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:67 +msgid "Consecutive" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:68 +msgid "Repeat item" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:69 +msgid "Carousel" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:70 +msgid "Shuffle" +msgstr "" + +#: src/bin/clapper-app/clapper-app-window.c:824 +msgid "Drop on title bar to play now or anywhere else to enqueue." +msgstr "" diff --git a/src/bin/clapper-app/po/he.po b/src/bin/clapper-app/po/he.po new file mode 100644 index 00000000..4a9e3ed4 --- /dev/null +++ b/src/bin/clapper-app/po/he.po @@ -0,0 +1,468 @@ +# Hebrew translations for clapper-app package. +# Copyright (C) 2024 THE clapper-app'S COPYRIGHT HOLDER +# This file is distributed under the same license as the clapper-app package. +# Automatically generated, 2024. +# +msgid "" +msgstr "" +"Project-Id-Version: clapper-app\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-04-05 20:50+0200\n" +"PO-Revision-Date: 2024-03-07 21:34+0100\n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\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=2; plural=(n != 1);\n" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:14 +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:14 +msgid "Codec" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:24 +msgid "Channels" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:36 +msgid "Sample Format" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:46 +msgid "Sample Rate" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:58 +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:51 +msgid "Bitrate" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:70 +#: src/bin/clapper-app/ui/clapper-app-subtitle-stream-list-item.ui:24 +msgid "Language" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:10 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:11 +msgid "General" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:13 +msgid "Show shortcuts" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:19 +msgid "Open preferences" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:25 +msgid "Toggle fullscreen" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:26 +msgid "Double tap | Double click" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:32 +msgid "Quit" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:40 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:32 +msgid "Media" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:43 +#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:30 +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:178 +msgid "Add Files…" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:49 +#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:40 +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:182 +msgid "Add URI…" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:57 +msgid "Queue" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:61 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:68 +msgid "Next item" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:75 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:82 +msgid "Previous item" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:88 +msgid "Change progression mode" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:96 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:76 +msgid "Playback" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:99 +msgid "Toggle play" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:100 +msgid "Tap | Left click" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:107 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:115 +msgid "Seek forward" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:108 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:132 +msgid "Double tap (right side) | Scroll right" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:116 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:124 +msgid "Double tap (left side) | Scroll left" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:123 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:131 +msgid "Seek backward" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:138 +msgid "Volume up" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:139 +msgid "Scroll up" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:145 +msgid "Volume down" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:146 +msgid "Scroll down" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:152 +msgid "Toggle mute" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:158 +msgid "Speed up" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:164 +msgid "Speed down" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:171 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:178 +msgid "Next chapter" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:185 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:192 +msgid "Previous chapter" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:13 +msgid "Info" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:35 +#: src/bin/clapper-app/ui/clapper-app-subtitle-stream-list-item.ui:14 +msgid "Title" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:49 +msgid "Container Format" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:63 +msgid "Duration" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:81 +msgid "Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:84 +#: src/bin/clapper-app/clapper-app-list-item-utils.c:36 +msgid "Video" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:107 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:80 +#: src/bin/clapper-app/clapper-app-list-item-utils.c:39 +msgid "Audio" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:130 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:100 +#: src/bin/clapper-app/clapper-app-list-item-utils.c:42 +msgid "Subtitles" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:155 +msgid "Video Playback" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:158 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:199 +msgid "Decoder" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:170 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:211 +msgid "Filter" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:182 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:223 +msgid "Sink" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:196 +msgid "Audio Playback" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:247 +msgid "Video Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:290 +msgid "Audio Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:333 +msgid "Subtitle Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:21 +msgid "Start by adding media to playback queue" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:15 +msgid "Seeking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:18 +msgid "Method" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:19 +msgid "A preferred method used for seeking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:32 +msgid "Value" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:33 +msgid "Value used for seeking forward/backward" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:46 +msgid "Unit" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:47 +msgid "An unit of a seek forward/backward value" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:51 +msgid "Second" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:52 +msgid "Minute" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:53 +msgid "Percentage" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:63 +msgid "Features" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:66 +msgid "Server" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:67 +msgid "Control player remotely" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:83 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:103 +msgid "Offset" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:84 +msgid "Synchronisation offset in seconds between the audio and video streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:104 +msgid "" +"Synchronisation offset in seconds between the subtitle and video streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:118 +msgid "Default font" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:119 +msgid "Text font used for subtitles when media does not explicitly specify one" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:137 +msgid "Tweaks" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:144 +msgid "Plugin ranking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:145 +msgid "Alter default ranks of GStreamer plugins" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:164 +msgid "Plugin Ranking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:182 +msgid "Available plugins" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:183 +msgid "" +"Select a plugin and its feature to override rank for. When multiple elements " +"have similiar capabilities, the one with highest value is preferred." +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:186 +msgid "Plugin" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:195 +msgid "Plugin feature" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:213 +msgid "Add override" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:229 +msgid "Rank overrides" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:60 +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:23 +msgid "Add" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:87 +msgid "Queue progression" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:6 +msgid "Add URI" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:7 +msgid "Insert an URI to be added to playback queue" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:18 +msgid "Enter or drop URI here" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:22 +msgid "Cancel" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:24 +msgid "Resolution" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:39 +msgid "Framerate" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:63 +msgid "Pixel Format" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-window-state-buttons.ui:57 +msgid "Preferences" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-window-state-buttons.ui:61 +msgid "Keyboard Shortcuts" +msgstr "" + +#. TRANSLATORS: Please do not translate application name +#: src/bin/clapper-app/ui/clapper-app-window-state-buttons.ui:68 +msgid "About Clapper" +msgstr "" + +#. TRANSLATORS: Put your name(s) here for credits or leave untranslated +#: src/bin/clapper-app/clapper-app-about-window.c:43 +msgid "translator-credits" +msgstr "" + +#: src/bin/clapper-app/clapper-app-info-window.c:86 +msgid "Hardware" +msgstr "" + +#: src/bin/clapper-app/clapper-app-info-window.c:86 +msgid "Software" +msgstr "" + +#: src/bin/clapper-app/clapper-app-preferences-window.c:441 +msgid "Accurate" +msgstr "" + +#: src/bin/clapper-app/clapper-app-preferences-window.c:443 +msgid "Normal" +msgstr "" + +#: src/bin/clapper-app/clapper-app-preferences-window.c:445 +msgid "Fast" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:66 +msgid "No progression" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:67 +msgid "Consecutive" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:68 +msgid "Repeat item" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:69 +msgid "Carousel" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:70 +msgid "Shuffle" +msgstr "" + +#: src/bin/clapper-app/clapper-app-window.c:824 +msgid "Drop on title bar to play now or anywhere else to enqueue." +msgstr "" diff --git a/src/bin/clapper-app/po/hr.po b/src/bin/clapper-app/po/hr.po new file mode 100644 index 00000000..ecc3215a --- /dev/null +++ b/src/bin/clapper-app/po/hr.po @@ -0,0 +1,469 @@ +# Croatian translations for clapper-app package. +# Copyright (C) 2024 THE clapper-app'S COPYRIGHT HOLDER +# This file is distributed under the same license as the clapper-app package. +# Automatically generated, 2024. +# +msgid "" +msgstr "" +"Project-Id-Version: clapper-app\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-04-05 20:50+0200\n" +"PO-Revision-Date: 2024-03-07 21:34+0100\n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: hr\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" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:14 +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:14 +msgid "Codec" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:24 +msgid "Channels" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:36 +msgid "Sample Format" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:46 +msgid "Sample Rate" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:58 +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:51 +msgid "Bitrate" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:70 +#: src/bin/clapper-app/ui/clapper-app-subtitle-stream-list-item.ui:24 +msgid "Language" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:10 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:11 +msgid "General" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:13 +msgid "Show shortcuts" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:19 +msgid "Open preferences" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:25 +msgid "Toggle fullscreen" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:26 +msgid "Double tap | Double click" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:32 +msgid "Quit" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:40 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:32 +msgid "Media" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:43 +#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:30 +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:178 +msgid "Add Files…" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:49 +#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:40 +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:182 +msgid "Add URI…" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:57 +msgid "Queue" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:61 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:68 +msgid "Next item" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:75 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:82 +msgid "Previous item" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:88 +msgid "Change progression mode" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:96 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:76 +msgid "Playback" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:99 +msgid "Toggle play" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:100 +msgid "Tap | Left click" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:107 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:115 +msgid "Seek forward" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:108 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:132 +msgid "Double tap (right side) | Scroll right" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:116 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:124 +msgid "Double tap (left side) | Scroll left" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:123 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:131 +msgid "Seek backward" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:138 +msgid "Volume up" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:139 +msgid "Scroll up" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:145 +msgid "Volume down" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:146 +msgid "Scroll down" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:152 +msgid "Toggle mute" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:158 +msgid "Speed up" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:164 +msgid "Speed down" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:171 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:178 +msgid "Next chapter" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:185 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:192 +msgid "Previous chapter" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:13 +msgid "Info" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:35 +#: src/bin/clapper-app/ui/clapper-app-subtitle-stream-list-item.ui:14 +msgid "Title" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:49 +msgid "Container Format" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:63 +msgid "Duration" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:81 +msgid "Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:84 +#: src/bin/clapper-app/clapper-app-list-item-utils.c:36 +msgid "Video" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:107 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:80 +#: src/bin/clapper-app/clapper-app-list-item-utils.c:39 +msgid "Audio" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:130 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:100 +#: src/bin/clapper-app/clapper-app-list-item-utils.c:42 +msgid "Subtitles" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:155 +msgid "Video Playback" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:158 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:199 +msgid "Decoder" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:170 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:211 +msgid "Filter" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:182 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:223 +msgid "Sink" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:196 +msgid "Audio Playback" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:247 +msgid "Video Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:290 +msgid "Audio Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:333 +msgid "Subtitle Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:21 +msgid "Start by adding media to playback queue" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:15 +msgid "Seeking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:18 +msgid "Method" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:19 +msgid "A preferred method used for seeking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:32 +msgid "Value" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:33 +msgid "Value used for seeking forward/backward" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:46 +msgid "Unit" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:47 +msgid "An unit of a seek forward/backward value" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:51 +msgid "Second" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:52 +msgid "Minute" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:53 +msgid "Percentage" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:63 +msgid "Features" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:66 +msgid "Server" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:67 +msgid "Control player remotely" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:83 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:103 +msgid "Offset" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:84 +msgid "Synchronisation offset in seconds between the audio and video streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:104 +msgid "" +"Synchronisation offset in seconds between the subtitle and video streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:118 +msgid "Default font" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:119 +msgid "Text font used for subtitles when media does not explicitly specify one" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:137 +msgid "Tweaks" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:144 +msgid "Plugin ranking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:145 +msgid "Alter default ranks of GStreamer plugins" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:164 +msgid "Plugin Ranking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:182 +msgid "Available plugins" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:183 +msgid "" +"Select a plugin and its feature to override rank for. When multiple elements " +"have similiar capabilities, the one with highest value is preferred." +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:186 +msgid "Plugin" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:195 +msgid "Plugin feature" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:213 +msgid "Add override" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:229 +msgid "Rank overrides" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:60 +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:23 +msgid "Add" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:87 +msgid "Queue progression" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:6 +msgid "Add URI" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:7 +msgid "Insert an URI to be added to playback queue" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:18 +msgid "Enter or drop URI here" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:22 +msgid "Cancel" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:24 +msgid "Resolution" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:39 +msgid "Framerate" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:63 +msgid "Pixel Format" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-window-state-buttons.ui:57 +msgid "Preferences" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-window-state-buttons.ui:61 +msgid "Keyboard Shortcuts" +msgstr "" + +#. TRANSLATORS: Please do not translate application name +#: src/bin/clapper-app/ui/clapper-app-window-state-buttons.ui:68 +msgid "About Clapper" +msgstr "" + +#. TRANSLATORS: Put your name(s) here for credits or leave untranslated +#: src/bin/clapper-app/clapper-app-about-window.c:43 +msgid "translator-credits" +msgstr "" + +#: src/bin/clapper-app/clapper-app-info-window.c:86 +msgid "Hardware" +msgstr "" + +#: src/bin/clapper-app/clapper-app-info-window.c:86 +msgid "Software" +msgstr "" + +#: src/bin/clapper-app/clapper-app-preferences-window.c:441 +msgid "Accurate" +msgstr "" + +#: src/bin/clapper-app/clapper-app-preferences-window.c:443 +msgid "Normal" +msgstr "" + +#: src/bin/clapper-app/clapper-app-preferences-window.c:445 +msgid "Fast" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:66 +msgid "No progression" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:67 +msgid "Consecutive" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:68 +msgid "Repeat item" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:69 +msgid "Carousel" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:70 +msgid "Shuffle" +msgstr "" + +#: src/bin/clapper-app/clapper-app-window.c:824 +msgid "Drop on title bar to play now or anywhere else to enqueue." +msgstr "" diff --git a/src/bin/clapper-app/po/hu.po b/src/bin/clapper-app/po/hu.po new file mode 100644 index 00000000..574e22c9 --- /dev/null +++ b/src/bin/clapper-app/po/hu.po @@ -0,0 +1,468 @@ +# Hungarian translations for clapper-app package. +# Copyright (C) 2024 THE clapper-app'S COPYRIGHT HOLDER +# This file is distributed under the same license as the clapper-app package. +# Automatically generated, 2024. +# +msgid "" +msgstr "" +"Project-Id-Version: clapper-app\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-04-05 20:50+0200\n" +"PO-Revision-Date: 2024-03-07 21:34+0100\n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\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" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:14 +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:14 +msgid "Codec" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:24 +msgid "Channels" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:36 +msgid "Sample Format" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:46 +msgid "Sample Rate" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:58 +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:51 +msgid "Bitrate" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:70 +#: src/bin/clapper-app/ui/clapper-app-subtitle-stream-list-item.ui:24 +msgid "Language" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:10 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:11 +msgid "General" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:13 +msgid "Show shortcuts" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:19 +msgid "Open preferences" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:25 +msgid "Toggle fullscreen" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:26 +msgid "Double tap | Double click" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:32 +msgid "Quit" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:40 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:32 +msgid "Media" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:43 +#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:30 +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:178 +msgid "Add Files…" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:49 +#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:40 +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:182 +msgid "Add URI…" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:57 +msgid "Queue" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:61 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:68 +msgid "Next item" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:75 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:82 +msgid "Previous item" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:88 +msgid "Change progression mode" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:96 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:76 +msgid "Playback" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:99 +msgid "Toggle play" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:100 +msgid "Tap | Left click" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:107 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:115 +msgid "Seek forward" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:108 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:132 +msgid "Double tap (right side) | Scroll right" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:116 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:124 +msgid "Double tap (left side) | Scroll left" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:123 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:131 +msgid "Seek backward" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:138 +msgid "Volume up" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:139 +msgid "Scroll up" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:145 +msgid "Volume down" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:146 +msgid "Scroll down" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:152 +msgid "Toggle mute" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:158 +msgid "Speed up" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:164 +msgid "Speed down" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:171 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:178 +msgid "Next chapter" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:185 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:192 +msgid "Previous chapter" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:13 +msgid "Info" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:35 +#: src/bin/clapper-app/ui/clapper-app-subtitle-stream-list-item.ui:14 +msgid "Title" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:49 +msgid "Container Format" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:63 +msgid "Duration" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:81 +msgid "Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:84 +#: src/bin/clapper-app/clapper-app-list-item-utils.c:36 +msgid "Video" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:107 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:80 +#: src/bin/clapper-app/clapper-app-list-item-utils.c:39 +msgid "Audio" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:130 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:100 +#: src/bin/clapper-app/clapper-app-list-item-utils.c:42 +msgid "Subtitles" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:155 +msgid "Video Playback" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:158 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:199 +msgid "Decoder" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:170 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:211 +msgid "Filter" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:182 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:223 +msgid "Sink" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:196 +msgid "Audio Playback" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:247 +msgid "Video Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:290 +msgid "Audio Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:333 +msgid "Subtitle Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:21 +msgid "Start by adding media to playback queue" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:15 +msgid "Seeking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:18 +msgid "Method" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:19 +msgid "A preferred method used for seeking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:32 +msgid "Value" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:33 +msgid "Value used for seeking forward/backward" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:46 +msgid "Unit" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:47 +msgid "An unit of a seek forward/backward value" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:51 +msgid "Second" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:52 +msgid "Minute" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:53 +msgid "Percentage" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:63 +msgid "Features" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:66 +msgid "Server" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:67 +msgid "Control player remotely" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:83 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:103 +msgid "Offset" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:84 +msgid "Synchronisation offset in seconds between the audio and video streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:104 +msgid "" +"Synchronisation offset in seconds between the subtitle and video streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:118 +msgid "Default font" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:119 +msgid "Text font used for subtitles when media does not explicitly specify one" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:137 +msgid "Tweaks" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:144 +msgid "Plugin ranking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:145 +msgid "Alter default ranks of GStreamer plugins" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:164 +msgid "Plugin Ranking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:182 +msgid "Available plugins" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:183 +msgid "" +"Select a plugin and its feature to override rank for. When multiple elements " +"have similiar capabilities, the one with highest value is preferred." +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:186 +msgid "Plugin" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:195 +msgid "Plugin feature" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:213 +msgid "Add override" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:229 +msgid "Rank overrides" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:60 +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:23 +msgid "Add" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:87 +msgid "Queue progression" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:6 +msgid "Add URI" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:7 +msgid "Insert an URI to be added to playback queue" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:18 +msgid "Enter or drop URI here" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:22 +msgid "Cancel" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:24 +msgid "Resolution" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:39 +msgid "Framerate" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:63 +msgid "Pixel Format" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-window-state-buttons.ui:57 +msgid "Preferences" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-window-state-buttons.ui:61 +msgid "Keyboard Shortcuts" +msgstr "" + +#. TRANSLATORS: Please do not translate application name +#: src/bin/clapper-app/ui/clapper-app-window-state-buttons.ui:68 +msgid "About Clapper" +msgstr "" + +#. TRANSLATORS: Put your name(s) here for credits or leave untranslated +#: src/bin/clapper-app/clapper-app-about-window.c:43 +msgid "translator-credits" +msgstr "" + +#: src/bin/clapper-app/clapper-app-info-window.c:86 +msgid "Hardware" +msgstr "" + +#: src/bin/clapper-app/clapper-app-info-window.c:86 +msgid "Software" +msgstr "" + +#: src/bin/clapper-app/clapper-app-preferences-window.c:441 +msgid "Accurate" +msgstr "" + +#: src/bin/clapper-app/clapper-app-preferences-window.c:443 +msgid "Normal" +msgstr "" + +#: src/bin/clapper-app/clapper-app-preferences-window.c:445 +msgid "Fast" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:66 +msgid "No progression" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:67 +msgid "Consecutive" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:68 +msgid "Repeat item" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:69 +msgid "Carousel" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:70 +msgid "Shuffle" +msgstr "" + +#: src/bin/clapper-app/clapper-app-window.c:824 +msgid "Drop on title bar to play now or anywhere else to enqueue." +msgstr "" diff --git a/src/bin/clapper-app/po/it.po b/src/bin/clapper-app/po/it.po new file mode 100644 index 00000000..67b2cca0 --- /dev/null +++ b/src/bin/clapper-app/po/it.po @@ -0,0 +1,468 @@ +# Italian translations for clapper-app package. +# Copyright (C) 2024 THE clapper-app'S COPYRIGHT HOLDER +# This file is distributed under the same license as the clapper-app package. +# Automatically generated, 2024. +# +msgid "" +msgstr "" +"Project-Id-Version: clapper-app\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-04-05 20:50+0200\n" +"PO-Revision-Date: 2024-03-07 21:34+0100\n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\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" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:14 +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:14 +msgid "Codec" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:24 +msgid "Channels" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:36 +msgid "Sample Format" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:46 +msgid "Sample Rate" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:58 +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:51 +msgid "Bitrate" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:70 +#: src/bin/clapper-app/ui/clapper-app-subtitle-stream-list-item.ui:24 +msgid "Language" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:10 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:11 +msgid "General" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:13 +msgid "Show shortcuts" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:19 +msgid "Open preferences" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:25 +msgid "Toggle fullscreen" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:26 +msgid "Double tap | Double click" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:32 +msgid "Quit" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:40 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:32 +msgid "Media" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:43 +#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:30 +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:178 +msgid "Add Files…" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:49 +#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:40 +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:182 +msgid "Add URI…" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:57 +msgid "Queue" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:61 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:68 +msgid "Next item" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:75 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:82 +msgid "Previous item" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:88 +msgid "Change progression mode" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:96 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:76 +msgid "Playback" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:99 +msgid "Toggle play" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:100 +msgid "Tap | Left click" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:107 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:115 +msgid "Seek forward" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:108 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:132 +msgid "Double tap (right side) | Scroll right" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:116 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:124 +msgid "Double tap (left side) | Scroll left" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:123 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:131 +msgid "Seek backward" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:138 +msgid "Volume up" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:139 +msgid "Scroll up" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:145 +msgid "Volume down" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:146 +msgid "Scroll down" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:152 +msgid "Toggle mute" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:158 +msgid "Speed up" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:164 +msgid "Speed down" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:171 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:178 +msgid "Next chapter" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:185 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:192 +msgid "Previous chapter" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:13 +msgid "Info" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:35 +#: src/bin/clapper-app/ui/clapper-app-subtitle-stream-list-item.ui:14 +msgid "Title" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:49 +msgid "Container Format" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:63 +msgid "Duration" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:81 +msgid "Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:84 +#: src/bin/clapper-app/clapper-app-list-item-utils.c:36 +msgid "Video" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:107 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:80 +#: src/bin/clapper-app/clapper-app-list-item-utils.c:39 +msgid "Audio" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:130 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:100 +#: src/bin/clapper-app/clapper-app-list-item-utils.c:42 +msgid "Subtitles" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:155 +msgid "Video Playback" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:158 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:199 +msgid "Decoder" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:170 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:211 +msgid "Filter" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:182 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:223 +msgid "Sink" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:196 +msgid "Audio Playback" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:247 +msgid "Video Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:290 +msgid "Audio Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:333 +msgid "Subtitle Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:21 +msgid "Start by adding media to playback queue" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:15 +msgid "Seeking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:18 +msgid "Method" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:19 +msgid "A preferred method used for seeking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:32 +msgid "Value" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:33 +msgid "Value used for seeking forward/backward" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:46 +msgid "Unit" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:47 +msgid "An unit of a seek forward/backward value" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:51 +msgid "Second" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:52 +msgid "Minute" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:53 +msgid "Percentage" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:63 +msgid "Features" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:66 +msgid "Server" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:67 +msgid "Control player remotely" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:83 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:103 +msgid "Offset" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:84 +msgid "Synchronisation offset in seconds between the audio and video streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:104 +msgid "" +"Synchronisation offset in seconds between the subtitle and video streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:118 +msgid "Default font" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:119 +msgid "Text font used for subtitles when media does not explicitly specify one" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:137 +msgid "Tweaks" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:144 +msgid "Plugin ranking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:145 +msgid "Alter default ranks of GStreamer plugins" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:164 +msgid "Plugin Ranking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:182 +msgid "Available plugins" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:183 +msgid "" +"Select a plugin and its feature to override rank for. When multiple elements " +"have similiar capabilities, the one with highest value is preferred." +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:186 +msgid "Plugin" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:195 +msgid "Plugin feature" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:213 +msgid "Add override" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:229 +msgid "Rank overrides" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:60 +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:23 +msgid "Add" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:87 +msgid "Queue progression" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:6 +msgid "Add URI" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:7 +msgid "Insert an URI to be added to playback queue" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:18 +msgid "Enter or drop URI here" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:22 +msgid "Cancel" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:24 +msgid "Resolution" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:39 +msgid "Framerate" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:63 +msgid "Pixel Format" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-window-state-buttons.ui:57 +msgid "Preferences" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-window-state-buttons.ui:61 +msgid "Keyboard Shortcuts" +msgstr "" + +#. TRANSLATORS: Please do not translate application name +#: src/bin/clapper-app/ui/clapper-app-window-state-buttons.ui:68 +msgid "About Clapper" +msgstr "" + +#. TRANSLATORS: Put your name(s) here for credits or leave untranslated +#: src/bin/clapper-app/clapper-app-about-window.c:43 +msgid "translator-credits" +msgstr "" + +#: src/bin/clapper-app/clapper-app-info-window.c:86 +msgid "Hardware" +msgstr "" + +#: src/bin/clapper-app/clapper-app-info-window.c:86 +msgid "Software" +msgstr "" + +#: src/bin/clapper-app/clapper-app-preferences-window.c:441 +msgid "Accurate" +msgstr "" + +#: src/bin/clapper-app/clapper-app-preferences-window.c:443 +msgid "Normal" +msgstr "" + +#: src/bin/clapper-app/clapper-app-preferences-window.c:445 +msgid "Fast" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:66 +msgid "No progression" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:67 +msgid "Consecutive" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:68 +msgid "Repeat item" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:69 +msgid "Carousel" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:70 +msgid "Shuffle" +msgstr "" + +#: src/bin/clapper-app/clapper-app-window.c:824 +msgid "Drop on title bar to play now or anywhere else to enqueue." +msgstr "" diff --git a/src/bin/clapper-app/po/ja.po b/src/bin/clapper-app/po/ja.po new file mode 100644 index 00000000..916438bb --- /dev/null +++ b/src/bin/clapper-app/po/ja.po @@ -0,0 +1,468 @@ +# Japanese translations for clapper-app package. +# Copyright (C) 2024 THE clapper-app'S COPYRIGHT HOLDER +# This file is distributed under the same license as the clapper-app package. +# Automatically generated, 2024. +# +msgid "" +msgstr "" +"Project-Id-Version: clapper-app\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-04-05 20:50+0200\n" +"PO-Revision-Date: 2024-03-07 21:34+0100\n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: ja\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:14 +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:14 +msgid "Codec" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:24 +msgid "Channels" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:36 +msgid "Sample Format" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:46 +msgid "Sample Rate" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:58 +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:51 +msgid "Bitrate" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:70 +#: src/bin/clapper-app/ui/clapper-app-subtitle-stream-list-item.ui:24 +msgid "Language" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:10 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:11 +msgid "General" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:13 +msgid "Show shortcuts" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:19 +msgid "Open preferences" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:25 +msgid "Toggle fullscreen" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:26 +msgid "Double tap | Double click" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:32 +msgid "Quit" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:40 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:32 +msgid "Media" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:43 +#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:30 +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:178 +msgid "Add Files…" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:49 +#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:40 +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:182 +msgid "Add URI…" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:57 +msgid "Queue" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:61 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:68 +msgid "Next item" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:75 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:82 +msgid "Previous item" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:88 +msgid "Change progression mode" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:96 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:76 +msgid "Playback" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:99 +msgid "Toggle play" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:100 +msgid "Tap | Left click" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:107 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:115 +msgid "Seek forward" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:108 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:132 +msgid "Double tap (right side) | Scroll right" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:116 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:124 +msgid "Double tap (left side) | Scroll left" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:123 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:131 +msgid "Seek backward" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:138 +msgid "Volume up" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:139 +msgid "Scroll up" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:145 +msgid "Volume down" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:146 +msgid "Scroll down" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:152 +msgid "Toggle mute" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:158 +msgid "Speed up" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:164 +msgid "Speed down" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:171 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:178 +msgid "Next chapter" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:185 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:192 +msgid "Previous chapter" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:13 +msgid "Info" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:35 +#: src/bin/clapper-app/ui/clapper-app-subtitle-stream-list-item.ui:14 +msgid "Title" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:49 +msgid "Container Format" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:63 +msgid "Duration" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:81 +msgid "Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:84 +#: src/bin/clapper-app/clapper-app-list-item-utils.c:36 +msgid "Video" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:107 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:80 +#: src/bin/clapper-app/clapper-app-list-item-utils.c:39 +msgid "Audio" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:130 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:100 +#: src/bin/clapper-app/clapper-app-list-item-utils.c:42 +msgid "Subtitles" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:155 +msgid "Video Playback" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:158 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:199 +msgid "Decoder" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:170 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:211 +msgid "Filter" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:182 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:223 +msgid "Sink" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:196 +msgid "Audio Playback" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:247 +msgid "Video Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:290 +msgid "Audio Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:333 +msgid "Subtitle Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:21 +msgid "Start by adding media to playback queue" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:15 +msgid "Seeking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:18 +msgid "Method" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:19 +msgid "A preferred method used for seeking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:32 +msgid "Value" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:33 +msgid "Value used for seeking forward/backward" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:46 +msgid "Unit" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:47 +msgid "An unit of a seek forward/backward value" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:51 +msgid "Second" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:52 +msgid "Minute" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:53 +msgid "Percentage" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:63 +msgid "Features" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:66 +msgid "Server" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:67 +msgid "Control player remotely" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:83 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:103 +msgid "Offset" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:84 +msgid "Synchronisation offset in seconds between the audio and video streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:104 +msgid "" +"Synchronisation offset in seconds between the subtitle and video streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:118 +msgid "Default font" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:119 +msgid "Text font used for subtitles when media does not explicitly specify one" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:137 +msgid "Tweaks" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:144 +msgid "Plugin ranking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:145 +msgid "Alter default ranks of GStreamer plugins" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:164 +msgid "Plugin Ranking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:182 +msgid "Available plugins" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:183 +msgid "" +"Select a plugin and its feature to override rank for. When multiple elements " +"have similiar capabilities, the one with highest value is preferred." +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:186 +msgid "Plugin" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:195 +msgid "Plugin feature" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:213 +msgid "Add override" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:229 +msgid "Rank overrides" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:60 +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:23 +msgid "Add" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:87 +msgid "Queue progression" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:6 +msgid "Add URI" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:7 +msgid "Insert an URI to be added to playback queue" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:18 +msgid "Enter or drop URI here" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:22 +msgid "Cancel" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:24 +msgid "Resolution" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:39 +msgid "Framerate" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:63 +msgid "Pixel Format" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-window-state-buttons.ui:57 +msgid "Preferences" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-window-state-buttons.ui:61 +msgid "Keyboard Shortcuts" +msgstr "" + +#. TRANSLATORS: Please do not translate application name +#: src/bin/clapper-app/ui/clapper-app-window-state-buttons.ui:68 +msgid "About Clapper" +msgstr "" + +#. TRANSLATORS: Put your name(s) here for credits or leave untranslated +#: src/bin/clapper-app/clapper-app-about-window.c:43 +msgid "translator-credits" +msgstr "" + +#: src/bin/clapper-app/clapper-app-info-window.c:86 +msgid "Hardware" +msgstr "" + +#: src/bin/clapper-app/clapper-app-info-window.c:86 +msgid "Software" +msgstr "" + +#: src/bin/clapper-app/clapper-app-preferences-window.c:441 +msgid "Accurate" +msgstr "" + +#: src/bin/clapper-app/clapper-app-preferences-window.c:443 +msgid "Normal" +msgstr "" + +#: src/bin/clapper-app/clapper-app-preferences-window.c:445 +msgid "Fast" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:66 +msgid "No progression" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:67 +msgid "Consecutive" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:68 +msgid "Repeat item" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:69 +msgid "Carousel" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:70 +msgid "Shuffle" +msgstr "" + +#: src/bin/clapper-app/clapper-app-window.c:824 +msgid "Drop on title bar to play now or anywhere else to enqueue." +msgstr "" diff --git a/src/bin/clapper-app/po/lt.po b/src/bin/clapper-app/po/lt.po new file mode 100644 index 00000000..6907a7b9 --- /dev/null +++ b/src/bin/clapper-app/po/lt.po @@ -0,0 +1,469 @@ +# Lithuanian translations for clapper-app package. +# Copyright (C) 2024 THE clapper-app'S COPYRIGHT HOLDER +# This file is distributed under the same license as the clapper-app package. +# Automatically generated, 2024. +# +msgid "" +msgstr "" +"Project-Id-Version: clapper-app\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-04-05 20:50+0200\n" +"PO-Revision-Date: 2024-03-07 21:34+0100\n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: lt\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%100<10 || n%100>=20) ? 1 : 2);\n" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:14 +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:14 +msgid "Codec" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:24 +msgid "Channels" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:36 +msgid "Sample Format" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:46 +msgid "Sample Rate" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:58 +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:51 +msgid "Bitrate" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:70 +#: src/bin/clapper-app/ui/clapper-app-subtitle-stream-list-item.ui:24 +msgid "Language" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:10 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:11 +msgid "General" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:13 +msgid "Show shortcuts" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:19 +msgid "Open preferences" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:25 +msgid "Toggle fullscreen" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:26 +msgid "Double tap | Double click" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:32 +msgid "Quit" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:40 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:32 +msgid "Media" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:43 +#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:30 +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:178 +msgid "Add Files…" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:49 +#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:40 +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:182 +msgid "Add URI…" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:57 +msgid "Queue" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:61 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:68 +msgid "Next item" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:75 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:82 +msgid "Previous item" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:88 +msgid "Change progression mode" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:96 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:76 +msgid "Playback" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:99 +msgid "Toggle play" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:100 +msgid "Tap | Left click" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:107 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:115 +msgid "Seek forward" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:108 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:132 +msgid "Double tap (right side) | Scroll right" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:116 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:124 +msgid "Double tap (left side) | Scroll left" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:123 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:131 +msgid "Seek backward" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:138 +msgid "Volume up" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:139 +msgid "Scroll up" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:145 +msgid "Volume down" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:146 +msgid "Scroll down" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:152 +msgid "Toggle mute" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:158 +msgid "Speed up" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:164 +msgid "Speed down" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:171 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:178 +msgid "Next chapter" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:185 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:192 +msgid "Previous chapter" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:13 +msgid "Info" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:35 +#: src/bin/clapper-app/ui/clapper-app-subtitle-stream-list-item.ui:14 +msgid "Title" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:49 +msgid "Container Format" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:63 +msgid "Duration" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:81 +msgid "Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:84 +#: src/bin/clapper-app/clapper-app-list-item-utils.c:36 +msgid "Video" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:107 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:80 +#: src/bin/clapper-app/clapper-app-list-item-utils.c:39 +msgid "Audio" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:130 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:100 +#: src/bin/clapper-app/clapper-app-list-item-utils.c:42 +msgid "Subtitles" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:155 +msgid "Video Playback" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:158 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:199 +msgid "Decoder" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:170 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:211 +msgid "Filter" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:182 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:223 +msgid "Sink" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:196 +msgid "Audio Playback" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:247 +msgid "Video Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:290 +msgid "Audio Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:333 +msgid "Subtitle Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:21 +msgid "Start by adding media to playback queue" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:15 +msgid "Seeking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:18 +msgid "Method" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:19 +msgid "A preferred method used for seeking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:32 +msgid "Value" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:33 +msgid "Value used for seeking forward/backward" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:46 +msgid "Unit" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:47 +msgid "An unit of a seek forward/backward value" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:51 +msgid "Second" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:52 +msgid "Minute" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:53 +msgid "Percentage" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:63 +msgid "Features" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:66 +msgid "Server" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:67 +msgid "Control player remotely" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:83 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:103 +msgid "Offset" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:84 +msgid "Synchronisation offset in seconds between the audio and video streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:104 +msgid "" +"Synchronisation offset in seconds between the subtitle and video streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:118 +msgid "Default font" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:119 +msgid "Text font used for subtitles when media does not explicitly specify one" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:137 +msgid "Tweaks" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:144 +msgid "Plugin ranking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:145 +msgid "Alter default ranks of GStreamer plugins" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:164 +msgid "Plugin Ranking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:182 +msgid "Available plugins" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:183 +msgid "" +"Select a plugin and its feature to override rank for. When multiple elements " +"have similiar capabilities, the one with highest value is preferred." +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:186 +msgid "Plugin" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:195 +msgid "Plugin feature" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:213 +msgid "Add override" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:229 +msgid "Rank overrides" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:60 +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:23 +msgid "Add" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:87 +msgid "Queue progression" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:6 +msgid "Add URI" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:7 +msgid "Insert an URI to be added to playback queue" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:18 +msgid "Enter or drop URI here" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:22 +msgid "Cancel" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:24 +msgid "Resolution" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:39 +msgid "Framerate" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:63 +msgid "Pixel Format" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-window-state-buttons.ui:57 +msgid "Preferences" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-window-state-buttons.ui:61 +msgid "Keyboard Shortcuts" +msgstr "" + +#. TRANSLATORS: Please do not translate application name +#: src/bin/clapper-app/ui/clapper-app-window-state-buttons.ui:68 +msgid "About Clapper" +msgstr "" + +#. TRANSLATORS: Put your name(s) here for credits or leave untranslated +#: src/bin/clapper-app/clapper-app-about-window.c:43 +msgid "translator-credits" +msgstr "" + +#: src/bin/clapper-app/clapper-app-info-window.c:86 +msgid "Hardware" +msgstr "" + +#: src/bin/clapper-app/clapper-app-info-window.c:86 +msgid "Software" +msgstr "" + +#: src/bin/clapper-app/clapper-app-preferences-window.c:441 +msgid "Accurate" +msgstr "" + +#: src/bin/clapper-app/clapper-app-preferences-window.c:443 +msgid "Normal" +msgstr "" + +#: src/bin/clapper-app/clapper-app-preferences-window.c:445 +msgid "Fast" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:66 +msgid "No progression" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:67 +msgid "Consecutive" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:68 +msgid "Repeat item" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:69 +msgid "Carousel" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:70 +msgid "Shuffle" +msgstr "" + +#: src/bin/clapper-app/clapper-app-window.c:824 +msgid "Drop on title bar to play now or anywhere else to enqueue." +msgstr "" diff --git a/src/bin/clapper-app/po/meson.build b/src/bin/clapper-app/po/meson.build new file mode 100644 index 00000000..b166bffe --- /dev/null +++ b/src/bin/clapper-app/po/meson.build @@ -0,0 +1 @@ +i18n.gettext(meson.project_name() + '-app', preset: 'glib') diff --git a/src/bin/clapper-app/po/nl.po b/src/bin/clapper-app/po/nl.po new file mode 100644 index 00000000..75a28033 --- /dev/null +++ b/src/bin/clapper-app/po/nl.po @@ -0,0 +1,468 @@ +# Dutch translations for clapper-app package. +# Copyright (C) 2024 THE clapper-app'S COPYRIGHT HOLDER +# This file is distributed under the same license as the clapper-app package. +# Automatically generated, 2024. +# +msgid "" +msgstr "" +"Project-Id-Version: clapper-app\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-04-05 20:50+0200\n" +"PO-Revision-Date: 2024-03-07 21:34+0100\n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\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" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:14 +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:14 +msgid "Codec" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:24 +msgid "Channels" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:36 +msgid "Sample Format" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:46 +msgid "Sample Rate" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:58 +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:51 +msgid "Bitrate" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:70 +#: src/bin/clapper-app/ui/clapper-app-subtitle-stream-list-item.ui:24 +msgid "Language" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:10 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:11 +msgid "General" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:13 +msgid "Show shortcuts" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:19 +msgid "Open preferences" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:25 +msgid "Toggle fullscreen" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:26 +msgid "Double tap | Double click" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:32 +msgid "Quit" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:40 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:32 +msgid "Media" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:43 +#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:30 +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:178 +msgid "Add Files…" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:49 +#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:40 +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:182 +msgid "Add URI…" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:57 +msgid "Queue" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:61 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:68 +msgid "Next item" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:75 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:82 +msgid "Previous item" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:88 +msgid "Change progression mode" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:96 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:76 +msgid "Playback" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:99 +msgid "Toggle play" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:100 +msgid "Tap | Left click" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:107 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:115 +msgid "Seek forward" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:108 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:132 +msgid "Double tap (right side) | Scroll right" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:116 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:124 +msgid "Double tap (left side) | Scroll left" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:123 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:131 +msgid "Seek backward" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:138 +msgid "Volume up" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:139 +msgid "Scroll up" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:145 +msgid "Volume down" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:146 +msgid "Scroll down" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:152 +msgid "Toggle mute" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:158 +msgid "Speed up" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:164 +msgid "Speed down" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:171 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:178 +msgid "Next chapter" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:185 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:192 +msgid "Previous chapter" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:13 +msgid "Info" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:35 +#: src/bin/clapper-app/ui/clapper-app-subtitle-stream-list-item.ui:14 +msgid "Title" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:49 +msgid "Container Format" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:63 +msgid "Duration" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:81 +msgid "Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:84 +#: src/bin/clapper-app/clapper-app-list-item-utils.c:36 +msgid "Video" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:107 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:80 +#: src/bin/clapper-app/clapper-app-list-item-utils.c:39 +msgid "Audio" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:130 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:100 +#: src/bin/clapper-app/clapper-app-list-item-utils.c:42 +msgid "Subtitles" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:155 +msgid "Video Playback" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:158 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:199 +msgid "Decoder" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:170 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:211 +msgid "Filter" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:182 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:223 +msgid "Sink" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:196 +msgid "Audio Playback" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:247 +msgid "Video Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:290 +msgid "Audio Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:333 +msgid "Subtitle Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:21 +msgid "Start by adding media to playback queue" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:15 +msgid "Seeking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:18 +msgid "Method" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:19 +msgid "A preferred method used for seeking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:32 +msgid "Value" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:33 +msgid "Value used for seeking forward/backward" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:46 +msgid "Unit" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:47 +msgid "An unit of a seek forward/backward value" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:51 +msgid "Second" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:52 +msgid "Minute" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:53 +msgid "Percentage" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:63 +msgid "Features" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:66 +msgid "Server" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:67 +msgid "Control player remotely" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:83 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:103 +msgid "Offset" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:84 +msgid "Synchronisation offset in seconds between the audio and video streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:104 +msgid "" +"Synchronisation offset in seconds between the subtitle and video streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:118 +msgid "Default font" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:119 +msgid "Text font used for subtitles when media does not explicitly specify one" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:137 +msgid "Tweaks" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:144 +msgid "Plugin ranking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:145 +msgid "Alter default ranks of GStreamer plugins" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:164 +msgid "Plugin Ranking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:182 +msgid "Available plugins" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:183 +msgid "" +"Select a plugin and its feature to override rank for. When multiple elements " +"have similiar capabilities, the one with highest value is preferred." +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:186 +msgid "Plugin" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:195 +msgid "Plugin feature" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:213 +msgid "Add override" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:229 +msgid "Rank overrides" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:60 +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:23 +msgid "Add" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:87 +msgid "Queue progression" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:6 +msgid "Add URI" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:7 +msgid "Insert an URI to be added to playback queue" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:18 +msgid "Enter or drop URI here" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:22 +msgid "Cancel" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:24 +msgid "Resolution" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:39 +msgid "Framerate" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:63 +msgid "Pixel Format" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-window-state-buttons.ui:57 +msgid "Preferences" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-window-state-buttons.ui:61 +msgid "Keyboard Shortcuts" +msgstr "" + +#. TRANSLATORS: Please do not translate application name +#: src/bin/clapper-app/ui/clapper-app-window-state-buttons.ui:68 +msgid "About Clapper" +msgstr "" + +#. TRANSLATORS: Put your name(s) here for credits or leave untranslated +#: src/bin/clapper-app/clapper-app-about-window.c:43 +msgid "translator-credits" +msgstr "" + +#: src/bin/clapper-app/clapper-app-info-window.c:86 +msgid "Hardware" +msgstr "" + +#: src/bin/clapper-app/clapper-app-info-window.c:86 +msgid "Software" +msgstr "" + +#: src/bin/clapper-app/clapper-app-preferences-window.c:441 +msgid "Accurate" +msgstr "" + +#: src/bin/clapper-app/clapper-app-preferences-window.c:443 +msgid "Normal" +msgstr "" + +#: src/bin/clapper-app/clapper-app-preferences-window.c:445 +msgid "Fast" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:66 +msgid "No progression" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:67 +msgid "Consecutive" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:68 +msgid "Repeat item" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:69 +msgid "Carousel" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:70 +msgid "Shuffle" +msgstr "" + +#: src/bin/clapper-app/clapper-app-window.c:824 +msgid "Drop on title bar to play now or anywhere else to enqueue." +msgstr "" diff --git a/src/bin/clapper-app/po/pl.po b/src/bin/clapper-app/po/pl.po new file mode 100644 index 00000000..541a6705 --- /dev/null +++ b/src/bin/clapper-app/po/pl.po @@ -0,0 +1,469 @@ +# Polish translations for clapper-app package. +# Copyright (C) 2024 THE clapper-app'S COPYRIGHT HOLDER +# This file is distributed under the same license as the clapper-app package. +# Automatically generated, 2024. +# +msgid "" +msgstr "" +"Project-Id-Version: clapper-app\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-04-05 20:50+0200\n" +"PO-Revision-Date: 2024-03-07 21:34+0100\n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\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" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:14 +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:14 +msgid "Codec" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:24 +msgid "Channels" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:36 +msgid "Sample Format" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:46 +msgid "Sample Rate" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:58 +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:51 +msgid "Bitrate" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:70 +#: src/bin/clapper-app/ui/clapper-app-subtitle-stream-list-item.ui:24 +msgid "Language" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:10 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:11 +msgid "General" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:13 +msgid "Show shortcuts" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:19 +msgid "Open preferences" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:25 +msgid "Toggle fullscreen" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:26 +msgid "Double tap | Double click" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:32 +msgid "Quit" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:40 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:32 +msgid "Media" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:43 +#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:30 +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:178 +msgid "Add Files…" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:49 +#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:40 +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:182 +msgid "Add URI…" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:57 +msgid "Queue" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:61 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:68 +msgid "Next item" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:75 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:82 +msgid "Previous item" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:88 +msgid "Change progression mode" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:96 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:76 +msgid "Playback" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:99 +msgid "Toggle play" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:100 +msgid "Tap | Left click" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:107 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:115 +msgid "Seek forward" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:108 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:132 +msgid "Double tap (right side) | Scroll right" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:116 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:124 +msgid "Double tap (left side) | Scroll left" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:123 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:131 +msgid "Seek backward" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:138 +msgid "Volume up" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:139 +msgid "Scroll up" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:145 +msgid "Volume down" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:146 +msgid "Scroll down" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:152 +msgid "Toggle mute" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:158 +msgid "Speed up" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:164 +msgid "Speed down" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:171 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:178 +msgid "Next chapter" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:185 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:192 +msgid "Previous chapter" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:13 +msgid "Info" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:35 +#: src/bin/clapper-app/ui/clapper-app-subtitle-stream-list-item.ui:14 +msgid "Title" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:49 +msgid "Container Format" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:63 +msgid "Duration" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:81 +msgid "Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:84 +#: src/bin/clapper-app/clapper-app-list-item-utils.c:36 +msgid "Video" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:107 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:80 +#: src/bin/clapper-app/clapper-app-list-item-utils.c:39 +msgid "Audio" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:130 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:100 +#: src/bin/clapper-app/clapper-app-list-item-utils.c:42 +msgid "Subtitles" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:155 +msgid "Video Playback" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:158 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:199 +msgid "Decoder" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:170 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:211 +msgid "Filter" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:182 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:223 +msgid "Sink" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:196 +msgid "Audio Playback" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:247 +msgid "Video Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:290 +msgid "Audio Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:333 +msgid "Subtitle Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:21 +msgid "Start by adding media to playback queue" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:15 +msgid "Seeking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:18 +msgid "Method" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:19 +msgid "A preferred method used for seeking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:32 +msgid "Value" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:33 +msgid "Value used for seeking forward/backward" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:46 +msgid "Unit" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:47 +msgid "An unit of a seek forward/backward value" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:51 +msgid "Second" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:52 +msgid "Minute" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:53 +msgid "Percentage" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:63 +msgid "Features" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:66 +msgid "Server" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:67 +msgid "Control player remotely" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:83 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:103 +msgid "Offset" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:84 +msgid "Synchronisation offset in seconds between the audio and video streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:104 +msgid "" +"Synchronisation offset in seconds between the subtitle and video streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:118 +msgid "Default font" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:119 +msgid "Text font used for subtitles when media does not explicitly specify one" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:137 +msgid "Tweaks" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:144 +msgid "Plugin ranking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:145 +msgid "Alter default ranks of GStreamer plugins" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:164 +msgid "Plugin Ranking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:182 +msgid "Available plugins" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:183 +msgid "" +"Select a plugin and its feature to override rank for. When multiple elements " +"have similiar capabilities, the one with highest value is preferred." +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:186 +msgid "Plugin" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:195 +msgid "Plugin feature" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:213 +msgid "Add override" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:229 +msgid "Rank overrides" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:60 +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:23 +msgid "Add" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:87 +msgid "Queue progression" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:6 +msgid "Add URI" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:7 +msgid "Insert an URI to be added to playback queue" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:18 +msgid "Enter or drop URI here" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:22 +msgid "Cancel" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:24 +msgid "Resolution" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:39 +msgid "Framerate" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:63 +msgid "Pixel Format" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-window-state-buttons.ui:57 +msgid "Preferences" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-window-state-buttons.ui:61 +msgid "Keyboard Shortcuts" +msgstr "" + +#. TRANSLATORS: Please do not translate application name +#: src/bin/clapper-app/ui/clapper-app-window-state-buttons.ui:68 +msgid "About Clapper" +msgstr "" + +#. TRANSLATORS: Put your name(s) here for credits or leave untranslated +#: src/bin/clapper-app/clapper-app-about-window.c:43 +msgid "translator-credits" +msgstr "" + +#: src/bin/clapper-app/clapper-app-info-window.c:86 +msgid "Hardware" +msgstr "" + +#: src/bin/clapper-app/clapper-app-info-window.c:86 +msgid "Software" +msgstr "" + +#: src/bin/clapper-app/clapper-app-preferences-window.c:441 +msgid "Accurate" +msgstr "" + +#: src/bin/clapper-app/clapper-app-preferences-window.c:443 +msgid "Normal" +msgstr "" + +#: src/bin/clapper-app/clapper-app-preferences-window.c:445 +msgid "Fast" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:66 +msgid "No progression" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:67 +msgid "Consecutive" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:68 +msgid "Repeat item" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:69 +msgid "Carousel" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:70 +msgid "Shuffle" +msgstr "" + +#: src/bin/clapper-app/clapper-app-window.c:824 +msgid "Drop on title bar to play now or anywhere else to enqueue." +msgstr "" diff --git a/src/bin/clapper-app/po/pt.po b/src/bin/clapper-app/po/pt.po new file mode 100644 index 00000000..4b13804d --- /dev/null +++ b/src/bin/clapper-app/po/pt.po @@ -0,0 +1,468 @@ +# Portuguese translations for clapper-app package. +# Copyright (C) 2024 THE clapper-app'S COPYRIGHT HOLDER +# This file is distributed under the same license as the clapper-app package. +# Automatically generated, 2024. +# +msgid "" +msgstr "" +"Project-Id-Version: clapper-app\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-04-05 20:50+0200\n" +"PO-Revision-Date: 2024-03-07 21:34+0100\n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: pt\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" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:14 +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:14 +msgid "Codec" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:24 +msgid "Channels" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:36 +msgid "Sample Format" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:46 +msgid "Sample Rate" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:58 +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:51 +msgid "Bitrate" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:70 +#: src/bin/clapper-app/ui/clapper-app-subtitle-stream-list-item.ui:24 +msgid "Language" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:10 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:11 +msgid "General" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:13 +msgid "Show shortcuts" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:19 +msgid "Open preferences" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:25 +msgid "Toggle fullscreen" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:26 +msgid "Double tap | Double click" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:32 +msgid "Quit" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:40 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:32 +msgid "Media" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:43 +#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:30 +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:178 +msgid "Add Files…" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:49 +#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:40 +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:182 +msgid "Add URI…" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:57 +msgid "Queue" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:61 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:68 +msgid "Next item" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:75 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:82 +msgid "Previous item" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:88 +msgid "Change progression mode" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:96 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:76 +msgid "Playback" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:99 +msgid "Toggle play" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:100 +msgid "Tap | Left click" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:107 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:115 +msgid "Seek forward" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:108 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:132 +msgid "Double tap (right side) | Scroll right" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:116 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:124 +msgid "Double tap (left side) | Scroll left" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:123 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:131 +msgid "Seek backward" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:138 +msgid "Volume up" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:139 +msgid "Scroll up" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:145 +msgid "Volume down" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:146 +msgid "Scroll down" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:152 +msgid "Toggle mute" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:158 +msgid "Speed up" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:164 +msgid "Speed down" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:171 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:178 +msgid "Next chapter" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:185 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:192 +msgid "Previous chapter" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:13 +msgid "Info" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:35 +#: src/bin/clapper-app/ui/clapper-app-subtitle-stream-list-item.ui:14 +msgid "Title" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:49 +msgid "Container Format" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:63 +msgid "Duration" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:81 +msgid "Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:84 +#: src/bin/clapper-app/clapper-app-list-item-utils.c:36 +msgid "Video" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:107 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:80 +#: src/bin/clapper-app/clapper-app-list-item-utils.c:39 +msgid "Audio" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:130 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:100 +#: src/bin/clapper-app/clapper-app-list-item-utils.c:42 +msgid "Subtitles" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:155 +msgid "Video Playback" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:158 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:199 +msgid "Decoder" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:170 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:211 +msgid "Filter" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:182 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:223 +msgid "Sink" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:196 +msgid "Audio Playback" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:247 +msgid "Video Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:290 +msgid "Audio Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:333 +msgid "Subtitle Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:21 +msgid "Start by adding media to playback queue" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:15 +msgid "Seeking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:18 +msgid "Method" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:19 +msgid "A preferred method used for seeking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:32 +msgid "Value" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:33 +msgid "Value used for seeking forward/backward" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:46 +msgid "Unit" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:47 +msgid "An unit of a seek forward/backward value" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:51 +msgid "Second" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:52 +msgid "Minute" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:53 +msgid "Percentage" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:63 +msgid "Features" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:66 +msgid "Server" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:67 +msgid "Control player remotely" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:83 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:103 +msgid "Offset" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:84 +msgid "Synchronisation offset in seconds between the audio and video streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:104 +msgid "" +"Synchronisation offset in seconds between the subtitle and video streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:118 +msgid "Default font" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:119 +msgid "Text font used for subtitles when media does not explicitly specify one" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:137 +msgid "Tweaks" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:144 +msgid "Plugin ranking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:145 +msgid "Alter default ranks of GStreamer plugins" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:164 +msgid "Plugin Ranking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:182 +msgid "Available plugins" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:183 +msgid "" +"Select a plugin and its feature to override rank for. When multiple elements " +"have similiar capabilities, the one with highest value is preferred." +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:186 +msgid "Plugin" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:195 +msgid "Plugin feature" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:213 +msgid "Add override" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:229 +msgid "Rank overrides" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:60 +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:23 +msgid "Add" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:87 +msgid "Queue progression" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:6 +msgid "Add URI" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:7 +msgid "Insert an URI to be added to playback queue" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:18 +msgid "Enter or drop URI here" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:22 +msgid "Cancel" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:24 +msgid "Resolution" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:39 +msgid "Framerate" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:63 +msgid "Pixel Format" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-window-state-buttons.ui:57 +msgid "Preferences" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-window-state-buttons.ui:61 +msgid "Keyboard Shortcuts" +msgstr "" + +#. TRANSLATORS: Please do not translate application name +#: src/bin/clapper-app/ui/clapper-app-window-state-buttons.ui:68 +msgid "About Clapper" +msgstr "" + +#. TRANSLATORS: Put your name(s) here for credits or leave untranslated +#: src/bin/clapper-app/clapper-app-about-window.c:43 +msgid "translator-credits" +msgstr "" + +#: src/bin/clapper-app/clapper-app-info-window.c:86 +msgid "Hardware" +msgstr "" + +#: src/bin/clapper-app/clapper-app-info-window.c:86 +msgid "Software" +msgstr "" + +#: src/bin/clapper-app/clapper-app-preferences-window.c:441 +msgid "Accurate" +msgstr "" + +#: src/bin/clapper-app/clapper-app-preferences-window.c:443 +msgid "Normal" +msgstr "" + +#: src/bin/clapper-app/clapper-app-preferences-window.c:445 +msgid "Fast" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:66 +msgid "No progression" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:67 +msgid "Consecutive" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:68 +msgid "Repeat item" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:69 +msgid "Carousel" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:70 +msgid "Shuffle" +msgstr "" + +#: src/bin/clapper-app/clapper-app-window.c:824 +msgid "Drop on title bar to play now or anywhere else to enqueue." +msgstr "" diff --git a/src/bin/clapper-app/po/pt_BR.po b/src/bin/clapper-app/po/pt_BR.po new file mode 100644 index 00000000..a7e2c1ba --- /dev/null +++ b/src/bin/clapper-app/po/pt_BR.po @@ -0,0 +1,469 @@ +# Portuguese translations for clapper-app package +# Traduções em português brasileiro para o pacote clapper-app. +# Copyright (C) 2024 THE clapper-app'S COPYRIGHT HOLDER +# This file is distributed under the same license as the clapper-app package. +# Automatically generated, 2024. +# +msgid "" +msgstr "" +"Project-Id-Version: clapper-app\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-04-05 20:50+0200\n" +"PO-Revision-Date: 2024-03-07 21:34+0100\n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\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" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:14 +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:14 +msgid "Codec" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:24 +msgid "Channels" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:36 +msgid "Sample Format" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:46 +msgid "Sample Rate" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:58 +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:51 +msgid "Bitrate" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:70 +#: src/bin/clapper-app/ui/clapper-app-subtitle-stream-list-item.ui:24 +msgid "Language" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:10 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:11 +msgid "General" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:13 +msgid "Show shortcuts" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:19 +msgid "Open preferences" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:25 +msgid "Toggle fullscreen" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:26 +msgid "Double tap | Double click" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:32 +msgid "Quit" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:40 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:32 +msgid "Media" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:43 +#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:30 +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:178 +msgid "Add Files…" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:49 +#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:40 +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:182 +msgid "Add URI…" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:57 +msgid "Queue" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:61 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:68 +msgid "Next item" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:75 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:82 +msgid "Previous item" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:88 +msgid "Change progression mode" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:96 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:76 +msgid "Playback" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:99 +msgid "Toggle play" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:100 +msgid "Tap | Left click" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:107 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:115 +msgid "Seek forward" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:108 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:132 +msgid "Double tap (right side) | Scroll right" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:116 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:124 +msgid "Double tap (left side) | Scroll left" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:123 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:131 +msgid "Seek backward" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:138 +msgid "Volume up" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:139 +msgid "Scroll up" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:145 +msgid "Volume down" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:146 +msgid "Scroll down" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:152 +msgid "Toggle mute" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:158 +msgid "Speed up" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:164 +msgid "Speed down" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:171 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:178 +msgid "Next chapter" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:185 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:192 +msgid "Previous chapter" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:13 +msgid "Info" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:35 +#: src/bin/clapper-app/ui/clapper-app-subtitle-stream-list-item.ui:14 +msgid "Title" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:49 +msgid "Container Format" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:63 +msgid "Duration" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:81 +msgid "Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:84 +#: src/bin/clapper-app/clapper-app-list-item-utils.c:36 +msgid "Video" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:107 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:80 +#: src/bin/clapper-app/clapper-app-list-item-utils.c:39 +msgid "Audio" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:130 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:100 +#: src/bin/clapper-app/clapper-app-list-item-utils.c:42 +msgid "Subtitles" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:155 +msgid "Video Playback" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:158 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:199 +msgid "Decoder" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:170 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:211 +msgid "Filter" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:182 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:223 +msgid "Sink" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:196 +msgid "Audio Playback" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:247 +msgid "Video Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:290 +msgid "Audio Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:333 +msgid "Subtitle Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:21 +msgid "Start by adding media to playback queue" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:15 +msgid "Seeking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:18 +msgid "Method" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:19 +msgid "A preferred method used for seeking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:32 +msgid "Value" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:33 +msgid "Value used for seeking forward/backward" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:46 +msgid "Unit" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:47 +msgid "An unit of a seek forward/backward value" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:51 +msgid "Second" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:52 +msgid "Minute" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:53 +msgid "Percentage" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:63 +msgid "Features" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:66 +msgid "Server" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:67 +msgid "Control player remotely" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:83 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:103 +msgid "Offset" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:84 +msgid "Synchronisation offset in seconds between the audio and video streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:104 +msgid "" +"Synchronisation offset in seconds between the subtitle and video streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:118 +msgid "Default font" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:119 +msgid "Text font used for subtitles when media does not explicitly specify one" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:137 +msgid "Tweaks" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:144 +msgid "Plugin ranking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:145 +msgid "Alter default ranks of GStreamer plugins" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:164 +msgid "Plugin Ranking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:182 +msgid "Available plugins" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:183 +msgid "" +"Select a plugin and its feature to override rank for. When multiple elements " +"have similiar capabilities, the one with highest value is preferred." +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:186 +msgid "Plugin" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:195 +msgid "Plugin feature" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:213 +msgid "Add override" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:229 +msgid "Rank overrides" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:60 +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:23 +msgid "Add" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:87 +msgid "Queue progression" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:6 +msgid "Add URI" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:7 +msgid "Insert an URI to be added to playback queue" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:18 +msgid "Enter or drop URI here" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:22 +msgid "Cancel" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:24 +msgid "Resolution" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:39 +msgid "Framerate" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:63 +msgid "Pixel Format" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-window-state-buttons.ui:57 +msgid "Preferences" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-window-state-buttons.ui:61 +msgid "Keyboard Shortcuts" +msgstr "" + +#. TRANSLATORS: Please do not translate application name +#: src/bin/clapper-app/ui/clapper-app-window-state-buttons.ui:68 +msgid "About Clapper" +msgstr "" + +#. TRANSLATORS: Put your name(s) here for credits or leave untranslated +#: src/bin/clapper-app/clapper-app-about-window.c:43 +msgid "translator-credits" +msgstr "" + +#: src/bin/clapper-app/clapper-app-info-window.c:86 +msgid "Hardware" +msgstr "" + +#: src/bin/clapper-app/clapper-app-info-window.c:86 +msgid "Software" +msgstr "" + +#: src/bin/clapper-app/clapper-app-preferences-window.c:441 +msgid "Accurate" +msgstr "" + +#: src/bin/clapper-app/clapper-app-preferences-window.c:443 +msgid "Normal" +msgstr "" + +#: src/bin/clapper-app/clapper-app-preferences-window.c:445 +msgid "Fast" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:66 +msgid "No progression" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:67 +msgid "Consecutive" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:68 +msgid "Repeat item" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:69 +msgid "Carousel" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:70 +msgid "Shuffle" +msgstr "" + +#: src/bin/clapper-app/clapper-app-window.c:824 +msgid "Drop on title bar to play now or anywhere else to enqueue." +msgstr "" diff --git a/src/bin/clapper-app/po/ru.po b/src/bin/clapper-app/po/ru.po new file mode 100644 index 00000000..b9220683 --- /dev/null +++ b/src/bin/clapper-app/po/ru.po @@ -0,0 +1,469 @@ +# Russian translations for clapper-app package. +# Copyright (C) 2024 THE clapper-app'S COPYRIGHT HOLDER +# This file is distributed under the same license as the clapper-app package. +# Automatically generated, 2024. +# +msgid "" +msgstr "" +"Project-Id-Version: clapper-app\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-04-05 20:50+0200\n" +"PO-Revision-Date: 2024-03-07 21:34+0100\n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\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" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:14 +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:14 +msgid "Codec" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:24 +msgid "Channels" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:36 +msgid "Sample Format" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:46 +msgid "Sample Rate" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:58 +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:51 +msgid "Bitrate" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:70 +#: src/bin/clapper-app/ui/clapper-app-subtitle-stream-list-item.ui:24 +msgid "Language" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:10 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:11 +msgid "General" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:13 +msgid "Show shortcuts" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:19 +msgid "Open preferences" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:25 +msgid "Toggle fullscreen" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:26 +msgid "Double tap | Double click" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:32 +msgid "Quit" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:40 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:32 +msgid "Media" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:43 +#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:30 +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:178 +msgid "Add Files…" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:49 +#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:40 +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:182 +msgid "Add URI…" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:57 +msgid "Queue" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:61 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:68 +msgid "Next item" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:75 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:82 +msgid "Previous item" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:88 +msgid "Change progression mode" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:96 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:76 +msgid "Playback" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:99 +msgid "Toggle play" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:100 +msgid "Tap | Left click" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:107 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:115 +msgid "Seek forward" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:108 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:132 +msgid "Double tap (right side) | Scroll right" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:116 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:124 +msgid "Double tap (left side) | Scroll left" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:123 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:131 +msgid "Seek backward" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:138 +msgid "Volume up" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:139 +msgid "Scroll up" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:145 +msgid "Volume down" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:146 +msgid "Scroll down" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:152 +msgid "Toggle mute" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:158 +msgid "Speed up" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:164 +msgid "Speed down" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:171 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:178 +msgid "Next chapter" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:185 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:192 +msgid "Previous chapter" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:13 +msgid "Info" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:35 +#: src/bin/clapper-app/ui/clapper-app-subtitle-stream-list-item.ui:14 +msgid "Title" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:49 +msgid "Container Format" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:63 +msgid "Duration" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:81 +msgid "Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:84 +#: src/bin/clapper-app/clapper-app-list-item-utils.c:36 +msgid "Video" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:107 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:80 +#: src/bin/clapper-app/clapper-app-list-item-utils.c:39 +msgid "Audio" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:130 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:100 +#: src/bin/clapper-app/clapper-app-list-item-utils.c:42 +msgid "Subtitles" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:155 +msgid "Video Playback" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:158 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:199 +msgid "Decoder" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:170 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:211 +msgid "Filter" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:182 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:223 +msgid "Sink" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:196 +msgid "Audio Playback" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:247 +msgid "Video Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:290 +msgid "Audio Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:333 +msgid "Subtitle Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:21 +msgid "Start by adding media to playback queue" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:15 +msgid "Seeking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:18 +msgid "Method" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:19 +msgid "A preferred method used for seeking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:32 +msgid "Value" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:33 +msgid "Value used for seeking forward/backward" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:46 +msgid "Unit" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:47 +msgid "An unit of a seek forward/backward value" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:51 +msgid "Second" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:52 +msgid "Minute" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:53 +msgid "Percentage" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:63 +msgid "Features" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:66 +msgid "Server" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:67 +msgid "Control player remotely" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:83 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:103 +msgid "Offset" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:84 +msgid "Synchronisation offset in seconds between the audio and video streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:104 +msgid "" +"Synchronisation offset in seconds between the subtitle and video streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:118 +msgid "Default font" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:119 +msgid "Text font used for subtitles when media does not explicitly specify one" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:137 +msgid "Tweaks" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:144 +msgid "Plugin ranking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:145 +msgid "Alter default ranks of GStreamer plugins" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:164 +msgid "Plugin Ranking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:182 +msgid "Available plugins" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:183 +msgid "" +"Select a plugin and its feature to override rank for. When multiple elements " +"have similiar capabilities, the one with highest value is preferred." +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:186 +msgid "Plugin" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:195 +msgid "Plugin feature" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:213 +msgid "Add override" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:229 +msgid "Rank overrides" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:60 +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:23 +msgid "Add" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:87 +msgid "Queue progression" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:6 +msgid "Add URI" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:7 +msgid "Insert an URI to be added to playback queue" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:18 +msgid "Enter or drop URI here" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:22 +msgid "Cancel" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:24 +msgid "Resolution" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:39 +msgid "Framerate" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:63 +msgid "Pixel Format" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-window-state-buttons.ui:57 +msgid "Preferences" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-window-state-buttons.ui:61 +msgid "Keyboard Shortcuts" +msgstr "" + +#. TRANSLATORS: Please do not translate application name +#: src/bin/clapper-app/ui/clapper-app-window-state-buttons.ui:68 +msgid "About Clapper" +msgstr "" + +#. TRANSLATORS: Put your name(s) here for credits or leave untranslated +#: src/bin/clapper-app/clapper-app-about-window.c:43 +msgid "translator-credits" +msgstr "" + +#: src/bin/clapper-app/clapper-app-info-window.c:86 +msgid "Hardware" +msgstr "" + +#: src/bin/clapper-app/clapper-app-info-window.c:86 +msgid "Software" +msgstr "" + +#: src/bin/clapper-app/clapper-app-preferences-window.c:441 +msgid "Accurate" +msgstr "" + +#: src/bin/clapper-app/clapper-app-preferences-window.c:443 +msgid "Normal" +msgstr "" + +#: src/bin/clapper-app/clapper-app-preferences-window.c:445 +msgid "Fast" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:66 +msgid "No progression" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:67 +msgid "Consecutive" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:68 +msgid "Repeat item" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:69 +msgid "Carousel" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:70 +msgid "Shuffle" +msgstr "" + +#: src/bin/clapper-app/clapper-app-window.c:824 +msgid "Drop on title bar to play now or anywhere else to enqueue." +msgstr "" diff --git a/src/bin/clapper-app/po/sk.po b/src/bin/clapper-app/po/sk.po new file mode 100644 index 00000000..c5f95771 --- /dev/null +++ b/src/bin/clapper-app/po/sk.po @@ -0,0 +1,468 @@ +# Slovak translations for clapper-app package. +# Copyright (C) 2024 THE clapper-app'S COPYRIGHT HOLDER +# This file is distributed under the same license as the clapper-app package. +# Automatically generated, 2024. +# +msgid "" +msgstr "" +"Project-Id-Version: clapper-app\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-04-05 20:50+0200\n" +"PO-Revision-Date: 2024-03-07 21:34+0100\n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: sk\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" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:14 +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:14 +msgid "Codec" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:24 +msgid "Channels" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:36 +msgid "Sample Format" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:46 +msgid "Sample Rate" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:58 +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:51 +msgid "Bitrate" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:70 +#: src/bin/clapper-app/ui/clapper-app-subtitle-stream-list-item.ui:24 +msgid "Language" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:10 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:11 +msgid "General" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:13 +msgid "Show shortcuts" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:19 +msgid "Open preferences" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:25 +msgid "Toggle fullscreen" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:26 +msgid "Double tap | Double click" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:32 +msgid "Quit" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:40 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:32 +msgid "Media" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:43 +#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:30 +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:178 +msgid "Add Files…" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:49 +#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:40 +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:182 +msgid "Add URI…" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:57 +msgid "Queue" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:61 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:68 +msgid "Next item" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:75 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:82 +msgid "Previous item" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:88 +msgid "Change progression mode" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:96 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:76 +msgid "Playback" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:99 +msgid "Toggle play" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:100 +msgid "Tap | Left click" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:107 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:115 +msgid "Seek forward" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:108 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:132 +msgid "Double tap (right side) | Scroll right" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:116 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:124 +msgid "Double tap (left side) | Scroll left" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:123 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:131 +msgid "Seek backward" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:138 +msgid "Volume up" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:139 +msgid "Scroll up" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:145 +msgid "Volume down" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:146 +msgid "Scroll down" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:152 +msgid "Toggle mute" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:158 +msgid "Speed up" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:164 +msgid "Speed down" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:171 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:178 +msgid "Next chapter" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:185 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:192 +msgid "Previous chapter" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:13 +msgid "Info" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:35 +#: src/bin/clapper-app/ui/clapper-app-subtitle-stream-list-item.ui:14 +msgid "Title" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:49 +msgid "Container Format" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:63 +msgid "Duration" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:81 +msgid "Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:84 +#: src/bin/clapper-app/clapper-app-list-item-utils.c:36 +msgid "Video" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:107 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:80 +#: src/bin/clapper-app/clapper-app-list-item-utils.c:39 +msgid "Audio" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:130 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:100 +#: src/bin/clapper-app/clapper-app-list-item-utils.c:42 +msgid "Subtitles" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:155 +msgid "Video Playback" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:158 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:199 +msgid "Decoder" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:170 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:211 +msgid "Filter" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:182 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:223 +msgid "Sink" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:196 +msgid "Audio Playback" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:247 +msgid "Video Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:290 +msgid "Audio Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:333 +msgid "Subtitle Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:21 +msgid "Start by adding media to playback queue" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:15 +msgid "Seeking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:18 +msgid "Method" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:19 +msgid "A preferred method used for seeking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:32 +msgid "Value" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:33 +msgid "Value used for seeking forward/backward" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:46 +msgid "Unit" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:47 +msgid "An unit of a seek forward/backward value" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:51 +msgid "Second" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:52 +msgid "Minute" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:53 +msgid "Percentage" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:63 +msgid "Features" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:66 +msgid "Server" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:67 +msgid "Control player remotely" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:83 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:103 +msgid "Offset" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:84 +msgid "Synchronisation offset in seconds between the audio and video streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:104 +msgid "" +"Synchronisation offset in seconds between the subtitle and video streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:118 +msgid "Default font" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:119 +msgid "Text font used for subtitles when media does not explicitly specify one" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:137 +msgid "Tweaks" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:144 +msgid "Plugin ranking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:145 +msgid "Alter default ranks of GStreamer plugins" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:164 +msgid "Plugin Ranking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:182 +msgid "Available plugins" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:183 +msgid "" +"Select a plugin and its feature to override rank for. When multiple elements " +"have similiar capabilities, the one with highest value is preferred." +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:186 +msgid "Plugin" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:195 +msgid "Plugin feature" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:213 +msgid "Add override" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:229 +msgid "Rank overrides" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:60 +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:23 +msgid "Add" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:87 +msgid "Queue progression" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:6 +msgid "Add URI" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:7 +msgid "Insert an URI to be added to playback queue" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:18 +msgid "Enter or drop URI here" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:22 +msgid "Cancel" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:24 +msgid "Resolution" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:39 +msgid "Framerate" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:63 +msgid "Pixel Format" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-window-state-buttons.ui:57 +msgid "Preferences" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-window-state-buttons.ui:61 +msgid "Keyboard Shortcuts" +msgstr "" + +#. TRANSLATORS: Please do not translate application name +#: src/bin/clapper-app/ui/clapper-app-window-state-buttons.ui:68 +msgid "About Clapper" +msgstr "" + +#. TRANSLATORS: Put your name(s) here for credits or leave untranslated +#: src/bin/clapper-app/clapper-app-about-window.c:43 +msgid "translator-credits" +msgstr "" + +#: src/bin/clapper-app/clapper-app-info-window.c:86 +msgid "Hardware" +msgstr "" + +#: src/bin/clapper-app/clapper-app-info-window.c:86 +msgid "Software" +msgstr "" + +#: src/bin/clapper-app/clapper-app-preferences-window.c:441 +msgid "Accurate" +msgstr "" + +#: src/bin/clapper-app/clapper-app-preferences-window.c:443 +msgid "Normal" +msgstr "" + +#: src/bin/clapper-app/clapper-app-preferences-window.c:445 +msgid "Fast" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:66 +msgid "No progression" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:67 +msgid "Consecutive" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:68 +msgid "Repeat item" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:69 +msgid "Carousel" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:70 +msgid "Shuffle" +msgstr "" + +#: src/bin/clapper-app/clapper-app-window.c:824 +msgid "Drop on title bar to play now or anywhere else to enqueue." +msgstr "" diff --git a/src/bin/clapper-app/po/sv.po b/src/bin/clapper-app/po/sv.po new file mode 100644 index 00000000..d884932b --- /dev/null +++ b/src/bin/clapper-app/po/sv.po @@ -0,0 +1,468 @@ +# Swedish translations for clapper-app package. +# Copyright (C) 2024 THE clapper-app'S COPYRIGHT HOLDER +# This file is distributed under the same license as the clapper-app package. +# Automatically generated, 2024. +# +msgid "" +msgstr "" +"Project-Id-Version: clapper-app\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-04-05 20:50+0200\n" +"PO-Revision-Date: 2024-03-07 21:34+0100\n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\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" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:14 +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:14 +msgid "Codec" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:24 +msgid "Channels" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:36 +msgid "Sample Format" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:46 +msgid "Sample Rate" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:58 +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:51 +msgid "Bitrate" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:70 +#: src/bin/clapper-app/ui/clapper-app-subtitle-stream-list-item.ui:24 +msgid "Language" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:10 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:11 +msgid "General" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:13 +msgid "Show shortcuts" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:19 +msgid "Open preferences" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:25 +msgid "Toggle fullscreen" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:26 +msgid "Double tap | Double click" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:32 +msgid "Quit" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:40 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:32 +msgid "Media" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:43 +#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:30 +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:178 +msgid "Add Files…" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:49 +#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:40 +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:182 +msgid "Add URI…" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:57 +msgid "Queue" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:61 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:68 +msgid "Next item" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:75 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:82 +msgid "Previous item" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:88 +msgid "Change progression mode" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:96 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:76 +msgid "Playback" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:99 +msgid "Toggle play" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:100 +msgid "Tap | Left click" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:107 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:115 +msgid "Seek forward" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:108 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:132 +msgid "Double tap (right side) | Scroll right" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:116 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:124 +msgid "Double tap (left side) | Scroll left" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:123 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:131 +msgid "Seek backward" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:138 +msgid "Volume up" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:139 +msgid "Scroll up" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:145 +msgid "Volume down" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:146 +msgid "Scroll down" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:152 +msgid "Toggle mute" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:158 +msgid "Speed up" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:164 +msgid "Speed down" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:171 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:178 +msgid "Next chapter" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:185 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:192 +msgid "Previous chapter" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:13 +msgid "Info" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:35 +#: src/bin/clapper-app/ui/clapper-app-subtitle-stream-list-item.ui:14 +msgid "Title" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:49 +msgid "Container Format" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:63 +msgid "Duration" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:81 +msgid "Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:84 +#: src/bin/clapper-app/clapper-app-list-item-utils.c:36 +msgid "Video" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:107 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:80 +#: src/bin/clapper-app/clapper-app-list-item-utils.c:39 +msgid "Audio" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:130 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:100 +#: src/bin/clapper-app/clapper-app-list-item-utils.c:42 +msgid "Subtitles" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:155 +msgid "Video Playback" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:158 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:199 +msgid "Decoder" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:170 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:211 +msgid "Filter" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:182 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:223 +msgid "Sink" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:196 +msgid "Audio Playback" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:247 +msgid "Video Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:290 +msgid "Audio Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:333 +msgid "Subtitle Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:21 +msgid "Start by adding media to playback queue" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:15 +msgid "Seeking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:18 +msgid "Method" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:19 +msgid "A preferred method used for seeking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:32 +msgid "Value" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:33 +msgid "Value used for seeking forward/backward" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:46 +msgid "Unit" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:47 +msgid "An unit of a seek forward/backward value" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:51 +msgid "Second" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:52 +msgid "Minute" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:53 +msgid "Percentage" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:63 +msgid "Features" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:66 +msgid "Server" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:67 +msgid "Control player remotely" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:83 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:103 +msgid "Offset" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:84 +msgid "Synchronisation offset in seconds between the audio and video streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:104 +msgid "" +"Synchronisation offset in seconds between the subtitle and video streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:118 +msgid "Default font" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:119 +msgid "Text font used for subtitles when media does not explicitly specify one" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:137 +msgid "Tweaks" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:144 +msgid "Plugin ranking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:145 +msgid "Alter default ranks of GStreamer plugins" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:164 +msgid "Plugin Ranking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:182 +msgid "Available plugins" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:183 +msgid "" +"Select a plugin and its feature to override rank for. When multiple elements " +"have similiar capabilities, the one with highest value is preferred." +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:186 +msgid "Plugin" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:195 +msgid "Plugin feature" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:213 +msgid "Add override" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:229 +msgid "Rank overrides" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:60 +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:23 +msgid "Add" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:87 +msgid "Queue progression" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:6 +msgid "Add URI" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:7 +msgid "Insert an URI to be added to playback queue" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:18 +msgid "Enter or drop URI here" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:22 +msgid "Cancel" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:24 +msgid "Resolution" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:39 +msgid "Framerate" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:63 +msgid "Pixel Format" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-window-state-buttons.ui:57 +msgid "Preferences" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-window-state-buttons.ui:61 +msgid "Keyboard Shortcuts" +msgstr "" + +#. TRANSLATORS: Please do not translate application name +#: src/bin/clapper-app/ui/clapper-app-window-state-buttons.ui:68 +msgid "About Clapper" +msgstr "" + +#. TRANSLATORS: Put your name(s) here for credits or leave untranslated +#: src/bin/clapper-app/clapper-app-about-window.c:43 +msgid "translator-credits" +msgstr "" + +#: src/bin/clapper-app/clapper-app-info-window.c:86 +msgid "Hardware" +msgstr "" + +#: src/bin/clapper-app/clapper-app-info-window.c:86 +msgid "Software" +msgstr "" + +#: src/bin/clapper-app/clapper-app-preferences-window.c:441 +msgid "Accurate" +msgstr "" + +#: src/bin/clapper-app/clapper-app-preferences-window.c:443 +msgid "Normal" +msgstr "" + +#: src/bin/clapper-app/clapper-app-preferences-window.c:445 +msgid "Fast" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:66 +msgid "No progression" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:67 +msgid "Consecutive" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:68 +msgid "Repeat item" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:69 +msgid "Carousel" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:70 +msgid "Shuffle" +msgstr "" + +#: src/bin/clapper-app/clapper-app-window.c:824 +msgid "Drop on title bar to play now or anywhere else to enqueue." +msgstr "" diff --git a/src/bin/clapper-app/po/tr.po b/src/bin/clapper-app/po/tr.po new file mode 100644 index 00000000..1b566300 --- /dev/null +++ b/src/bin/clapper-app/po/tr.po @@ -0,0 +1,468 @@ +# Turkish translations for clapper-app package. +# Copyright (C) 2024 THE clapper-app'S COPYRIGHT HOLDER +# This file is distributed under the same license as the clapper-app package. +# Automatically generated, 2024. +# +msgid "" +msgstr "" +"Project-Id-Version: clapper-app\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-04-05 20:50+0200\n" +"PO-Revision-Date: 2024-03-07 21:34+0100\n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\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=2; plural=(n != 1);\n" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:14 +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:14 +msgid "Codec" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:24 +msgid "Channels" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:36 +msgid "Sample Format" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:46 +msgid "Sample Rate" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:58 +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:51 +msgid "Bitrate" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:70 +#: src/bin/clapper-app/ui/clapper-app-subtitle-stream-list-item.ui:24 +msgid "Language" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:10 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:11 +msgid "General" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:13 +msgid "Show shortcuts" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:19 +msgid "Open preferences" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:25 +msgid "Toggle fullscreen" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:26 +msgid "Double tap | Double click" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:32 +msgid "Quit" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:40 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:32 +msgid "Media" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:43 +#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:30 +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:178 +msgid "Add Files…" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:49 +#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:40 +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:182 +msgid "Add URI…" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:57 +msgid "Queue" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:61 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:68 +msgid "Next item" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:75 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:82 +msgid "Previous item" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:88 +msgid "Change progression mode" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:96 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:76 +msgid "Playback" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:99 +msgid "Toggle play" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:100 +msgid "Tap | Left click" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:107 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:115 +msgid "Seek forward" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:108 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:132 +msgid "Double tap (right side) | Scroll right" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:116 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:124 +msgid "Double tap (left side) | Scroll left" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:123 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:131 +msgid "Seek backward" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:138 +msgid "Volume up" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:139 +msgid "Scroll up" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:145 +msgid "Volume down" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:146 +msgid "Scroll down" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:152 +msgid "Toggle mute" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:158 +msgid "Speed up" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:164 +msgid "Speed down" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:171 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:178 +msgid "Next chapter" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:185 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:192 +msgid "Previous chapter" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:13 +msgid "Info" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:35 +#: src/bin/clapper-app/ui/clapper-app-subtitle-stream-list-item.ui:14 +msgid "Title" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:49 +msgid "Container Format" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:63 +msgid "Duration" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:81 +msgid "Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:84 +#: src/bin/clapper-app/clapper-app-list-item-utils.c:36 +msgid "Video" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:107 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:80 +#: src/bin/clapper-app/clapper-app-list-item-utils.c:39 +msgid "Audio" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:130 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:100 +#: src/bin/clapper-app/clapper-app-list-item-utils.c:42 +msgid "Subtitles" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:155 +msgid "Video Playback" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:158 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:199 +msgid "Decoder" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:170 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:211 +msgid "Filter" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:182 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:223 +msgid "Sink" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:196 +msgid "Audio Playback" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:247 +msgid "Video Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:290 +msgid "Audio Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:333 +msgid "Subtitle Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:21 +msgid "Start by adding media to playback queue" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:15 +msgid "Seeking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:18 +msgid "Method" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:19 +msgid "A preferred method used for seeking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:32 +msgid "Value" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:33 +msgid "Value used for seeking forward/backward" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:46 +msgid "Unit" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:47 +msgid "An unit of a seek forward/backward value" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:51 +msgid "Second" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:52 +msgid "Minute" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:53 +msgid "Percentage" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:63 +msgid "Features" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:66 +msgid "Server" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:67 +msgid "Control player remotely" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:83 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:103 +msgid "Offset" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:84 +msgid "Synchronisation offset in seconds between the audio and video streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:104 +msgid "" +"Synchronisation offset in seconds between the subtitle and video streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:118 +msgid "Default font" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:119 +msgid "Text font used for subtitles when media does not explicitly specify one" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:137 +msgid "Tweaks" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:144 +msgid "Plugin ranking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:145 +msgid "Alter default ranks of GStreamer plugins" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:164 +msgid "Plugin Ranking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:182 +msgid "Available plugins" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:183 +msgid "" +"Select a plugin and its feature to override rank for. When multiple elements " +"have similiar capabilities, the one with highest value is preferred." +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:186 +msgid "Plugin" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:195 +msgid "Plugin feature" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:213 +msgid "Add override" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:229 +msgid "Rank overrides" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:60 +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:23 +msgid "Add" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:87 +msgid "Queue progression" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:6 +msgid "Add URI" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:7 +msgid "Insert an URI to be added to playback queue" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:18 +msgid "Enter or drop URI here" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:22 +msgid "Cancel" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:24 +msgid "Resolution" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:39 +msgid "Framerate" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:63 +msgid "Pixel Format" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-window-state-buttons.ui:57 +msgid "Preferences" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-window-state-buttons.ui:61 +msgid "Keyboard Shortcuts" +msgstr "" + +#. TRANSLATORS: Please do not translate application name +#: src/bin/clapper-app/ui/clapper-app-window-state-buttons.ui:68 +msgid "About Clapper" +msgstr "" + +#. TRANSLATORS: Put your name(s) here for credits or leave untranslated +#: src/bin/clapper-app/clapper-app-about-window.c:43 +msgid "translator-credits" +msgstr "" + +#: src/bin/clapper-app/clapper-app-info-window.c:86 +msgid "Hardware" +msgstr "" + +#: src/bin/clapper-app/clapper-app-info-window.c:86 +msgid "Software" +msgstr "" + +#: src/bin/clapper-app/clapper-app-preferences-window.c:441 +msgid "Accurate" +msgstr "" + +#: src/bin/clapper-app/clapper-app-preferences-window.c:443 +msgid "Normal" +msgstr "" + +#: src/bin/clapper-app/clapper-app-preferences-window.c:445 +msgid "Fast" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:66 +msgid "No progression" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:67 +msgid "Consecutive" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:68 +msgid "Repeat item" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:69 +msgid "Carousel" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:70 +msgid "Shuffle" +msgstr "" + +#: src/bin/clapper-app/clapper-app-window.c:824 +msgid "Drop on title bar to play now or anywhere else to enqueue." +msgstr "" diff --git a/src/bin/clapper-app/po/zh_CN.po b/src/bin/clapper-app/po/zh_CN.po new file mode 100644 index 00000000..d94c5e54 --- /dev/null +++ b/src/bin/clapper-app/po/zh_CN.po @@ -0,0 +1,468 @@ +# Chinese translations for clapper-app package +# clapper-app Èí¼þ°üµÄ¼òÌåÖÐÎÄ·­Òë. +# Copyright (C) 2024 THE clapper-app'S COPYRIGHT HOLDER +# This file is distributed under the same license as the clapper-app package. +# Automatically generated, 2024. +# +msgid "" +msgstr "" +"Project-Id-Version: clapper-app\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-04-05 20:50+0200\n" +"PO-Revision-Date: 2024-03-07 21:34+0100\n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: zh_CN\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:14 +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:14 +msgid "Codec" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:24 +msgid "Channels" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:36 +msgid "Sample Format" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:46 +msgid "Sample Rate" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:58 +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:51 +msgid "Bitrate" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:70 +#: src/bin/clapper-app/ui/clapper-app-subtitle-stream-list-item.ui:24 +msgid "Language" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:10 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:11 +msgid "General" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:13 +msgid "Show shortcuts" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:19 +msgid "Open preferences" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:25 +msgid "Toggle fullscreen" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:26 +msgid "Double tap | Double click" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:32 +msgid "Quit" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:40 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:32 +msgid "Media" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:43 +#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:30 +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:178 +msgid "Add Files…" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:49 +#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:40 +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:182 +msgid "Add URI…" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:57 +msgid "Queue" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:61 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:68 +msgid "Next item" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:75 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:82 +msgid "Previous item" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:88 +msgid "Change progression mode" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:96 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:76 +msgid "Playback" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:99 +msgid "Toggle play" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:100 +msgid "Tap | Left click" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:107 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:115 +msgid "Seek forward" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:108 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:132 +msgid "Double tap (right side) | Scroll right" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:116 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:124 +msgid "Double tap (left side) | Scroll left" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:123 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:131 +msgid "Seek backward" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:138 +msgid "Volume up" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:139 +msgid "Scroll up" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:145 +msgid "Volume down" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:146 +msgid "Scroll down" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:152 +msgid "Toggle mute" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:158 +msgid "Speed up" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:164 +msgid "Speed down" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:171 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:178 +msgid "Next chapter" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:185 +#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:192 +msgid "Previous chapter" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:13 +msgid "Info" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:35 +#: src/bin/clapper-app/ui/clapper-app-subtitle-stream-list-item.ui:14 +msgid "Title" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:49 +msgid "Container Format" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:63 +msgid "Duration" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:81 +msgid "Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:84 +#: src/bin/clapper-app/clapper-app-list-item-utils.c:36 +msgid "Video" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:107 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:80 +#: src/bin/clapper-app/clapper-app-list-item-utils.c:39 +msgid "Audio" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:130 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:100 +#: src/bin/clapper-app/clapper-app-list-item-utils.c:42 +msgid "Subtitles" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:155 +msgid "Video Playback" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:158 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:199 +msgid "Decoder" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:170 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:211 +msgid "Filter" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:182 +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:223 +msgid "Sink" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:196 +msgid "Audio Playback" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:247 +msgid "Video Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:290 +msgid "Audio Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-info-window.ui:333 +msgid "Subtitle Streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:21 +msgid "Start by adding media to playback queue" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:15 +msgid "Seeking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:18 +msgid "Method" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:19 +msgid "A preferred method used for seeking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:32 +msgid "Value" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:33 +msgid "Value used for seeking forward/backward" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:46 +msgid "Unit" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:47 +msgid "An unit of a seek forward/backward value" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:51 +msgid "Second" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:52 +msgid "Minute" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:53 +msgid "Percentage" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:63 +msgid "Features" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:66 +msgid "Server" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:67 +msgid "Control player remotely" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:83 +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:103 +msgid "Offset" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:84 +msgid "Synchronisation offset in seconds between the audio and video streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:104 +msgid "" +"Synchronisation offset in seconds between the subtitle and video streams" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:118 +msgid "Default font" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:119 +msgid "Text font used for subtitles when media does not explicitly specify one" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:137 +msgid "Tweaks" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:144 +msgid "Plugin ranking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:145 +msgid "Alter default ranks of GStreamer plugins" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:164 +msgid "Plugin Ranking" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:182 +msgid "Available plugins" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:183 +msgid "" +"Select a plugin and its feature to override rank for. When multiple elements " +"have similiar capabilities, the one with highest value is preferred." +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:186 +msgid "Plugin" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:195 +msgid "Plugin feature" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:213 +msgid "Add override" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:229 +msgid "Rank overrides" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:60 +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:23 +msgid "Add" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:87 +msgid "Queue progression" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:6 +msgid "Add URI" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:7 +msgid "Insert an URI to be added to playback queue" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:18 +msgid "Enter or drop URI here" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:22 +msgid "Cancel" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:24 +msgid "Resolution" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:39 +msgid "Framerate" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:63 +msgid "Pixel Format" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-window-state-buttons.ui:57 +msgid "Preferences" +msgstr "" + +#: src/bin/clapper-app/ui/clapper-app-window-state-buttons.ui:61 +msgid "Keyboard Shortcuts" +msgstr "" + +#. TRANSLATORS: Please do not translate application name +#: src/bin/clapper-app/ui/clapper-app-window-state-buttons.ui:68 +msgid "About Clapper" +msgstr "" + +#. TRANSLATORS: Put your name(s) here for credits or leave untranslated +#: src/bin/clapper-app/clapper-app-about-window.c:43 +msgid "translator-credits" +msgstr "" + +#: src/bin/clapper-app/clapper-app-info-window.c:86 +msgid "Hardware" +msgstr "" + +#: src/bin/clapper-app/clapper-app-info-window.c:86 +msgid "Software" +msgstr "" + +#: src/bin/clapper-app/clapper-app-preferences-window.c:441 +msgid "Accurate" +msgstr "" + +#: src/bin/clapper-app/clapper-app-preferences-window.c:443 +msgid "Normal" +msgstr "" + +#: src/bin/clapper-app/clapper-app-preferences-window.c:445 +msgid "Fast" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:66 +msgid "No progression" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:67 +msgid "Consecutive" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:68 +msgid "Repeat item" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:69 +msgid "Carousel" +msgstr "" + +#: src/bin/clapper-app/clapper-app-utils.c:70 +msgid "Shuffle" +msgstr "" + +#: src/bin/clapper-app/clapper-app-window.c:824 +msgid "Drop on title bar to play now or anywhere else to enqueue." +msgstr "" diff --git a/src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui b/src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui new file mode 100644 index 00000000..75d5c61d --- /dev/null +++ b/src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui @@ -0,0 +1,81 @@ + + + + diff --git a/src/bin/clapper-app/ui/clapper-app-headerbar.ui b/src/bin/clapper-app/ui/clapper-app-headerbar.ui new file mode 100644 index 00000000..adbce235 --- /dev/null +++ b/src/bin/clapper-app/ui/clapper-app-headerbar.ui @@ -0,0 +1,153 @@ + + + + diff --git a/src/bin/clapper-app/ui/clapper-app-help-overlay.ui b/src/bin/clapper-app/ui/clapper-app-help-overlay.ui new file mode 100644 index 00000000..7f0b41c0 --- /dev/null +++ b/src/bin/clapper-app/ui/clapper-app-help-overlay.ui @@ -0,0 +1,201 @@ + + + + true + + + app + + + General + + + Show shortcuts + <Ctrl>question + + + + + Open preferences + <Ctrl>comma + + + + + Toggle fullscreen + Double tap | Double click + F11 f + + + + + Quit + <Ctrl>Q + + + + + + + Media + + + Add Files… + <Ctrl>O + + + + + Add URI… + <Ctrl>U + + + + + + + Queue + + + ltr + Next item + <Ctrl>Right + + + + + rtl + Next item + <Ctrl>Left + + + + + ltr + Previous item + <Ctrl>Left + + + + + rtl + Previous item + <Ctrl>Right + + + + + Change progression mode + <Ctrl>P + + + + + + + Playback + + + Toggle play + Tap | Left click + space k + + + + + ltr + Seek forward + Double tap (right side) | Scroll right + Right l + + + + + rtl + Seek forward + Double tap (left side) | Scroll left + Left j + + + + + ltr + Seek backward + Double tap (left side) | Scroll left + Left j + + + + + rtl + Seek backward + Double tap (right side) | Scroll right + Right l + + + + + Volume up + Scroll up + Up + + + + + Volume down + Scroll down + Down + + + + + Toggle mute + M + + + + + Speed up + greater + + + + + Speed down + less + + + + + ltr + Next chapter + <Shift>Right + + + + + rtl + Next chapter + <Shift>Left + + + + + ltr + Previous chapter + <Shift>Left + + + + + rtl + Previous chapter + <Shift>Right + + + + + + + + diff --git a/src/bin/clapper-app/ui/clapper-app-info-window.ui b/src/bin/clapper-app/ui/clapper-app-info-window.ui new file mode 100644 index 00000000..0393d791 --- /dev/null +++ b/src/bin/clapper-app/ui/clapper-app-info-window.ui @@ -0,0 +1,380 @@ + + + + diff --git a/src/bin/clapper-app/ui/clapper-app-initial-state.ui b/src/bin/clapper-app/ui/clapper-app-initial-state.ui new file mode 100644 index 00000000..f579f89a --- /dev/null +++ b/src/bin/clapper-app/ui/clapper-app-initial-state.ui @@ -0,0 +1,52 @@ + + + + vertical + 6 + + + + end + center + + + + + true + true + com.github.rafostar.Clapper + Clapper + Start by adding media to playback queue + + + vertical + center + center + 6 + + + Add Files… + app.add-files + + + + + + Add URI… + app.add-uri + + + + + + + + + diff --git a/src/bin/clapper-app/ui/clapper-app-preferences-window.ui b/src/bin/clapper-app/ui/clapper-app-preferences-window.ui new file mode 100644 index 00000000..af643712 --- /dev/null +++ b/src/bin/clapper-app/ui/clapper-app-preferences-window.ui @@ -0,0 +1,246 @@ + + + + + Plugin Ranking + + + + + + + + + + + + + vertical + + + Available plugins + Select a plugin and its feature to override rank for. When multiple elements have similiar capabilities, the one with highest value is preferred. + + + Plugin + true + + + + + + + + Plugin feature + true + + + + + + plugins_combo_row + + + + + + + + + center + center + Add override + + + features_combo_row + ClapperAppPreferencesWindow + + + + + + + + + Rank overrides + false + + + + + + + + + + + + + + diff --git a/src/bin/clapper-app/ui/clapper-app-queue-list-item.ui b/src/bin/clapper-app/ui/clapper-app-queue-list-item.ui new file mode 100644 index 00000000..cc1d8c7e --- /dev/null +++ b/src/bin/clapper-app/ui/clapper-app-queue-list-item.ui @@ -0,0 +1,39 @@ + + + + diff --git a/src/bin/clapper-app/ui/clapper-app-queue-list.ui b/src/bin/clapper-app/ui/clapper-app-queue-list.ui new file mode 100644 index 00000000..20b9f7db --- /dev/null +++ b/src/bin/clapper-app/ui/clapper-app-queue-list.ui @@ -0,0 +1,187 @@ + + + + +
+ + Add Files… + app.add-files + + + Add URI… + app.add-uri + +
+
+
diff --git a/src/bin/clapper-app/ui/clapper-app-queue-progression-item.ui b/src/bin/clapper-app/ui/clapper-app-queue-progression-item.ui new file mode 100644 index 00000000..a4d44aa3 --- /dev/null +++ b/src/bin/clapper-app/ui/clapper-app-queue-progression-item.ui @@ -0,0 +1,39 @@ + + + + diff --git a/src/bin/clapper-app/ui/clapper-app-subtitle-stream-list-item.ui b/src/bin/clapper-app/ui/clapper-app-subtitle-stream-list-item.ui new file mode 100644 index 00000000..5b544df7 --- /dev/null +++ b/src/bin/clapper-app/ui/clapper-app-subtitle-stream-list-item.ui @@ -0,0 +1,35 @@ + + + + diff --git a/src/bin/clapper-app/ui/clapper-app-uri-dialog.ui b/src/bin/clapper-app/ui/clapper-app-uri-dialog.ui new file mode 100644 index 00000000..4ab5b3e6 --- /dev/null +++ b/src/bin/clapper-app/ui/clapper-app-uri-dialog.ui @@ -0,0 +1,26 @@ + + + + true + 420 + Add URI + Insert an URI to be added to playback queue + cancel + add + + + fill + center + true + true + true + url + Enter or drop URI here + + + + Cancel + Add + + + diff --git a/src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui b/src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui new file mode 100644 index 00000000..6d0fb39c --- /dev/null +++ b/src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui @@ -0,0 +1,74 @@ + + + + diff --git a/src/bin/clapper-app/ui/clapper-app-window-state-buttons.ui b/src/bin/clapper-app/ui/clapper-app-window-state-buttons.ui new file mode 100644 index 00000000..3ee4c34a --- /dev/null +++ b/src/bin/clapper-app/ui/clapper-app-window-state-buttons.ui @@ -0,0 +1,73 @@ + + + + +
+ + Preferences + app.preferences + + + Keyboard Shortcuts + win.show-help-overlay + +
+
+ + + About Clapper + app.about + +
+
+
diff --git a/src/bin/clapper-app/ui/clapper-app-window.ui b/src/bin/clapper-app/ui/clapper-app-window.ui new file mode 100644 index 00000000..d25521b9 --- /dev/null +++ b/src/bin/clapper-app/ui/clapper-app-window.ui @@ -0,0 +1,75 @@ + + + + diff --git a/src/bin/meson.build b/src/bin/meson.build new file mode 100644 index 00000000..c8a1c51c --- /dev/null +++ b/src/bin/meson.build @@ -0,0 +1 @@ +subdir('clapper-app') diff --git a/src/meson.build b/src/meson.build index c2f563b5..479f4cd2 100644 --- a/src/meson.build +++ b/src/meson.build @@ -1 +1,2 @@ subdir('lib') +subdir('bin')