python3-xapp-3.0.2/0000775000175000017500000000000015127754237013027 5ustar fabiofabiopython3-xapp-3.0.2/.github/0000775000175000017500000000000015127754237014367 5ustar fabiofabiopython3-xapp-3.0.2/.github/workflows/0000775000175000017500000000000015127754237016424 5ustar fabiofabiopython3-xapp-3.0.2/.github/workflows/build.yml0000664000175000017500000000063415127754237020251 0ustar fabiofabioname: Build on: push: branches: - master pull_request: branches: - master workflow_dispatch: jobs: build: uses: linuxmint/github-actions/.github/workflows/do-builds.yml@master with: commit_id: master ############################## Comma separated list - like 'linuxmint/xapp, linuxmint/cinnamon-desktop' dependencies: ############################## python3-xapp-3.0.2/.gitignore0000664000175000017500000000016715127754237015023 0ustar fabiofabiodebian/files debian/.debhelper/ debian/*.debhelper debian/*.substvars debian/python3-xapp/ debian/debhelper-build-stamppython3-xapp-3.0.2/AUTHORS0000664000175000017500000000000015127754237014065 0ustar fabiofabiopython3-xapp-3.0.2/COPYING0000664000175000017500000006130315127754237014065 0ustar fabiofabio GNU LIBRARY GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1991 Free Software Foundation, Inc. 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the library GPL. It is numbered 2 because it goes with version 2 of the ordinary GPL.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Library General Public License, applies to some specially designated Free Software Foundation software, and to any other libraries whose authors decide to use it. You can use it for your libraries, 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 this service 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 make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library, or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link a program with the library, you must provide complete object files to the recipients so that they can relink them with the library, after making changes to the library and recompiling it. And you must show them these terms so they know their rights. Our method of protecting your rights has two steps: (1) copyright the library, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the library. Also, for each distributor's protection, we want to make certain that everyone understands that there is no warranty for this free library. If the library is modified by someone else and passed on, we want its recipients to know that what they have is not the original version, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that companies distributing free software will individually obtain patent licenses, thus in effect transforming the program into proprietary software. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License, which was designed for utility programs. This license, the GNU Library General Public License, applies to certain designated libraries. This license is quite different from the ordinary one; be sure to read it in full, and don't assume that anything in it is the same as in the ordinary license. The reason we have a separate public license for some libraries is that they blur the distinction we usually make between modifying or adding to a program and simply using it. Linking a program with a library, without changing the library, is in some sense simply using the library, and is analogous to running a utility program or application program. However, in a textual and legal sense, the linked executable is a combined work, a derivative of the original library, and the ordinary General Public License treats it as such. Because of this blurred distinction, using the ordinary General Public License for libraries did not effectively promote software sharing, because most developers did not use the libraries. We concluded that weaker conditions might promote sharing better. However, unrestricted linking of non-free programs would deprive the users of those programs of all benefit from the free status of the libraries themselves. This Library General Public License is intended to permit developers of non-free programs to use free libraries, while preserving your freedom as a user of such programs to change the free libraries that are incorporated in them. (We have not seen how to achieve this as regards changes in header files, but we have achieved it as regards changes in the actual functions of the Library.) The hope is that this will lead to faster development of free libraries. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, while the latter only works together with the library. Note that it is possible for a library to be covered by the ordinary General Public License rather than by this special one. GNU LIBRARY GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Library General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also compile or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. c) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. d) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), 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 distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Library 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 Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "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 LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY 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 LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS Appendix: How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey 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 library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! python3-xapp-3.0.2/ChangeLog0000664000175000017500000000000015127754237014567 0ustar fabiofabiopython3-xapp-3.0.2/INSTALL0000664000175000017500000000005715127754237014062 0ustar fabiofabioQuite easy, just run: python setup.py install python3-xapp-3.0.2/PKG-INFO0000664000175000017500000000101215127754237014116 0ustar fabiofabioMetadata-Version: 1.0 Name: python-xapp Version: 1.8.0 Summary: The Xapp Python library. Home-page: http://github.com/linuxmint/python-xapp Author: Linux Mint Author-email: root@linuxmint.com License: UNKNOWN Description: UNKNOWN Platform: UNKNOWN Classifier: License :: OSI Approved :: GNU Lesser General Public License v2 (LGPLv2) Classifier: Programming Language :: Python :: 2.6 Classifier: Programming Language :: Python :: 2.7 Classifier: Programming Language :: Python :: 3 Classifier: Topic :: Desktop Environment python3-xapp-3.0.2/README0000664000175000017500000000000015127754237013675 0ustar fabiofabiopython3-xapp-3.0.2/TODO0000664000175000017500000000000015127754237013505 0ustar fabiofabiopython3-xapp-3.0.2/debian/0000775000175000017500000000000015127754237014251 5ustar fabiofabiopython3-xapp-3.0.2/makepot0000775000175000017500000000017515127754237014420 0ustar fabiofabio#!/bin/bash xgettext --language=Python -cTRANSLATORS --keyword=_ --keyword=N_ --output=python-xapp.pot xapp/*.py xapp/*/*.py python3-xapp-3.0.2/meson.build0000664000175000017500000000043615127754237015174 0ustar fabiofabioproject('python-xapp', version : '3.0.2', meson_version : '>=0.47.0') pymod = import('python') python3 = pymod.find_installation(get_option('python_target')) i18n = import('i18n') gettext_package = meson.project_name() podir = meson.source_root() / 'po' subdir('po') subdir('xapp') python3-xapp-3.0.2/meson_options.txt0000664000175000017500000000015015127754237016460 0ustar fabiofabiooption('python_target', type: 'string', value: 'python3', description: 'Python installation to target') python3-xapp-3.0.2/po/0000775000175000017500000000000015127754237013445 5ustar fabiofabiopython3-xapp-3.0.2/po/LINGUAS0000664000175000017500000000022015127754237014464 0ustar fabiofabiobe bg br ca cs cy da de en_GB eo es eu fi fr fr_CA he hr hu ia is it ja ka ko lo lv mk nb nl nn oc pl pt pt_BR ru sk sl sv tr uk vi zh_CN zh_TW python3-xapp-3.0.2/po/be.po0000664000175000017500000000315115127754237014373 0ustar fabiofabio# Belarusian translation for linuxmint # Copyright (c) 2025 Rosetta Contributors and Canonical Ltd 2025 # This file is distributed under the same license as the linuxmint package. # FIRST AUTHOR , 2025. # msgid "" msgstr "" "Project-Id-Version: linuxmint\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2025-11-11 13:45+0000\n" "PO-Revision-Date: 2025-11-21 18:02+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Belarusian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2026-01-08 15:45+0000\n" "X-Generator: Launchpad (build 99c00f518760bdd50fc6e353e7736d2fff8fba4a)\n" #: xapp/widgets/ListEditor.py:161 msgid "Move up" msgstr "" #: xapp/widgets/ListEditor.py:167 msgid "Move down" msgstr "" #: xapp/widgets/ListEditor.py:231 msgid "Cancel" msgstr "" #: xapp/widgets/ListEditor.py:234 msgid "Save" msgstr "" #: xapp/widgets/ListEditor.py:354 msgid "Add" msgstr "" #: xapp/widgets/ListEditor.py:362 msgid "Remove" msgstr "" #: xapp/widgets/ListEditor.py:369 msgid "Edit" msgstr "" #: xapp/widgets/ListEditor.py:377 msgid "Remove all" msgstr "" #: xapp/widgets/ListEditor.py:486 #, python-format msgid "'%s' is already in the list." msgstr "" #: xapp/widgets/ListEditor.py:571 msgid "Remove?" msgstr "" #: xapp/widgets/ListEditor.py:573 #, python-format msgid "Are you sure you want to remove '%s'?" msgstr "" #: xapp/widgets/ListEditor.py:626 msgid "Remove all?" msgstr "" #: xapp/widgets/ListEditor.py:628 msgid "This will remove all items from the list." msgstr "" python3-xapp-3.0.2/po/bg.po0000664000175000017500000000375615127754237014410 0ustar fabiofabio# Bulgarian translation for linuxmint # Copyright (c) 2025 Rosetta Contributors and Canonical Ltd 2025 # This file is distributed under the same license as the linuxmint package. # FIRST AUTHOR , 2025. # msgid "" msgstr "" "Project-Id-Version: linuxmint\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2025-11-11 13:45+0000\n" "PO-Revision-Date: 2025-11-12 17:51+0000\n" "Last-Translator: spacy01 \n" "Language-Team: Bulgarian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2026-01-08 15:45+0000\n" "X-Generator: Launchpad (build 99c00f518760bdd50fc6e353e7736d2fff8fba4a)\n" #: xapp/widgets/ListEditor.py:161 msgid "Move up" msgstr "Нагоре" #: xapp/widgets/ListEditor.py:167 msgid "Move down" msgstr "Надолу" #: xapp/widgets/ListEditor.py:231 msgid "Cancel" msgstr "Отказ" #: xapp/widgets/ListEditor.py:234 msgid "Save" msgstr "Запиши" #: xapp/widgets/ListEditor.py:354 msgid "Add" msgstr "Добавяне" #: xapp/widgets/ListEditor.py:362 msgid "Remove" msgstr "Премахване" #: xapp/widgets/ListEditor.py:369 msgid "Edit" msgstr "Редакция" #: xapp/widgets/ListEditor.py:377 msgid "Remove all" msgstr "Премахване на всички" #: xapp/widgets/ListEditor.py:486 #, python-format msgid "'%s' is already in the list." msgstr "'%s' е вече в списъка." #: xapp/widgets/ListEditor.py:571 msgid "Remove?" msgstr "Премахване?" #: xapp/widgets/ListEditor.py:573 #, python-format msgid "Are you sure you want to remove '%s'?" msgstr "Наистина ли искате да премахнете „%s“?" #: xapp/widgets/ListEditor.py:626 msgid "Remove all?" msgstr "Премахване на всички?" #: xapp/widgets/ListEditor.py:628 msgid "This will remove all items from the list." msgstr "Това действие ще премахне всички елементи от списъка." python3-xapp-3.0.2/po/br.po0000664000175000017500000000345015127754237014412 0ustar fabiofabio# Breton translation for linuxmint # Copyright (c) 2025 Rosetta Contributors and Canonical Ltd 2025 # This file is distributed under the same license as the linuxmint package. # FIRST AUTHOR , 2025. # msgid "" msgstr "" "Project-Id-Version: linuxmint\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2025-11-11 13:45+0000\n" "PO-Revision-Date: 2025-11-12 15:37+0000\n" "Last-Translator: Anthony Guechoum \n" "Language-Team: Breton \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2026-01-08 15:45+0000\n" "X-Generator: Launchpad (build 99c00f518760bdd50fc6e353e7736d2fff8fba4a)\n" #: xapp/widgets/ListEditor.py:161 msgid "Move up" msgstr "" #: xapp/widgets/ListEditor.py:167 msgid "Move down" msgstr "" #: xapp/widgets/ListEditor.py:231 msgid "Cancel" msgstr "Nullañ" #: xapp/widgets/ListEditor.py:234 msgid "Save" msgstr "Enrollañ" #: xapp/widgets/ListEditor.py:354 msgid "Add" msgstr "Ouzhpennañ" #: xapp/widgets/ListEditor.py:362 msgid "Remove" msgstr "Dilemel" #: xapp/widgets/ListEditor.py:369 msgid "Edit" msgstr "Aozañ" #: xapp/widgets/ListEditor.py:377 msgid "Remove all" msgstr "Dilemel pep tra" #: xapp/widgets/ListEditor.py:486 #, python-format msgid "'%s' is already in the list." msgstr "Emañ '%s' el listenn endeo." #: xapp/widgets/ListEditor.py:571 msgid "Remove?" msgstr "Dilemel?" #: xapp/widgets/ListEditor.py:573 #, python-format msgid "Are you sure you want to remove '%s'?" msgstr "Ha sur oc'h e fell deoc'h dilemel '%s'?" #: xapp/widgets/ListEditor.py:626 msgid "Remove all?" msgstr "Dilemel pep tra?" #: xapp/widgets/ListEditor.py:628 msgid "This will remove all items from the list." msgstr "Dilamet e vo pep elfenn eus al listenn." python3-xapp-3.0.2/po/ca.po0000664000175000017500000000346215127754237014375 0ustar fabiofabio# Catalan translation for linuxmint # Copyright (c) 2025 Rosetta Contributors and Canonical Ltd 2025 # This file is distributed under the same license as the linuxmint package. # FIRST AUTHOR , 2025. # msgid "" msgstr "" "Project-Id-Version: linuxmint\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2025-11-11 13:45+0000\n" "PO-Revision-Date: 2025-11-12 11:52+0000\n" "Last-Translator: Isidro Pisa \n" "Language-Team: Catalan \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2026-01-08 15:45+0000\n" "X-Generator: Launchpad (build 99c00f518760bdd50fc6e353e7736d2fff8fba4a)\n" #: xapp/widgets/ListEditor.py:161 msgid "Move up" msgstr "Mou amunt" #: xapp/widgets/ListEditor.py:167 msgid "Move down" msgstr "Mou avall" #: xapp/widgets/ListEditor.py:231 msgid "Cancel" msgstr "Cancel·la" #: xapp/widgets/ListEditor.py:234 msgid "Save" msgstr "Desa" #: xapp/widgets/ListEditor.py:354 msgid "Add" msgstr "Afegeix" #: xapp/widgets/ListEditor.py:362 msgid "Remove" msgstr "Elimina" #: xapp/widgets/ListEditor.py:369 msgid "Edit" msgstr "Edita" #: xapp/widgets/ListEditor.py:377 msgid "Remove all" msgstr "Elimina-ho tot" #: xapp/widgets/ListEditor.py:486 #, python-format msgid "'%s' is already in the list." msgstr "'%s' ja és a la llista." #: xapp/widgets/ListEditor.py:571 msgid "Remove?" msgstr "Voleu eliminar-ho?" #: xapp/widgets/ListEditor.py:573 #, python-format msgid "Are you sure you want to remove '%s'?" msgstr "Estàs segur que vols eliminar '%s'?" #: xapp/widgets/ListEditor.py:626 msgid "Remove all?" msgstr "Eliminar-ho tot?" #: xapp/widgets/ListEditor.py:628 msgid "This will remove all items from the list." msgstr "S'eliminaran tots els elements de la llista." python3-xapp-3.0.2/po/cs.po0000664000175000017500000000347215127754237014420 0ustar fabiofabio# Czech translation for linuxmint # Copyright (c) 2025 Rosetta Contributors and Canonical Ltd 2025 # This file is distributed under the same license as the linuxmint package. # FIRST AUTHOR , 2025. # msgid "" msgstr "" "Project-Id-Version: linuxmint\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2025-11-11 13:45+0000\n" "PO-Revision-Date: 2025-11-11 19:30+0000\n" "Last-Translator: Marek Hladík \n" "Language-Team: Czech \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2026-01-08 15:45+0000\n" "X-Generator: Launchpad (build 99c00f518760bdd50fc6e353e7736d2fff8fba4a)\n" #: xapp/widgets/ListEditor.py:161 msgid "Move up" msgstr "Posunout výš" #: xapp/widgets/ListEditor.py:167 msgid "Move down" msgstr "Posunout níž" #: xapp/widgets/ListEditor.py:231 msgid "Cancel" msgstr "Zrušit" #: xapp/widgets/ListEditor.py:234 msgid "Save" msgstr "Uložit" #: xapp/widgets/ListEditor.py:354 msgid "Add" msgstr "Přidat" #: xapp/widgets/ListEditor.py:362 msgid "Remove" msgstr "Odstranit" #: xapp/widgets/ListEditor.py:369 msgid "Edit" msgstr "Upravit" #: xapp/widgets/ListEditor.py:377 msgid "Remove all" msgstr "Odstranit vše" #: xapp/widgets/ListEditor.py:486 #, python-format msgid "'%s' is already in the list." msgstr "„%s“ už je v seznamu." #: xapp/widgets/ListEditor.py:571 msgid "Remove?" msgstr "Odstranit?" #: xapp/widgets/ListEditor.py:573 #, python-format msgid "Are you sure you want to remove '%s'?" msgstr "Opravdu chcete „%s“ odebrat?" #: xapp/widgets/ListEditor.py:626 msgid "Remove all?" msgstr "Odstranit vše?" #: xapp/widgets/ListEditor.py:628 msgid "This will remove all items from the list." msgstr "Tímto se odstraní všechny položky ze seznamu." python3-xapp-3.0.2/po/cy.po0000664000175000017500000000345615127754237014430 0ustar fabiofabio# Welsh translation for linuxmint # Copyright (c) 2025 Rosetta Contributors and Canonical Ltd 2025 # This file is distributed under the same license as the linuxmint package. # FIRST AUTHOR , 2025. # msgid "" msgstr "" "Project-Id-Version: linuxmint\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2025-11-11 13:45+0000\n" "PO-Revision-Date: 2025-11-17 22:21+0000\n" "Last-Translator: Rhoslyn Prys \n" "Language-Team: Welsh \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2026-01-08 15:45+0000\n" "X-Generator: Launchpad (build 99c00f518760bdd50fc6e353e7736d2fff8fba4a)\n" #: xapp/widgets/ListEditor.py:161 msgid "Move up" msgstr "Symud i fyny" #: xapp/widgets/ListEditor.py:167 msgid "Move down" msgstr "Symud i lawr" #: xapp/widgets/ListEditor.py:231 msgid "Cancel" msgstr "Diddymu" #: xapp/widgets/ListEditor.py:234 msgid "Save" msgstr "Cadw" #: xapp/widgets/ListEditor.py:354 msgid "Add" msgstr "Ychwanegu" #: xapp/widgets/ListEditor.py:362 msgid "Remove" msgstr "Tynnu" #: xapp/widgets/ListEditor.py:369 msgid "Edit" msgstr "Golygu" #: xapp/widgets/ListEditor.py:377 msgid "Remove all" msgstr "Tynnu'r cyfan" #: xapp/widgets/ListEditor.py:486 #, python-format msgid "'%s' is already in the list." msgstr "Mae '%s' eisoes ar y rhestr." #: xapp/widgets/ListEditor.py:571 msgid "Remove?" msgstr "Tynnu?" #: xapp/widgets/ListEditor.py:573 #, python-format msgid "Are you sure you want to remove '%s'?" msgstr "Ydych chi'n siŵr eich bod am dynnu '%s'?" #: xapp/widgets/ListEditor.py:626 msgid "Remove all?" msgstr "Tynnu'r cyfan?" #: xapp/widgets/ListEditor.py:628 msgid "This will remove all items from the list." msgstr "Bydd hyn yn tynnu'r holl eitemau o'r rhestr." python3-xapp-3.0.2/po/da.po0000664000175000017500000000345715127754237014402 0ustar fabiofabio# Danish translation for linuxmint # Copyright (c) 2025 Rosetta Contributors and Canonical Ltd 2025 # This file is distributed under the same license as the linuxmint package. # FIRST AUTHOR , 2025. # msgid "" msgstr "" "Project-Id-Version: linuxmint\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2025-11-11 13:45+0000\n" "PO-Revision-Date: 2025-11-12 16:26+0000\n" "Last-Translator: Alan Mortensen \n" "Language-Team: Danish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2026-01-08 15:45+0000\n" "X-Generator: Launchpad (build 99c00f518760bdd50fc6e353e7736d2fff8fba4a)\n" #: xapp/widgets/ListEditor.py:161 msgid "Move up" msgstr "Flyt op" #: xapp/widgets/ListEditor.py:167 msgid "Move down" msgstr "Flyt ned" #: xapp/widgets/ListEditor.py:231 msgid "Cancel" msgstr "Annullér" #: xapp/widgets/ListEditor.py:234 msgid "Save" msgstr "Gem" #: xapp/widgets/ListEditor.py:354 msgid "Add" msgstr "Tilføj" #: xapp/widgets/ListEditor.py:362 msgid "Remove" msgstr "Fjern" #: xapp/widgets/ListEditor.py:369 msgid "Edit" msgstr "Redigér" #: xapp/widgets/ListEditor.py:377 msgid "Remove all" msgstr "Fjern alle" #: xapp/widgets/ListEditor.py:486 #, python-format msgid "'%s' is already in the list." msgstr "“%s” er allerede på listen." #: xapp/widgets/ListEditor.py:571 msgid "Remove?" msgstr "Fjern?" #: xapp/widgets/ListEditor.py:573 #, python-format msgid "Are you sure you want to remove '%s'?" msgstr "Er du sikker på, du vil fjerne “%s”?" #: xapp/widgets/ListEditor.py:626 msgid "Remove all?" msgstr "Fjern alle?" #: xapp/widgets/ListEditor.py:628 msgid "This will remove all items from the list." msgstr "Det vil fjerne alle elementer på listen." python3-xapp-3.0.2/po/de.po0000664000175000017500000000354015127754237014377 0ustar fabiofabio# German translation for linuxmint # Copyright (c) 2025 Rosetta Contributors and Canonical Ltd 2025 # This file is distributed under the same license as the linuxmint package. # FIRST AUTHOR , 2025. # msgid "" msgstr "" "Project-Id-Version: linuxmint\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2025-11-11 13:45+0000\n" "PO-Revision-Date: 2025-11-12 16:36+0000\n" "Last-Translator: Tobias Bannert \n" "Language-Team: German \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2026-01-08 15:45+0000\n" "X-Generator: Launchpad (build 99c00f518760bdd50fc6e353e7736d2fff8fba4a)\n" #: xapp/widgets/ListEditor.py:161 msgid "Move up" msgstr "Nach oben" #: xapp/widgets/ListEditor.py:167 msgid "Move down" msgstr "Nach unten" #: xapp/widgets/ListEditor.py:231 msgid "Cancel" msgstr "Abbrechen" #: xapp/widgets/ListEditor.py:234 msgid "Save" msgstr "Speichern" #: xapp/widgets/ListEditor.py:354 msgid "Add" msgstr "Hinzufügen" #: xapp/widgets/ListEditor.py:362 msgid "Remove" msgstr "Entfernen" #: xapp/widgets/ListEditor.py:369 msgid "Edit" msgstr "Bearbeiten" #: xapp/widgets/ListEditor.py:377 msgid "Remove all" msgstr "Alles entfernen" #: xapp/widgets/ListEditor.py:486 #, python-format msgid "'%s' is already in the list." msgstr "»%s« ist bereits in der Liste." #: xapp/widgets/ListEditor.py:571 msgid "Remove?" msgstr "Entfernen?" #: xapp/widgets/ListEditor.py:573 #, python-format msgid "Are you sure you want to remove '%s'?" msgstr "Sind Sie sicher, dass Sie »%s« entfernen möchten?" #: xapp/widgets/ListEditor.py:626 msgid "Remove all?" msgstr "Alles entfernen?" #: xapp/widgets/ListEditor.py:628 msgid "This will remove all items from the list." msgstr "Dadurch werden alle Elemente aus der Liste entfernt." python3-xapp-3.0.2/po/en_GB.po0000664000175000017500000000346315127754237014765 0ustar fabiofabio# English (United Kingdom) translation for linuxmint # Copyright (c) 2025 Rosetta Contributors and Canonical Ltd 2025 # This file is distributed under the same license as the linuxmint package. # FIRST AUTHOR , 2025. # msgid "" msgstr "" "Project-Id-Version: linuxmint\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2025-11-11 13:45+0000\n" "PO-Revision-Date: 2025-11-15 17:10+0000\n" "Last-Translator: Andi Chandler \n" "Language-Team: English (United Kingdom) \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2026-01-08 15:45+0000\n" "X-Generator: Launchpad (build 99c00f518760bdd50fc6e353e7736d2fff8fba4a)\n" #: xapp/widgets/ListEditor.py:161 msgid "Move up" msgstr "Move up" #: xapp/widgets/ListEditor.py:167 msgid "Move down" msgstr "Move down" #: xapp/widgets/ListEditor.py:231 msgid "Cancel" msgstr "Cancel" #: xapp/widgets/ListEditor.py:234 msgid "Save" msgstr "Save" #: xapp/widgets/ListEditor.py:354 msgid "Add" msgstr "Add" #: xapp/widgets/ListEditor.py:362 msgid "Remove" msgstr "Remove" #: xapp/widgets/ListEditor.py:369 msgid "Edit" msgstr "Edit" #: xapp/widgets/ListEditor.py:377 msgid "Remove all" msgstr "Remove all" #: xapp/widgets/ListEditor.py:486 #, python-format msgid "'%s' is already in the list." msgstr "'%s' is already in the list." #: xapp/widgets/ListEditor.py:571 msgid "Remove?" msgstr "Remove?" #: xapp/widgets/ListEditor.py:573 #, python-format msgid "Are you sure you want to remove '%s'?" msgstr "Are you sure you want to remove '%s'?" #: xapp/widgets/ListEditor.py:626 msgid "Remove all?" msgstr "Remove all?" #: xapp/widgets/ListEditor.py:628 msgid "This will remove all items from the list." msgstr "This will remove all items from the list." python3-xapp-3.0.2/po/eo.po0000664000175000017500000000346315127754237014416 0ustar fabiofabio# Esperanto translation for linuxmint # Copyright (c) 2025 Rosetta Contributors and Canonical Ltd 2025 # This file is distributed under the same license as the linuxmint package. # FIRST AUTHOR , 2025. # msgid "" msgstr "" "Project-Id-Version: linuxmint\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2025-11-11 13:45+0000\n" "PO-Revision-Date: 2025-11-11 16:30+0000\n" "Last-Translator: Piet Coppens \n" "Language-Team: Esperanto \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2026-01-08 15:45+0000\n" "X-Generator: Launchpad (build 99c00f518760bdd50fc6e353e7736d2fff8fba4a)\n" #: xapp/widgets/ListEditor.py:161 msgid "Move up" msgstr "Movi supren" #: xapp/widgets/ListEditor.py:167 msgid "Move down" msgstr "Movi malsupren" #: xapp/widgets/ListEditor.py:231 msgid "Cancel" msgstr "Nuligi" #: xapp/widgets/ListEditor.py:234 msgid "Save" msgstr "Konservi" #: xapp/widgets/ListEditor.py:354 msgid "Add" msgstr "Aldoni" #: xapp/widgets/ListEditor.py:362 msgid "Remove" msgstr "Forigi" #: xapp/widgets/ListEditor.py:369 msgid "Edit" msgstr "Redakti" #: xapp/widgets/ListEditor.py:377 msgid "Remove all" msgstr "Forigi ĉiujn" #: xapp/widgets/ListEditor.py:486 #, python-format msgid "'%s' is already in the list." msgstr "'%s' estas jam en la listo." #: xapp/widgets/ListEditor.py:571 msgid "Remove?" msgstr "Ĉu forigi?" #: xapp/widgets/ListEditor.py:573 #, python-format msgid "Are you sure you want to remove '%s'?" msgstr "Ĉu vi certas, ke vi volas forigi '%s'?" #: xapp/widgets/ListEditor.py:626 msgid "Remove all?" msgstr "Ĉu forigi ĉiujn?" #: xapp/widgets/ListEditor.py:628 msgid "This will remove all items from the list." msgstr "Ĉi tio forigos ĉiujn erojn de la listo." python3-xapp-3.0.2/po/es.po0000664000175000017500000000345715127754237014425 0ustar fabiofabio# Spanish translation for linuxmint # Copyright (c) 2025 Rosetta Contributors and Canonical Ltd 2025 # This file is distributed under the same license as the linuxmint package. # FIRST AUTHOR , 2025. # msgid "" msgstr "" "Project-Id-Version: linuxmint\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2025-11-11 13:45+0000\n" "PO-Revision-Date: 2025-11-11 14:43+0000\n" "Last-Translator: Marcos Sánchez \n" "Language-Team: Spanish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2026-01-08 15:45+0000\n" "X-Generator: Launchpad (build 99c00f518760bdd50fc6e353e7736d2fff8fba4a)\n" #: xapp/widgets/ListEditor.py:161 msgid "Move up" msgstr "Subir" #: xapp/widgets/ListEditor.py:167 msgid "Move down" msgstr "Bajar" #: xapp/widgets/ListEditor.py:231 msgid "Cancel" msgstr "Cancelar" #: xapp/widgets/ListEditor.py:234 msgid "Save" msgstr "Guardar" #: xapp/widgets/ListEditor.py:354 msgid "Add" msgstr "Añadir" #: xapp/widgets/ListEditor.py:362 msgid "Remove" msgstr "Eliminar" #: xapp/widgets/ListEditor.py:369 msgid "Edit" msgstr "Editar" #: xapp/widgets/ListEditor.py:377 msgid "Remove all" msgstr "Eliminar todo" #: xapp/widgets/ListEditor.py:486 #, python-format msgid "'%s' is already in the list." msgstr "'%s' ya está en la lista." #: xapp/widgets/ListEditor.py:571 msgid "Remove?" msgstr "¿Eliminar?" #: xapp/widgets/ListEditor.py:573 #, python-format msgid "Are you sure you want to remove '%s'?" msgstr "¿Estás seguro de que deseas eliminar '%s'?" #: xapp/widgets/ListEditor.py:626 msgid "Remove all?" msgstr "¿Eliminar todo?" #: xapp/widgets/ListEditor.py:628 msgid "This will remove all items from the list." msgstr "Esto eliminará todos los elementos de la lista." python3-xapp-3.0.2/po/eu.po0000664000175000017500000000345415127754237014424 0ustar fabiofabio# Basque translation for linuxmint # Copyright (c) 2025 Rosetta Contributors and Canonical Ltd 2025 # This file is distributed under the same license as the linuxmint package. # FIRST AUTHOR , 2025. # msgid "" msgstr "" "Project-Id-Version: linuxmint\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2025-11-11 13:45+0000\n" "PO-Revision-Date: 2025-11-11 20:37+0000\n" "Last-Translator: Asier Iturralde Sarasola \n" "Language-Team: Basque \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2026-01-08 15:45+0000\n" "X-Generator: Launchpad (build 99c00f518760bdd50fc6e353e7736d2fff8fba4a)\n" #: xapp/widgets/ListEditor.py:161 msgid "Move up" msgstr "Eraman gora" #: xapp/widgets/ListEditor.py:167 msgid "Move down" msgstr "Eraman behera" #: xapp/widgets/ListEditor.py:231 msgid "Cancel" msgstr "Utzi" #: xapp/widgets/ListEditor.py:234 msgid "Save" msgstr "Gorde" #: xapp/widgets/ListEditor.py:354 msgid "Add" msgstr "Gehitu" #: xapp/widgets/ListEditor.py:362 msgid "Remove" msgstr "Kendu" #: xapp/widgets/ListEditor.py:369 msgid "Edit" msgstr "Editatu" #: xapp/widgets/ListEditor.py:377 msgid "Remove all" msgstr "Kendu denak" #: xapp/widgets/ListEditor.py:486 #, python-format msgid "'%s' is already in the list." msgstr "'%s' dagoeneko zerrendan dago." #: xapp/widgets/ListEditor.py:571 msgid "Remove?" msgstr "Kendu?" #: xapp/widgets/ListEditor.py:573 #, python-format msgid "Are you sure you want to remove '%s'?" msgstr "Ziur zaude '%s' kendu nahi duzula?" #: xapp/widgets/ListEditor.py:626 msgid "Remove all?" msgstr "Kendu guztiak?" #: xapp/widgets/ListEditor.py:628 msgid "This will remove all items from the list." msgstr "Honek elementu guztiak kenduko ditu zerrendatik." python3-xapp-3.0.2/po/fi.po0000664000175000017500000000342415127754237014406 0ustar fabiofabio# Finnish translation for linuxmint # Copyright (c) 2025 Rosetta Contributors and Canonical Ltd 2025 # This file is distributed under the same license as the linuxmint package. # FIRST AUTHOR , 2025. # msgid "" msgstr "" "Project-Id-Version: linuxmint\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2025-11-11 13:45+0000\n" "PO-Revision-Date: 2025-11-19 18:53+0000\n" "Last-Translator: JTi65 \n" "Language-Team: Finnish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2026-01-08 15:45+0000\n" "X-Generator: Launchpad (build 99c00f518760bdd50fc6e353e7736d2fff8fba4a)\n" #: xapp/widgets/ListEditor.py:161 msgid "Move up" msgstr "Siirrä ylös" #: xapp/widgets/ListEditor.py:167 msgid "Move down" msgstr "Siirrä alas" #: xapp/widgets/ListEditor.py:231 msgid "Cancel" msgstr "Peru" #: xapp/widgets/ListEditor.py:234 msgid "Save" msgstr "Tallenna" #: xapp/widgets/ListEditor.py:354 msgid "Add" msgstr "Lisää" #: xapp/widgets/ListEditor.py:362 msgid "Remove" msgstr "Poista" #: xapp/widgets/ListEditor.py:369 msgid "Edit" msgstr "Muokkaa" #: xapp/widgets/ListEditor.py:377 msgid "Remove all" msgstr "Poista kaikki" #: xapp/widgets/ListEditor.py:486 #, python-format msgid "'%s' is already in the list." msgstr "\"%s\" on jo luettelossa." #: xapp/widgets/ListEditor.py:571 msgid "Remove?" msgstr "Poista?" #: xapp/widgets/ListEditor.py:573 #, python-format msgid "Are you sure you want to remove '%s'?" msgstr "Poistetaanko varmasti \"%s\"?" #: xapp/widgets/ListEditor.py:626 msgid "Remove all?" msgstr "Poista kaikki?" #: xapp/widgets/ListEditor.py:628 msgid "This will remove all items from the list." msgstr "Tämä poistaa kaikki kohteet luettelosta." python3-xapp-3.0.2/po/fr.po0000664000175000017500000000353115127754237014416 0ustar fabiofabio# French translation for linuxmint # Copyright (c) 2025 Rosetta Contributors and Canonical Ltd 2025 # This file is distributed under the same license as the linuxmint package. # FIRST AUTHOR , 2025. # msgid "" msgstr "" "Project-Id-Version: linuxmint\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2025-11-11 13:45+0000\n" "PO-Revision-Date: 2025-11-12 23:00+0000\n" "Last-Translator: AO \n" "Language-Team: French \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2026-01-08 15:45+0000\n" "X-Generator: Launchpad (build 99c00f518760bdd50fc6e353e7736d2fff8fba4a)\n" #: xapp/widgets/ListEditor.py:161 msgid "Move up" msgstr "Déplacer vers le haut" #: xapp/widgets/ListEditor.py:167 msgid "Move down" msgstr "Déplacer vers le bas" #: xapp/widgets/ListEditor.py:231 msgid "Cancel" msgstr "Annuler" #: xapp/widgets/ListEditor.py:234 msgid "Save" msgstr "Enregistrer" #: xapp/widgets/ListEditor.py:354 msgid "Add" msgstr "Ajouter" #: xapp/widgets/ListEditor.py:362 msgid "Remove" msgstr "Supprimer" #: xapp/widgets/ListEditor.py:369 msgid "Edit" msgstr "Modifier" #: xapp/widgets/ListEditor.py:377 msgid "Remove all" msgstr "Tout supprimer" #: xapp/widgets/ListEditor.py:486 #, python-format msgid "'%s' is already in the list." msgstr "« %s »  fait déjà partie de la liste." #: xapp/widgets/ListEditor.py:571 msgid "Remove?" msgstr "Supprimer ?" #: xapp/widgets/ListEditor.py:573 #, python-format msgid "Are you sure you want to remove '%s'?" msgstr "Voulez-vous supprimer « %s » ?" #: xapp/widgets/ListEditor.py:626 msgid "Remove all?" msgstr "Tout supprimer ?" #: xapp/widgets/ListEditor.py:628 msgid "This will remove all items from the list." msgstr "Tous les éléments seront supprimés de la liste." python3-xapp-3.0.2/po/fr_CA.po0000664000175000017500000000355615127754237014770 0ustar fabiofabio# French (Canada) translation for linuxmint # Copyright (c) 2025 Rosetta Contributors and Canonical Ltd 2025 # This file is distributed under the same license as the linuxmint package. # FIRST AUTHOR , 2025. # msgid "" msgstr "" "Project-Id-Version: linuxmint\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2025-11-11 13:45+0000\n" "PO-Revision-Date: 2025-11-12 23:00+0000\n" "Last-Translator: AO \n" "Language-Team: French (Canada) \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2026-01-08 15:45+0000\n" "X-Generator: Launchpad (build 99c00f518760bdd50fc6e353e7736d2fff8fba4a)\n" #: xapp/widgets/ListEditor.py:161 msgid "Move up" msgstr "Déplacer vers le haut" #: xapp/widgets/ListEditor.py:167 msgid "Move down" msgstr "Déplacer vers le bas" #: xapp/widgets/ListEditor.py:231 msgid "Cancel" msgstr "Annuler" #: xapp/widgets/ListEditor.py:234 msgid "Save" msgstr "Enregistrer" #: xapp/widgets/ListEditor.py:354 msgid "Add" msgstr "Ajouter" #: xapp/widgets/ListEditor.py:362 msgid "Remove" msgstr "Supprimer" #: xapp/widgets/ListEditor.py:369 msgid "Edit" msgstr "Modifier" #: xapp/widgets/ListEditor.py:377 msgid "Remove all" msgstr "Tout supprimer" #: xapp/widgets/ListEditor.py:486 #, python-format msgid "'%s' is already in the list." msgstr "« %s »  fait déjà partie de la liste." #: xapp/widgets/ListEditor.py:571 msgid "Remove?" msgstr "Supprimer ?" #: xapp/widgets/ListEditor.py:573 #, python-format msgid "Are you sure you want to remove '%s'?" msgstr "Voulez-vous supprimer « %s » ?" #: xapp/widgets/ListEditor.py:626 msgid "Remove all?" msgstr "Tout supprimer ?" #: xapp/widgets/ListEditor.py:628 msgid "This will remove all items from the list." msgstr "Tous les éléments seront supprimés de la liste." python3-xapp-3.0.2/po/he.po0000664000175000017500000000356215127754237014407 0ustar fabiofabio# Hebrew translation for linuxmint # Copyright (c) 2025 Rosetta Contributors and Canonical Ltd 2025 # This file is distributed under the same license as the linuxmint package. # FIRST AUTHOR , 2025. # msgid "" msgstr "" "Project-Id-Version: linuxmint\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2025-11-11 13:45+0000\n" "PO-Revision-Date: 2025-11-17 11:39+0000\n" "Last-Translator: Avi Markovitz \n" "Language-Team: Hebrew \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2026-01-08 15:45+0000\n" "X-Generator: Launchpad (build 99c00f518760bdd50fc6e353e7736d2fff8fba4a)\n" #: xapp/widgets/ListEditor.py:161 msgid "Move up" msgstr "העברה מעלה" #: xapp/widgets/ListEditor.py:167 msgid "Move down" msgstr "העברה מטה" #: xapp/widgets/ListEditor.py:231 msgid "Cancel" msgstr "ביטול" #: xapp/widgets/ListEditor.py:234 msgid "Save" msgstr "שמירה" #: xapp/widgets/ListEditor.py:354 msgid "Add" msgstr "הוספה" #: xapp/widgets/ListEditor.py:362 msgid "Remove" msgstr "הסרה" #: xapp/widgets/ListEditor.py:369 msgid "Edit" msgstr "עריכה" #: xapp/widgets/ListEditor.py:377 msgid "Remove all" msgstr "להסיר הכול" #: xapp/widgets/ListEditor.py:486 #, python-format msgid "'%s' is already in the list." msgstr "'%s' קיים כבר ברשימה." #: xapp/widgets/ListEditor.py:571 msgid "Remove?" msgstr "להסיר?" #: xapp/widgets/ListEditor.py:573 #, python-format msgid "Are you sure you want to remove '%s'?" msgstr "האם להסיר את '%s'?" #: xapp/widgets/ListEditor.py:626 msgid "Remove all?" msgstr "להסיר הכל?" #: xapp/widgets/ListEditor.py:628 msgid "This will remove all items from the list." msgstr "פעולה זו תסיר את כל הפריטים מהרשימה." python3-xapp-3.0.2/po/hr.po0000664000175000017500000000344215127754237014421 0ustar fabiofabio# Croatian translation for linuxmint # Copyright (c) 2025 Rosetta Contributors and Canonical Ltd 2025 # This file is distributed under the same license as the linuxmint package. # FIRST AUTHOR , 2025. # msgid "" msgstr "" "Project-Id-Version: linuxmint\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2025-11-11 13:45+0000\n" "PO-Revision-Date: 2025-11-14 19:14+0000\n" "Last-Translator: Niko Košćina \n" "Language-Team: Croatian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2026-01-08 15:45+0000\n" "X-Generator: Launchpad (build 99c00f518760bdd50fc6e353e7736d2fff8fba4a)\n" #: xapp/widgets/ListEditor.py:161 msgid "Move up" msgstr "Pomakni gore" #: xapp/widgets/ListEditor.py:167 msgid "Move down" msgstr "Pomakni dolje" #: xapp/widgets/ListEditor.py:231 msgid "Cancel" msgstr "Otkaži" #: xapp/widgets/ListEditor.py:234 msgid "Save" msgstr "Spremi" #: xapp/widgets/ListEditor.py:354 msgid "Add" msgstr "Dodaj" #: xapp/widgets/ListEditor.py:362 msgid "Remove" msgstr "Ukloni" #: xapp/widgets/ListEditor.py:369 msgid "Edit" msgstr "Uredi" #: xapp/widgets/ListEditor.py:377 msgid "Remove all" msgstr "Ukloni sve" #: xapp/widgets/ListEditor.py:486 #, python-format msgid "'%s' is already in the list." msgstr "'%s' je već na popisu." #: xapp/widgets/ListEditor.py:571 msgid "Remove?" msgstr "Ukloni?" #: xapp/widgets/ListEditor.py:573 #, python-format msgid "Are you sure you want to remove '%s'?" msgstr "Sigurno želite ukloniti '%s'?" #: xapp/widgets/ListEditor.py:626 msgid "Remove all?" msgstr "Uklonite sve?" #: xapp/widgets/ListEditor.py:628 msgid "This will remove all items from the list." msgstr "Ovo će ukloniti sve stavke iz popisa." python3-xapp-3.0.2/po/hu.po0000664000175000017500000000363315127754237014426 0ustar fabiofabio# Hungarian translation for linuxmint # Copyright (c) 2025 Rosetta Contributors and Canonical Ltd 2025 # This file is distributed under the same license as the linuxmint package. # FIRST AUTHOR , 2025. # msgid "" msgstr "" "Project-Id-Version: linuxmint\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2025-11-11 13:45+0000\n" "PO-Revision-Date: 2025-12-08 13:23+0000\n" "Last-Translator: KAMI \n" "Language-Team: Hungarian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2026-01-08 15:45+0000\n" "X-Generator: Launchpad (build 99c00f518760bdd50fc6e353e7736d2fff8fba4a)\n" #: xapp/widgets/ListEditor.py:161 msgid "Move up" msgstr "Felfelé mozgatás" #: xapp/widgets/ListEditor.py:167 msgid "Move down" msgstr "Lefelé mozgatás" #: xapp/widgets/ListEditor.py:231 msgid "Cancel" msgstr "Mégse" #: xapp/widgets/ListEditor.py:234 msgid "Save" msgstr "Mentés" #: xapp/widgets/ListEditor.py:354 msgid "Add" msgstr "Hozzáadás" #: xapp/widgets/ListEditor.py:362 msgid "Remove" msgstr "Eltávolítás" #: xapp/widgets/ListEditor.py:369 msgid "Edit" msgstr "Szerkesztés" #: xapp/widgets/ListEditor.py:377 msgid "Remove all" msgstr "Összes eltávolítása" #: xapp/widgets/ListEditor.py:486 #, python-format msgid "'%s' is already in the list." msgstr "Már szerepel a listán: „%s”." #: xapp/widgets/ListEditor.py:571 msgid "Remove?" msgstr "Eltávolítja?" #: xapp/widgets/ListEditor.py:573 #, python-format msgid "Are you sure you want to remove '%s'?" msgstr "Valóban el kívánja távolítani a következőt: „%s”?" #: xapp/widgets/ListEditor.py:626 msgid "Remove all?" msgstr "Valóban el kívánja távolítani az összeset?" #: xapp/widgets/ListEditor.py:628 msgid "This will remove all items from the list." msgstr "Eltávolítja az összes elemet a listáról." python3-xapp-3.0.2/po/ia.po0000664000175000017500000000344315127754237014402 0ustar fabiofabio# Interlingua translation for linuxmint # Copyright (c) 2025 Rosetta Contributors and Canonical Ltd 2025 # This file is distributed under the same license as the linuxmint package. # FIRST AUTHOR , 2025. # msgid "" msgstr "" "Project-Id-Version: linuxmint\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2025-11-11 13:45+0000\n" "PO-Revision-Date: 2025-11-24 04:53+0000\n" "Last-Translator: karm \n" "Language-Team: Interlingua \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2026-01-08 15:45+0000\n" "X-Generator: Launchpad (build 99c00f518760bdd50fc6e353e7736d2fff8fba4a)\n" #: xapp/widgets/ListEditor.py:161 msgid "Move up" msgstr "Mover supra" #: xapp/widgets/ListEditor.py:167 msgid "Move down" msgstr "Mover infra" #: xapp/widgets/ListEditor.py:231 msgid "Cancel" msgstr "Cancellar" #: xapp/widgets/ListEditor.py:234 msgid "Save" msgstr "Salvar" #: xapp/widgets/ListEditor.py:354 msgid "Add" msgstr "Adder" #: xapp/widgets/ListEditor.py:362 msgid "Remove" msgstr "Remover" #: xapp/widgets/ListEditor.py:369 msgid "Edit" msgstr "Modificar" #: xapp/widgets/ListEditor.py:377 msgid "Remove all" msgstr "Remover toto" #: xapp/widgets/ListEditor.py:486 #, python-format msgid "'%s' is already in the list." msgstr "'%s' es jam in le lista." #: xapp/widgets/ListEditor.py:571 msgid "Remove?" msgstr "Remover?" #: xapp/widgets/ListEditor.py:573 #, python-format msgid "Are you sure you want to remove '%s'?" msgstr "Desira tu vermente remover '%s'?" #: xapp/widgets/ListEditor.py:626 msgid "Remove all?" msgstr "Remover toto?" #: xapp/widgets/ListEditor.py:628 msgid "This will remove all items from the list." msgstr "Isto removera tote le articulos del lista" python3-xapp-3.0.2/po/is.po0000664000175000017500000000351715127754237014426 0ustar fabiofabio# Icelandic translation for linuxmint # Copyright (c) 2025 Rosetta Contributors and Canonical Ltd 2025 # This file is distributed under the same license as the linuxmint package. # FIRST AUTHOR , 2025. # msgid "" msgstr "" "Project-Id-Version: linuxmint\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2025-11-11 13:45+0000\n" "PO-Revision-Date: 2025-11-12 16:52+0000\n" "Last-Translator: Sveinn í Felli \n" "Language-Team: Icelandic \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2026-01-08 15:45+0000\n" "X-Generator: Launchpad (build 99c00f518760bdd50fc6e353e7736d2fff8fba4a)\n" #: xapp/widgets/ListEditor.py:161 msgid "Move up" msgstr "Færa upp" #: xapp/widgets/ListEditor.py:167 msgid "Move down" msgstr "Færa niður" #: xapp/widgets/ListEditor.py:231 msgid "Cancel" msgstr "Hætta við" #: xapp/widgets/ListEditor.py:234 msgid "Save" msgstr "Vista" #: xapp/widgets/ListEditor.py:354 msgid "Add" msgstr "Bæta við" #: xapp/widgets/ListEditor.py:362 msgid "Remove" msgstr "Fjarlægja" #: xapp/widgets/ListEditor.py:369 msgid "Edit" msgstr "Breyta" #: xapp/widgets/ListEditor.py:377 msgid "Remove all" msgstr "Fjarlægja allt" #: xapp/widgets/ListEditor.py:486 #, python-format msgid "'%s' is already in the list." msgstr "'%s' er þegar á listanum." #: xapp/widgets/ListEditor.py:571 msgid "Remove?" msgstr "Fjarlægja?" #: xapp/widgets/ListEditor.py:573 #, python-format msgid "Are you sure you want to remove '%s'?" msgstr "Ertu viss um að þú viljir fjarlægja '%s'?" #: xapp/widgets/ListEditor.py:626 msgid "Remove all?" msgstr "Fjarlægja allt?" #: xapp/widgets/ListEditor.py:628 msgid "This will remove all items from the list." msgstr "Þetta mun fjarlægja öll atriði af listanum." python3-xapp-3.0.2/po/it.po0000664000175000017500000000346715127754237014433 0ustar fabiofabio# Italian translation for linuxmint # Copyright (c) 2025 Rosetta Contributors and Canonical Ltd 2025 # This file is distributed under the same license as the linuxmint package. # FIRST AUTHOR , 2025. # msgid "" msgstr "" "Project-Id-Version: linuxmint\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2025-11-11 13:45+0000\n" "PO-Revision-Date: 2025-11-11 20:59+0000\n" "Last-Translator: Dragone2 \n" "Language-Team: Italian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2026-01-08 15:45+0000\n" "X-Generator: Launchpad (build 99c00f518760bdd50fc6e353e7736d2fff8fba4a)\n" #: xapp/widgets/ListEditor.py:161 msgid "Move up" msgstr "Sposta su" #: xapp/widgets/ListEditor.py:167 msgid "Move down" msgstr "Sposta giù" #: xapp/widgets/ListEditor.py:231 msgid "Cancel" msgstr "Annulla" #: xapp/widgets/ListEditor.py:234 msgid "Save" msgstr "Salva" #: xapp/widgets/ListEditor.py:354 msgid "Add" msgstr "Aggiungi" #: xapp/widgets/ListEditor.py:362 msgid "Remove" msgstr "Rimuovi" #: xapp/widgets/ListEditor.py:369 msgid "Edit" msgstr "Modifica" #: xapp/widgets/ListEditor.py:377 msgid "Remove all" msgstr "Rimuovi tutto" #: xapp/widgets/ListEditor.py:486 #, python-format msgid "'%s' is already in the list." msgstr "'%s' è già presente nell'elenco." #: xapp/widgets/ListEditor.py:571 msgid "Remove?" msgstr "Rimuovere?" #: xapp/widgets/ListEditor.py:573 #, python-format msgid "Are you sure you want to remove '%s'?" msgstr "Vuoi davvero rimuovere '%s'?" #: xapp/widgets/ListEditor.py:626 msgid "Remove all?" msgstr "Rimuovere tutto?" #: xapp/widgets/ListEditor.py:628 msgid "This will remove all items from the list." msgstr "In questo modo verranno rimossi tutti gli elementi dall'elenco." python3-xapp-3.0.2/po/ja.po0000664000175000017500000000355215127754237014404 0ustar fabiofabio# Japanese translation for linuxmint # Copyright (c) 2025 Rosetta Contributors and Canonical Ltd 2025 # This file is distributed under the same license as the linuxmint package. # FIRST AUTHOR , 2025. # msgid "" msgstr "" "Project-Id-Version: linuxmint\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2025-11-11 13:45+0000\n" "PO-Revision-Date: 2025-11-12 08:04+0000\n" "Last-Translator: kmyyfz8q \n" "Language-Team: Japanese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2026-01-08 15:45+0000\n" "X-Generator: Launchpad (build 99c00f518760bdd50fc6e353e7736d2fff8fba4a)\n" "Language: ja\n" #: xapp/widgets/ListEditor.py:161 msgid "Move up" msgstr "上へ移動" #: xapp/widgets/ListEditor.py:167 msgid "Move down" msgstr "下へ移動" #: xapp/widgets/ListEditor.py:231 msgid "Cancel" msgstr "キャンセル" #: xapp/widgets/ListEditor.py:234 msgid "Save" msgstr "保存" #: xapp/widgets/ListEditor.py:354 msgid "Add" msgstr "追加" #: xapp/widgets/ListEditor.py:362 msgid "Remove" msgstr "削除" #: xapp/widgets/ListEditor.py:369 msgid "Edit" msgstr "編集" #: xapp/widgets/ListEditor.py:377 msgid "Remove all" msgstr "すべて削除" #: xapp/widgets/ListEditor.py:486 #, python-format msgid "'%s' is already in the list." msgstr "すでに '%s' は一覧にあります。" #: xapp/widgets/ListEditor.py:571 msgid "Remove?" msgstr "削除しますか?" #: xapp/widgets/ListEditor.py:573 #, python-format msgid "Are you sure you want to remove '%s'?" msgstr "'%s' を削除しますか?" #: xapp/widgets/ListEditor.py:626 msgid "Remove all?" msgstr "すべて削除しますか?" #: xapp/widgets/ListEditor.py:628 msgid "This will remove all items from the list." msgstr "一覧からすべての項目を削除します。" python3-xapp-3.0.2/po/ka.po0000664000175000017500000000423415127754237014403 0ustar fabiofabio# Georgian translation for linuxmint # Copyright (c) 2025 Rosetta Contributors and Canonical Ltd 2025 # This file is distributed under the same license as the linuxmint package. # FIRST AUTHOR , 2025. # msgid "" msgstr "" "Project-Id-Version: linuxmint\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2025-11-11 13:45+0000\n" "PO-Revision-Date: 2025-11-15 23:33+0000\n" "Last-Translator: Saba Mtchedlishvili \n" "Language-Team: Georgian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2026-01-08 15:45+0000\n" "X-Generator: Launchpad (build 99c00f518760bdd50fc6e353e7736d2fff8fba4a)\n" "Language: ka\n" #: xapp/widgets/ListEditor.py:161 msgid "Move up" msgstr "ადი მაღლა" #: xapp/widgets/ListEditor.py:167 msgid "Move down" msgstr "ჩადი დაბლა" #: xapp/widgets/ListEditor.py:231 msgid "Cancel" msgstr "გააუქმე" #: xapp/widgets/ListEditor.py:234 msgid "Save" msgstr "შეინახე" #: xapp/widgets/ListEditor.py:354 msgid "Add" msgstr "დაამატე" #: xapp/widgets/ListEditor.py:362 msgid "Remove" msgstr "ამოშალე" #: xapp/widgets/ListEditor.py:369 msgid "Edit" msgstr "ჩაასწორე" #: xapp/widgets/ListEditor.py:377 msgid "Remove all" msgstr "ამოშალე ყველა" #: xapp/widgets/ListEditor.py:486 #, python-format msgid "'%s' is already in the list." msgstr "'%s' უკვე არის ჩამონათვალში." #: xapp/widgets/ListEditor.py:571 msgid "Remove?" msgstr "ამოვშალო?" #: xapp/widgets/ListEditor.py:573 #, python-format msgid "Are you sure you want to remove '%s'?" msgstr "დარწმუნებული ხარ რომ გინდა ამოვშალო '%s'?" #: xapp/widgets/ListEditor.py:626 msgid "Remove all?" msgstr "ამოვშალო ყველა?" #: xapp/widgets/ListEditor.py:628 msgid "This will remove all items from the list." msgstr "ეს ამოშლის ყველა პუნქტს ამ ჩამონათვლიდან." python3-xapp-3.0.2/po/ko.po0000664000175000017500000000354515127754237014425 0ustar fabiofabio# Korean translation for linuxmint # Copyright (c) 2025 Rosetta Contributors and Canonical Ltd 2025 # This file is distributed under the same license as the linuxmint package. # FIRST AUTHOR , 2025. # msgid "" msgstr "" "Project-Id-Version: linuxmint\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2025-11-11 13:45+0000\n" "PO-Revision-Date: 2025-11-13 15:45+0000\n" "Last-Translator: Jung-Kyu Park \n" "Language-Team: Korean \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2026-01-08 15:45+0000\n" "X-Generator: Launchpad (build 99c00f518760bdd50fc6e353e7736d2fff8fba4a)\n" #: xapp/widgets/ListEditor.py:161 msgid "Move up" msgstr "위로 옮기기" #: xapp/widgets/ListEditor.py:167 msgid "Move down" msgstr "아래로 옮기기" #: xapp/widgets/ListEditor.py:231 msgid "Cancel" msgstr "취소" #: xapp/widgets/ListEditor.py:234 msgid "Save" msgstr "저장하기" #: xapp/widgets/ListEditor.py:354 msgid "Add" msgstr "추가하기" #: xapp/widgets/ListEditor.py:362 msgid "Remove" msgstr "삭제하기" #: xapp/widgets/ListEditor.py:369 msgid "Edit" msgstr "편집하기" #: xapp/widgets/ListEditor.py:377 msgid "Remove all" msgstr "모두 삭제" #: xapp/widgets/ListEditor.py:486 #, python-format msgid "'%s' is already in the list." msgstr "'%s'은 이미 목록에 있습니다." #: xapp/widgets/ListEditor.py:571 msgid "Remove?" msgstr "삭제할까요?" #: xapp/widgets/ListEditor.py:573 #, python-format msgid "Are you sure you want to remove '%s'?" msgstr "'%s'를 삭제할까요?" #: xapp/widgets/ListEditor.py:626 msgid "Remove all?" msgstr "모두 삭제할까요?" #: xapp/widgets/ListEditor.py:628 msgid "This will remove all items from the list." msgstr "모든 항목을 목록에서 삭제합니다." python3-xapp-3.0.2/po/lo.po0000664000175000017500000000407715127754237014427 0ustar fabiofabio# Lao translation for linuxmint # Copyright (c) 2025 Rosetta Contributors and Canonical Ltd 2025 # This file is distributed under the same license as the linuxmint package. # FIRST AUTHOR , 2025. # msgid "" msgstr "" "Project-Id-Version: linuxmint\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2025-11-11 13:45+0000\n" "PO-Revision-Date: 2025-11-19 01:14+0000\n" "Last-Translator: boneni \n" "Language-Team: Lao \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2026-01-08 15:45+0000\n" "X-Generator: Launchpad (build 99c00f518760bdd50fc6e353e7736d2fff8fba4a)\n" #: xapp/widgets/ListEditor.py:161 msgid "Move up" msgstr "ເລື້ອນຂື້ນ" #: xapp/widgets/ListEditor.py:167 msgid "Move down" msgstr "ເລື່ອນລົງ" #: xapp/widgets/ListEditor.py:231 msgid "Cancel" msgstr "ຍົກເລີກ" #: xapp/widgets/ListEditor.py:234 msgid "Save" msgstr "ບັນທຶກ" #: xapp/widgets/ListEditor.py:354 msgid "Add" msgstr "ເພີ່ມ" #: xapp/widgets/ListEditor.py:362 msgid "Remove" msgstr "ລຶບ" #: xapp/widgets/ListEditor.py:369 msgid "Edit" msgstr "ແກ້ໄຂ" #: xapp/widgets/ListEditor.py:377 msgid "Remove all" msgstr "ລຶບທັງໝົດ" #: xapp/widgets/ListEditor.py:486 #, python-format msgid "'%s' is already in the list." msgstr "'%s' ມີຢູ່ໃນລາຍການແລ້ວ." #: xapp/widgets/ListEditor.py:571 msgid "Remove?" msgstr "ລຶບອອກບໍ່?" #: xapp/widgets/ListEditor.py:573 #, python-format msgid "Are you sure you want to remove '%s'?" msgstr "ເຈົ້າແນ່ໃຈບໍ່ວ່າຕ້ອງການລຶບ '%s' ອອກ?" #: xapp/widgets/ListEditor.py:626 msgid "Remove all?" msgstr "ລືບອອກທັງໝົດບໍ່?" #: xapp/widgets/ListEditor.py:628 msgid "This will remove all items from the list." msgstr "ການດຳເນີນການນີ້ຈະລຶບລາຍການທັງໝົດອອກ." python3-xapp-3.0.2/po/lv.po0000664000175000017500000000350315127754237014427 0ustar fabiofabio# Latvian translation for linuxmint # Copyright (c) 2025 Rosetta Contributors and Canonical Ltd 2025 # This file is distributed under the same license as the linuxmint package. # FIRST AUTHOR , 2025. # msgid "" msgstr "" "Project-Id-Version: linuxmint\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2025-11-11 13:45+0000\n" "PO-Revision-Date: 2025-12-27 12:39+0000\n" "Last-Translator: Klavs Petersons \n" "Language-Team: Latvian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2026-01-08 15:45+0000\n" "X-Generator: Launchpad (build 99c00f518760bdd50fc6e353e7736d2fff8fba4a)\n" "Language: lv\n" #: xapp/widgets/ListEditor.py:161 msgid "Move up" msgstr "Pārvietot augšup" #: xapp/widgets/ListEditor.py:167 msgid "Move down" msgstr "Pārvietot lejup" #: xapp/widgets/ListEditor.py:231 msgid "Cancel" msgstr "Atcelt" #: xapp/widgets/ListEditor.py:234 msgid "Save" msgstr "Saglabāt" #: xapp/widgets/ListEditor.py:354 msgid "Add" msgstr "Pievienot" #: xapp/widgets/ListEditor.py:362 msgid "Remove" msgstr "Noņemt" #: xapp/widgets/ListEditor.py:369 msgid "Edit" msgstr "Rediģēt" #: xapp/widgets/ListEditor.py:377 msgid "Remove all" msgstr "Noņemt visu" #: xapp/widgets/ListEditor.py:486 #, python-format msgid "'%s' is already in the list." msgstr "'%s' jau atrodas sarakstā." #: xapp/widgets/ListEditor.py:571 msgid "Remove?" msgstr "Noņemt?" #: xapp/widgets/ListEditor.py:573 #, python-format msgid "Are you sure you want to remove '%s'?" msgstr "Vai tiešām vēlies noņemt '%s'?" #: xapp/widgets/ListEditor.py:626 msgid "Remove all?" msgstr "Noņemt visu?" #: xapp/widgets/ListEditor.py:628 msgid "This will remove all items from the list." msgstr "Tas noņems visus vienumus no saraksta." python3-xapp-3.0.2/po/meson.build0000664000175000017500000000006315127754237015606 0ustar fabiofabioi18n.gettext(gettext_package, preset: 'glib' ) python3-xapp-3.0.2/po/mk.po0000664000175000017500000000403015127754237014411 0ustar fabiofabio# Macedonian translation for linuxmint # Copyright (c) 2025 Rosetta Contributors and Canonical Ltd 2025 # This file is distributed under the same license as the linuxmint package. # FIRST AUTHOR , 2025. # msgid "" msgstr "" "Project-Id-Version: linuxmint\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2025-11-11 13:45+0000\n" "PO-Revision-Date: 2025-12-01 18:50+0000\n" "Last-Translator: Bojan Stojanoski \n" "Language-Team: Macedonian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2026-01-08 15:45+0000\n" "X-Generator: Launchpad (build 99c00f518760bdd50fc6e353e7736d2fff8fba4a)\n" #: xapp/widgets/ListEditor.py:161 msgid "Move up" msgstr "Помести нагоре" #: xapp/widgets/ListEditor.py:167 msgid "Move down" msgstr "Помести надолу" #: xapp/widgets/ListEditor.py:231 msgid "Cancel" msgstr "Откажи" #: xapp/widgets/ListEditor.py:234 msgid "Save" msgstr "Зачувај" #: xapp/widgets/ListEditor.py:354 msgid "Add" msgstr "Додадете" #: xapp/widgets/ListEditor.py:362 msgid "Remove" msgstr "Отстрани" #: xapp/widgets/ListEditor.py:369 msgid "Edit" msgstr "Уреди" #: xapp/widgets/ListEditor.py:377 msgid "Remove all" msgstr "Отстрани сѐ" #: xapp/widgets/ListEditor.py:486 #, python-format msgid "'%s' is already in the list." msgstr "„%s“ е веќе во листата." #: xapp/widgets/ListEditor.py:571 msgid "Remove?" msgstr "Да се ​​отстрани?" #: xapp/widgets/ListEditor.py:573 #, python-format msgid "Are you sure you want to remove '%s'?" msgstr "Дали сте сигурни дека сакате да го отстраните „%s“?" #: xapp/widgets/ListEditor.py:626 msgid "Remove all?" msgstr "Да се ​​отстранат сите?" #: xapp/widgets/ListEditor.py:628 msgid "This will remove all items from the list." msgstr "Ова ќе ги отстрани сите ставки од листата." python3-xapp-3.0.2/po/nb.po0000664000175000017500000000344615127754237014413 0ustar fabiofabio# Norwegian Bokmal translation for linuxmint # Copyright (c) 2025 Rosetta Contributors and Canonical Ltd 2025 # This file is distributed under the same license as the linuxmint package. # FIRST AUTHOR , 2025. # msgid "" msgstr "" "Project-Id-Version: linuxmint\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2025-11-11 13:45+0000\n" "PO-Revision-Date: 2025-11-13 17:07+0000\n" "Last-Translator: Simen Ryland Førde \n" "Language-Team: Norwegian Bokmal \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2026-01-08 15:45+0000\n" "X-Generator: Launchpad (build 99c00f518760bdd50fc6e353e7736d2fff8fba4a)\n" #: xapp/widgets/ListEditor.py:161 msgid "Move up" msgstr "Flytt opp" #: xapp/widgets/ListEditor.py:167 msgid "Move down" msgstr "Flytt ned" #: xapp/widgets/ListEditor.py:231 msgid "Cancel" msgstr "Avbryt" #: xapp/widgets/ListEditor.py:234 msgid "Save" msgstr "Lagre" #: xapp/widgets/ListEditor.py:354 msgid "Add" msgstr "Legg til" #: xapp/widgets/ListEditor.py:362 msgid "Remove" msgstr "Fjern" #: xapp/widgets/ListEditor.py:369 msgid "Edit" msgstr "Rediger" #: xapp/widgets/ListEditor.py:377 msgid "Remove all" msgstr "Fjern alle" #: xapp/widgets/ListEditor.py:486 #, python-format msgid "'%s' is already in the list." msgstr "%s' er allerede i listen." #: xapp/widgets/ListEditor.py:571 msgid "Remove?" msgstr "Fjerne?" #: xapp/widgets/ListEditor.py:573 #, python-format msgid "Are you sure you want to remove '%s'?" msgstr "Er du sikker på at du vil fjerne '%s'?" #: xapp/widgets/ListEditor.py:626 msgid "Remove all?" msgstr "Fjerne alt?" #: xapp/widgets/ListEditor.py:628 msgid "This will remove all items from the list." msgstr "Dette vil fjerne alt fra listen." python3-xapp-3.0.2/po/nl.po0000664000175000017500000000351515127754237014422 0ustar fabiofabio# Dutch translation for linuxmint # Copyright (c) 2025 Rosetta Contributors and Canonical Ltd 2025 # This file is distributed under the same license as the linuxmint package. # FIRST AUTHOR , 2025. # msgid "" msgstr "" "Project-Id-Version: linuxmint\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2025-11-11 13:45+0000\n" "PO-Revision-Date: 2025-11-11 15:35+0000\n" "Last-Translator: Pjotr12345 \n" "Language-Team: Dutch \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2026-01-08 15:45+0000\n" "X-Generator: Launchpad (build 99c00f518760bdd50fc6e353e7736d2fff8fba4a)\n" #: xapp/widgets/ListEditor.py:161 msgid "Move up" msgstr "Omhoog verplaatsen" #: xapp/widgets/ListEditor.py:167 msgid "Move down" msgstr "Omlaag verplaatsen" #: xapp/widgets/ListEditor.py:231 msgid "Cancel" msgstr "Afbreken" #: xapp/widgets/ListEditor.py:234 msgid "Save" msgstr "Opslaan" #: xapp/widgets/ListEditor.py:354 msgid "Add" msgstr "Toevoegen" #: xapp/widgets/ListEditor.py:362 msgid "Remove" msgstr "Verwijderen" #: xapp/widgets/ListEditor.py:369 msgid "Edit" msgstr "Bewerken" #: xapp/widgets/ListEditor.py:377 msgid "Remove all" msgstr "Alles verwijderen" #: xapp/widgets/ListEditor.py:486 #, python-format msgid "'%s' is already in the list." msgstr "'%s' staat reeds in de lijst." #: xapp/widgets/ListEditor.py:571 msgid "Remove?" msgstr "Verwijderen?" #: xapp/widgets/ListEditor.py:573 #, python-format msgid "Are you sure you want to remove '%s'?" msgstr "Weet u zeker dat u '%s' wilt verwijderen?" #: xapp/widgets/ListEditor.py:626 msgid "Remove all?" msgstr "Alles verwijderen?" #: xapp/widgets/ListEditor.py:628 msgid "This will remove all items from the list." msgstr "Dit zal alle elementen in de lijst verwijderen." python3-xapp-3.0.2/po/nn.po0000664000175000017500000000344115127754237014422 0ustar fabiofabio# Norwegian Nynorsk translation for linuxmint # Copyright (c) 2025 Rosetta Contributors and Canonical Ltd 2025 # This file is distributed under the same license as the linuxmint package. # FIRST AUTHOR , 2025. # msgid "" msgstr "" "Project-Id-Version: linuxmint\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2025-11-11 13:45+0000\n" "PO-Revision-Date: 2025-11-14 22:02+0000\n" "Last-Translator: Simen Ryland Førde \n" "Language-Team: Norwegian Nynorsk \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2026-01-08 15:45+0000\n" "X-Generator: Launchpad (build 99c00f518760bdd50fc6e353e7736d2fff8fba4a)\n" #: xapp/widgets/ListEditor.py:161 msgid "Move up" msgstr "Flytt opp" #: xapp/widgets/ListEditor.py:167 msgid "Move down" msgstr "Flytt ned" #: xapp/widgets/ListEditor.py:231 msgid "Cancel" msgstr "Avbryt" #: xapp/widgets/ListEditor.py:234 msgid "Save" msgstr "Lagre" #: xapp/widgets/ListEditor.py:354 msgid "Add" msgstr "Legg til" #: xapp/widgets/ListEditor.py:362 msgid "Remove" msgstr "Fjern" #: xapp/widgets/ListEditor.py:369 msgid "Edit" msgstr "Rediger" #: xapp/widgets/ListEditor.py:377 msgid "Remove all" msgstr "Fjern alle" #: xapp/widgets/ListEditor.py:486 #, python-format msgid "'%s' is already in the list." msgstr "%s' er alt i lista." #: xapp/widgets/ListEditor.py:571 msgid "Remove?" msgstr "Fjern?" #: xapp/widgets/ListEditor.py:573 #, python-format msgid "Are you sure you want to remove '%s'?" msgstr "Er du sikker på at du vil fjerne '%s'?" #: xapp/widgets/ListEditor.py:626 msgid "Remove all?" msgstr "Fjerne alt?" #: xapp/widgets/ListEditor.py:628 msgid "This will remove all items from the list." msgstr "Dette vil fjerne alt frå lista." python3-xapp-3.0.2/po/oc.po0000664000175000017500000000352315127754237014411 0ustar fabiofabio# Occitan (post 1500) translation for linuxmint # Copyright (c) 2025 Rosetta Contributors and Canonical Ltd 2025 # This file is distributed under the same license as the linuxmint package. # FIRST AUTHOR , 2025. # msgid "" msgstr "" "Project-Id-Version: linuxmint\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2025-11-11 13:45+0000\n" "PO-Revision-Date: 2025-11-12 21:34+0000\n" "Last-Translator: Quentin PAGÈS \n" "Language-Team: Occitan (post 1500) \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2026-01-08 15:45+0000\n" "X-Generator: Launchpad (build 99c00f518760bdd50fc6e353e7736d2fff8fba4a)\n" #: xapp/widgets/ListEditor.py:161 msgid "Move up" msgstr "Montar" #: xapp/widgets/ListEditor.py:167 msgid "Move down" msgstr "Davalar" #: xapp/widgets/ListEditor.py:231 msgid "Cancel" msgstr "Anullar" #: xapp/widgets/ListEditor.py:234 msgid "Save" msgstr "Enregistrar" #: xapp/widgets/ListEditor.py:354 msgid "Add" msgstr "Apondre" #: xapp/widgets/ListEditor.py:362 msgid "Remove" msgstr "Suprimir" #: xapp/widgets/ListEditor.py:369 msgid "Edit" msgstr "Edicion" #: xapp/widgets/ListEditor.py:377 msgid "Remove all" msgstr "Tot suprimir" #: xapp/widgets/ListEditor.py:486 #, python-format msgid "'%s' is already in the list." msgstr "« %s » es ja dins la lista." #: xapp/widgets/ListEditor.py:571 msgid "Remove?" msgstr "Suprimir ?" #: xapp/widgets/ListEditor.py:573 #, python-format msgid "Are you sure you want to remove '%s'?" msgstr "Volètz vertadièrament suprimir « %s » ?" #: xapp/widgets/ListEditor.py:626 msgid "Remove all?" msgstr "Tot suprimir ?" #: xapp/widgets/ListEditor.py:628 msgid "This will remove all items from the list." msgstr "Aquò suprimirà totes los elements de la lista." python3-xapp-3.0.2/po/pl.po0000664000175000017500000000350415127754237014422 0ustar fabiofabio# Polish translation for linuxmint # Copyright (c) 2025 Rosetta Contributors and Canonical Ltd 2025 # This file is distributed under the same license as the linuxmint package. # FIRST AUTHOR , 2025. # msgid "" msgstr "" "Project-Id-Version: linuxmint\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2025-11-11 13:45+0000\n" "PO-Revision-Date: 2025-11-11 14:30+0000\n" "Last-Translator: Marek Adamski \n" "Language-Team: Polish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2026-01-08 15:45+0000\n" "X-Generator: Launchpad (build 99c00f518760bdd50fc6e353e7736d2fff8fba4a)\n" #: xapp/widgets/ListEditor.py:161 msgid "Move up" msgstr "Przesuń w górę" #: xapp/widgets/ListEditor.py:167 msgid "Move down" msgstr "Przesuń w dół" #: xapp/widgets/ListEditor.py:231 msgid "Cancel" msgstr "Anuluj" #: xapp/widgets/ListEditor.py:234 msgid "Save" msgstr "Zapisz" #: xapp/widgets/ListEditor.py:354 msgid "Add" msgstr "Dodaj" #: xapp/widgets/ListEditor.py:362 msgid "Remove" msgstr "Usuń" #: xapp/widgets/ListEditor.py:369 msgid "Edit" msgstr "Edytuj" #: xapp/widgets/ListEditor.py:377 msgid "Remove all" msgstr "Usuń wszystkie" #: xapp/widgets/ListEditor.py:486 #, python-format msgid "'%s' is already in the list." msgstr "„%s” jest już na liście." #: xapp/widgets/ListEditor.py:571 msgid "Remove?" msgstr "Usunąć?" #: xapp/widgets/ListEditor.py:573 #, python-format msgid "Are you sure you want to remove '%s'?" msgstr "Czy na pewno chcesz usunąć „%s”?" #: xapp/widgets/ListEditor.py:626 msgid "Remove all?" msgstr "Usunąć wszystkie?" #: xapp/widgets/ListEditor.py:628 msgid "This will remove all items from the list." msgstr "Spowoduje to usunięcie wszystkich elementów z listy." python3-xapp-3.0.2/po/pt.po0000664000175000017500000000350515127754237014433 0ustar fabiofabio# Portuguese translation for linuxmint # Copyright (c) 2025 Rosetta Contributors and Canonical Ltd 2025 # This file is distributed under the same license as the linuxmint package. # FIRST AUTHOR , 2025. # msgid "" msgstr "" "Project-Id-Version: linuxmint\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2025-11-11 13:45+0000\n" "PO-Revision-Date: 2025-11-15 16:37+0000\n" "Last-Translator: Hugo Carvalho \n" "Language-Team: Portuguese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2026-01-08 15:45+0000\n" "X-Generator: Launchpad (build 99c00f518760bdd50fc6e353e7736d2fff8fba4a)\n" #: xapp/widgets/ListEditor.py:161 msgid "Move up" msgstr "Mover para cima" #: xapp/widgets/ListEditor.py:167 msgid "Move down" msgstr "Mover para baixo" #: xapp/widgets/ListEditor.py:231 msgid "Cancel" msgstr "Cancelar" #: xapp/widgets/ListEditor.py:234 msgid "Save" msgstr "Guardar" #: xapp/widgets/ListEditor.py:354 msgid "Add" msgstr "Adicionar" #: xapp/widgets/ListEditor.py:362 msgid "Remove" msgstr "Remover" #: xapp/widgets/ListEditor.py:369 msgid "Edit" msgstr "Editar" #: xapp/widgets/ListEditor.py:377 msgid "Remove all" msgstr "Remover tudo" #: xapp/widgets/ListEditor.py:486 #, python-format msgid "'%s' is already in the list." msgstr "'%s' já está na lista." #: xapp/widgets/ListEditor.py:571 msgid "Remove?" msgstr "Remover?" #: xapp/widgets/ListEditor.py:573 #, python-format msgid "Are you sure you want to remove '%s'?" msgstr "Tem a certeza que deseja remover '%s'?" #: xapp/widgets/ListEditor.py:626 msgid "Remove all?" msgstr "Remover tudo?" #: xapp/widgets/ListEditor.py:628 msgid "This will remove all items from the list." msgstr "Isto irá remover todos os itens da lista." python3-xapp-3.0.2/po/pt_BR.po0000664000175000017500000000353015127754237015014 0ustar fabiofabio# Brazilian Portuguese translation for linuxmint # Copyright (c) 2025 Rosetta Contributors and Canonical Ltd 2025 # This file is distributed under the same license as the linuxmint package. # FIRST AUTHOR , 2025. # msgid "" msgstr "" "Project-Id-Version: linuxmint\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2025-11-11 13:45+0000\n" "PO-Revision-Date: 2025-11-25 18:44+0000\n" "Last-Translator: Alberlan Lopes \n" "Language-Team: Brazilian Portuguese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2026-01-08 15:45+0000\n" "X-Generator: Launchpad (build 99c00f518760bdd50fc6e353e7736d2fff8fba4a)\n" #: xapp/widgets/ListEditor.py:161 msgid "Move up" msgstr "Mover para cima" #: xapp/widgets/ListEditor.py:167 msgid "Move down" msgstr "Mover para baixo" #: xapp/widgets/ListEditor.py:231 msgid "Cancel" msgstr "Cancelar" #: xapp/widgets/ListEditor.py:234 msgid "Save" msgstr "Salvar" #: xapp/widgets/ListEditor.py:354 msgid "Add" msgstr "Adicionar" #: xapp/widgets/ListEditor.py:362 msgid "Remove" msgstr "Remover" #: xapp/widgets/ListEditor.py:369 msgid "Edit" msgstr "Editar" #: xapp/widgets/ListEditor.py:377 msgid "Remove all" msgstr "Remover todos" #: xapp/widgets/ListEditor.py:486 #, python-format msgid "'%s' is already in the list." msgstr "'%s' já está na lista." #: xapp/widgets/ListEditor.py:571 msgid "Remove?" msgstr "Remover?" #: xapp/widgets/ListEditor.py:573 #, python-format msgid "Are you sure you want to remove '%s'?" msgstr "Você tem certeza que deseja remover '%s'?" #: xapp/widgets/ListEditor.py:626 msgid "Remove all?" msgstr "Remover tudo?" #: xapp/widgets/ListEditor.py:628 msgid "This will remove all items from the list." msgstr "Isso removerá todos os itens da lista." python3-xapp-3.0.2/po/ru.po0000664000175000017500000000372515127754237014442 0ustar fabiofabio# Russian translation for linuxmint # Copyright (c) 2025 Rosetta Contributors and Canonical Ltd 2025 # This file is distributed under the same license as the linuxmint package. # FIRST AUTHOR , 2025. # msgid "" msgstr "" "Project-Id-Version: linuxmint\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2025-11-11 13:45+0000\n" "PO-Revision-Date: 2025-11-16 12:09+0000\n" "Last-Translator: Aleksey Kabanov \n" "Language-Team: Russian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2026-01-08 15:45+0000\n" "X-Generator: Launchpad (build 99c00f518760bdd50fc6e353e7736d2fff8fba4a)\n" #: xapp/widgets/ListEditor.py:161 msgid "Move up" msgstr "Переместить вверх" #: xapp/widgets/ListEditor.py:167 msgid "Move down" msgstr "Переместить вниз" #: xapp/widgets/ListEditor.py:231 msgid "Cancel" msgstr "Отменить" #: xapp/widgets/ListEditor.py:234 msgid "Save" msgstr "Сохранить" #: xapp/widgets/ListEditor.py:354 msgid "Add" msgstr "Добавить" #: xapp/widgets/ListEditor.py:362 msgid "Remove" msgstr "Удалить" #: xapp/widgets/ListEditor.py:369 msgid "Edit" msgstr "Изменить" #: xapp/widgets/ListEditor.py:377 msgid "Remove all" msgstr "Удалить все" #: xapp/widgets/ListEditor.py:486 #, python-format msgid "'%s' is already in the list." msgstr "'%s' уже в списке." #: xapp/widgets/ListEditor.py:571 msgid "Remove?" msgstr "Удалить?" #: xapp/widgets/ListEditor.py:573 #, python-format msgid "Are you sure you want to remove '%s'?" msgstr "Вы уверены, что хотите удалить '%s'?" #: xapp/widgets/ListEditor.py:626 msgid "Remove all?" msgstr "Удалить все?" #: xapp/widgets/ListEditor.py:628 msgid "This will remove all items from the list." msgstr "Это действие удалит все элементы из списка." python3-xapp-3.0.2/po/sk.po0000664000175000017500000000347515127754237014433 0ustar fabiofabio# Slovak translation for linuxmint # Copyright (c) 2025 Rosetta Contributors and Canonical Ltd 2025 # This file is distributed under the same license as the linuxmint package. # FIRST AUTHOR , 2025. # msgid "" msgstr "" "Project-Id-Version: linuxmint\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2025-11-11 13:45+0000\n" "PO-Revision-Date: 2025-12-19 12:12+0000\n" "Last-Translator: menom \n" "Language-Team: Slovak \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2026-01-08 15:45+0000\n" "X-Generator: Launchpad (build 99c00f518760bdd50fc6e353e7736d2fff8fba4a)\n" #: xapp/widgets/ListEditor.py:161 msgid "Move up" msgstr "Posunúť sa hore" #: xapp/widgets/ListEditor.py:167 msgid "Move down" msgstr "Posunúť sa dole" #: xapp/widgets/ListEditor.py:231 msgid "Cancel" msgstr "Zrušiť" #: xapp/widgets/ListEditor.py:234 msgid "Save" msgstr "Uložiť" #: xapp/widgets/ListEditor.py:354 msgid "Add" msgstr "Pridať" #: xapp/widgets/ListEditor.py:362 msgid "Remove" msgstr "Odstrániť" #: xapp/widgets/ListEditor.py:369 msgid "Edit" msgstr "Editovať" #: xapp/widgets/ListEditor.py:377 msgid "Remove all" msgstr "Odstrániť všetko" #: xapp/widgets/ListEditor.py:486 #, python-format msgid "'%s' is already in the list." msgstr "'%s' je už v zozname." #: xapp/widgets/ListEditor.py:571 msgid "Remove?" msgstr "Odstrániť?" #: xapp/widgets/ListEditor.py:573 #, python-format msgid "Are you sure you want to remove '%s'?" msgstr "Naozaj chcete odstrániť '%s'?" #: xapp/widgets/ListEditor.py:626 msgid "Remove all?" msgstr "Odstrániť všetko?" #: xapp/widgets/ListEditor.py:628 msgid "This will remove all items from the list." msgstr "Týmto sa odstránia všetky položky zo zoznamu." python3-xapp-3.0.2/po/sl.po0000664000175000017500000000354615127754237014433 0ustar fabiofabio# Slovenian translation for linuxmint # Copyright (c) 2025 Rosetta Contributors and Canonical Ltd 2025 # This file is distributed under the same license as the linuxmint package. # FIRST AUTHOR , 2025. # msgid "" msgstr "" "Project-Id-Version: linuxmint\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2025-11-11 13:45+0000\n" "PO-Revision-Date: 2025-11-26 21:00+0000\n" "Last-Translator: Martin Srebotnjak \n" "Language-Team: Slovenian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2026-01-08 15:45+0000\n" "X-Generator: Launchpad (build 99c00f518760bdd50fc6e353e7736d2fff8fba4a)\n" #: xapp/widgets/ListEditor.py:161 msgid "Move up" msgstr "Premakni navzgor" #: xapp/widgets/ListEditor.py:167 msgid "Move down" msgstr "Premakni navzdol" #: xapp/widgets/ListEditor.py:231 msgid "Cancel" msgstr "Prekliči" #: xapp/widgets/ListEditor.py:234 msgid "Save" msgstr "Shrani" #: xapp/widgets/ListEditor.py:354 msgid "Add" msgstr "Dodaj" #: xapp/widgets/ListEditor.py:362 msgid "Remove" msgstr "Odstrani" #: xapp/widgets/ListEditor.py:369 msgid "Edit" msgstr "Uredi" #: xapp/widgets/ListEditor.py:377 msgid "Remove all" msgstr "Odstrani vse" #: xapp/widgets/ListEditor.py:486 #, python-format msgid "'%s' is already in the list." msgstr "'%s' je že na seznamu." #: xapp/widgets/ListEditor.py:571 msgid "Remove?" msgstr "Ali želite odstraniti?" #: xapp/widgets/ListEditor.py:573 #, python-format msgid "Are you sure you want to remove '%s'?" msgstr "Ali ste prepričani, da želite odstraniti '%s'?" #: xapp/widgets/ListEditor.py:626 msgid "Remove all?" msgstr "Ali želite odstraniti vse?" #: xapp/widgets/ListEditor.py:628 msgid "This will remove all items from the list." msgstr "S tem boste odstranili vse elemente s seznama." python3-xapp-3.0.2/po/sv.po0000664000175000017500000000350715127754237014442 0ustar fabiofabio# Swedish translation for linuxmint # Copyright (c) 2025 Rosetta Contributors and Canonical Ltd 2025 # This file is distributed under the same license as the linuxmint package. # FIRST AUTHOR , 2025. # msgid "" msgstr "" "Project-Id-Version: linuxmint\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2025-11-11 13:45+0000\n" "PO-Revision-Date: 2025-11-11 18:20+0000\n" "Last-Translator: Jan-Olof Svensson \n" "Language-Team: Swedish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2026-01-08 15:45+0000\n" "X-Generator: Launchpad (build 99c00f518760bdd50fc6e353e7736d2fff8fba4a)\n" #: xapp/widgets/ListEditor.py:161 msgid "Move up" msgstr "Flytta upp" #: xapp/widgets/ListEditor.py:167 msgid "Move down" msgstr "Flytta ner" #: xapp/widgets/ListEditor.py:231 msgid "Cancel" msgstr "Avbryt" #: xapp/widgets/ListEditor.py:234 msgid "Save" msgstr "Spara" #: xapp/widgets/ListEditor.py:354 msgid "Add" msgstr "Lägg till" #: xapp/widgets/ListEditor.py:362 msgid "Remove" msgstr "Ta bort" #: xapp/widgets/ListEditor.py:369 msgid "Edit" msgstr "Redigera" #: xapp/widgets/ListEditor.py:377 msgid "Remove all" msgstr "Ta bort alla" #: xapp/widgets/ListEditor.py:486 #, python-format msgid "'%s' is already in the list." msgstr "'%s' finns redan i listan." #: xapp/widgets/ListEditor.py:571 msgid "Remove?" msgstr "Ta bort?" #: xapp/widgets/ListEditor.py:573 #, python-format msgid "Are you sure you want to remove '%s'?" msgstr "Är du säker på att du vill ta bort '%s'?" #: xapp/widgets/ListEditor.py:626 msgid "Remove all?" msgstr "Ta bort alla?" #: xapp/widgets/ListEditor.py:628 msgid "This will remove all items from the list." msgstr "Detta kommer att ta bort alla objekt från listan." python3-xapp-3.0.2/po/tr.po0000664000175000017500000000343315127754237014435 0ustar fabiofabio# Turkish translation for linuxmint # Copyright (c) 2025 Rosetta Contributors and Canonical Ltd 2025 # This file is distributed under the same license as the linuxmint package. # FIRST AUTHOR , 2025. # msgid "" msgstr "" "Project-Id-Version: linuxmint\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2025-11-11 13:45+0000\n" "PO-Revision-Date: 2025-11-11 20:29+0000\n" "Last-Translator: Butterfly \n" "Language-Team: Turkish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2026-01-08 15:45+0000\n" "X-Generator: Launchpad (build 99c00f518760bdd50fc6e353e7736d2fff8fba4a)\n" #: xapp/widgets/ListEditor.py:161 msgid "Move up" msgstr "Yukarı taşı" #: xapp/widgets/ListEditor.py:167 msgid "Move down" msgstr "Aşağı taşı" #: xapp/widgets/ListEditor.py:231 msgid "Cancel" msgstr "İptal" #: xapp/widgets/ListEditor.py:234 msgid "Save" msgstr "Kaydet" #: xapp/widgets/ListEditor.py:354 msgid "Add" msgstr "Ekle" #: xapp/widgets/ListEditor.py:362 msgid "Remove" msgstr "Sil" #: xapp/widgets/ListEditor.py:369 msgid "Edit" msgstr "Düzenle" #: xapp/widgets/ListEditor.py:377 msgid "Remove all" msgstr "Tümünü sil" #: xapp/widgets/ListEditor.py:486 #, python-format msgid "'%s' is already in the list." msgstr "'%s' zaten listede." #: xapp/widgets/ListEditor.py:571 msgid "Remove?" msgstr "Sil?" #: xapp/widgets/ListEditor.py:573 #, python-format msgid "Are you sure you want to remove '%s'?" msgstr "'%s' ögesini silmek istediğinize emin misiniz?" #: xapp/widgets/ListEditor.py:626 msgid "Remove all?" msgstr "Tümünü sil?" #: xapp/widgets/ListEditor.py:628 msgid "This will remove all items from the list." msgstr "Bu, listedeki tüm ögeleri silecek." python3-xapp-3.0.2/po/uk.po0000664000175000017500000000371115127754237014426 0ustar fabiofabio# Ukrainian translation for linuxmint # Copyright (c) 2025 Rosetta Contributors and Canonical Ltd 2025 # This file is distributed under the same license as the linuxmint package. # FIRST AUTHOR , 2025. # msgid "" msgstr "" "Project-Id-Version: linuxmint\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2025-11-11 13:45+0000\n" "PO-Revision-Date: 2025-11-15 11:27+0000\n" "Last-Translator: Rostyslav Haitkulov \n" "Language-Team: Ukrainian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2026-01-08 15:45+0000\n" "X-Generator: Launchpad (build 99c00f518760bdd50fc6e353e7736d2fff8fba4a)\n" #: xapp/widgets/ListEditor.py:161 msgid "Move up" msgstr "Пересунути вгору" #: xapp/widgets/ListEditor.py:167 msgid "Move down" msgstr "Пересунути вниз" #: xapp/widgets/ListEditor.py:231 msgid "Cancel" msgstr "Скасувати" #: xapp/widgets/ListEditor.py:234 msgid "Save" msgstr "Зберегти" #: xapp/widgets/ListEditor.py:354 msgid "Add" msgstr "Додати" #: xapp/widgets/ListEditor.py:362 msgid "Remove" msgstr "Вилучити" #: xapp/widgets/ListEditor.py:369 msgid "Edit" msgstr "Редагувати" #: xapp/widgets/ListEditor.py:377 msgid "Remove all" msgstr "Вилучити все" #: xapp/widgets/ListEditor.py:486 #, python-format msgid "'%s' is already in the list." msgstr "'%s' вже в списку." #: xapp/widgets/ListEditor.py:571 msgid "Remove?" msgstr "Вилучити?" #: xapp/widgets/ListEditor.py:573 #, python-format msgid "Are you sure you want to remove '%s'?" msgstr "Ви дійсно бажаєте вилучити '%s'?" #: xapp/widgets/ListEditor.py:626 msgid "Remove all?" msgstr "Вилучити все?" #: xapp/widgets/ListEditor.py:628 msgid "This will remove all items from the list." msgstr "Це вилучить всі об'єкти зі списку." python3-xapp-3.0.2/po/vi.po0000664000175000017500000000351715127754237014431 0ustar fabiofabio# Vietnamese translation for linuxmint # Copyright (c) 2025 Rosetta Contributors and Canonical Ltd 2025 # This file is distributed under the same license as the linuxmint package. # FIRST AUTHOR , 2025. # msgid "" msgstr "" "Project-Id-Version: linuxmint\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2025-11-11 13:45+0000\n" "PO-Revision-Date: 2025-11-30 07:43+0000\n" "Last-Translator: Loc Huynh \n" "Language-Team: Vietnamese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2026-01-08 15:45+0000\n" "X-Generator: Launchpad (build 99c00f518760bdd50fc6e353e7736d2fff8fba4a)\n" #: xapp/widgets/ListEditor.py:161 msgid "Move up" msgstr "Di chuyển lên" #: xapp/widgets/ListEditor.py:167 msgid "Move down" msgstr "Di chuyển xuống" #: xapp/widgets/ListEditor.py:231 msgid "Cancel" msgstr "Thôi" #: xapp/widgets/ListEditor.py:234 msgid "Save" msgstr "Lưu" #: xapp/widgets/ListEditor.py:354 msgid "Add" msgstr "Thêm" #: xapp/widgets/ListEditor.py:362 msgid "Remove" msgstr "Xóa" #: xapp/widgets/ListEditor.py:369 msgid "Edit" msgstr "Sửa" #: xapp/widgets/ListEditor.py:377 msgid "Remove all" msgstr "Xóa tất cả" #: xapp/widgets/ListEditor.py:486 #, python-format msgid "'%s' is already in the list." msgstr "'%s' đã có trong danh sách." #: xapp/widgets/ListEditor.py:571 msgid "Remove?" msgstr "Xóa?" #: xapp/widgets/ListEditor.py:573 #, python-format msgid "Are you sure you want to remove '%s'?" msgstr "Bạn có chắc chắn muốn xóa '%s' không?" #: xapp/widgets/ListEditor.py:626 msgid "Remove all?" msgstr "Xóa tất cả?" #: xapp/widgets/ListEditor.py:628 msgid "This will remove all items from the list." msgstr "Điều này sẽ xóa tất cả các mục khỏi danh sách." python3-xapp-3.0.2/po/zh_CN.po0000664000175000017500000000346215127754237015013 0ustar fabiofabio# Chinese (Simplified) translation for linuxmint # Copyright (c) 2025 Rosetta Contributors and Canonical Ltd 2025 # This file is distributed under the same license as the linuxmint package. # FIRST AUTHOR , 2025. # msgid "" msgstr "" "Project-Id-Version: linuxmint\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2025-11-11 13:45+0000\n" "PO-Revision-Date: 2025-11-12 01:29+0000\n" "Last-Translator: 张鹏 \n" "Language-Team: Chinese (Simplified) \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2026-01-08 15:45+0000\n" "X-Generator: Launchpad (build 99c00f518760bdd50fc6e353e7736d2fff8fba4a)\n" #: xapp/widgets/ListEditor.py:161 msgid "Move up" msgstr "上移" #: xapp/widgets/ListEditor.py:167 msgid "Move down" msgstr "下移" #: xapp/widgets/ListEditor.py:231 msgid "Cancel" msgstr "取消" #: xapp/widgets/ListEditor.py:234 msgid "Save" msgstr "保存" #: xapp/widgets/ListEditor.py:354 msgid "Add" msgstr "添加" #: xapp/widgets/ListEditor.py:362 msgid "Remove" msgstr "移除" #: xapp/widgets/ListEditor.py:369 msgid "Edit" msgstr "编辑" #: xapp/widgets/ListEditor.py:377 msgid "Remove all" msgstr "全部移除" #: xapp/widgets/ListEditor.py:486 #, python-format msgid "'%s' is already in the list." msgstr "'%s' 已经在列表中。" #: xapp/widgets/ListEditor.py:571 msgid "Remove?" msgstr "确定移除?" #: xapp/widgets/ListEditor.py:573 #, python-format msgid "Are you sure you want to remove '%s'?" msgstr "您确定要移除“%s”吗?" #: xapp/widgets/ListEditor.py:626 msgid "Remove all?" msgstr "全部移除?" #: xapp/widgets/ListEditor.py:628 msgid "This will remove all items from the list." msgstr "这将从列表中删除所有项目。" python3-xapp-3.0.2/po/zh_TW.po0000664000175000017500000000347115127754237015045 0ustar fabiofabio# Chinese (Traditional) translation for linuxmint # Copyright (c) 2025 Rosetta Contributors and Canonical Ltd 2025 # This file is distributed under the same license as the linuxmint package. # FIRST AUTHOR , 2025. # msgid "" msgstr "" "Project-Id-Version: linuxmint\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2025-11-11 13:45+0000\n" "PO-Revision-Date: 2025-12-22 16:30+0000\n" "Last-Translator: taijuin lee \n" "Language-Team: Chinese (Traditional) \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2026-01-08 15:45+0000\n" "X-Generator: Launchpad (build 99c00f518760bdd50fc6e353e7736d2fff8fba4a)\n" #: xapp/widgets/ListEditor.py:161 msgid "Move up" msgstr "向上移動" #: xapp/widgets/ListEditor.py:167 msgid "Move down" msgstr "向下移動" #: xapp/widgets/ListEditor.py:231 msgid "Cancel" msgstr "取消" #: xapp/widgets/ListEditor.py:234 msgid "Save" msgstr "儲存" #: xapp/widgets/ListEditor.py:354 msgid "Add" msgstr "新增" #: xapp/widgets/ListEditor.py:362 msgid "Remove" msgstr "移除" #: xapp/widgets/ListEditor.py:369 msgid "Edit" msgstr "編輯" #: xapp/widgets/ListEditor.py:377 msgid "Remove all" msgstr "全部移除" #: xapp/widgets/ListEditor.py:486 #, python-format msgid "'%s' is already in the list." msgstr "「%s」已在清單中。" #: xapp/widgets/ListEditor.py:571 msgid "Remove?" msgstr "移除?" #: xapp/widgets/ListEditor.py:573 #, python-format msgid "Are you sure you want to remove '%s'?" msgstr "您確定要移除「%s」嗎?" #: xapp/widgets/ListEditor.py:626 msgid "Remove all?" msgstr "全部移除?" #: xapp/widgets/ListEditor.py:628 msgid "This will remove all items from the list." msgstr "這將從清單中移除所有項目。" python3-xapp-3.0.2/python-xapp.pot0000664000175000017500000000272315127754237016046 0ustar fabiofabio# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-11-11 13:45+0000\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=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" #: xapp/widgets/ListEditor.py:161 msgid "Move up" msgstr "" #: xapp/widgets/ListEditor.py:167 msgid "Move down" msgstr "" #: xapp/widgets/ListEditor.py:231 msgid "Cancel" msgstr "" #: xapp/widgets/ListEditor.py:234 msgid "Save" msgstr "" #: xapp/widgets/ListEditor.py:354 msgid "Add" msgstr "" #: xapp/widgets/ListEditor.py:362 msgid "Remove" msgstr "" #: xapp/widgets/ListEditor.py:369 msgid "Edit" msgstr "" #: xapp/widgets/ListEditor.py:377 msgid "Remove all" msgstr "" #: xapp/widgets/ListEditor.py:486 #, python-format msgid "'%s' is already in the list." msgstr "" #: xapp/widgets/ListEditor.py:571 msgid "Remove?" msgstr "" #: xapp/widgets/ListEditor.py:573 #, python-format msgid "Are you sure you want to remove '%s'?" msgstr "" #: xapp/widgets/ListEditor.py:626 msgid "Remove all?" msgstr "" #: xapp/widgets/ListEditor.py:628 msgid "This will remove all items from the list." msgstr "" python3-xapp-3.0.2/xapp/0000775000175000017500000000000015127754237013777 5ustar fabiofabiopython3-xapp-3.0.2/xapp/GSettingsWidgets.py0000664000175000017500000001753115127754237017616 0ustar fabiofabio#!/usr/bin/python3 from gi.repository import Gio, GLib from xapp.SettingsWidgets import * CAN_BACKEND = ["Switch", "SpinButton", "Entry", "TextView", "FontButton", "Range", "ComboBox", "ColorChooser", "FileChooser", "IconChooser"] # Monkey patch Gio.Settings object def __setitem__(self, key, value): # set_value() aborts the program on an unknown key if key not in self: raise KeyError('unknown key: %r' % (key,)) # determine type string of this key range = self.get_range(key) type_ = range.get_child_value(0).get_string() v = range.get_child_value(1) if type_ == 'type': # v is boxed empty array, type of its elements is the allowed value type assert v.get_child_value(0).get_type_string().startswith('a') type_str = v.get_child_value(0).get_type_string()[1:] elif type_ == 'enum': # v is an array with the allowed values assert v.get_child_value(0).get_type_string().startswith('a') type_str = v.get_child_value(0).get_child_value(0).get_type_string() elif type_ == 'flags': # v is an array with the allowed values assert v.get_child_value(0).get_type_string().startswith('a') type_str = v.get_child_value(0).get_type_string() elif type_ == 'range': # type_str is a tuple giving the range assert v.get_child_value(0).get_type_string().startswith('(') type_str = v.get_child_value(0).get_type_string()[1] if not self.set_value(key, GLib.Variant(type_str, value)): raise ValueError("value '%s' for key '%s' is outside of valid range" % (value, key)) def bind_with_mapping(self, key, widget, prop, flags, key_to_prop, prop_to_key): self._ignore_key_changed = False def key_changed(settings, key): if self._ignore_key_changed: return self._ignore_prop_changed = True widget.set_property(prop, key_to_prop(self[key])) self._ignore_prop_changed = False def prop_changed(widget, param): if self._ignore_prop_changed: return self._ignore_key_changed = True self[key] = prop_to_key(widget.get_property(prop)) self._ignore_key_changed = False if not (flags & (Gio.SettingsBindFlags.SET | Gio.SettingsBindFlags.GET)): # ie Gio.SettingsBindFlags.DEFAULT flags |= Gio.SettingsBindFlags.SET | Gio.SettingsBindFlags.GET if flags & Gio.SettingsBindFlags.GET: key_changed(self, key) if not (flags & Gio.SettingsBindFlags.GET_NO_CHANGES): self.connect('changed::' + key, key_changed) if flags & Gio.SettingsBindFlags.SET: widget.connect('notify::' + prop, prop_changed) if not (flags & Gio.SettingsBindFlags.NO_SENSITIVITY): self.bind_writable(key, widget, "sensitive", False) Gio.Settings.bind_with_mapping = bind_with_mapping Gio.Settings.__setitem__ = __setitem__ class BinFileMonitor(GObject.GObject): __gsignals__ = { 'changed': (GObject.SignalFlags.RUN_LAST, None, ()), } def __init__(self): super(BinFileMonitor, self).__init__() self.changed_id = 0 env = GLib.getenv("PATH") if env == None: env = "/bin:/usr/bin:." self.paths = env.split(":") self.monitors = [] for path in self.paths: file = Gio.File.new_for_path(path) mon = file.monitor_directory(Gio.FileMonitorFlags.SEND_MOVED, None) mon.connect("changed", self.queue_emit_changed) self.monitors.append(mon) def _emit_changed(self): self.emit("changed") self.changed_id = 0 return False def queue_emit_changed(self, file, other, event_type, data=None): if self.changed_id > 0: GLib.source_remove(self.changed_id) self.changed_id = 0 self.changed_id = GLib.idle_add(self._emit_changed) file_monitor = None def get_file_monitor(): global file_monitor if file_monitor == None: file_monitor = BinFileMonitor() return file_monitor # This class is not meant to be used directly - it is only a backend for the # settings widgets to enable them to bind attributes to gsettings keys. To use # the gesttings backend, simply add the "GSettings" prefix to the beginning # of the widget class name. The arguments of the backended class will be # (label, schema, key, any additional widget-specific args and keyword args). # (Note: this only works for classes that are gsettings compatible.) # # If you wish to make a new widget available to be backended, place it in the # CAN_BACKEND list. In addition, you will need to add the following attributes # to the widget class: # # bind_dir - (Gio.SettingsBindFlags) flags to define the binding direction or # None if you don't want the setting bound (for example if the # setting effects multiple attributes) # bind_prop - (string) the attribute in the widget that will be bound to the # setting. This property may be omitted if bind_dir is None # bind_object - (optional) the object to which to bind to (only needed if the # attribute to be bound is not a property of self.content_widget) # map_get, map_set - (function, optional) a function to map between setting and # bound attribute. May also be passed as a keyword arg during # instantiation. These will be ignored if bind_dir=None # set_rounding - (function, optional) To be used to set the digits to round to # if the setting is an integer class PXGSettingsBackend(object): def bind_settings(self): if hasattr(self, "set_rounding"): vtype = self.settings.get_value(self.key).get_type_string() if vtype in ["i", "u"]: self.set_rounding(0) if hasattr(self, "bind_object"): bind_object = self.bind_object else: bind_object = self.content_widget if hasattr(self, "map_get") or hasattr(self, "map_set"): self.settings.bind_with_mapping(self.key, bind_object, self.bind_prop, self.bind_dir, self.map_get, self.map_set) elif self.bind_dir != None: self.settings.bind(self.key, bind_object, self.bind_prop, self.bind_dir) else: self.settings.connect("changed::"+self.key, self.on_setting_changed) self.settings.bind_writable(self.key, bind_object, "sensitive", False) self.on_setting_changed() self.connect_widget_handlers() def set_value(self, value): self.settings[self.key] = value def get_value(self): return self.settings[self.key] def get_range(self): range = self.settings.get_range(self.key) if range[0] == "range": return [range[1][0], range[1][1]] else: return None def on_setting_changed(self, *args): raise NotImplementedError("SettingsWidget class must implement on_setting_changed().") def connect_widget_handlers(self, *args): if self.bind_dir == None: raise NotImplementedError("SettingsWidget classes with no .bind_dir must implement connect_widget_handlers().") def g_settings_factory(subclass): class NewClass(globals()[subclass], PXGSettingsBackend): def __init__(self, label, schema, key, *args, **kwargs): self.key = key if schema not in settings_objects: settings_objects[schema] = Gio.Settings.new(schema) self.settings = settings_objects[schema] if "map_get" in kwargs: self.map_get = kwargs["map_get"] del kwargs["map_get"] if "map_set" in kwargs: self.map_set = kwargs["map_set"] del kwargs["map_set"] super(NewClass, self).__init__(label, *args, **kwargs) self.bind_settings() return NewClass for widget in CAN_BACKEND: globals()["GSettings"+widget] = g_settings_factory(widget) python3-xapp-3.0.2/xapp/SettingsWidgets.py0000775000175000017500000006650515127754237017517 0ustar fabiofabio#!/usr/bin/python3 import math import gi gi.require_version('Gtk', '3.0') gi.require_version('XApp', '1.0') from gi.repository import Gio, Gtk, GObject, Gdk, GLib, XApp settings_objects = {} class EditableEntry (Gtk.Stack): __gsignals__ = { 'changed': (GObject.SignalFlags.RUN_FIRST, None, (str,)) } def __init__ (self): super(EditableEntry, self).__init__() self.set_transition_type(Gtk.StackTransitionType.CROSSFADE) self.set_transition_duration(150) self.label = Gtk.Label() self.entry = Gtk.Entry() self.button = Gtk.Button() self.button.set_alignment(1.0, 0.5) self.button.set_relief(Gtk.ReliefStyle.NONE) self.add_named(self.button, "button"); self.add_named(self.entry, "entry"); self.set_visible_child_name("button") self.editable = False self.current_text = None self.show_all() self.button.connect("released", self._on_button_clicked) self.button.connect("activate", self._on_button_clicked) self.entry.connect("activate", self._on_entry_validated) self.entry.connect("changed", self._on_entry_changed) self.entry.connect("focus-out-event", self._on_focus_lost) def set_text(self, text): self.button.set_label(text) self.entry.set_text(text) self.current_text = text def _on_focus_lost(self, widget, event): self.button.set_label(self.current_text) self.entry.set_text(self.current_text) self.set_editable(False) def _on_button_clicked(self, button): self.set_editable(True) self.entry.grab_focus() def _on_entry_validated(self, entry): self.set_editable(False) self.emit("changed", entry.get_text()) self.current_text = entry.get_text() def _on_entry_changed(self, entry): self.button.set_label(entry.get_text()) def set_editable(self, editable): if (editable): self.set_visible_child_name("entry") else: self.set_visible_child_name("button") self.editable = editable def set_tooltip_text(self, tooltip): self.button.set_tooltip_text(tooltip) def get_editable(self): return self.editable def get_text(self): return self.entry.get_text() class SettingsStack(Gtk.Stack): def __init__(self): Gtk.Stack.__init__(self) self.set_transition_type(Gtk.StackTransitionType.SLIDE_LEFT_RIGHT) self.set_transition_duration(150) self.expand = True class SettingsRevealer(Gtk.Revealer): def __init__(self, schema=None, key=None, values=None, check_func=None): Gtk.Revealer.__init__(self) self.check_func = check_func self.box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=15) Gtk.Revealer.add(self, self.box) self.set_transition_type(Gtk.RevealerTransitionType.SLIDE_DOWN) self.set_transition_duration(150) if schema: self.settings = Gio.Settings.new(schema) # if there aren't values or a function provided to determine visibility we can do a simple bind if values is None and check_func is None: self.settings.bind(key, self, "reveal-child", Gio.SettingsBindFlags.GET) else: self.values = values self.settings.connect("changed::" + key, self.on_settings_changed) self.on_settings_changed(self.settings, key) def add(self, widget): self.box.pack_start(widget, False, True, 0) #only used when checking values def on_settings_changed(self, settings, key): value = settings.get_value(key).unpack() if self.check_func is None: self.set_reveal_child(value in self.values) else: self.set_reveal_child(self.check_func(value, self.values)) class SettingsPage(Gtk.Box): def __init__(self): Gtk.Box.__init__(self) self.set_orientation(Gtk.Orientation.VERTICAL) self.set_spacing(30) self.set_margin_left(80) self.set_margin_right(80) self.set_margin_top(15) self.set_margin_bottom(15) def add_section(self, title=None, subtitle=None): section = SettingsSection(title, subtitle) self.pack_start(section, False, False, 0) return section def add_reveal_section(self, title, schema=None, key=None, values=None, revealer=None): section = SettingsSection(title) if revealer is None: revealer = SettingsRevealer(schema, key, values) revealer.add(section) section._revealer = revealer self.pack_start(revealer, False, False, 0) return section class SettingsSection(Gtk.Box): def __init__(self, title=None, subtitle=None): Gtk.Box.__init__(self, orientation=Gtk.Orientation.VERTICAL) self.set_spacing(10) self.always_show = False self.revealers = [] if title or subtitle: header_box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL) header_box.set_spacing(5) self.add(header_box) if title: label = Gtk.Label() label.set_markup("%s" % title) label.set_alignment(0, 0.5) header_box.add(label) if subtitle: sub = Gtk.Label() sub.set_text(subtitle) sub.get_style_context().add_class("dim-label") sub.set_alignment(0, 0.5) header_box.add(sub) self.frame = Gtk.Frame() self.frame.set_no_show_all(True) self.frame.set_shadow_type(Gtk.ShadowType.IN) frame_style = self.frame.get_style_context() frame_style.add_class("view") self.size_group = Gtk.SizeGroup() self.size_group.set_mode(Gtk.SizeGroupMode.VERTICAL) self.box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL) self.frame.add(self.box) self.add(self.frame) self.need_separator = False def add_row(self, widget): vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL) if self.need_separator: vbox.add(Gtk.Separator(orientation=Gtk.Orientation.HORIZONTAL)) list_box = Gtk.ListBox() list_box.set_selection_mode(Gtk.SelectionMode.NONE) row = Gtk.ListBoxRow(can_focus=False) row.add(widget) if isinstance(widget, Switch): list_box.connect("row-activated", widget.clicked) list_box.add(row) vbox.add(list_box) self.box.add(vbox) self.update_always_show_state() self.need_separator = True def add_reveal_row(self, widget, schema=None, key=None, values=None, check_func=None, revealer=None): vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL) if self.need_separator: vbox.add(Gtk.Separator(orientation=Gtk.Orientation.HORIZONTAL)) list_box = Gtk.ListBox() list_box.set_selection_mode(Gtk.SelectionMode.NONE) row = Gtk.ListBoxRow(can_focus=False) row.add(widget) if isinstance(widget, Switch): list_box.connect("row-activated", widget.clicked) list_box.add(row) vbox.add(list_box) if revealer is None: revealer = SettingsRevealer(schema, key, values, check_func) widget.revealer = revealer revealer.add(vbox) self.box.add(revealer) self.need_separator = True self.revealers.append(revealer) if not self.always_show: revealer.notify_id = revealer.connect('notify::child-revealed', self.check_reveal_state) self.check_reveal_state() return revealer def add_note(self, text): label = Gtk.Label() label.set_alignment(0, 0.5) label.set_markup(text) label.set_line_wrap(True) self.add(label) return label def update_always_show_state(self): if self.always_show: return self.frame.set_no_show_all(False) self.frame.show_all() self.always_show = True for revealer in self.revealers: revealer.disconnect(revealer.notify_id) def check_reveal_state(self, *args): for revealer in self.revealers: if revealer.props.child_revealed: self.box.show_all() self.frame.show() return self.frame.hide() class SettingsWidget(Gtk.Box): def __init__(self, dep_key=None): Gtk.Box.__init__(self) self.set_orientation(Gtk.Orientation.HORIZONTAL) self.set_spacing(20) self.set_border_width(5) self.set_margin_left(20) self.set_margin_right(20) if dep_key: self.set_dep_key(dep_key) def set_dep_key(self, dep_key): flag = Gio.SettingsBindFlags.GET if dep_key[0] == "!": dep_key = dep_key[1:] flag |= Gio.SettingsBindFlags.INVERT_BOOLEAN split = dep_key.split("/") dep_settings = Gio.Settings.new(split[0]) dep_settings.bind(split[1], self, "sensitive", flag) def add_to_size_group(self, group): group.add_widget(self.content_widget) def fill_row(self): self.set_border_width(0) self.set_margin_left(0) self.set_margin_right(0) def get_settings(self, schema): global settings_objects try: return settings_objects[schema] except: settings_objects[schema] = Gio.Settings.new(schema) return settings_objects[schema] class SettingsLabel(Gtk.Label): def __init__(self, text=None): Gtk.Label.__init__(self) if text: self.set_label(text) self.set_alignment(0.0, 0.5) self.set_line_wrap(True) def set_label_text(self, text): self.set_label(text) class Switch(SettingsWidget): bind_prop = "active" bind_dir = Gio.SettingsBindFlags.DEFAULT def __init__(self, label, dep_key=None, tooltip=""): super(Switch, self).__init__(dep_key=dep_key) self.content_widget = Gtk.Switch(valign=Gtk.Align.CENTER) self.label = SettingsLabel(label) self.pack_start(self.label, False, False, 0) self.pack_end(self.content_widget, False, False, 0) self.set_tooltip_text(tooltip) def clicked(self, *args): if self.is_sensitive(): self.content_widget.set_active(not self.content_widget.get_active()) class SpinButton(SettingsWidget): bind_prop = "value" bind_dir = Gio.SettingsBindFlags.GET def __init__(self, label, units="", mini=None, maxi=None, step=1, page=None, size_group=None, dep_key=None, tooltip=""): super(SpinButton, self).__init__(dep_key=dep_key) self.timer = None if units: label += " (%s)" % units self.label = SettingsLabel(label) self.content_widget = Gtk.SpinButton() self.pack_start(self.label, False, False, 0) self.pack_end(self.content_widget, False, False, 0) range = self.get_range() if mini == None or maxi == None: mini = range[0] maxi = range[1] elif range is not None: mini = max(mini, range[0]) maxi = min(maxi, range[1]) if not page: page = step self.content_widget.set_range(mini, maxi) self.content_widget.set_increments(step, page) digits = 0 if (step and '.' in str(step)): digits = len(str(step).split('.')[1]) self.content_widget.set_digits(digits) self.content_widget.connect("value-changed", self.apply_later) self.set_tooltip_text(tooltip) if size_group: self.add_to_size_group(size_group) def apply_later(self, *args): def apply(self): self.set_value(self.content_widget.get_value()) self.timer = None if self.timer: GLib.source_remove(self.timer) self.timer = GLib.timeout_add(300, apply, self) class Entry(SettingsWidget): bind_prop = "text" bind_dir = Gio.SettingsBindFlags.DEFAULT def __init__(self, label, expand_width=False, size_group=None, dep_key=None, tooltip=""): super(Entry, self).__init__(dep_key=dep_key) self.label = SettingsLabel(label) self.content_widget = Gtk.Entry() self.content_widget.set_valign(Gtk.Align.CENTER) self.pack_start(self.label, False, False, 0) self.pack_end(self.content_widget, expand_width, expand_width, 0) self.set_tooltip_text(tooltip) if size_group: self.add_to_size_group(size_group) class TextView(SettingsWidget): bind_prop = "text" bind_dir = Gio.SettingsBindFlags.DEFAULT def __init__(self, label, height=200, dep_key=None, tooltip=""): super(TextView, self).__init__(dep_key=dep_key) self.set_orientation(Gtk.Orientation.VERTICAL) self.set_spacing(8) self.label = Gtk.Label.new(label) self.label.set_halign(Gtk.Align.CENTER) self.scrolledwindow = Gtk.ScrolledWindow(hadjustment=None, vadjustment=None) self.scrolledwindow.set_size_request(width=-1, height=height) self.scrolledwindow.set_policy(hscrollbar_policy=Gtk.PolicyType.AUTOMATIC, vscrollbar_policy=Gtk.PolicyType.AUTOMATIC) self.scrolledwindow.set_shadow_type(type=Gtk.ShadowType.ETCHED_IN) self.content_widget = Gtk.TextView() self.content_widget.set_border_width(3) self.content_widget.set_wrap_mode(wrap_mode=Gtk.WrapMode.NONE) self.bind_object = self.content_widget.get_buffer() self.pack_start(self.label, False, False, 0) self.add(self.scrolledwindow) self.scrolledwindow.add(self.content_widget) self._value_changed_timer = None class FontButton(SettingsWidget): bind_prop = "font-name" bind_dir = Gio.SettingsBindFlags.DEFAULT def __init__(self, label, level=(Gtk.FontChooserLevel.STYLE | Gtk.FontChooserLevel.SIZE), size_group=None, dep_key=None, tooltip=""): super(FontButton, self).__init__(dep_key=dep_key) self.label = SettingsLabel(label) self.content_widget = Gtk.FontButton() self.content_widget.set_valign(Gtk.Align.CENTER) self.pack_start(self.label, False, False, 0) self.pack_end(self.content_widget, False, False, 0) self.set_tooltip_text(tooltip) if size_group: self.add_to_size_group(size_group) if not (level & Gtk.FontChooserLevel.STYLE): # the level mechanism is broken in gtk - choosing a level that doesn't include styles (italics, bold, etc) # results in a list that only has one variant per family, but in many cases the selected font is bold or # italicized (but not consistenly), which is not only confusing, but kind of defeats the purpose. To work # around that, we supply our own filter function that removes the variants correctly. If it ever gets fixed # in gtk, this parsing function can be removed and the level argument added directly to the font button. def filter_func(fam, face): face_text = face.get_face_name().lower() for keyword in ['bold', 'italic', 'oblique']: if keyword in face_text: return False return True self.content_widget.set_filter_func(filter_func) # add the style level to avoid the issues above - it's because we're already filtering them out manually level |= Gtk.FontChooserLevel.STYLE self.content_widget.set_level(level) class Range(SettingsWidget): bind_prop = "value" bind_dir = Gio.SettingsBindFlags.GET | Gio.SettingsBindFlags.NO_SENSITIVITY def __init__(self, label, min_label="", max_label="", mini=None, maxi=None, step=None, invert=False, log=False, show_value=True, dep_key=None, tooltip="", flipped=False, units="", digits=1): super(Range, self).__init__(dep_key=dep_key) self.set_orientation(Gtk.Orientation.VERTICAL) self.set_spacing(0) self.log = log self.invert = invert self.flipped = flipped self.timer = None self.value = 0 self.digits = digits self.units = units hbox = Gtk.Box() self.label = Gtk.Label.new(label) self.label.set_halign(Gtk.Align.CENTER) self.min_label= Gtk.Label() self.max_label = Gtk.Label() self.min_label.set_alignment(1.0, 0.75) self.max_label.set_alignment(1.0, 0.75) self.min_label.set_margin_right(6) self.max_label.set_margin_left(6) self.min_label.set_markup("%s" % min_label) self.max_label.set_markup("%s" % max_label) range = self.get_range() if mini == None or maxi == None: mini = range[0] maxi = range[1] elif range is not None: mini = max(mini, range[0]) maxi = min(maxi, range[1]) if log: mini = math.log(mini) maxi = math.log(maxi) if self.flipped: self.map_get = lambda x: -1 * (math.log(x)) self.map_set = lambda x: math.exp(x) else: self.map_get = lambda x: math.log(x) self.map_set = lambda x: math.exp(x) elif self.flipped: self.map_get = lambda x: x * -1 self.map_set = lambda x: x * -1 if self.flipped: tmp_mini = mini mini = maxi * -1 maxi = tmp_mini * -1 if step is None: self.step = (maxi - mini) * 0.02 else: self.step = math.log(step) if log else step self.content_widget = Gtk.Scale.new_with_range(Gtk.Orientation.HORIZONTAL, mini, maxi, self.step) self.content_widget.set_inverted(invert) self.content_widget.set_draw_value(show_value and not self.flipped) self.bind_object = self.content_widget.get_adjustment() if self.units != "": def format_value(scale, value, data=None): return "{0:0.{prec}f}{1}".format(value, self.units, prec=self.digits) self.content_widget.connect("format-value", format_value) if invert: self.step *= -1 # Gtk.Scale.new_with_range want a positive value, but our custom scroll handler wants a negative value hbox.pack_start(self.min_label, False, False, 0) hbox.pack_start(self.content_widget, True, True, 0) hbox.pack_start(self.max_label, False, False, 0) self.pack_start(self.label, False, False, 0) self.pack_start(hbox, True, True, 6) self.content_widget.connect("scroll-event", self.on_scroll_event) self.content_widget.connect("value-changed", self.apply_later) if (not log) and self.step % 1 == 0: self.content_widget.connect("change-value", self.round_value_to_step) self.set_tooltip_text(tooltip) def round_value_to_step(self, widget, scroll, value, data=None): if value % self.step != 0: widget.set_value(round(value / self.step) * self.step) return True return False def apply_later(self, *args): def apply(self): if self.log: self.set_value(math.exp(abs(self.content_widget.get_value()))) else: if self.flipped: self.set_value(self.content_widget.get_value() * -1) else: self.set_value(self.content_widget.get_value()) self.timer = None if self.timer: GLib.source_remove(self.timer) self.timer = GLib.timeout_add(300, apply, self) def on_scroll_event(self, widget, event): found, delta_x, delta_y = event.get_scroll_deltas() # If you scroll up, delta_y < 0. This is a weird world widget.set_value(widget.get_value() - delta_y * self.step) return True def add_mark(self, value, position, markup): if self.log: self.content_widget.add_mark(math.log(value), position, markup) else: self.content_widget.add_mark(value, position, markup) def set_rounding(self, digits): if not self.log: self.digits = digits self.content_widget.set_round_digits(digits) self.content_widget.set_digits(digits) class ComboBox(SettingsWidget): bind_dir = None def __init__(self, label, options=[], valtype=None, separator=None, size_group=None, dep_key=None, tooltip=""): super(ComboBox, self).__init__(dep_key=dep_key) self.valtype = valtype self.separator = separator self.option_map = {} self.label = SettingsLabel(label) self.content_widget = Gtk.ComboBox() renderer_text = Gtk.CellRendererText() self.content_widget.pack_start(renderer_text, True) self.content_widget.add_attribute(renderer_text, "text", 1) self.pack_start(self.label, False, False, 0) self.pack_end(self.content_widget, False, False, 0) self.content_widget.set_valign(Gtk.Align.CENTER) self.set_options(options) if separator: self.content_widget.set_row_separator_func(self.is_separator_row) self.set_tooltip_text(tooltip) if size_group: self.add_to_size_group(size_group) def on_my_value_changed(self, widget): tree_iter = widget.get_active_iter() if tree_iter != None: self.value = self.model[tree_iter][0] self.set_value(self.value) def on_setting_changed(self, *args): self.value = self.get_value() try: self.content_widget.set_active_iter(self.option_map[self.value]) except: self.content_widget.set_active_iter(None) def connect_widget_handlers(self, *args): self.content_widget.connect('changed', self.on_my_value_changed) def set_options(self, options): if self.valtype is not None: var_type = self.valtype else: # assume all keys are the same type (mixing types is going to cause an error somewhere) var_type = type(options[0][0]) self.model = Gtk.ListStore(var_type, str) for option in options: self.option_map[option[0]] = self.model.append([option[0], option[1]]) self.content_widget.set_model(self.model) self.content_widget.set_id_column(0) def is_separator_row(self, model, tree_iter): if model[tree_iter][0] == self.separator: return True else: return False class ColorChooser(SettingsWidget): bind_dir = None def __init__(self, label, legacy_string=False, size_group=None, dep_key=None, tooltip=""): super(ColorChooser, self).__init__(dep_key=dep_key) # note: Gdk.Color is deprecated in favor of Gdk.RGBA, but as the hex format is still used # in some places (most notably the desktop background handling in cinnamon-desktop) we # still support it for now by adding the legacy_string argument self.legacy_string = legacy_string self.label = SettingsLabel(label) self.content_widget = Gtk.ColorButton() self.content_widget.set_use_alpha(True) self.pack_start(self.label, False, False, 0) self.pack_end(self.content_widget, False, False, 0) self.set_tooltip_text(tooltip) if size_group: self.add_to_size_group(size_group) def on_setting_changed(self, *args): color_string = self.get_value() rgba = Gdk.RGBA() rgba.parse(color_string) self.content_widget.set_rgba(rgba) def connect_widget_handlers(self, *args): self.content_widget.connect('color-set', self.on_my_value_changed) def on_my_value_changed(self, widget): if self.legacy_string: color_string = self.content_widget.get_color().to_string() else: color_string = self.content_widget.get_rgba().to_string() self.set_value(color_string) class FileChooser(SettingsWidget): bind_dir = None def __init__(self, label, dir_select=False, size_group=None, dep_key=None, tooltip=""): super(FileChooser, self).__init__(dep_key=dep_key) if dir_select: action = Gtk.FileChooserAction.SELECT_FOLDER else: action = Gtk.FileChooserAction.OPEN self.label = SettingsLabel(label) self.content_widget = Gtk.FileChooserButton(action=action) self.pack_start(self.label, False, False, 0) self.pack_end(self.content_widget, False, False, 0) self.set_tooltip_text(tooltip) if size_group: self.add_to_size_group(size_group) def on_file_selected(self, *args): self.set_value(self.content_widget.get_uri()) def on_setting_changed(self, *args): self.content_widget.set_uri(self.get_value()) def connect_widget_handlers(self, *args): self.content_widget.connect("file-set", self.on_file_selected) class IconChooser(SettingsWidget): bind_prop = "icon" bind_dir = Gio.SettingsBindFlags.DEFAULT def __init__(self, label, default_icon=None, icon_categories=[], default_category=None, expand_width=False, size_group=None, dep_key=None, tooltip=""): super(IconChooser, self).__init__(dep_key=dep_key) self.label = SettingsLabel(label) self.content_widget = XApp.IconChooserButton() self.content_widget.set_icon_size(Gtk.IconSize.BUTTON) dialog = self.content_widget.get_dialog() if default_icon: dialog.set_default_icon(default_icon) for category in icon_categories: dialog.add_custom_category(category['name'], category['icons']) if default_category is not None: self.content_widget.set_default_category(default_category) self.pack_start(self.label, False, False, 0) self.pack_end(self.content_widget, expand_width, expand_width, 0) self.set_tooltip_text(tooltip) if size_group: self.add_to_size_group(size_group) class Button(SettingsWidget): def __init__(self, label, callback=None): super(Button, self).__init__() self.label = label self.callback = callback self.content_widget = Gtk.Button(label=label) self.pack_start(self.content_widget, True, True, 0) self.content_widget.connect("clicked", self._on_button_clicked) def _on_button_clicked(self, *args): if self.callback is not None: self.callback(self) elif hasattr(self, "on_activated"): self.on_activated() else: print("warning: button '%s' does nothing" % self.label) def set_label(self, label): self.label = label self.content_widget.set_label(label) class Text(SettingsWidget): def __init__(self, label, align=Gtk.Align.START): super(Text, self).__init__() self.label = label if align == Gtk.Align.END: xalign = 1.0 justification = Gtk.Justification.RIGHT elif align == Gtk.Align.CENTER: xalign = 0.5 justification = Gtk.Justification.CENTER else: # START and FILL align left xalign = 0 justification = Gtk.Justification.LEFT self.content_widget = Gtk.Label(label, halign=align, xalign=xalign, justify=justification) self.content_widget.set_line_wrap(True) self.pack_start(self.content_widget, True, True, 0) python3-xapp-3.0.2/xapp/__init__.py0000664000175000017500000000016015127754237016105 0ustar fabiofabio__all__ = [ "os", "GSettingsWidgets", "SettingsWidgets", "widgets", "threading", "util"] __version__ = "2.4.1" python3-xapp-3.0.2/xapp/meson.build0000664000175000017500000000100615127754237016136 0ustar fabiofabiopython3.install_sources( [ '__init__.py', 'GSettingsWidgets.py', 'os.py', 'SettingsWidgets.py' ], subdir: 'xapp' ) # Install widgets submodule files python3.install_sources( [ 'widgets/__init__.py', 'widgets/ListEditor.py', ], subdir: 'xapp/widgets' ) python3.install_sources( [ 'threading/__init__.py', ], subdir: 'xapp/threading' ) python3.install_sources( [ 'util/__init__.py', ], subdir: 'xapp/util' )python3-xapp-3.0.2/xapp/os.py0000664000175000017500000000670115127754237014776 0ustar fabiofabiofrom __future__ import absolute_import import os import psutil import subprocess ### SESSION DETECTION SESSION_CINNAMON = "Cinnamon" SESSION_MATE = "MATE" SESSION_XFCE = "XFCE" SESSION_KDE = "KDE" SESSION_GNOME = "GNOME" SESSION_UNKNOWN = "" def get_current_desktop(): session = os.getenv("XDG_CURRENT_DESKTOP", SESSION_UNKNOWN) for name in (SESSION_CINNAMON, SESSION_MATE, SESSION_XFCE, SESSION_KDE): if session.lower() == name.lower(): return name if session == "X-Cinnamon": return SESSION_CINNAMON return SESSION_UNKNOWN def is_desktop_cinnamon(): return get_current_desktop() == SESSION_CINNAMON def is_desktop_mate(): return get_current_desktop() == SESSION_MATE def is_desktop_xfce(): return get_current_desktop() == SESSION_XFCE def is_desktop_kde(): return get_current_desktop() == SESSION_KDE def is_desktop_gnome(): return get_current_desktop() == SESSION_GNOME def is_live_session(): is_live_session = False if os.access("/proc/cmdline", os.R_OK): cmdline = subprocess.check_output("cat /proc/cmdline", shell = True).decode("utf-8") for keyword in ["boot=casper", "boot=live"]: if keyword in cmdline: is_live_session = True break return is_live_session def is_guest_session(): home_path = os.path.expanduser("~") if "/tmp/guest" in home_path: return True else: return False ### PROCESS DETECTION def is_process_running(process_name): for pid in psutil.pids(): p = psutil.Process(pid) if p.name() == process_name: return True return False ### POLKIT SUPPORT def is_polkit_running(): # Check that pkexec is present if not os.path.exists("/usr/bin/pkexec"): return False # Check that the polkit agent is running if is_desktop_kde() and is_process_running("polkit-kde-authentication-agent-1"): return True if is_desktop_mate() and is_process_running("polkit-mate-authentication-agent-1"): return True elif is_process_running("polkit-gnome-authentication-agent-1"): return True elif is_process_running("polkitd"): return True else: return False def pkexec(command): if not isinstance(command, list): command = command.split(" ") subprocess.call(["/usr/bin/pkexec"] + command) ### Run as root def run_with_admin_privs(command, message=None, icon=None, support_pkexec=False): if not isinstance(command, list): command = command.split(" ") if is_polkit_running() and support_pkexec: pkexec(command) return True elif os.path.exists("/usr/bin/gksu"): commands = ["gksu"] if message is not None: commands = commands + ["--message", "%s" % message] commands = commands + command subprocess.Popen(commands) return True elif os.path.exists("/usr/bin/kdesudo"): commands = ["kdesudo", "-d"] if icon is not None: commands = commands + ["-i", icon] if message is not None: commands = commands + ["--comment", "%s" % message] commands = commands + command subprocess.Popen(commands) return True # Finally use pkexec if we have nothing else - it will work, but the executed program # may not be properly localized. elif is_polkit_running(): pkexec(command) return True else: return False python3-xapp-3.0.2/xapp/threading/0000775000175000017500000000000015127754237015744 5ustar fabiofabiopython3-xapp-3.0.2/xapp/threading/__init__.py0000664000175000017500000000077415127754237020065 0ustar fabiofabioimport gi import threading from gi.repository import GLib # Decorator to run things in the background def run_async(func): def wrapper(*args, **kwargs): thread = threading.Thread(target=func, args=args, kwargs=kwargs) thread.daemon = True thread.start() return thread return wrapper # Decorator to run things in the main Gtk loop def run_idle(func): def wrapper(*args): GLib.idle_add(func, *args) return wrapper __all__ = ["run_async", "run_idle"] python3-xapp-3.0.2/xapp/util/0000775000175000017500000000000015127754237014754 5ustar fabiofabiopython3-xapp-3.0.2/xapp/util/__init__.py0000664000175000017500000000064615127754237017073 0ustar fabiofabio def l10n(domain, locale_dir="/usr/share/locale"): """ Initialize gettext and locale bindings for the given app. Returns: function: The gettext translation function `_` for convenience. """ import gettext import locale locale.bindtextdomain(domain, locale_dir) gettext.bindtextdomain(domain, locale_dir) gettext.textdomain(domain) return gettext.gettext __all__ = ["l10n"] python3-xapp-3.0.2/xapp/widgets/0000775000175000017500000000000015127754237015445 5ustar fabiofabiopython3-xapp-3.0.2/xapp/widgets/ListEditor.py0000664000175000017500000007416315127754237020114 0ustar fabiofabio#!/usr/bin/python3 """ GTK3 List Editor Widget A reusable widget for managing a list of strings with add, remove, edit, and reorder functionality. """ import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk, Gdk, GObject from gi.repository import Pango import gettext _ = lambda s: gettext.dgettext("python-xapp", s) class ListEditor(Gtk.Box): """A GTK3 widget for managing a list of strings.""" __gsignals__ = { 'list-changed': (GObject.SignalFlags.RUN_FIRST, None, (object,)), } def __init__(self): super().__init__(orientation=Gtk.Orientation.VERTICAL, spacing=0) # Create the list store (model) self.list_store = Gtk.ListStore(str) # Validation and duplicate settings - all False by default self._validation_func = None self._allow_duplicates = False self._allow_ordering = False self._allow_add = False self._add_action = "" self._add_hint = "" self._allow_remove = False self._remove_action = "" self._allow_edit = False self._edit_action = "" self._edit_hint = "" self._allow_clear = False self._sort_func = lambda s: s.lower() self._auto_sort = True # Create main stack for view/edit modes self.main_stack = Gtk.Stack() self.main_stack.set_transition_type(Gtk.StackTransitionType.SLIDE_LEFT_RIGHT) self.main_stack.set_transition_duration(200) # VIEW MODE - List and toolbar self._create_view_mode() # EDIT MODE - Entry for add/edit self._create_edit_mode() # Add both modes to stack self.main_stack.add_named(self.view_box, "view") self.main_stack.add_named(self.edit_box, "edit") self.main_stack.set_visible_child_name("view") self.pack_start(self.main_stack, True, True, 0) # State tracking self._current_mode = "view" self._editing_item_path = None self._editing_iter = None # Apply initial visibility based on default settings self._update_button_visibility() # Initial button state self._update_button_sensitivity() # Apply initial sort self._apply_sort() self.show_all() def _create_view_mode(self): """Create the view mode layout with list and toolbar.""" self.view_box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=0) # Create the tree view self.tree_view = Gtk.TreeView(model=self.list_store) self.tree_view.set_headers_visible(False) # Create renderer and column self.text_renderer = Gtk.CellRendererText() column = Gtk.TreeViewColumn("String", self.text_renderer, text=0) self.tree_view.append_column(column) # Enable drag and drop for reordering (initially disabled) self.tree_view.set_reorderable(False) self.tree_view.connect("drag-end", self._on_drag_end) self.tree_view.connect("row-activated", self._on_row_activated) # Create selection self.selection = self.tree_view.get_selection() self.selection.connect("changed", self._on_selection_changed) # Create scrolled window for tree view scrolled = Gtk.ScrolledWindow() scrolled.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) scrolled.set_shadow_type(Gtk.ShadowType.IN) scrolled.add(self.tree_view) # Create toolbar for view mode self._create_view_toolbar() # Build view mode layout list_container = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=0) list_container.get_style_context().add_class("linked") list_container.pack_start(scrolled, True, True, 0) list_container.pack_start(self.view_toolbar, False, False, 0) self.view_box.pack_start(list_container, True, True, 0) def _create_view_toolbar(self): """Create the toolbar for view mode.""" self.view_toolbar = Gtk.Toolbar() self.view_toolbar.get_style_context().add_class("inline-toolbar") self.view_toolbar.set_no_show_all(True) # Create tool item container tool_item = Gtk.ToolItem() tool_item.set_expand(True) tool_item.show() # Create button box button_box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=6) # Group 1: Add/Edit/Remove buttons (linked) button_group1 = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=0) button_group1.get_style_context().add_class("linked") self.btn_add = Gtk.Button() self.btn_add.set_image(Gtk.Image.new_from_icon_name("xsi-list-add-symbolic", Gtk.IconSize.BUTTON)) self.btn_add.connect("clicked", self._on_add_clicked) self.btn_add.set_no_show_all(True) self.btn_edit = Gtk.Button() self.btn_edit.set_image(Gtk.Image.new_from_icon_name("xsi-document-edit-symbolic", Gtk.IconSize.BUTTON)) self.btn_edit.connect("clicked", self._on_edit_clicked) self.btn_edit.set_no_show_all(True) self.btn_remove = Gtk.Button() self.btn_remove.set_image(Gtk.Image.new_from_icon_name("xsi-list-remove-symbolic", Gtk.IconSize.BUTTON)) self.btn_remove.connect("clicked", self._on_remove_clicked) self.btn_remove.set_no_show_all(True) button_group1.pack_start(self.btn_add, False, False, 0) button_group1.pack_start(self.btn_edit, False, False, 0) button_group1.pack_start(self.btn_remove, False, False, 0) button_group1.show() # Group 2: Move buttons (linked) button_group2 = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=0) button_group2.get_style_context().add_class("linked") self.btn_move_up = Gtk.Button() self.btn_move_up.set_image(Gtk.Image.new_from_icon_name("xsi-go-up-symbolic", Gtk.IconSize.BUTTON)) self.btn_move_up.set_tooltip_text(_("Move up")) self.btn_move_up.connect("clicked", self._on_move_up_clicked) self.btn_move_up.set_no_show_all(True) self.btn_move_down = Gtk.Button() self.btn_move_down.set_image(Gtk.Image.new_from_icon_name("xsi-go-down-symbolic", Gtk.IconSize.BUTTON)) self.btn_move_down.set_tooltip_text(_("Move down")) self.btn_move_down.connect("clicked", self._on_move_down_clicked) self.btn_move_down.set_no_show_all(True) button_group2.pack_start(self.btn_move_up, False, False, 0) button_group2.pack_start(self.btn_move_down, False, False, 0) button_group2.show() # Group 3: Clear button (standalone but can be linked if other buttons added later) button_group3 = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=0) button_group3.get_style_context().add_class("linked") self.btn_clear = Gtk.Button() self.btn_clear.set_image(Gtk.Image.new_from_icon_name("xsi-user-trash-symbolic", Gtk.IconSize.BUTTON)) self.btn_clear.connect("clicked", self._on_clear_clicked) self.btn_clear.set_no_show_all(True) button_group3.pack_start(self.btn_clear, False, False, 0) button_group3.show() # Pack all button groups button_box.pack_start(button_group1, False, False, 0) button_box.pack_start(button_group2, False, False, 0) button_box.pack_end(button_group3, False, False, 0) button_box.show() # Add button box to tool item tool_item.add(button_box) self.view_toolbar.insert(tool_item, -1) def _create_edit_mode(self): """Create the edit mode layout with entry and controls.""" self.edit_box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=8) # Entry area entry_frame = Gtk.Frame() entry_frame.set_shadow_type(Gtk.ShadowType.IN) self.title = Gtk.Label() attributes = Pango.AttrList() weight = Pango.attr_weight_new(Pango.Weight.BOLD) attributes.insert(weight) self.title.set_attributes(attributes) self.title.set_halign(Gtk.Align.START) self.hint = Gtk.Label() self.hint.set_halign(Gtk.Align.START) entry_box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=8) entry_box.set_border_width(12) self.entry = Gtk.Entry() self.entry.connect("changed", self._on_entry_changed) self.entry.connect("activate", self._on_entry_activate) # Error label self.error_label = Gtk.Label() self.error_label.set_halign(Gtk.Align.START) self.error_label.set_no_show_all(True) # Action buttons action_buttons = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=6) action_buttons.set_halign(Gtk.Align.END) self.btn_cancel = Gtk.Button(label=_("Cancel")) self.btn_cancel.connect("clicked", self._on_cancel_clicked) self.btn_save = Gtk.Button(label=_("Save")) self.btn_save.get_style_context().add_class("suggested-action") self.btn_save.set_sensitive(False) self.btn_save.connect("clicked", self._on_save_clicked) action_buttons.pack_start(self.btn_cancel, False, False, 0) action_buttons.pack_start(self.btn_save, False, False, 0) entry_box.pack_start(self.title, False, False, 0) entry_box.pack_start(self.hint, False, False, 0) entry_box.pack_start(self.entry, False, False, 0) entry_box.pack_start(self.error_label, False, False, 0) entry_box.pack_start(action_buttons, False, False, 0) entry_frame.add(entry_box) self.edit_box.pack_start(entry_frame, True, True, 0) def _switch_to_view_mode(self): """Switch back to view mode.""" self.main_stack.set_visible_child_name("view") self._current_mode = "view" self._editing_item_path = None self.entry.set_text("") self.error_label.hide() def _switch_to_edit_mode(self, mode="add", item_path=None, current_text=""): """Switch to edit mode.""" self.main_stack.set_visible_child_name("edit") self._current_mode = "edit" self._editing_item_path = item_path if mode == "add": self.title.set_text(self._add_action) self.hint.set_text(self._add_hint) self.entry.set_text("") else: self.title.set_text(self._edit_action) self.hint.set_text(self._edit_hint) self.entry.set_text(current_text) self._validate_current_entry() self.entry.grab_focus() def _validate_current_entry(self): """Validate the current entry content and update UI.""" text = self.entry.get_text() stripped_text = text.strip() if not stripped_text: self.entry.get_style_context().remove_class("error") self.error_label.hide() self.btn_save.set_sensitive(False) return is_valid, error = self._validate_entry(text, exclude_iter=self.list_store.get_iter(self._editing_item_path) if self._editing_item_path else None) if is_valid: self.entry.get_style_context().remove_class("error") self.error_label.hide() self.btn_save.set_sensitive(True) else: self.entry.get_style_context().add_class("error") self.error_label.set_markup(f'{error}') self.error_label.show() self.btn_save.set_sensitive(False) def _save_current_entry(self): """Save the current entry based on mode.""" text = self.entry.get_text() stripped_text = text.strip() if not stripped_text: return if self._editing_item_path: iter = self.list_store.get_iter(self._editing_item_path) self.list_store.set_value(iter, 0, text) if self._auto_sort and not self._allow_ordering: self._apply_sort() else: iter = self.list_store.append([text]) if self._auto_sort and not self._allow_ordering: self._apply_sort() for row in self.list_store: if row[0] == text: self.selection.select_iter(row.iter) break else: self.selection.select_iter(iter) self.emit('list-changed', self.get_strings()) self._switch_to_view_mode() # Public API methods def set_validation_function(self, func): """ Set a validation function for new/edited entries. The function should accept a string and return: - None if validation passes - An error string if validation fails """ self._validation_func = func def set_allow_duplicates(self, allow): """Set whether duplicate entries are allowed.""" self._allow_duplicates = allow def set_allow_ordering(self, allow): """Set whether manual ordering is allowed.""" self._allow_ordering = allow self.tree_view.set_reorderable(allow) self._update_button_visibility() self._update_button_sensitivity() if not allow and self._auto_sort: self._apply_sort() def set_allow_add(self, allow, action=_("Add"), hint=""): """Set whether adding new items is allowed.""" self._allow_add = allow self._add_action = action self._add_hint = hint self.btn_add.set_tooltip_text(action) self._update_button_visibility() def set_allow_remove(self, allow, action=_("Remove")): """Set whether removing items is allowed.""" self._allow_remove = allow self._remove_action = action self.btn_remove.set_tooltip_text(action) self._update_button_visibility() def set_allow_edit(self, allow, action=_("Edit"), hint=""): """Set whether editing items is allowed.""" self._allow_edit = allow self._edit_action = action self._edit_hint = hint self.btn_edit.set_tooltip_text(action) self._update_button_visibility() def set_allow_clear(self, allow, action=_("Remove all")): """Set whether clearing all items is allowed.""" self._allow_clear = allow self.btn_clear.set_tooltip_text(action) self._update_button_visibility() def set_sort_function(self, func): """Set a sort function to keep the list sorted.""" if func is False: self._auto_sort = False self._sort_func = None elif func is None: self._auto_sort = True self._sort_func = lambda s: s.lower() else: self._auto_sort = True self._sort_func = func if self._auto_sort: self._apply_sort() def get_strings(self): """Get all strings in the list as a Python list.""" return [row[0] for row in self.list_store] def set_strings(self, strings): """Set the list content from a Python list of strings.""" self.list_store.clear() valid_strings = [] for string in strings: is_valid, error = self._validate_entry(string) if is_valid: valid_strings.append(string) if self._auto_sort and not self._allow_ordering and self._sort_func: try: valid_strings = sorted(valid_strings, key=self._sort_func) except: valid_strings = sorted(valid_strings, key=lambda s: s.lower()) for string in valid_strings: self.list_store.append([string]) self._update_button_sensitivity() self.emit('list-changed', self.get_strings()) def add_string(self, string): """Add a single string to the list.""" is_valid, error = self._validate_entry(string) if is_valid: self.list_store.append([string]) if self._auto_sort and not self._allow_ordering: self._apply_sort() self._update_button_sensitivity() self.emit('list-changed', self.get_strings()) return True return False # Internal methods def _update_button_visibility(self): """Update visibility of button groups based on allow settings.""" self.btn_add.set_visible(self._allow_add) self.btn_edit.set_visible(self._allow_edit) self.btn_remove.set_visible(self._allow_remove) self.btn_move_up.set_visible(self._allow_ordering) self.btn_move_down.set_visible(self._allow_ordering) self.btn_clear.set_visible(self._allow_clear) self.view_toolbar.set_visible(self._allow_add or self._allow_edit or self._allow_remove or self._allow_ordering or self._allow_clear) def _apply_sort(self): """Apply sorting to the list if auto-sort is enabled.""" if not self._auto_sort or not self._sort_func: return items = [row[0] for row in self.list_store] try: sorted_items = sorted(items, key=self._sort_func) except Exception: sorted_items = sorted(items, key=lambda s: s.lower()) if items != sorted_items: self.list_store.clear() for item in sorted_items: self.list_store.append([item]) def _validate_entry(self, text, exclude_iter=None): """Validate an entry based on custom validation and duplicate checking.""" if not text: return (False, "") # Custom validation function if self._validation_func: try: result = self._validation_func(text) if result is not None: # Validation failed - result is error message return (False, result) except Exception as e: return (False, "") # Duplicate checking if not self._allow_duplicates: for row in self.list_store: if exclude_iter and self.list_store.get_path(row.iter) == self.list_store.get_path(exclude_iter): continue if row[0] == text: return (False, _("'%s' is already in the list.") % text) return (True, None) def _update_button_sensitivity(self): """Enable/disable buttons based on selection and list state.""" model, iter = self.selection.get_selected() has_selection = iter is not None has_items = len(self.list_store) > 0 if self._allow_remove: self.btn_remove.set_sensitive(has_selection) if self._allow_edit: self.btn_edit.set_sensitive(has_selection) if self._allow_clear: self.btn_clear.set_sensitive(has_items) if self._allow_ordering and has_selection: path = model.get_path(iter) index = path.get_indices()[0] self.btn_move_up.set_sensitive(index > 0) self.btn_move_down.set_sensitive(index < len(model) - 1) else: self.btn_move_up.set_sensitive(False) self.btn_move_down.set_sensitive(False) # Event handlers def _on_add_clicked(self, button): """Switch to add mode.""" if self._allow_add: self._switch_to_edit_mode("add") def _on_edit_clicked(self, button): """Switch to edit mode for selected item.""" if not self._allow_edit: return model, iter = self.selection.get_selected() if iter: path = model.get_path(iter) current_text = model.get_value(iter, 0) self._switch_to_edit_mode("edit", path, current_text) def _on_cancel_clicked(self, button): """Cancel editing and return to view mode.""" self._switch_to_view_mode() def _on_save_clicked(self, button): """Save the current entry.""" self._save_current_entry() def _on_entry_changed(self, entry): """Validate entry as user types.""" self._validate_current_entry() def _on_entry_activate(self, entry): """Handle Enter key in entry.""" if self.btn_save.get_sensitive(): self._save_current_entry() def _on_drag_end(self, widget, context): if self._allow_ordering: self.emit('list-changed', self.get_strings()) def _on_row_activated(self, tree_view, path, column): if self._allow_edit: current_text = self.list_store[path][0] self._switch_to_edit_mode("edit", path, current_text) def _on_selection_changed(self, selection): self._update_button_sensitivity() def _on_remove_clicked(self, button): if not self._allow_remove: return model, iter = self.selection.get_selected() if iter: item_text = model.get_value(iter, 0) dialog = Gtk.MessageDialog( transient_for=self.get_toplevel(), flags=0, message_type=Gtk.MessageType.QUESTION, buttons=Gtk.ButtonsType.YES_NO, text=_("Remove?") ) dialog.format_secondary_text(_("Are you sure you want to remove '%s'?") % item_text) response = dialog.run() dialog.destroy() if response == Gtk.ResponseType.YES: next_iter = model.iter_next(iter) model.remove(iter) if next_iter: self.selection.select_iter(next_iter) elif len(model) > 0: last_path = Gtk.TreePath(len(model) - 1) self.selection.select_path(last_path) self.emit('list-changed', self.get_strings()) self._update_button_sensitivity() def _on_move_up_clicked(self, button): if not self._allow_ordering: return model, iter = self.selection.get_selected() if iter: path = model.get_path(iter) prev_path = Gtk.TreePath(path.get_indices()[0] - 1) prev_iter = model.get_iter(prev_path) model.swap(iter, prev_iter) self._update_button_sensitivity() self.emit('list-changed', self.get_strings()) def _on_move_down_clicked(self, button): if not self._allow_ordering: return model, iter = self.selection.get_selected() if iter: next_iter = model.iter_next(iter) if next_iter: model.swap(iter, next_iter) self._update_button_sensitivity() self.emit('list-changed', self.get_strings()) def _on_clear_clicked(self, button): if not self._allow_clear: return dialog = Gtk.MessageDialog( transient_for=self.get_toplevel(), flags=0, message_type=Gtk.MessageType.QUESTION, buttons=Gtk.ButtonsType.YES_NO, text=_("Remove all?") ) dialog.format_secondary_text(_("This will remove all items from the list.")) response = dialog.run() if response == Gtk.ResponseType.YES: self.list_store.clear() self._update_button_sensitivity() self.emit('list-changed', self.get_strings()) dialog.destroy() class DemoWindow(Gtk.Window): """Demo window to showcase the StringListWidget.""" def __init__(self): super().__init__(title="XApp.widgets.ListEditor() Demo") self.set_default_size(700, 600) self.set_border_width(12) main_box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=12) self.string_list = ListEditor() self.string_list.connect("list-changed", self._on_list_changed) sample_strings = ["Zebra", "Apple", "Mango", "Banana", "Cherry"] self.string_list.set_strings(sample_strings) main_box.pack_start(self.string_list, True, True, 0) controls_box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=6) controls_frame = Gtk.Frame(label="Controls") controls_frame.add(controls_box) order_box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=12) self.ordering_check = Gtk.CheckButton(label="Allow manual ordering") self.ordering_check.set_active(False) self.ordering_check.connect("toggled", self._on_ordering_toggled) order_box.pack_start(self.ordering_check, False, False, 6) sort_label = Gtk.Label(label="Sort mode:") order_box.pack_start(sort_label, False, False, 0) self.sort_combo = Gtk.ComboBoxText() self.sort_combo.append("alpha", "Alphabetical") self.sort_combo.append("length", "By length") self.sort_combo.append("reverse", "Reverse alphabetical") self.sort_combo.append("none", "No auto-sort") self.sort_combo.set_active_id("alpha") self.sort_combo.connect("changed", self._on_sort_changed) order_box.pack_start(self.sort_combo, False, False, 0) controls_box.pack_start(order_box, False, False, 6) self.duplicate_check = Gtk.CheckButton(label="Allow duplicates") self.duplicate_check.set_active(False) self.duplicate_check.connect("toggled", self._on_duplicate_toggled) controls_box.pack_start(self.duplicate_check, False, False, 6) # Add controls for other allow options allow_box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=12) self.add_check = Gtk.CheckButton(label="Allow add") self.add_check.set_active(False) self.add_check.connect("toggled", self._on_add_toggled) allow_box.pack_start(self.add_check, False, False, 0) self.remove_check = Gtk.CheckButton(label="Allow remove") self.remove_check.set_active(False) self.remove_check.connect("toggled", self._on_remove_toggled) allow_box.pack_start(self.remove_check, False, False, 0) self.edit_check = Gtk.CheckButton(label="Allow edit") self.edit_check.set_active(False) self.edit_check.connect("toggled", self._on_edit_toggled) allow_box.pack_start(self.edit_check, False, False, 0) self.clear_check = Gtk.CheckButton(label="Allow clear") self.clear_check.set_active(False) self.clear_check.connect("toggled", self._on_clear_toggled) allow_box.pack_start(self.clear_check, False, False, 0) controls_box.pack_start(allow_box, False, False, 6) val_box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=6) val_label = Gtk.Label(label="Validation: No R letters allowed!") val_box.pack_start(val_label, False, False, 0) self.string_list.set_validation_function(self.no_r_allowed) controls_box.pack_start(val_box, False, False, 6) main_box.pack_start(controls_frame, False, False, 0) self.info_label = Gtk.Label() self._update_info_label() main_box.pack_start(self.info_label, False, False, 0) status_box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=6) btn_get = Gtk.Button(label="Get List Content") btn_get.connect("clicked", self._on_get_content) status_box.pack_start(btn_get, False, False, 0) self.change_label = Gtk.Label() self.change_label.set_markup('No changes yet') status_box.pack_end(self.change_label, False, False, 0) main_box.pack_start(status_box, False, False, 0) self.add(main_box) self.connect("destroy", Gtk.main_quit) self.show_all() def no_r_allowed(self, text): if "r" in text.lower(): return "There is an R in the text!!" return None def _update_info_label(self): if self.ordering_check.get_active(): info = "Manual ordering enabled - use drag & drop or buttons" else: sort_mode = self.sort_combo.get_active_id() if sort_mode == "none": info = "Manual ordering disabled, no auto-sort" else: info = f"Auto-sorted: {self.sort_combo.get_active_text()}" self.info_label.set_markup(f'{info}') def _on_ordering_toggled(self, button): allow = button.get_active() self.string_list.set_allow_ordering(allow) self.sort_combo.set_sensitive(not allow) self._update_info_label() def _on_add_toggled(self, button): self.string_list.set_allow_add(button.get_active(), "Add a new thing", "Don't add rubbish now..") def _on_remove_toggled(self, button): self.string_list.set_allow_remove(button.get_active()) def _on_edit_toggled(self, button): self.string_list.set_allow_edit(button.get_active(), "Edit this thing", "careful now..") def _on_clear_toggled(self, button): self.string_list.set_allow_clear(button.get_active()) def _on_sort_changed(self, combo): sort_id = combo.get_active_id() if sort_id == "alpha": self.string_list.set_sort_function(lambda s: s.lower()) elif sort_id == "length": self.string_list.set_sort_function(lambda s: (len(s), s.lower())) elif sort_id == "reverse": self.string_list.set_sort_function(lambda s: s.lower()) self.string_list._sort_func = lambda s: ''.join(chr(255-ord(c)) for c in s.lower()) elif sort_id == "none": self.string_list.set_sort_function(False) self._update_info_label() def _on_duplicate_toggled(self, button): self.string_list.set_allow_duplicates(button.get_active()) def _on_list_changed(self, widget, strings): count = len(strings) self.change_label.set_markup( f'List changed! {count} items' ) GObject.timeout_add(2000, self._reset_change_label) def _reset_change_label(self): self.change_label.set_markup('Waiting for changes...') return False def _on_get_content(self, button): strings = self.string_list.get_strings() message = "Current list content:\n\n" if strings: message += "\n".join(f"• {s}" for s in strings) else: message += "(Empty list)" dialog = Gtk.MessageDialog( transient_for=self, flags=0, message_type=Gtk.MessageType.INFO, buttons=Gtk.ButtonsType.OK, text="List Content" ) dialog.format_secondary_text(message) dialog.run() dialog.destroy() if __name__ == "__main__": window = DemoWindow() Gtk.main()python3-xapp-3.0.2/xapp/widgets/__init__.py0000664000175000017500000000007615127754237017561 0ustar fabiofabiofrom .ListEditor import ListEditor __all__ = ["ListEditor"]