Repository: qwreey/quick-settings-tweaks Branch: master Commit: 7d05bba4b8a6 Files: 99 Total size: 747.0 KB Directory structure: gitextract_1mwh9xy9/ ├── .github/ │ ├── FUNDING.yml │ ├── ISSUE_TEMPLATE/ │ │ └── bug---error-report.md │ └── workflows/ │ └── build.yml ├── .gitignore ├── LICENSE ├── README.md ├── Todo.md ├── dirzsh.zsh ├── docker-compose.example.yml ├── install.sh ├── media/ │ ├── Changelog.md │ ├── dbus.xml │ ├── licenses.json │ └── rounded_corners.frag ├── metadata.json ├── old/ │ ├── features/ │ │ └── volumeMixer.ts │ ├── inputOutput.ts │ ├── layoutCustomize.ts │ ├── libs/ │ │ ├── streamSlider.ts │ │ └── volumeMixerHandlerNotImpled.ts │ ├── menus.ts │ ├── other.ts │ ├── panel.ts │ ├── prefsPages/ │ │ └── volumeMixer.ts │ ├── sidebarPrefs.ts │ └── widgetManager.ts ├── package.json ├── po/ │ ├── ca.po │ ├── cs.po │ ├── de.po │ ├── en.po │ ├── ja.po │ ├── ko.po │ ├── pl.po │ ├── pt.po │ ├── quick-settings-tweaks@qwreey.pot │ ├── ru.po │ ├── ta.po │ └── zh_Hans.po ├── schemas/ │ └── org.gnome.shell.extensions.quick-settings-tweaks.gschema.xml ├── scripts/ │ ├── contributor-labels.json │ ├── reindent.js │ └── version/ │ ├── gnome-docker-version │ ├── latest-build-number │ ├── latest-middle-version │ ├── latest-minor-version │ └── major-version ├── src/ │ ├── ambient.d.ts │ ├── config.ts │ ├── extension.ts │ ├── features/ │ │ ├── debug.ts │ │ ├── layout/ │ │ │ ├── dateMenu.ts │ │ │ ├── sound.ts │ │ │ ├── systemIndicator.ts │ │ │ ├── systemItems.ts │ │ │ └── toggles.ts │ │ ├── menuAnimation.ts │ │ ├── overlayMenu.ts │ │ ├── toggle/ │ │ │ └── unsafeQuickToggle.ts │ │ └── widget/ │ │ ├── media.ts │ │ ├── notifications.ts │ │ ├── volumeMixer.ts │ │ └── weather.ts │ ├── global.scss │ ├── global.ts │ ├── libs/ │ │ ├── prefs/ │ │ │ └── components.ts │ │ ├── shared/ │ │ │ ├── colors.ts │ │ │ ├── imageUtils.ts │ │ │ ├── jsUtils.ts │ │ │ ├── logger.ts │ │ │ ├── maid.ts │ │ │ └── styleClass.ts │ │ ├── shell/ │ │ │ ├── advani.ts │ │ │ ├── effects.ts │ │ │ ├── feature.ts │ │ │ ├── gesture.ts │ │ │ ├── quickSettingsUtils.ts │ │ │ └── styler.ts │ │ └── types/ │ │ ├── quickSettingsOrderItem.ts │ │ ├── systemIndicatorOrderItem.ts │ │ └── toggleOrderItem.ts │ ├── prefPages/ │ │ ├── about.ts │ │ ├── layout.ts │ │ ├── menu.ts │ │ ├── toggles.ts │ │ └── widgets.ts │ ├── prefs.ts │ ├── styles/ │ │ ├── date-menu.scss │ │ ├── debug.scss │ │ ├── media-widget.scss │ │ ├── message-compact.scss │ │ ├── message-remove-shadow.scss │ │ ├── notification-widget.scss │ │ ├── system-indicator.scss │ │ ├── volume-mixer-widget.scss │ │ └── weather-widget.scss │ ├── stylesheet.scss │ └── types.d.ts └── tsconfig.json ================================================ FILE CONTENTS ================================================ ================================================ FILE: .github/FUNDING.yml ================================================ # These are supported funding model platforms github: [qwreey] # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] patreon: # Replace with a single Patreon username open_collective: # Replace with a single Open Collective username ko_fi: # Replace with a single Ko-fi username tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry liberapay: # Replace with a single Liberapay username issuehunt: # Replace with a single IssueHunt username lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry polar: # Replace with a single Polar username buy_me_a_coffee: # Replace with a single Buy Me a Coffee username thanks_dev: # Replace with a single thanks.dev username custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] ================================================ FILE: .github/ISSUE_TEMPLATE/bug---error-report.md ================================================ --- name: Bug & Error report about: Create a report to help us improve title: "[bug] " labels: bug assignees: '' --- ## Describe the bug ## To Reproduce ## Expected behavior ## Screenshots ## Environment 1. gnome-shell version: (ex) GNOME Shell 47.5 2. distro information: ``` (ex) NAME="Arch Linux" PRETTY_NAME="Arch Linux" ID=arch BUILD_ID=rolling ``` 3. Extension version: 2.1 - stable ================================================ FILE: .github/workflows/build.yml ================================================ name: Build on: [push, pull_request] jobs: build: name: Build extension runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 - name: Install dependencies run: | sudo apt update DEBIAN_FRONTEND=noninteractive sudo apt install -y gettext gnome-shell - name: Build extension run: | npm i ./install.sh build - name: Archive current compilation uses: actions/upload-artifact@v4 with: name: "quick-settings-tweaks-${{ github.sha }}" path: "target/quick-settings-tweaks@qwreey.shell-extension.zip" ================================================ FILE: .gitignore ================================================ target/ i *.po~ host/ docker-compose.yml node_modules/ ================================================ FILE: LICENSE ================================================ GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . ================================================ FILE: README.md ================================================ # Quick Settings Tweaks [QuickSettings-Tweaker SkeletonUI](https://extensions.gnome.org/extension/5446/quick-settings-tweaker/)
### Let's tweak Gnome Quick Settings! [Get it on GNOME Extensions](https://extensions.gnome.org/extension/5446/quick-settings-tweaker/)

Quick Settings Tweaker is a Gnome 46+ extension which allows you to customize the new Quick Settings Panel to your liking!


## Features |

With this extension, you can...

| How it will appear | |:-------------------------------|:--------------------:| |

**Add the Media Controls Widget**

Control your music and videos directly from the Quick Settings, instead of the Date Menu.

For a cooler look, you can also get colors from the cover image and create a gradient.

| Media controls widget screenshot | |

**Add the Volume Mixer Widget**

Adjust application volumes, without opening extra application.

Place the menu button next to the output slider for a compact and natural layout.

| Volume mixer widget screenshot | |

**Add the Notifications Widget**

You can check what has been sent to your mailbox or messenger, without missing!

| Notifications widget screenshot | |

**Layout customize**

Hide, re-order, re-color your panel and Quick Settings layout

Make it simple and keep organized!

| Notifications widget screenshot | |

**Overlay menu layout**

Your Quick Settings panel is too big?

Try overlay layout! you can customize background and animation style too.

| Notifications widget screenshot | ## Sponsor You can promote and support development by [github sponsor!](https://github.com/sponsors/qwreey) You can help keep this project maintained Here is my sponsors, thank for your support! [![sponsors](https://readme-contribs.as93.net/sponsors/qwreey?shape=square&margin=16&perRow=15&title=Qwreey's%20Sponsors&textColor=f5acff&backgroundColor=0e001a&fontFamily=cursive&fontSize=14&limit=90&footerText=none&outerBorderRadius=24)](https://github.com/sponsors/qwreey) ## Stars [![Star History Chart](https://api.star-history.com/svg?repos=qwreey/quick-settings-tweaks&type=Date)](https://star-history.com/#qwreey/quick-settings-tweaks&Date) ## Development ### Building > Prerequirements: You need to install nodejs, bash, and gnome-shell for compiling extension from source You can create development build by executing `TARGET=dev ./install.sh create-release`. make sure run `npm i` first to ensure all build dependencies installed Or, you can get nightly preview build from [github releases tab](https://github.com/qwreey/quick-settings-tweaks/releases). Build extension from `dev` branch is not encouraged, because the `dev` branch has unchecked bleeding-edge features not guaranteed to work. github-preview build is tested by developer and much stable than building `dev` branch. ### Contribution and Issues Keep in mind that there may be one or a few developers, but there may be many issues and users. I think you know how to behave with manners without even having to say it. Please check github [project board page](https://github.com/users/qwreey/projects/2) for issue priority and progress. #### Raise an issue If you want to raise an issue, First, **you must search your issue first.** duplicated issue will be closed, and disturb developer's time. Second, **you must attach a related log files, gnome version and extension version informations.** if you don't provide information much about your issue, it is hard to solve your issue. and to be clear, Please use `[migration]`, `[feature]`, `[bug]` prefix for issue title, It is very useful for searching and organizing issues And last, **you must use well-formed english** You can use a translator or AI to write it, so avoid wasting time by having the developer translate and take notes. This takes up a surprising amount of the developer's time, making analysis very difficult, especially if the logs are mixed in English and other languages. #### PR and code contribution If you want to contribute, **you must pull `dev` branch, Not master branch.** master branch is release branch, because AUR and some user distributions use master branch as build source. **If you create pull-request to master branch, it will be closed.** you should re-open PR to dev branch. ### Testing ![gnome-docker devlopment screenshot](.github/images/dev-preview.png) You can test extension with command `./install.sh dev`. You will need tigervnc client and docker in host. Tested in arch linux but it should working on any systemd based platform You can re-build extension by log out and close vnc window or send SIGINT to exit dev docker. ================================================ FILE: Todo.md ================================================ Scroll view layout for media widget Touch enchantments: Notifications: slide to discard Readme file homepage? 배터리 알약 아이콘 widgets: sound output: device to hide show device name sound input: always show slider show device name device to hide volume mixer item to hide show hidden item button (temporary) as submenu (like background apps) 키보드로 포커스 가능해야함 더보기 아이콘 sound card 로 바꾸고 싶은데 그런 옵션이 있으면 좋겠음 Add cover image round clip effect option 이미지 비율 설정 기능 날씨 로딩중에 라벨 위치 패널 전체 오더링 << 가능했으면 좋겠음.......... 왼쪽 오른쪽 중간 고르기 가능하고 위젯 오더링 습도계 시스템 메뉴에 시간 표시 datemenu format 백그라운드 앱스 스타일: 일반, 퀵토글, 시스템레이아웃 열리는 애니메이션 미디어 타이틀 움직이도록 show full title never when hover, move around always, move around when hover, as tooltip 어나더: 자동으로 지우는 알림 리스트 (타이틀 regex) datemenu 왼쪽 레이아웃 오른쪽레이아웃, 메뉴 열지 않기 more dimmer option to hide widget header? 믹서 디바이스 변경 구현하기 ================================================ FILE: dirzsh.zsh ================================================ $ID:load() { lib:path-alloc2 "PATHALLOC_$ID" ./scripts : alias execute="ID=$ID $ID:execute" alias lg="ID=$ID $ID:lg" alias dbus-docker="ID=$ID $ID:dbus-docker" alias notify="ID=$ID $ID:notify" alias notify-test="ID=$ID $ID:notify-test" alias prefs="ID=$ID $ID:prefs" } $ID:unload() { lib:path-free "PATHALLOC_$ID" unalias execute unalias lg unalias dbus-docker unalias notify unalias notify-test unalias prefs } $ID:execute() { if [ -e ./host/vncready ]; then sudo docker compose exec -u gnome gnome-docker env DISPLAY=":0" DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus gdbus call -e -d org.gnome.Shell -o /org/gnome/Shell -m org.gnome.Shell.Eval "$1" else gdbus call -e -d org.gnome.Shell -o /org/gnome/Shell -m org.gnome.Shell.Eval "$1" fi } $ID:dbus-docker() { sudo docker compose exec -u gnome gnome-docker env DISPLAY=":0" DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus $@ } $ID:lg() { $ID:execute "Main.createLookingGlass().toggle()" } $ID:notify() { if [ -e ./host/vncready ]; then $ID:dbus-docker notify-send $@ else notify-send $@ fi } $ID:notify-test() { $ID:notify test testmessage -u normal -t 0 } $ID:prefs() { if [ -e ./host/vncready ]; then $ID:dbus-docker gnome-extensions prefs quick-settings-tweaks@qwreey else gnome-extensions prefs quick-settings-tweaks@qwreey fi } ================================================ FILE: docker-compose.example.yml ================================================ services: gnome-docker: container_name: gnome-docker hostname: gnome-docker build: ./host/gnome-docker environment: VNC_OPTION: -SecurityTypes=None -rfbunixpath /host/vncsocket -rfbport 5900 BEFORE_GNOME: "/extension/install.sh dev-guest" ROOTMODE: false XVFB_GPU: false XVFB_SCREEN_WIDTH: 1080 RDP_OPTION: "-auth /monitors:0" # Remote ports: # for rdp - 3389:3389 # for vnc - 5900:5900 # For systemd security_opt: - seccomp:unconfined - apparmor:unconfined cgroup: host # Mounts volumes: # Systemd requirements - type: tmpfs target: /tmp - type: tmpfs target: /run - /sys/fs/cgroup:/sys/fs/cgroup:ro - /sys/fs/cgroup/system.slice:/sys/fs/cgroup/system.slice:rw # Host dir - ./host:/host:rw - ./:/extension - ./host/home:/home/gnome ================================================ FILE: install.sh ================================================ #!/usr/bin/env bash cd "$(dirname "$(readlink -f "$0")")" function update-po() { build echo '' > messages.po [ "$?" != "0" ] && echo "update-po: Unable to create ./messages.po file" && return 1 which xgettext 2>/dev/null >/dev/null [ "$?" != "0" ] && echo "update-po: xgettext is not installed on this system. please install and try again" && return 1 find ./target/out -type f \( -name "*.ui" -or -name "*.js" \) | xgettext --from-code utf-8 -j messages.po -f - [ "$?" != "0" ] && echo "update-po: Unable to update messages.po file by xgettext" && return 1 sed -i 's|"Content\-Type: text/plain; charset=CHARSET\\n"|"Content-Type: text/plain; charset=UTF-8\\n"|g' messages.po [ "$?" != "0" ] && echo "update-po: Unable to set charset in messages.po file" && return 1 find ./po -type f -name "*.po" | xargs -i msgmerge {} messages.po -N --no-wrap -U [ "$?" != "0" ] && echo "update-po: Failed to update *.po files (msgmerge error)" && return 1 mv messages.po $(find ./po -type f -name "*.pot") [ "$?" != "0" ] && echo "update-po: Unable to move messages.po file (pot file not found)" && return 1 return 0 } function fetch-contributors() { LABELS=$(cat scripts/contributor-labels.json) echo "[" FIRST="1" curl -Ls "https://api.github.com/repos/qwreey/quick-settings-tweaks/contributors?per_page=16&page=1" | while read line; do if echo $line | grep -oP '^ *{ *$' > /dev/null; then [ "$FIRST" = "0" ] && echo -e "\t}," FIRST="0" echo -e "\t{" fi if NAME=$(echo $line | grep -oP '(?<="login": ").*(?=")'); then USER_LABEL=$(printf "%s" "$LABELS" | grep -oP "(?<=\"$NAME\": \").*(?=\")") echo -e "\t\t\"name\": \"$NAME\"," echo -e "\t\t\"image\": \"$NAME\"," echo -en "\t\t" echo "\"label\": \"${USER_LABEL:-ETC}\"," curl -Lso target/contributors/$NAME.png "https://github.com/$NAME.png?size=38" fi if HOMEPAGE=$(echo $line | grep -oP '(?<="html_url": ").*(?=")'); then echo -e "\t\t\"link\": \"$HOMEPAGE\"" fi done echo -e "\t}" echo "]" } function build() { rm -rf target/out mkdir -p target/out # Typescript compiling ( npx tsc --noCheck cp -r target/tsc/* target/out ) & TSC_PID=$! # Stylesheet compiling ( npx sass\ --no-source-map\ src/stylesheet.scss:target/out/stylesheet.css sed $'s/^ /\t/g' -i target/out/stylesheet.css ) & SASS_PID=$! # Fetch contributors & Copy assets ( if [ ! -e target/contributors ]; then mkdir -p target/contributors fetch-contributors > target/contributors/data.json fi cp metadata.json target/out cp -r schemas target/out cp -r media target/out cp -r target/contributors target/out/media ) & COPYING_PID=$! # Wait for tasks wait $TSC_PID wait $SASS_PID wait $COPYING_PID # Update config metadata case "$TARGET" in dev ) sed 's/isDevelopmentBuild: false/isDevelopmentBuild: true/' -i target/out/config.js ;; preview ) ;; release ) sed 's/isReleaseBuild: false/isReleaseBuild: true/' -i target/out/config.js ;; github-release ) sed 's/isReleaseBuild: false/isReleaseBuild: true/' -i target/out/config.js sed 's/isGithubBuild: false/isGithubBuild: true/' -i target/out/config.js ;; github-preview ) sed 's/isGithubBuild: false/isGithubBuild: true/' -i target/out/config.js ;; esac if [ -z "$VERSION" ]; then VERSION=$(git branch --show-current) fi sed "s/version: \"unknown\"/version: \"$VERSION\"/" -i target/out/config.js [ ! -z "$BUILD_NUMBER" ] && sed "s/buildNumber: 0/buildNumber: $BUILD_NUMBER/" -i target/out/config.js # Change indents for reducing size of target node scripts/reindent.js -- target/out/**/*.js # Pack extension gnome-extensions pack target/out\ --podir=../../po\ --extra-source=features\ --extra-source=libs\ --extra-source=prefPages\ --extra-source=media\ --extra-source=global.js\ --extra-source=config.js\ --out-dir=target\ --force [ "$?" != "0" ] && echo "Failed to pack extension" && return 1 return 0 } function enable() { gnome-extensions enable quick-settings-tweaks@qwreey } function install() { gnome-extensions install\ target/quick-settings-tweaks@qwreey.shell-extension.zip\ --force [ "$?" != "0" ] && echo "Failed to install extension" && return 1 echo "Extension was installed. logout and login shell, and check extension list." return 0 } function log() { journalctl /usr/bin/gnome-shell -f -q --output cat | grep '\[EXTENSION QSTweaks\] ' } function clear-old-po() { rm ./po/*.po~ } function compile-preferences() { glib-compile-schemas --targetdir=target/out/schemas schemas [ "$?" != "0" ] && echo "compile-preferences: glib-compile-schemas command failed" && return 1 return 0 } function increase-middle-version() { echo $(( $(cat scripts/version/latest-middle-version) + 1 )) > scripts/version/latest-middle-version echo $(( $(cat scripts/version/latest-build-number) + 1 )) > scripts/version/latest-build-number echo 1 > scripts/version/latest-minor-version } function increase-minor-version() { echo $(( $(cat scripts/version/latest-build-number) + 1 )) > scripts/version/latest-build-number echo $(( $(cat scripts/version/latest-minor-version) + 1 )) > scripts/version/latest-minor-version } function get-full-version() { VERSION_MAJOR=$(cat scripts/version/major-version) VERSION_MIDDLE=$(cat scripts/version/latest-middle-version) VERSION_MINOR=$(cat scripts/version/latest-minor-version) BUILD_NUMBER=$(cat scripts/version/latest-build-number) VERSION_TAG="" case "$TARGET" in dev ) VERSION_TAG="-dev$VERSION_MINOR" ;; preview ) VERSION_TAG="-pre$VERSION_MINOR" ;; release ) VERSION_TAG="" ;; github-release ) VERSION_TAG="" ;; github-preview ) VERSION_TAG="-pre$VERSION_MINOR" ;; esac VERSION="$VERSION_MAJOR.$VERSION_MIDDLE$VERSION_TAG" } function update-metadata-version() { get-full-version sed 's| *"version-name": *"[^"]*",| "version-name": "'$VERSION'",|g' -i metadata.json } function create-release() { get-full-version update-metadata-version VERSION=$VERSION BUILD_NUMBER=$BUILD_NUMBER build cp target/quick-settings-tweaks@qwreey.shell-extension.zip target/$VERSION-$TARGET.zip } function dev() { if ! sudo echo > /dev/null; then return fi mkdir -p host [ -e host/extension-ready ] && rm host/extension-ready mkfifo host/extension-ready [ -e host/extension-build ] && rm host/extension-build mkfifo host/extension-build # Build ( TARGET="${TARGET:-dev}" create-release echo > host/extension-ready ) & # Watch Build Request read -d '' INNER_BUILDWATCH << EOF cat host/extension-build > /dev/null while true; do cat host/extension-build > /dev/null if [ ! -e host/vncready ]; then break fi TARGET="\${TARGET:-dev}" create-release echo > host/extension-ready done EOF setsid bash -c "$INNER_BUILDWATCH" & BUILDWATCH_PID=$! [ ! -e ./docker-compose.yml ] && cp ./docker-compose.example.yml ./docker-compose.yml CURTAG="" if [ -e "./host/gnome-docker" ]; then CURTAG="$(git -C host/gnome-docker describe --tags --always --abbrev=0 HEAD)" else git clone https://github.com/qwreey/gnome-docker host/gnome-docker --recursive --tags fi TARTAG="$(cat scripts/version/gnome-docker-version)" if [[ "$CURTAG" != "$TARTAG" ]]; then git -C host/gnome-docker pull origin master --tags git -C host/gnome-docker submodule update git -C host/gnome-docker checkout "$TARTAG" sudo docker compose -f ./docker-compose.yml build fi COMPOSEFILE="./docker-compose.yml" ./host/gnome-docker/test.sh rm host/extension-build host/extension-ready kill $BUILDWATCH_PID 2> /dev/null wait $BUILDWATCH_PID exit 0 } function dev-guest() { echo > /host/extension-build cat /host/extension-ready > /dev/null install enable } function usage() { echo 'Usage: ./install.sh COMMAND' echo 'COMMAND:' echo " install install the extension in the user's home directory" echo ' under ~/.local' echo ' build Creates a zip file of the extension' echo ' update-po Update po files to match source files' echo ' dev Run dev docker' echo ' log show extension logs (live)' echo ' clear-old-po clear *.po~' echo ' enable enable extension' echo ' install-enable install and enable' echo ' compile-preferences compile schema file (test)' } case "$1" in "install" ) install ;; "install-enable" ) install enable ;; "build" ) build ;; "log" ) log ;; "update-po" ) update-po ;; "clear-old-po" ) clear-old-po ;; "enable" ) enable ;; "dev" ) dev ;; "dev-guest" ) dev-guest ;; "compile-preferences") compile-preferences ;; "increase-minor-version") increase-minor-version ;; "increase-middle-version") increase-middle-version ;; "update-metadata-version") update-metadata-version ;; "create-release") create-release ;; * ) usage ;; esac exit ================================================ FILE: media/Changelog.md ================================================ # 2.3-stable {{HEADER}} - Drop gnome 48 support - Add support for gnome 49 - Remove dnd quick toggle (now gnome support it natively) - Add 'overlay-menu-overflow-anchor' option for adjust overlay menu box overflowing ## Fix - VolumeMixer widget - Fix already been disposed warning # 2.2-stable {{HEADER}} - Drop gnome 46, 47 support - Add support for gnome 48 - Remove non-compatible feature - Date Menu - Hide Media Control - Hide Notifications ## Fix - Weather widget - Fix 'already disposed' warning - DND Toggle - Fix missing icon when it's turned off by PR #191 - Notification - Better padding for Native notifications clear button by PR #184 - Fix settings names by PR #183 # 2.1-stable {{HEADER}} - Layout editor shows only useful items > For example, a DND quick toggle only appears when enabled - Migration for gnome 48 (partially) - 'vertical' property migration - Fix some typescript type errors - Update locales - Add github sponsor (replace original one) ## New Features - Menu animation - Add background brightness option - Weather widget - Add show or hide location label option - Add max forecasts option - Add weather interval option - System Indicators - Monochrome option for privacy indicators ## Fix - System Indicators - Fix accent indicators color not match with shell accent color - Weather widget - Fix status label style - Fix project name # 2.1-pre7 {{HEADER}} - Improve ordering editors - Update locale files - Migration for gnome 48 (partially) - Media widget: Lowered GNOME Shell API dependency for backwards compatibility ## New Features - Quick toggle layout - Add GType name filter option - Now you can hide 'Unsorted items' - System indicators layout - Add ordering and hiding option - Add accent screen sharing & recording indicators option - Add accent privacy indicators option ## Fix - Default value optimization for menu animation - Fix broken scrollbar padding - Fix mixer description only shows 'Playback Stream' - Fix smooth scroll cause scrolling issue on media widget - Fix mixer widget menu section initial state - Fix #170, some quick toggles are not hiding - Fix 'has been already disposed' error on weather widget - Fix '(intermediate value).Extension.features is null' error when extension unloading # 2.1-pre6 {{HEADER}} - Reduce reloading cost ## New Features - Media widget - Add adjust smooth scroll speed option - Overlay menu - Smoother animation - Better animation start offset for flyout style - Volume mixer widget - Add show stream icon option - Add attach menu to output slider option ## Fix - Media widget - Fix 'event.moveStartCoords is undefined' error # 2.1-pre5 {{HEADER}} - List the license in more detail - Weather feature is now stable ## New Features - Media widget - Add round clip effect detailed option - Support trackpad and trackpoint smooth scroll - Date menu - Add hide left box option - Add hide right box option - Add menu disable option - Add menu button hide option - VolumeMixer widget - Migrated from 1.18 ## Fix - Fix 'st_widget_get_theme_node called on the widget which is not in the stage' issue ## Prefs QOL patch - Add detailed button on some options # 2.1-pre4 {{HEADER}} - Changelog viewer enchantments - Show build number, git hash, and date in detailed view ## New Features - Media widget - Add gradient background option - Add progress bar style option - Add contorl button opacity option - Implement swipe to switch page - Implement round clip effect to make transition better - Weather widget - Add click command option - Debugging - Expose features ## Fix - Fix gnome-shell segfault on dragging media widget - Media widget - Fix page indicator click action ## New Licenses - rounded-window-corners - Auther: yilozt - URL: https://github.com/yilozt/rounded-window-corners # 2.1-pre3 {{HEADER}} - Update repo url in metadata ## New Features - Option to hide dnd indicator completely - Debugging - Use better logging format - Add logging level option - Add extension environment expose option - Notifications widget - Add vfade offset option - Add scrollbar visibility option ## Fix - Fix 'PageIndicators has been already disposed' issue - Add more promise catch handlers and source naming for debugging - Removed fixStScrollViewScrollbarOverflow, use vscrollbar_policy instead ## Known issues - Cannot hide keyboard quick toggle # 2.1-pre2 {{HEADER}} ## New Features - Add quick toggle ordering and hiding - Add page indicator on media widget - Add DND indicator position option - Add save last session state option on unsafe mode quick toggle ## Fix - Fix changelog text align - Fix pref page scroll flickering issue - Fix weather widget empty when no location selected issue ## Prefs QOL patch - Move contributor rows to dialog # 2.1-pre1 {{HEADER}} - **Droped gnome-shell 43 and 44 support COMPLETELY** due to ESM incompatible - Using major.middle.minor version system - Using girs and typescript, for better development - New stable, github-stable, github-preview release channel ## Shell version bump shell-version >= 45, >= 48 ## Prefs QOL patch - Some space rich option groups are now using bottom sheet layout - Add button for reset modified options - Organize about section - Add changelogs subpage ## New Features - Reorder and hide system items - Reanimate menu, overlay menu mode - Weather widget ## Known issues - Sometime, the media progress bar displayed even should't be displayed - Weather widget shows empty box when region wasn't selected ================================================ FILE: media/dbus.xml ================================================ ================================================ FILE: media/licenses.json ================================================ [ { "licenseUri": "https://github.com/qwreey/quick-settings-tweaks/blob/master/LICENSE", "name": "quick-settings-tweaks", "author": "qwreey", "url": "https://github.com/qwreey/quick-settings-tweaks", "licenseSummary": "LGPL v3.0" }, { "licenseUri": "https://gitlab.gnome.org/GNOME/gnome-shell/-/blob/main/COPYING", "name": "gnome-shell", "author": "gnome", "url": "https://gitlab.gnome.org/GNOME/gnome-shell", "licenseSummary": "GPL v2" }, { "licenseUri": "https://github.com/microsoft/TypeScript/blob/main/LICENSE.txt", "name": "TypeScript", "author": "microsoft", "url": "https://www.typescriptlang.org", "description": "Typescript compiler", "licenseSummary": "Apache License 2.0" }, { "licenseUri": "https://github.com/gjsify/gnome-shell/blob/main/LICENSE", "name": "girs", "author": "gisify", "url": "https://github.com/gjsify/gnome-shell", "description": "Gnome shell typescript types", "licenseSummary": "MIT License" }, { "licenseUri": "https://github.com/sass/dart-sass/blob/main/LICENSE", "name": "sass", "url": "https://sass-lang.com/", "description": "Stylesheet pre-processor", "licenseSummary": "MIT License" }, { "name": "gnome-volume-mixer", "author": "mymindstorm", "url": "https://github.com/mymindstorm/gnome-volume-mixer", "licenseUri": "https://github.com/mymindstorm/gnome-volume-mixer/blob/master/LICENSE", "description": "Volume mixer widget", "affectedFiles": [ "features/widget/volumeMixer.ts" ], "licenseSummary": "MIT License" }, { "licenseUri": "https://github.com/yilozt/rounded-window-corners/blob/main/LICENSE", "name": "rounded-window-corners", "author": "yilozt", "url": "https://github.com/yilozt/rounded-window-corners", "affectedFiles": [ "media/rounded_corners.frag", "libs/roundClip.ts" ], "description": "Round clip shader" } ] ================================================ FILE: media/rounded_corners.frag ================================================ // This shader is copied from Mutter project: // https://gitlab.gnome.org/GNOME/mutter/-/blob/main/src/compositor/meta-background-content.c // // With a litte change to make it works well with windows // The uniforms variables for controls uniform vec4 bounds; // x, y: top left; z, w: bottom right uniform float clip_radius; uniform vec4 inner_bounds; uniform float inner_clip_radius; uniform vec2 pixel_step; uniform float border_width; uniform vec4 border_color; uniform float exponent; float circle_bounds(vec2 p, vec2 center, float clip_radius) { vec2 delta = p - vec2(center.x, center.y); float dist_squared = dot(delta, delta); // Fully outside the circle float outer_radius = clip_radius + 0.5; if(dist_squared >= (outer_radius * outer_radius)) return 0.0; // Fully inside the circle float inner_radius = clip_radius - 0.5; if(dist_squared <= (inner_radius * inner_radius)) return 1.0; // Only pixels on the edge of the curve need expensive antialiasing return outer_radius - sqrt(dist_squared); } float squircle_bounds(vec2 p, vec2 center, float clip_radius, float exponent) { vec2 delta = abs(p - center); float pow_dx = pow(delta.x, exponent); float pow_dy = pow(delta.y, exponent); float dist = pow(pow_dx + pow_dy, 1.0 / exponent); return clamp(clip_radius - dist + 0.5, 0.0, 1.0); } float rounded_rect_coverage(vec2 p, vec4 bounds, float clip_radius, float exponent) { // Outside the bounds if(p.x < bounds.x || p.x > bounds.z || p.y < bounds.y || p.y > bounds.w) { return 0.0; } vec2 center; float center_left = bounds.x + clip_radius; float center_right = bounds.z - clip_radius; if(p.x < center_left) center.x = center_left; else if(p.x > center_right) center.x = center_right; else return 1.0; // The vast majority of pixels exit early here float center_top = bounds.y + clip_radius; float center_bottom = bounds.w - clip_radius; if(p.y < center_top) center.y = center_top; else if(p.y > center_bottom) center.y = center_bottom; else return 1.0; if(exponent <= 2.0) { return circle_bounds(p, center, clip_radius); } else { return squircle_bounds(p, center, clip_radius, exponent); } } void main() { vec2 texture_coord = cogl_tex_coord0_in.xy / pixel_step; float outer_alpha = rounded_rect_coverage(texture_coord, bounds, clip_radius, exponent); if(border_width > 0.9 || border_width < -0.9) { float inner_alpha = rounded_rect_coverage(texture_coord, inner_bounds, inner_clip_radius, exponent); float border_alpha = clamp(abs(outer_alpha - inner_alpha), 0.0, 1.0); if (border_width > 0.0) { // Clip corners of window first cogl_color_out *= outer_alpha; // Then mix Rounded window and border cogl_color_out = mix(cogl_color_out, vec4(border_color.rgb, 1.0), border_alpha * border_color.a); } else { // Fill an rounded rectangle with border color first vec4 border_rect = vec4(border_color.rgb, 1.0) * inner_alpha * border_color.a; // Then mix rounded window and border, rounded window is smaller than border_rect cogl_color_out = mix(border_rect, cogl_color_out, outer_alpha); } } else { cogl_color_out *= outer_alpha; } } ================================================ FILE: metadata.json ================================================ { "name": "Quick Settings Tweaks", "uuid": "quick-settings-tweaks@qwreey", "description": "Let's tweak gnome's quick settings! You can add Media Controls, Notifications, Volume Mixer on quick settings and remove useless buttons!", "shell-version": ["48", "49"], "url": "https://github.com/qwreey/quick-settings-tweaks", "settings-schema": "org.gnome.shell.extensions.quick-settings-tweaks", "gettext-domain": "quick-settings-tweaks", "version-name": "2.2-pre1", "donations": { "github": "qwreey" } } ================================================ FILE: old/features/volumeMixer.ts ================================================ import { featureReloader } from "../libs/utility.js" import { VolumeMixer } from "../libs/volumeMixerHandler.js" import { Global } from "../global.js" export class VolumeMixerFeature { load() { let settings = Global.Settings // setup reloader featureReloader.enableWithSettingKeys(this, [ "volume-mixer-enabled", "volume-mixer-position", "volume-mixer-filtered-apps", "volume-mixer-show-description", "volume-mixer-show-icon", "volume-mixer-filter-mode", "volume-mixer-use-regex", "volume-mixer-check-description" ]) // check is feature enabled if (!Global.Settings.get_boolean("volume-mixer-enabled")) return // Make volume mixer this.volumeMixer = new VolumeMixer({ 'volume-mixer-filtered-apps': settings.get_strv("volume-mixer-filtered-apps"), 'volume-mixer-filter-mode': settings.get_string("volume-mixer-filter-mode"), 'volume-mixer-show-description': settings.get_boolean("volume-mixer-show-description"), 'volume-mixer-show-icon': settings.get_boolean("volume-mixer-show-icon"), 'volume-mixer-check-description': settings.get_boolean("volume-mixer-check-description"), 'volume-mixer-use-regex': settings.get_boolean("volume-mixer-use-regex") }) // Insert volume mixer into Quick Settings Global.QuickSettingsMenu.addItem(this.volumeMixer.actor, 2) if (Global.Settings.get_string("volume-mixer-position") === "top") { Global.GetStreamSlider(({ InputStreamSlider }) => { Global.QuickSettingsMenu._grid.set_child_above_sibling( this.volumeMixer.actor, InputStreamSlider ) }) } } unload() { // disable feature reloader featureReloader.disable(this) if (this.volumeMixer) this.volumeMixer.destroy() this.volumeMixer = null } } ================================================ FILE: old/inputOutput.ts ================================================ import { Global } from "./global.js" import St from "gi://St" import * as Volume from "resource:///org/gnome/shell/ui/status/volume.js" import * as PopupMenu from "resource:///org/gnome/shell/ui/popupMenu.js" import { FeatureBase, type SettingLoader } from "./libs/shell/feature.js" import { logger } from "./libs/shared/logger.js" export class SoundTweakFeature extends FeatureBase { // #region settings outputShowSelected: boolean inputShowSelected: boolean inputAlwaysShow: boolean outputHide: {name: string}[] inputHide: {name: string}[] loadSettings(loader: SettingLoader): void { this.outputShowSelected = loader.loadBoolean("sound-output-show-selected") this.inputShowSelected = loader.loadBoolean("sound-input-show-selected") this.inputAlwaysShow = loader.loadBoolean("sound-input-always-show") this.outputHide = loader.loadValue("sound-output-hide") this.inputHide = loader.loadValue("sound-input-hide") } // #endregion settings onLoad() { if (this.outputShowSelected) { const label = this.maid.destroyJob(new St.Label({ style_class: "QSTWEAKS-volume-mixer-label" })) Global.QuickSettingsMenu.addItem(label, 2) Global.GetStreamSlider().then(({ OutputStreamSlider }) => { Global.QuickSettingsGrid.set_child_below_sibling(label, OutputStreamSlider) }).catch(logger.error) } } onUnload(): void {} } unload() { // disable feature reloader featureReloader.disable(this) if (this._inputListener) { this._detachInputLabel() Volume.getMixerControl().disconnect(this._inputListener) this._inputListener = null } if (this._inputVisibilityListener) { let inputVisibilityListener = this._inputVisibilityListener this._inputVisibilityListener = null Global.GetStreamSlider(({ InputStreamSlider }) => { InputStreamSlider.disconnect(inputVisibilityListener) InputStreamSlider.visible = InputStreamSlider._shouldBeVisible() }) } if (this._outputListener) { this._detachOutputLabel() Volume.getMixerControl().disconnect(this._outputListener) this._outputListener = null } } // =========================================== Ouput =========================================== _setupOutputChangedListener() { this._attachOutputLabel() this._outputListener = Volume.getMixerControl().connect('active-output-update', (c, id) => this._onOutputDeviceChanged(id)) } _onOutputDeviceChanged(deviceId) { const device = Volume.getMixerControl().lookup_output_id(deviceId) this.outputLabel.text = this._getDeviceName(device) } _attachOutputLabel() { this.outputLabel = new St.Label() this.outputLabel.style_class = "QSTWEAKS-volume-mixer-label" Global.QuickSettingsMenu.addItem(this.outputLabel, 2) this.outputLabel.visible = Global.Settings.get_boolean("output-show-selected") Global.GetStreamSlider(({ OutputStreamSlider }) => { Global.QuickSettingsGrid.set_child_below_sibling(this.outputLabel, OutputStreamSlider) this.outputLabel.text = this._findActiveDevice(OutputStreamSlider) }) } _detachOutputLabel() { if (this.outputLabel && this.outputLabel.get_parent()) { this.outputLabel.get_parent().remove_child(this.outputLabel) this.outputLabel = null } } // =========================================== Input =========================================== _setupInputChangedListener() { this._attachInputLabel() this._inputListener = Volume.getMixerControl().connect('active-input-update', (c, id) => this._onInputDeviceChanged(id)) } _attachInputLabel() { this.inputLabel = new St.Label() this.inputLabel.style_class = "QSTWEAKS-volume-mixer-label" Global.QuickSettingsMenu.addItem(this.inputLabel, 2) Global.GetStreamSlider(({ InputStreamSlider }) => { Global.QuickSettingsGrid.set_child_below_sibling(this.inputLabel, InputStreamSlider) this.inputLabel.text = this._findActiveDevice(InputStreamSlider) }) this._setInputLabelVisibility() } _onInputDeviceChanged(deviceId) { const device = Volume.getMixerControl().lookup_input_id(deviceId) this.inputLabel.text = this._getDeviceName(device) } _detachInputLabel() { if (this.inputLabel && this.inputLabel.get_parent()) { this.inputLabel.get_parent().remove_child(this.inputLabel) this.inputLabel = null } } // =========================================== Input Visbility =========================================== _setupInputVisibilityObserver() { Global.GetStreamSlider(({ InputStreamSlider }) => { this._inputVisibilityListener = InputStreamSlider.connect("notify::visible", () => this._onInputStreamSliderSynced()) this._onInputStreamSliderSynced() }) } _onInputStreamSliderSynced() { this._setInputStreamSliderVisibility() if (this._inputListener) { this._setInputLabelVisibility() } } _setInputStreamSliderVisibility() { Global.GetStreamSlider(({ InputStreamSlider }) => { InputStreamSlider.visible = InputStreamSlider._shouldBeVisible() || Global.Settings.get_boolean("input-always-show") }) } _setInputLabelVisibility() { Global.GetStreamSlider(({ InputStreamSlider }) => { this.inputLabel.visible = InputStreamSlider.visible && Global.Settings.get_boolean("input-show-selected") }) } // =========================================== Utils =========================================== _findActiveDevice(sliderObject) { // find the current selected input and grab the input text from that let menuChildren = sliderObject.menu.box.get_children()[1].get_children() for (let index = 0; index < menuChildren.length; index++) { let item = menuChildren[index] if (item._ornament == PopupMenu.Ornament.CHECK) { return item.label.text } } return null } _getDeviceName(device) { if (!device) return const { description, origin } = device const name = origin ? `${description} – ${origin}` : description return name } } ================================================ FILE: old/layoutCustomize.ts ================================================ import St from "gi://St" import { Global } from "../global.js" import { FeatureBase, type SettingLoader } from "../libs/feature.js" import { QuickMenuToggle } from "resource:///org/gnome/shell/ui/quickSettings.js" export class LayoutCustomize extends FeatureBase { _scroll: St.ScrollView _sections: St.BoxLayout // #region settings override loadSettings(loader: SettingLoader): void { } // #endregion settings onChild(actor: QuickMenuToggle) { actor.get_parent().remove_child(actor) this._sections.add_child(actor) } checkChildren() { for (const item of Global.QuickSettingsGrid.get_children()) { if (item instanceof QuickMenuToggle) this.onChild(item) } } update() { } override onLoad(): void { Global.QuickSettingsBox.vertical = false // Global.QuickSettingsBox.add_child( // new St.Button({height: 100, width: 100, style: "background-color:red;"}) // ) this.maid.connectJob( Global.QuickSettingsBox, "notify::mapped", ()=>{ if (Global.QuickSettingsBox.mapped) this.update() } ) } override onUnload(): void { Global.QuickSettingsBox.vertical = true } } ================================================ FILE: old/libs/streamSlider.ts ================================================ import GObject from "gi://GObject" import Gio from "gi://Gio" import GLib from "gi://GLib" import Gvc from "gi://Gvc" import { QuickSlider } from "resource:///org/gnome/shell/ui/quickSettings.js" import * as PopupMenu from "resource:///org/gnome/shell/ui/popupMenu.js" const ALLOW_AMPLIFIED_VOLUME_KEY = 'allow-volume-above-100-percent' class StreamSlider extends QuickSlider { _init(control) { super._init() this._connections = [] // ADDED BY QWREEY this._control = control this._inDrag = false this._notifyVolumeChangeId = 0 this._soundSettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.sound', }) // MODED BY QWREEY this._connections.push([ this._soundSettings, this._soundSettings.connect(`changed::${ALLOW_AMPLIFIED_VOLUME_KEY}`, () => this._amplifySettingsChanged()) ]) this._amplifySettingsChanged() this._sliderChangedId = this.slider.connect('notify::value', () => this._sliderChanged()) this._connections.push([ // ADDED BY QWREEY this.slider, this._sliderChangedId ]) this._connections.push([ // MODED BY QWREEY this.slider, this.slider.connect('drag-begin', () => (this._inDrag = true)) ]) this._connections.push([ // MODED BY QWREEY this.slider, this.slider.connect('drag-end', () => { this._inDrag = false this._notifyVolumeChange() }) ]) this._deviceItems = new Map() this._deviceSection = new PopupMenu.PopupMenuSection() this.menu.addMenuItem(this._deviceSection) this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()) this.menu.addSettingsAction(_('Sound Settings'), 'gnome-sound-panel.desktop') this._stream = null this._volumeCancellable = null this._icons = [] this._sync() this._connections.push([ // ADDED BY QWREEY this, this.connect('destroy', this._destroy.bind(this)) ]) } get stream() { return this._stream } set stream(stream) { this._stream?.disconnectObject(this) this._stream = stream if (this._stream) { this._connectStream(this._stream) this._updateVolume() } else { this.emit('stream-updated') } this._sync() } _connectStream(stream) { stream.connectObject( 'notify::is-muted', this._updateVolume.bind(this), 'notify::volume', this._updateVolume.bind(this), this) } _lookupDevice(_id) { throw new GObject.NotImplementedError( `_lookupDevice in ${this.constructor.name}`) } _activateDevice(_device) { throw new GObject.NotImplementedError( `_activateDevice in ${this.constructor.name}`) } _addDevice(id) { if (this._deviceItems.has(id)) return const device = this._lookupDevice(id) if (!device) return const { description, origin } = device const name = origin ? `${description} – ${origin}` : description const item = new PopupMenu.PopupImageMenuItem(name, device.get_gicon()) this._connections.push([ item, item.connect('activate', () => this._activateDevice(device)) ]) this._deviceSection.addMenuItem(item) this._deviceItems.set(id, item) this._sync() } _removeDevice(id) { this._deviceItems.get(id)?.destroy() if (this._deviceItems.delete(id)) this._sync() } _setActiveDevice(activeId) { for (const [id, item] of this._deviceItems) { item.setOrnament(id === activeId ? PopupMenu.Ornament.CHECK : PopupMenu.Ornament.NONE) } } _shouldBeVisible() { return this._stream != null } _sync() { this.visible = this._shouldBeVisible() this.menuEnabled = this._deviceItems.size > 1 } _sliderChanged() { if (!this._stream) return let value = this.slider.value let volume = value * this._control.get_vol_max_norm() let prevMuted = this._stream.is_muted let prevVolume = this._stream.volume if (volume < 1) { this._stream.volume = 0 if (!prevMuted) this._stream.change_is_muted(true) } else { this._stream.volume = volume if (prevMuted) this._stream.change_is_muted(false) } this._stream.push_volume() let volumeChanged = this._stream.volume !== prevVolume if (volumeChanged && !this._notifyVolumeChangeId && !this._inDrag) { this._notifyVolumeChangeId = GLib.timeout_add(GLib.PRIORITY_DEFAULT, 30, () => { this._notifyVolumeChange() this._notifyVolumeChangeId = 0 return GLib.SOURCE_REMOVE }) GLib.Source.set_name_by_id(this._notifyVolumeChangeId, '[gnome-shell] this._notifyVolumeChangeId') } } _notifyVolumeChange() { if (this._volumeCancellable) this._volumeCancellable.cancel() this._volumeCancellable = null if (this._stream.state === Gvc.MixerStreamState.RUNNING) return // feedback not necessary while playing this._volumeCancellable = new Gio.Cancellable() let player = global.display.get_sound_player() player.play_from_theme('audio-volume-change', _('Volume changed'), this._volumeCancellable) } _changeSlider(value) { this.slider.block_signal_handler(this._sliderChangedId) this.slider.value = value this.slider.unblock_signal_handler(this._sliderChangedId) } _updateVolume() { let muted = this._stream.is_muted this._changeSlider(muted ? 0 : this._stream.volume / this._control.get_vol_max_norm()) this.emit('stream-updated') } _amplifySettingsChanged() { this._allowAmplified = this._soundSettings.get_boolean(ALLOW_AMPLIFIED_VOLUME_KEY) this.slider.maximum_value = this._allowAmplified ? this.getMaxLevel() : 1 if (this._stream) this._updateVolume() } getIcon() { if (!this._stream) return null let volume = this._stream.volume let n if (this._stream.is_muted || volume <= 0) { n = 0 } else { n = Math.ceil(3 * volume / this._control.get_vol_max_norm()) n = Math.clamp(n, 1, this._icons.length - 1) } return this._icons[n] } getLevel() { if (!this._stream) return null return this._stream.volume / this._control.get_vol_max_norm() } getMaxLevel() { let maxVolume = this._control.get_vol_max_norm() if (this._allowAmplified) maxVolume = this._control.get_vol_max_amplified() return maxVolume / this._control.get_vol_max_norm() } // ADDED BY QWREEY _destroy() { GLib.Source.remove(this._notifyVolumeChangeId) for (const item of this._connections) { item[0].disconnect(item[1]) } this._connections = null } } GObject.registerClass({ Signals: { 'stream-updated': {}, }, }, StreamSlider) ================================================ FILE: old/libs/volumeMixerHandlerNotImpled.ts ================================================ /* * This code is partially licensed under the gnome-volume-mixer license. * For more details, please check the license page in the about tab of the extension settings. */ import St from "gi://St" import Gvc from "gi://Gvc" import GObject from "gi://GObject" import Gio from "gi://Gio" import GLib from "gi://GLib" import { QuickSlider } from "resource:///org/gnome/shell/ui/quickSettings.js" import * as PopupMenu from "resource:///org/gnome/shell/ui/popupMenu.js" import * as Volume from "resource:///org/gnome/shell/ui/status/volume.js" import Maid from "./libs/maid.js" const ALLOW_AMPLIFIED_VOLUME_KEY = 'allow-volume-above-100-percent' // 디바이스 변경 구현하기 // 루프는 오직 컨테이너가 보이는 상태에서만 작동해야함 class StreamSlider extends QuickSlider { _init(control: Gvc.MixerControl, stream: Gvc.MixerStream) { // ... this._maid.connectJob(this.slider, "drag-begin", () => { this._inDrag = true }) this._maid.connectJob(this.slider, "drag-end", () => { this._inDrag = false }) // this._deviceItems = new Map() // this._deviceSection = new PopupMenu.PopupMenuSection() // this.menu.addMenuItem(this._deviceSection) this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()) this.menu.addSettingsAction(_('Sound Settings'), 'gnome-sound-panel.desktop') // ... } // ... _connectStream(stream: Gvc.MixerStream) { } // ... // _lookupDevice(_id) { // throw new GObject.NotImplementedError( // `_lookupDevice in ${this.constructor.name}`) // } // _activateDevice(_device) { // throw new GObject.NotImplementedError( // `_activateDevice in ${this.constructor.name}`) // } // _addDevice(id) { // if (this._deviceItems.has(id)) // return // const device = this._lookupDevice(id) // if (!device) // return // const { description, origin } = device // const name = origin // ? `${description} – ${origin}` // : description // const item = new PopupMenu.PopupImageMenuItem(name, device.get_gicon()) // this._connections.push([ // item, // item.connect('activate', () => this._activateDevice(device)) // ]) // this._deviceSection.addMenuItem(item) // this._deviceItems.set(id, item) // this._sync() // } // _removeDevice(id) { // this._deviceItems.get(id)?.destroy() // if (this._deviceItems.delete(id)) // this._sync() // } // _setActiveDevice(activeId) { // for (const [id, item] of this._deviceItems) { // item.setOrnament(id === activeId // ? PopupMenu.Ornament.CHECK // : PopupMenu.Ornament.NONE) // } // } // ... _shouldBeVisible() { return this._stream != null } // not used getIcon() { if (!this._stream) return null let volume = this._stream.volume let n if (this._stream.is_muted || volume <= 0) { n = 0 } else { n = Math.ceil(3 * volume / this._control.get_vol_max_norm()) n = Math.clamp(n, 1, this._icons.length - 1) } return this._icons[n] } } ================================================ FILE: old/menus.ts ================================================ // Sound output menu // Sound input menu // Bluetooth // Wifi // VPN // Power mode (detailed?) // Wired // Hide item from... ================================================ FILE: old/other.ts ================================================ import Adw from "gi://Adw" import GObject from "gi://GObject" import Gio from "gi://Gio" import { gettext as _ } from "resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js" import Config from "../config.js" import type QstExtensionPreferences from "../prefs.js" import { Group, SwitchRow, fixPageScrollIssue, } from "../libs/prefComponents.js" export const OtherPage = GObject.registerClass({ GTypeName: Config.baseGTypeName+"OtherPage", }, class OtherPage extends Adw.PreferencesPage { constructor(settings: Gio.Settings, _prefs: QstExtensionPreferences, window: Adw.PreferencesWindow) { super({ name: "Other", title: _("Other"), iconName: "preferences-system-symbolic", }) fixPageScrollIssue(this) } }) ================================================ FILE: old/panel.ts ================================================ ================================================ FILE: old/prefsPages/volumeMixer.ts ================================================ import Adw from "gi://Adw" import Gtk from "gi://Gtk" import GObject from "gi://GObject" import Gio from "gi://Gio" import { gettext as _ } from "resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js" import { baseGTypeName, SwitchRow, makeDropdown } from "../libs/prefComponents.js" export const VolumeMixerAddFilterDialog = GObject.registerClass({ GTypeName: baseGTypeName+'VolumeMixerAddFilterDialog', }, class VolumeMixerAddFilterDialog extends Gtk.Dialog { appNameEntry filterListData constructor(callingWidget, filterListData) { super({ use_header_bar: true, transient_for: callingWidget.get_root(), destroy_with_parent: true, modal: true, resizable: false, title: _("Add Application to filtering") }) this.filterListData = filterListData const addButton = this.add_button(_("Add"), Gtk.ResponseType.OK) addButton.get_style_context().add_class('suggested-action') addButton.sensitive = false this.add_button(_("Cancel"), Gtk.ResponseType.CANCEL) const dialogContent = this.get_content_area() dialogContent.margin_top = 20 dialogContent.margin_bottom = 20 dialogContent.margin_end = 20 dialogContent.margin_start = 20 const appNameLabel = new Gtk.Label({ label: _("Application name"), halign: Gtk.Align.START, margin_bottom: 10 }) dialogContent.append(appNameLabel) this.appNameEntry = new Gtk.Entry() this.appNameEntry.connect('activate', () => { if (this.checkInputValid()) { this.response(Gtk.ResponseType.OK) } }) dialogContent.append(this.appNameEntry) this.appNameEntry.connect("changed", () => { addButton.sensitive = this.checkInputValid() }) } checkInputValid() { if (this.appNameEntry.text.length === 0) { return false } else if (this.filterListData.indexOf(this.appNameEntry.text) !== -1) { return false } else { return true } } }) export const FilterMode = GObject.registerClass({ Properties: { 'name': GObject.ParamSpec.string( 'name', 'name', 'name', GObject.ParamFlags.READWRITE, null), 'value': GObject.ParamSpec.string( 'value', 'value', 'value', GObject.ParamFlags.READWRITE, null), }, }, class FilterMode extends GObject.Object { _init(name, value) { super._init({ name, value }) } }) export const volumeMixerPage = GObject.registerClass({ GTypeName: baseGTypeName+'volumeMixerPage', }, class volumeMixerPage extends Adw.PreferencesPage { constructor(settings) { // group config super({ name: 'volumeMixer', title: _('Volume Mixer'), iconName: 'audio-volume-high-symbolic', }) this.settings = settings this.filterListData = this.settings.get_strv("volume-mixer-filtered-apps") const generalGroup = new Adw.PreferencesGroup({ title: _("General"), description: _("Enchant input/output slider") }) SwitchRow({ parent: generalGroup, title: _("Show current audio output selection"), value: settings.get_boolean("output-show-selected"), subtitle: _("Always show the current audio output selection above the volume slider"), bind: "output-show-selected] }) SwitchRow({ parent: generalGroup, title: _("Show current audio input selection"), value: settings.get_boolean("input-show-selected"), subtitle: _("Always show the current audio input selection above the volume slider"), bind: "input-show-selected] }) SwitchRow({ parent: generalGroup, title: _("Always show input"), value: settings.get_boolean("input-always-show"), subtitle: _("Always show the audio input volume slider, even when there is no audio input stream."), bind: "input-always-show] }) this.add(generalGroup) // volumeMixerGroup const volumeMixerGroup = new Adw.PreferencesGroup({ title: _("Add volume mixer (PulseAudio, Pipewire)"), description: _("Turn on to make the volume mixer visible\nForked from https://github.com/mymindstorm/gnome-volume-mixer"), headerSuffix: SwitchRow({ title: "", value: settings.get_boolean("volume-mixer-enabled"), bind: "volume-mixer-enabled", }) }) makeDropdown({ // move to bottom parent: volumeMixerGroup, title: _("Position"), subtitle: _("Set volume mixer position"), value: this.settings.get_string('volume-mixer-position'), type: "string", bind: [this.settings, 'volume-mixer-position'], items: [ {name: _("Top (Below Output/Input slider)"), value: "top"}, {name: _("Bottom"), value: "bottom"}, ], sensitiveBind: "volume-mixer-enabled", }) SwitchRow({ // show-description title: _('Show stream Description'), subtitle: _('Show audio stream description above the slider'), value: this.settings.get_boolean('volume-mixer-show-description'), parent: volumeMixerGroup, bind: [this.settings, 'volume-mixer-show-description'], sensitiveBind: "volume-mixer-enabled", }) SwitchRow({ // show-icon title: _('Show stream Icon'), subtitle: _('Show application icon in front of the slider'), value: this.settings.get_boolean('volume-mixer-show-icon'), parent: volumeMixerGroup, bind: [this.settings, 'volume-mixer-show-icon'], sensitiveBind: "volume-mixer-enabled", }) this.add(volumeMixerGroup) // Application filter settings group const filterGroup = new Adw.PreferencesGroup({ title: "", description: _('Filter applications shown in the volume mixer.'), }) this.add(filterGroup) // filter-mode makeDropdown({ parent: filterGroup, title: _("Filter Mode"), value: this.settings.get_string('volume-mixer-filter-mode'), type: "string", bind: [this.settings, 'volume-mixer-filter-mode'], items: [ {name: _("Blacklist"), value: "block"}, {name: _("Whitelist"), value: "allow"}, ], sensitiveBind: "volume-mixer-enabled", }) SwitchRow({ parent: filterGroup, title: _('Using Javascript Regex'), subtitle: _('Use Javascript RegExp for filtering app name or description'), value: this.settings.get_boolean('volume-mixer-use-regex'), bind: [this.settings, 'volume-mixer-use-regex'], sensitiveBind: "volume-mixer-enabled", }) SwitchRow({ parent: filterGroup, title: _("Check Stream Description"), subtitle: _("Check Description also"), value: this.settings.get_boolean('volume-mixer-check-description'), bind: [this.settings, 'volume-mixer-check-description'], sensitiveBind: "volume-mixer-enabled", }) // group to act as spacer for filter list this.filteredAppsGroup = new Adw.PreferencesGroup() settings.bind( "volume-mixer-enabled", this.filteredAppsGroup,'sensitive', Gio.SettingsBindFlags.DEFAULT ) this.filteredAppsGroup.sensitive = settings.get_boolean("volume-mixer-enabled") this.add(this.filteredAppsGroup) // List of filtered apps for (const filteredAppName of this.filterListData) { this.filteredAppsGroup.add(this.buildFilterListRow(filteredAppName)) } // Add filter entry button this.createAddFilteredAppButtonRow() // TODO: modes // - group by application // - group by application but as a dropdown with streams // - show all streams // TODO: go thru github issues // popularity: page 26, 5th from the top // TODO: style } createAddFilteredAppButtonRow() { // I wanted to use Adw.PrefrencesRow, but you can't get the 'row-activated' signal unless it's part of a Gtk.ListBox. // Adw.PrefrencesGroup doesn't extend Gtk.ListBox. // TODO: Learn a less hacky to do this. I'm currently too new to GTK to know the best practice. this.addFilteredAppButtonRow = new Adw.ActionRow() const addIcon = Gtk.Image.new_from_icon_name("list-add") addIcon.height_request = 40 this.addFilteredAppButtonRow.set_child(addIcon) this.filteredAppsGroup.add(this.addFilteredAppButtonRow) // It won't send 'activated' signal w/o this being set. this.addFilteredAppButtonRow.activatable_widget = addIcon this.addFilteredAppButtonRow.connect('activated', (callingWidget) => { this.showFilteredAppDialog(callingWidget, this.filterListData) }) } buildFilterListRow(filteredAppName) { const filterListRow = new Adw.PreferencesRow({ title: filteredAppName, activatable: false, }) // Make box for custom row const filterListBox = new Gtk.Box({ margin_bottom:6, margin_top: 6, margin_end: 15, margin_start: 15 }) // Add title const filterListLabel = Gtk.Label.new(filterListRow.title) filterListLabel.hexpand = true filterListLabel.halign = Gtk.Align.START filterListBox.append(filterListLabel) // Add remove button const filterListButton = new Gtk.Button({ halign: Gtk.Align.END }) // Add icon to remove button const filterListImage = Gtk.Image.new_from_icon_name("user-trash-symbolic") filterListButton.set_child(filterListImage) // Tie action to remove button filterListButton.connect("clicked", (_button) => this.removeFilteredApp(filteredAppName, filterListRow)) filterListBox.append(filterListButton) filterListRow.set_child(filterListBox) return filterListRow } removeFilteredApp(filteredAppName, filterListRow) { this.filterListData.splice(this.filterListData.indexOf(filteredAppName), 1) this.settings.set_strv("volume-mixer-filtered-apps", this.filterListData) this.filteredAppsGroup.remove(filterListRow) } addFilteredApp(filteredAppName) { this.filterListData.push(filteredAppName) this.settings.set_strv("volume-mixer-filtered-apps", this.filterListData) this.filteredAppsGroup.remove(this.addFilteredAppButtonRow) this.filteredAppsGroup.add(this.buildFilterListRow(filteredAppName)) this.filteredAppsGroup.add(this.addFilteredAppButtonRow) } showFilteredAppDialog(callingWidget, filterListData) { const dialog = new VolumeMixerAddFilterDialog(callingWidget, filterListData) dialog.connect('response', (_dialog, response) => { if (response === Gtk.ResponseType.OK) { this.addFilteredApp(dialog.appNameEntry.text) } dialog.close() dialog.destroy() }) dialog.show() } }) ================================================ FILE: old/sidebarPrefs.ts ================================================ import Gtk from "gi://Gtk" import Gdk from "gi://Gdk" import Gio from "gi://Gio" import Adw from "gi://Adw" import { ExtensionPreferences } from "resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js" import { gettext as _ } from "resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js" import { WidgetsPage } from "./prefPages/widgets.js" import { TogglesPage } from "./prefPages/toggles.js" import { OtherPage } from "./prefPages/other.js" import { AboutPage } from "./prefPages/about.js" import { MenuPage } from "./prefPages/menu.js" import { ContributorsRow, LicenseRow, Row, Group } from "./libs/prefComponents.js" import Config from "./config.js" var pageList = [ WidgetsPage, TogglesPage, MenuPage, OtherPage, AboutPage, ] export default class QstExtensionPreferences extends ExtensionPreferences { appendIconPath(path: string) { const iconTheme = Gtk.IconTheme.get_for_display(Gdk.Display.get_default()) if (!iconTheme.get_search_path().includes(path)) iconTheme.add_search_path(path) } readExtensionFile(path: string) { const decoder = new TextDecoder() const file = Gio.File.new_for_path(`${this.path}/${path}`) const content = file.load_contents(null)[1] return decoder.decode(content) } getContributorRows(): ContributorsRow.Contributor[][] { const contributors = JSON.parse( this.readExtensionFile("media/contributors/data.json") ) as ContributorsRow.Contributor[] if (!contributors.length) return [] const rows: ContributorsRow.Contributor[][] = [[]] contributors.reduce((currentRow: ContributorsRow.Contributor[], obj: ContributorsRow.Contributor)=>{ if (currentRow.length >= 4) rows.push(currentRow = []) currentRow.push(obj) return currentRow }, rows[0]) return rows } getLicenses(): LicenseRow.License[] { const licenses = JSON.parse( this.readExtensionFile("media/licenses.json") ) as LicenseRow.License[] for (const item of licenses) { if (item.file) { item.content = async () => this.readExtensionFile(item.file) } } return licenses } getVersionString(): string { let version = Config.version.toUpperCase().replace(/-.*?$/, "") if (this.metadata.version) { version += "." + this.metadata.version } version += " — " if (Config.isReleaseBuild) { version += _("Stable") } else if (Config.isDevelopmentBuild) { version += _("Development") } else { version += _("Preview") } if (Config.isGithubBuild) { version += " " + _("(Github Release)") } else if (!this.metadata.version) { version += " " + _("(Built from source)") } return version } getChangelog(): string { return this.readExtensionFile("media/Changelog.md") } async fillPreferencesWindow(window: Adw.PreferencesWindow) { let settings = this.getSettings() // Register icon path this.appendIconPath(this.path + "/media") this.appendIconPath(this.path + "/media/contributors") // Set window options window.set_search_enabled(true) window.set_default_size(720, 640) // Create sidebar area const sidebar = new Adw.NavigationPage({ title: this.metadata.name, width_request: 196, }) const sidebarToolbar = new Adw.ToolbarView() const sidebarHeader = new Adw.HeaderBar() sidebarToolbar.add_top_bar(sidebarHeader) sidebar.set_child(sidebarToolbar) const sidebarPage = new Adw.PreferencesPage() sidebarToolbar.set_content(sidebarPage) // Create content area const content = new Adw.NavigationPage({ title: "undefined" }) const contentToolbar = new Adw.ToolbarView() const contentHeader = new Adw.HeaderBar() contentToolbar.add_top_bar(contentHeader) content.set_child(contentToolbar) // Create navigation const navigation = new Adw.NavigationSplitView({ vexpand: true, hexpand: true, }) navigation.set_show_content(true) navigation.set_sidebar(sidebar) navigation.set_content(content) window.set_content(navigation) window.add(new Adw.PreferencesPage()) const open = (page: Adw.PreferencesPage) => { contentToolbar.content = page content.title = page.title } const sidebarGroup = Group({ parent: sidebarPage, }) for (const PageClass of pageList) { const page = new PageClass(settings, this, window) const row = Row({ parent: sidebarGroup, title: page.title, icon: page.iconName, noLinkIcon: true, action: ()=>{ open(page) } }) if (!contentToolbar.content) open(page) } } } ================================================ FILE: old/widgetManager.ts ================================================ import St from "gi://St" import { Global } from "../global.js" import Maid from "./maid.js" export class WidgetManager { _scroll: St.ScrollView _sections: St.BoxLayout _maid: Maid _boxes: St.BoxLayout[] update() { this._boxes[] } load(): void { this._maid = new Maid() Global.QuickSettingsBox.vertical = false this._maid.connectJob( Global.Settings, "changed::layout", this.update.bind(this) ) this._maid.connectJob( Global.QuickSettingsBox, "notify::mapped", ()=>{ if (Global.QuickSettingsBox.mapped) this.update() } ) } unload(): void { this._maid.destroy() Global.QuickSettingsBox.vertical = true } } ================================================ FILE: package.json ================================================ { "name": "quick-settings-tweaks", "description": "A TypeScript GNOME Extension", "version": "0.0.0", "author": { "email": "me@qwreey.moe", "name": "qwreey", "url": "https://github.com/qwreey" }, "type": "module", "sideEffects": false, "license": "LGPL-3.0-or-later", "homepage": "https://github.com/qwreey/quick-settings-tweaks#readme", "private": true, "bugs": { "url": "https://github.com/qwreey/quick-settings-tweaks/issues" }, "repository": { "type": "git", "url": "git+https://github.com/qwreey/quick-settings-tweaks.git" }, "devDependencies": { "sass": "^1.83.4", "typescript": "^5.7.3" }, "dependencies": { "@girs/gjs": "^4.0.0-beta.38", "@girs/gnome-shell": "^49.0.1" } } ================================================ FILE: po/ca.po ================================================ # AUTHORS # jcatfor https://github.com/jcatfor, 2023. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: 1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-07-20 15:34+0000\n" "Language: ca\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: target/out/libs/prefs/components.js:57 msgid "Details" msgstr "" #: target/out/libs/prefs/components.js:144 msgid "This feature marked as experimental" msgstr "" #: target/out/libs/prefs/components.js:274 msgid "Reset to default" msgstr "" #: target/out/libs/prefs/components.js:512 msgid "Theme default" msgstr "" #: target/out/libs/prefs/components.js:853 msgid "Homepage" msgstr "" #: target/out/libs/prefs/components.js:859 #: target/out/libs/prefs/components.js:863 target/out/prefPages/about.js:49 #: target/out/prefPages/about.js:51 target/out/prefPages/about.js:56 msgid "License" msgstr "" #: target/out/libs/prefs/components.js:860 msgid "Loading ..." msgstr "" #: target/out/libs/prefs/components.js:869 msgid "Affected Files" msgstr "" #: target/out/libs/prefs/components.js:924 msgid "Changelog" msgstr "" #: target/out/libs/prefs/components.js:938 msgid "(Current)" msgstr "" #: target/out/libs/prefs/components.js:969 #, javascript-format msgid "> **Date:** %s" msgstr "" #: target/out/libs/prefs/components.js:970 #, javascript-format msgid "> **Git Hash:** %s" msgstr "" #: target/out/libs/prefs/components.js:971 #, javascript-format msgid "> **Build Number:** %d" msgstr "" #: target/out/libs/prefs/components.js:1034 msgid "Padding" msgstr "" #: target/out/libs/prefs/components.js:1038 msgid "Top" msgstr "" #: target/out/libs/prefs/components.js:1049 msgid "Bottom" msgstr "" #: target/out/libs/prefs/components.js:1060 msgid "Left" msgstr "" #: target/out/libs/prefs/components.js:1071 msgid "Right" msgstr "" #: target/out/prefs.js:60 msgid "Stable" msgstr "" #: target/out/prefs.js:63 msgid "Development" msgstr "" #: target/out/prefs.js:66 msgid "Preview" msgstr "" #: target/out/prefs.js:69 msgid "(Github Release)" msgstr "" #: target/out/prefs.js:72 msgid "(Built from source)" msgstr "" #: target/out/features/widget/notifications.js:26 msgid "No Notifications" msgstr "" #: target/out/features/widget/notifications.js:58 #: target/out/features/widget/notifications.js:122 msgid "Clear" msgstr "" # Quick settings notifications title text # Notifications title #: target/out/features/widget/notifications.js:76 msgid "Notifications" msgstr "Notificacions" #: target/out/features/widget/notifications.js:105 #: target/out/features/toggle/dndQuickToggle.js:10 #: target/out/prefPages/layout.js:345 target/out/prefPages/layout.js:485 msgid "Do Not Disturb" msgstr "" #: target/out/features/widget/media.js:118 msgid "Unknown title" msgstr "" #: target/out/features/widget/media.js:888 msgid "Media" msgstr "" #: target/out/features/widget/volumeMixer.js:105 msgid "Volume changed" msgstr "" #: target/out/features/widget/volumeMixer.js:463 msgid "Open volumx mixer" msgstr "" #: target/out/features/widget/volumeMixer.js:480 msgid "Volume Mixer" msgstr "" #: target/out/features/widget/weather.js:73 msgid "Weather" msgstr "" #: target/out/features/widget/weather.js:192 msgid "Location has not been set" msgstr "" # Unsafe mode #: target/out/features/toggle/unsafeQuickToggle.js:11 #: target/out/prefPages/layout.js:346 target/out/prefPages/layout.js:496 msgid "Unsafe Mode" msgstr "Mode no segur" #: target/out/prefPages/widgets.js:11 msgid "Handle radius" msgstr "" #: target/out/prefPages/widgets.js:12 msgid "Set this to 0 to use default radius" msgstr "" #: target/out/prefPages/widgets.js:18 msgid "Handle color" msgstr "" #: target/out/prefPages/widgets.js:36 msgid "Slider style" msgstr "" #: target/out/prefPages/widgets.js:39 msgid "Slim" msgstr "" #: target/out/prefPages/widgets.js:40 target/out/prefPages/layout.js:766 msgid "Default" msgstr "" #: target/out/prefPages/widgets.js:48 target/out/prefPages/widgets.js:173 msgid "Background color" msgstr "" #: target/out/prefPages/widgets.js:55 msgid "Active Background color" msgstr "" #: target/out/prefPages/widgets.js:62 msgid "Thickness" msgstr "" #: target/out/prefPages/widgets.js:66 msgid "Set this to 0 to use default thickness" msgstr "" #: target/out/prefPages/widgets.js:76 msgid "Widgets" msgstr "" #: target/out/prefPages/widgets.js:83 target/out/prefPages/widgets.js:136 #: target/out/prefPages/widgets.js:162 target/out/prefPages/widgets.js:224 msgid "Media Widget" msgstr "" #: target/out/prefPages/widgets.js:88 msgid "Turn on to make the media widget visible on the Quick Settings panel" msgstr "" #: target/out/prefPages/widgets.js:92 target/out/prefPages/widgets.js:280 #: target/out/prefPages/widgets.js:343 msgid "Compact mode" msgstr "" #: target/out/prefPages/widgets.js:93 msgid "" "Make Media Controls widget smaller\n" "Make it more similar in size to the notification message" msgstr "" #: target/out/prefPages/widgets.js:99 msgid "Control buttons opacity" msgstr "" #: target/out/prefPages/widgets.js:100 msgid "Set this to 255 to make opaque, and 0 to make transparent" msgstr "" #: target/out/prefPages/widgets.js:108 msgid "Show next button" msgstr "" #: target/out/prefPages/widgets.js:109 msgid "Add next contorl button next to description" msgstr "" #: target/out/prefPages/widgets.js:115 msgid "Show previous button" msgstr "" #: target/out/prefPages/widgets.js:116 msgid "Add previous contorl button next to description" msgstr "" #: target/out/prefPages/widgets.js:122 msgid "Show pause button" msgstr "" #: target/out/prefPages/widgets.js:123 msgid "Add pause contorl button next to description" msgstr "" #: target/out/prefPages/widgets.js:129 target/out/prefPages/widgets.js:138 msgid "Show progress bar" msgstr "" #: target/out/prefPages/widgets.js:130 target/out/prefPages/widgets.js:139 msgid "Add progress bar under description" msgstr "" #: target/out/prefPages/widgets.js:155 target/out/prefPages/widgets.js:164 msgid "Gradient background" msgstr "" #: target/out/prefPages/widgets.js:156 target/out/prefPages/widgets.js:169 msgid "" "Use gradient background extracted from cover image\n" "May affect performance slightly" msgstr "" #: target/out/prefPages/widgets.js:174 msgid "Base background color" msgstr "" #: target/out/prefPages/widgets.js:182 msgid "Start opacity" msgstr "" #: target/out/prefPages/widgets.js:183 msgid "Adjust left side transparency, Set this to 1000 to make opaque" msgstr "" #: target/out/prefPages/widgets.js:190 msgid "Start color" msgstr "" #: target/out/prefPages/widgets.js:191 msgid "Adjust left side background color mixing, Set this to 1000 to show extracted color" msgstr "" #: target/out/prefPages/widgets.js:198 msgid "End opacity" msgstr "" #: target/out/prefPages/widgets.js:199 msgid "Adjust right side transparency, Set this to 1000 to make opaque" msgstr "" #: target/out/prefPages/widgets.js:206 msgid "End color" msgstr "" #: target/out/prefPages/widgets.js:207 msgid "Adjust right side background color mixing, Set this to 1000 to show extracted color" msgstr "" #: target/out/prefPages/widgets.js:216 target/out/prefPages/widgets.js:226 msgid "Round clip effect" msgstr "" #: target/out/prefPages/widgets.js:217 target/out/prefPages/widgets.js:231 msgid "Use round clip effect to make transition more natural" msgstr "" #: target/out/prefPages/widgets.js:234 msgid "Padding adjustment" msgstr "" #: target/out/prefPages/widgets.js:236 msgid "Adjust clip effect padding, edit this if your theme has a different margin or padding" msgstr "" #: target/out/prefPages/widgets.js:253 target/out/prefPages/widgets.js:318 #: target/out/prefPages/widgets.js:350 msgid "Remove shadow" msgstr "" #: target/out/prefPages/widgets.js:254 msgid "" "Remove shadow from media message\n" "Use if your theme creates unnecessary shadows" msgstr "" #: target/out/prefPages/widgets.js:260 msgid "Smooth scroll speed" msgstr "" #: target/out/prefPages/widgets.js:261 msgid "Adjust trackpad and trackpoint scroll speed, negative number for invert direction" msgstr "" #: target/out/prefPages/widgets.js:271 msgid "Notifications Widget" msgstr "" #: target/out/prefPages/widgets.js:276 msgid "Turn on to make the notifications widget visible on the Quick Settings panel" msgstr "" #: target/out/prefPages/widgets.js:281 msgid "Make notifications smaller" msgstr "" #: target/out/prefPages/widgets.js:287 target/out/prefPages/widgets.js:418 msgid "Max height" msgstr "" #: target/out/prefPages/widgets.js:288 #, javascript-format msgid "Set maximum height of the Notifications widget, default is %d. Set this to 0 to disable max height" msgstr "" #: target/out/prefPages/widgets.js:296 target/out/prefPages/widgets.js:441 msgid "Fade out offset" msgstr "" #: target/out/prefPages/widgets.js:297 target/out/prefPages/widgets.js:442 msgid "Set position of the fade out effect begins. Set this to 0 to disable fade out effect. default is 46" msgstr "" #: target/out/prefPages/widgets.js:304 msgid "Auto hide" msgstr "" #: target/out/prefPages/widgets.js:305 msgid "Hide the Notifications widget when have no notifications" msgstr "" #: target/out/prefPages/widgets.js:311 msgid "Use native controls" msgstr "" #: target/out/prefPages/widgets.js:312 msgid "Use native dnd switch and clear button" msgstr "" #: target/out/prefPages/widgets.js:319 msgid "" "Remove shadow from notification message\n" "Use if your theme creates unnecessary shadows" msgstr "" #: target/out/prefPages/widgets.js:325 target/out/prefPages/widgets.js:427 msgid "Show scrollbar" msgstr "" #: target/out/prefPages/widgets.js:326 msgid "Show scrollbar on message list" msgstr "" #: target/out/prefPages/widgets.js:334 msgid "Weather Widget" msgstr "" #: target/out/prefPages/widgets.js:339 msgid "Turn on to make the weather widget visible on the Quick Settings panel" msgstr "" #: target/out/prefPages/widgets.js:344 msgid "Make weather widget smaller" msgstr "" #: target/out/prefPages/widgets.js:351 msgid "" "Remove shadow from weather widget\n" "Use if your theme creates unnecessary shadows" msgstr "" #: target/out/prefPages/widgets.js:357 msgid "Click command" msgstr "" #: target/out/prefPages/widgets.js:363 msgid "Show location" msgstr "" #: target/out/prefPages/widgets.js:364 msgid "Show the location label on header" msgstr "" #: target/out/prefPages/widgets.js:373 msgid "Forecast interval" msgstr "" #: target/out/prefPages/widgets.js:374 msgid "Adjust forecast interval in hour" msgstr "" #: target/out/prefPages/widgets.js:381 msgid "Max forecasts" msgstr "" #: target/out/prefPages/widgets.js:382 msgid "Adjust max forecasts" msgstr "" #: target/out/prefPages/widgets.js:388 target/out/prefPages/widgets.js:456 msgid "Volume mixer Widget" msgstr "" #: target/out/prefPages/widgets.js:393 msgid "Turn on to make the volume mixer widget visible on the Quick Settings panel" msgstr "" #: target/out/prefPages/widgets.js:397 msgid "Label text" msgstr "" #: target/out/prefPages/widgets.js:398 msgid "Choose label above slider text source" msgstr "" #: target/out/prefPages/widgets.js:400 msgid "Both" msgstr "" #: target/out/prefPages/widgets.js:401 msgid "Title" msgstr "" #: target/out/prefPages/widgets.js:402 msgid "Description" msgstr "" #: target/out/prefPages/widgets.js:403 msgid "None" msgstr "" #: target/out/prefPages/widgets.js:411 msgid "Label opacity" msgstr "" #: target/out/prefPages/widgets.js:412 msgid "" "Adjust label opacity.\n" "Set this to 255 to make opaque, and 0 to make transparent" msgstr "" #: target/out/prefPages/widgets.js:419 #, javascript-format msgid "Set maximum height of the Volume mixer widget, default is %d. Set this to 0 to disable max height" msgstr "" #: target/out/prefPages/widgets.js:428 msgid "Show scrollbar on mixer list" msgstr "" #: target/out/prefPages/widgets.js:434 msgid "Show stream icon" msgstr "" #: target/out/prefPages/widgets.js:435 msgid "Show stream icon above mixer sliders" msgstr "" #: target/out/prefPages/widgets.js:450 target/out/prefPages/widgets.js:458 msgid "Attach to output slider" msgstr "" #: target/out/prefPages/widgets.js:451 target/out/prefPages/widgets.js:459 msgid "Attach volume mixer menu button to output slider. Use if you prefer compact layout" msgstr "" #: target/out/prefPages/widgets.js:468 msgid "Menu icon" msgstr "" #: target/out/prefPages/about.js:12 target/out/prefPages/about.js:32 msgid "About" msgstr "" #: target/out/prefPages/about.js:33 msgid "Common extension informations" msgstr "" #: target/out/prefPages/about.js:36 target/out/prefPages/about.js:40 msgid "Changelogs" msgstr "" #: target/out/prefPages/about.js:37 target/out/prefPages/about.js:41 msgid "View the change history for this extension" msgstr "" #: target/out/prefPages/about.js:50 target/out/prefPages/about.js:57 msgid "License of codes" msgstr "" #: target/out/prefPages/about.js:63 target/out/prefPages/about.js:65 #: target/out/prefPages/about.js:69 msgid "Contributors" msgstr "" #: target/out/prefPages/about.js:64 target/out/prefPages/about.js:70 msgid "The creators of this extension" msgstr "" #: target/out/prefPages/about.js:74 msgid "More contributors" msgstr "" #: target/out/prefPages/about.js:75 msgid "See more contributors on github" msgstr "" #: target/out/prefPages/about.js:85 msgid "Link" msgstr "" #: target/out/prefPages/about.js:86 msgid "External links about this extension" msgstr "" #: target/out/prefPages/about.js:90 msgid "Donate via github sponsors" msgstr "" #: target/out/prefPages/about.js:91 msgid "Support development!" msgstr "" #: target/out/prefPages/about.js:97 msgid "Rate and comment the extension!" msgstr "" #: target/out/prefPages/about.js:102 msgid "Github Repository" msgstr "" #: target/out/prefPages/about.js:103 msgid "" "Add Star on Repository is helping me a lot!\n" "Please, if you found bug from this extension, you can make issue to make me know that!\n" "Or, you can create PR with wonderful features!" msgstr "" #: target/out/prefPages/about.js:109 msgid "Add translation to this extension!" msgstr "" #: target/out/prefPages/about.js:115 msgid "Debug" msgstr "" #: target/out/prefPages/about.js:116 msgid "Extension debugging options" msgstr "" #: target/out/prefPages/about.js:120 msgid "Expose environment" msgstr "" #: target/out/prefPages/about.js:121 msgid "Expose extension environment to globalThis.qst" msgstr "" #: target/out/prefPages/about.js:126 msgid "Show layout border" msgstr "" #: target/out/prefPages/about.js:127 msgid "Show layout borders on Quick Settings" msgstr "" #: target/out/prefPages/about.js:132 msgid "Log level" msgstr "" #: target/out/prefPages/about.js:135 msgid "none" msgstr "" #: target/out/prefPages/about.js:136 msgid "error" msgstr "" #: target/out/prefPages/about.js:137 msgid "info" msgstr "" #: target/out/prefPages/about.js:138 msgid "debug" msgstr "" #: target/out/prefPages/toggles.js:12 msgid "Toggles" msgstr "" #: target/out/prefPages/toggles.js:19 msgid "DND Quick Toggle" msgstr "" #: target/out/prefPages/toggles.js:20 msgid "Turn on to add the DND quick toggle on the Quick Settings panel" msgstr "" #: target/out/prefPages/toggles.js:28 msgid "DND indicator position" msgstr "" #: target/out/prefPages/toggles.js:29 msgid "Set DND indicator position" msgstr "" #: target/out/prefPages/toggles.js:33 msgid "System Tray" msgstr "" #: target/out/prefPages/toggles.js:34 msgid "Date Menu Button" msgstr "" #: target/out/prefPages/toggles.js:41 msgid "Unsafe Mode Quick Toggle" msgstr "" #: target/out/prefPages/toggles.js:42 msgid "Turn on to add the unsafe quick toggle on the Quick Settings panel" msgstr "" #: target/out/prefPages/toggles.js:50 msgid "Save last session state" msgstr "" #: target/out/prefPages/toggles.js:51 msgid "Turn on to save last session unsafe state" msgstr "" #: target/out/prefPages/menu.js:9 target/out/prefPages/menu.js:141 msgid "Advanced animation style" msgstr "" #: target/out/prefPages/menu.js:13 msgid "Open Duration" msgstr "" #: target/out/prefPages/menu.js:14 msgid "Open animation duration in microseconds" msgstr "" #: target/out/prefPages/menu.js:21 msgid "Close Duration" msgstr "" #: target/out/prefPages/menu.js:22 msgid "Close animation duration in microseconds" msgstr "" #: target/out/prefPages/menu.js:29 msgid "Grid Content Opacity" msgstr "" #: target/out/prefPages/menu.js:30 msgid "" "Adjust grid content opacity.\n" "Set this to 255 to make opaque, and 0 to make transparent" msgstr "" #: target/out/prefPages/menu.js:37 msgid "Background Blur Radius" msgstr "" #: target/out/prefPages/menu.js:38 msgid "" "Adjust background blur radius.\n" "Set this to 0 to disable blur effect" msgstr "" #: target/out/prefPages/menu.js:45 msgid "Background Brightness" msgstr "" #: target/out/prefPages/menu.js:46 msgid "" "Adjust background brightness.\n" "Set this to 1000 to disable brightness control effect.\n" "Not impacts on gnome-shell's default dim effect." msgstr "" #: target/out/prefPages/menu.js:53 msgid "Background Opacity" msgstr "" #: target/out/prefPages/menu.js:54 msgid "" "Adjust background opacity.\n" "Set this to 255 to make opaque, and 0 to make transparent" msgstr "" #: target/out/prefPages/menu.js:61 msgid "Background X Scale" msgstr "" #: target/out/prefPages/menu.js:62 msgid "Adjust background x scale, 1000 means 1.0 scale" msgstr "" #: target/out/prefPages/menu.js:69 msgid "Background Y Scale" msgstr "" #: target/out/prefPages/menu.js:70 msgid "Adjust background y scale, 1000 means 1.0 scale" msgstr "" #: target/out/prefPages/menu.js:84 msgid "Menu" msgstr "" #: target/out/prefPages/menu.js:91 msgid "Overlay Mode" msgstr "" #: target/out/prefPages/menu.js:92 msgid "Display toggle, power, and sound menus as overlay" msgstr "" #: target/out/prefPages/menu.js:101 msgid "Overlay Width" msgstr "" #: target/out/prefPages/menu.js:102 msgid "" "Adjust overlay menu width\n" "Set this to 0 to disable adjusting" msgstr "" #: target/out/prefPages/menu.js:109 msgid "Overlay Animation Duration" msgstr "" #: target/out/prefPages/menu.js:110 msgid "" "Custom menu open animation duration in microseconds\n" "Set this to 0 to disable custom animation" msgstr "" #: target/out/prefPages/menu.js:117 msgid "Overlay Animation Style" msgstr "" #: target/out/prefPages/menu.js:118 msgid "Custom menu open animation style" msgstr "" #: target/out/prefPages/menu.js:120 msgid "Flyout" msgstr "" #: target/out/prefPages/menu.js:121 msgid "Dialog" msgstr "" #: target/out/prefPages/menu.js:130 target/out/prefPages/menu.js:143 msgid "Animation" msgstr "" #: target/out/prefPages/menu.js:131 msgid "" "Add menu animation on toggle menu opening and closing\n" "To get the best feel, turn on overlay mode" msgstr "" #: target/out/prefPages/menu.js:142 msgid "Adjust speed, blur, scale, and opacity" msgstr "" #: target/out/prefPages/layout.js:25 msgid "The item not found" msgstr "" #: target/out/prefPages/layout.js:28 msgid "No changes" msgstr "" #: target/out/prefPages/layout.js:31 msgid "The same item already exists" msgstr "" #: target/out/prefPages/layout.js:40 #, javascript-format msgid "Properties of %s" msgstr "" #: target/out/prefPages/layout.js:47 msgid "Save" msgstr "" #: target/out/prefPages/layout.js:64 msgid "Toggle editor" msgstr "" #: target/out/prefPages/layout.js:84 msgid "This option requires full gnome-shell reloading" msgstr "" #: target/out/prefPages/layout.js:160 target/out/prefPages/layout.js:278 #: target/out/prefPages/layout.js:437 target/out/prefPages/layout.js:672 msgid "Hide" msgstr "" #: target/out/prefPages/layout.js:232 #, javascript-format msgid "My item #%d" msgstr "" #: target/out/prefPages/layout.js:250 msgid "New Item" msgstr "" #: target/out/prefPages/layout.js:261 target/out/prefPages/layout.js:610 #: target/out/prefPages/layout.js:737 target/out/prefPages/layout.js:787 #: target/out/prefPages/layout.js:813 msgid "Ordering and Hiding" msgstr "" #: target/out/prefPages/layout.js:273 target/out/prefPages/layout.js:432 msgid "Friendly Name" msgstr "" #: target/out/prefPages/layout.js:283 msgid "Title Regex (Javascript Regex)" msgstr "" #: target/out/prefPages/layout.js:288 target/out/prefPages/layout.js:442 msgid "Constructor Name" msgstr "" #: target/out/prefPages/layout.js:294 target/out/prefPages/layout.js:448 msgid "GType Name" msgstr "" #: target/out/prefPages/layout.js:302 target/out/prefPages/layout.js:456 msgid "This is the comment for easy identification in the settings list. It has no effect on the behavior of the extension" msgstr "" #: target/out/prefPages/layout.js:307 target/out/prefPages/layout.js:461 msgid "Javascript constructor name" msgstr "" #: target/out/prefPages/layout.js:312 target/out/prefPages/layout.js:466 msgid "GObject gtype name. You can get this value by calling GObject.type_name_from_instance" msgstr "" #: target/out/prefPages/layout.js:342 msgid "Keyboard Backlight" msgstr "" #: target/out/prefPages/layout.js:388 target/out/prefPages/layout.js:538 msgid "Unordered items" msgstr "" #: target/out/prefPages/layout.js:486 msgid "Remote Access Applet" msgstr "" #: target/out/prefPages/layout.js:487 msgid "Camera" msgstr "" #: target/out/prefPages/layout.js:488 msgid "Volume Input" msgstr "" #: target/out/prefPages/layout.js:489 msgid "Location" msgstr "" #: target/out/prefPages/layout.js:490 msgid "Thunderbolt" msgstr "" #: target/out/prefPages/layout.js:492 msgid "Network" msgstr "" #: target/out/prefPages/layout.js:495 msgid "Volume Output" msgstr "" #: target/out/prefPages/layout.js:497 msgid "System (Battery)" msgstr "" #: target/out/prefPages/layout.js:618 msgid "Desktop Spacer" msgstr "" #: target/out/prefPages/layout.js:629 msgid "Laptop Spacer" msgstr "" #: target/out/prefPages/layout.js:641 msgid "Capture button" msgstr "" #: target/out/prefPages/layout.js:647 msgid "Settings button" msgstr "" #: target/out/prefPages/layout.js:653 msgid "Lock button" msgstr "" #: target/out/prefPages/layout.js:659 msgid "Shutdown button" msgstr "" #: target/out/prefPages/layout.js:665 msgid "Battery button" msgstr "" #: target/out/prefPages/layout.js:711 msgid "Layout" msgstr "" #: target/out/prefPages/layout.js:718 msgid "Quick Toggles Layout" msgstr "" #: target/out/prefPages/layout.js:719 target/out/prefPages/layout.js:734 msgid "Adjust quick toggles layout" msgstr "" #: target/out/prefPages/layout.js:738 msgid "Reorder and hide quick toggles" msgstr "" #: target/out/prefPages/layout.js:745 msgid "System Indicators" msgstr "" #: target/out/prefPages/layout.js:746 msgid "Adjust system indicators layout and style" msgstr "" #: target/out/prefPages/layout.js:751 msgid "Accent screen sharing indicator" msgstr "" #: target/out/prefPages/layout.js:752 msgid "Use shell accent color on screen sharing indicator" msgstr "" #: target/out/prefPages/layout.js:757 msgid "Accent screen recording indicator" msgstr "" #: target/out/prefPages/layout.js:758 msgid "Use shell accent color on screen recording indicator" msgstr "" #: target/out/prefPages/layout.js:763 msgid "Privacy indicators style" msgstr "" #: target/out/prefPages/layout.js:764 msgid "Use monochrome or shell accent color on privarcy indicators" msgstr "" #: target/out/prefPages/layout.js:767 msgid "Accent" msgstr "" #: target/out/prefPages/layout.js:768 msgid "Monochrome" msgstr "" #: target/out/prefPages/layout.js:777 msgid "Adjust system indicators" msgstr "" #: target/out/prefPages/layout.js:788 msgid "Reorder and hide system indicators" msgstr "" #: target/out/prefPages/layout.js:795 msgid "System Items Layout" msgstr "" #: target/out/prefPages/layout.js:800 target/out/prefPages/layout.js:815 msgid "Adjust system items layout" msgstr "" #: target/out/prefPages/layout.js:804 msgid "Hide layout box" msgstr "" #: target/out/prefPages/layout.js:805 msgid "Hide all buttons and layout box" msgstr "" #: target/out/prefPages/layout.js:814 msgid "Reorder and hide system items" msgstr "" #: target/out/prefPages/layout.js:823 msgid "Date Menu" msgstr "" #: target/out/prefPages/layout.js:824 msgid "Adjust Date Menu layout" msgstr "" #: target/out/prefPages/layout.js:828 msgid "Hide left box" msgstr "" #: target/out/prefPages/layout.js:829 msgid "Hide the left box of the date menu, which contains notifications and media control" msgstr "" #: target/out/prefPages/layout.js:834 msgid "Hide right box" msgstr "" #: target/out/prefPages/layout.js:835 msgid "Hide the right box of the date menu, which contains calendar, world clock and weather" msgstr "" #: target/out/prefPages/layout.js:840 msgid "Disable menu" msgstr "" #: target/out/prefPages/layout.js:841 msgid "Do not open date menu when the date menu button clicked" msgstr "" ================================================ FILE: po/cs.po ================================================ # AUTHORS # ondra05 https://github.com/ondra05, 2023. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: 1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-07-20 15:34+0000\n" "Language: en\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: target/out/libs/prefs/components.js:57 msgid "Details" msgstr "" #: target/out/libs/prefs/components.js:144 msgid "This feature marked as experimental" msgstr "" #: target/out/libs/prefs/components.js:274 msgid "Reset to default" msgstr "" #: target/out/libs/prefs/components.js:512 msgid "Theme default" msgstr "" #: target/out/libs/prefs/components.js:853 msgid "Homepage" msgstr "" #: target/out/libs/prefs/components.js:859 #: target/out/libs/prefs/components.js:863 target/out/prefPages/about.js:49 #: target/out/prefPages/about.js:51 target/out/prefPages/about.js:56 msgid "License" msgstr "" #: target/out/libs/prefs/components.js:860 msgid "Loading ..." msgstr "" #: target/out/libs/prefs/components.js:869 msgid "Affected Files" msgstr "" #: target/out/libs/prefs/components.js:924 msgid "Changelog" msgstr "" #: target/out/libs/prefs/components.js:938 msgid "(Current)" msgstr "" #: target/out/libs/prefs/components.js:969 #, javascript-format msgid "> **Date:** %s" msgstr "" #: target/out/libs/prefs/components.js:970 #, javascript-format msgid "> **Git Hash:** %s" msgstr "" #: target/out/libs/prefs/components.js:971 #, javascript-format msgid "> **Build Number:** %d" msgstr "" #: target/out/libs/prefs/components.js:1034 msgid "Padding" msgstr "" #: target/out/libs/prefs/components.js:1038 msgid "Top" msgstr "" #: target/out/libs/prefs/components.js:1049 msgid "Bottom" msgstr "" #: target/out/libs/prefs/components.js:1060 msgid "Left" msgstr "" #: target/out/libs/prefs/components.js:1071 msgid "Right" msgstr "" #: target/out/prefs.js:60 msgid "Stable" msgstr "" #: target/out/prefs.js:63 msgid "Development" msgstr "" #: target/out/prefs.js:66 msgid "Preview" msgstr "" #: target/out/prefs.js:69 msgid "(Github Release)" msgstr "" #: target/out/prefs.js:72 msgid "(Built from source)" msgstr "" #: target/out/features/widget/notifications.js:26 msgid "No Notifications" msgstr "" #: target/out/features/widget/notifications.js:58 #: target/out/features/widget/notifications.js:122 msgid "Clear" msgstr "" # Quick settings notifications title text #: target/out/features/widget/notifications.js:76 msgid "Notifications" msgstr "Upozornění" #: target/out/features/widget/notifications.js:105 #: target/out/features/toggle/dndQuickToggle.js:10 #: target/out/prefPages/layout.js:345 target/out/prefPages/layout.js:485 msgid "Do Not Disturb" msgstr "" #: target/out/features/widget/media.js:118 msgid "Unknown title" msgstr "" #: target/out/features/widget/media.js:888 msgid "Media" msgstr "" #: target/out/features/widget/volumeMixer.js:105 msgid "Volume changed" msgstr "" #: target/out/features/widget/volumeMixer.js:463 msgid "Open volumx mixer" msgstr "" #: target/out/features/widget/volumeMixer.js:480 msgid "Volume Mixer" msgstr "" #: target/out/features/widget/weather.js:73 msgid "Weather" msgstr "" #: target/out/features/widget/weather.js:192 msgid "Location has not been set" msgstr "" #: target/out/features/toggle/unsafeQuickToggle.js:11 #: target/out/prefPages/layout.js:346 target/out/prefPages/layout.js:496 msgid "Unsafe Mode" msgstr "" #: target/out/prefPages/widgets.js:11 msgid "Handle radius" msgstr "" #: target/out/prefPages/widgets.js:12 msgid "Set this to 0 to use default radius" msgstr "" #: target/out/prefPages/widgets.js:18 msgid "Handle color" msgstr "" #: target/out/prefPages/widgets.js:36 msgid "Slider style" msgstr "" #: target/out/prefPages/widgets.js:39 msgid "Slim" msgstr "" #: target/out/prefPages/widgets.js:40 target/out/prefPages/layout.js:766 msgid "Default" msgstr "" #: target/out/prefPages/widgets.js:48 target/out/prefPages/widgets.js:173 msgid "Background color" msgstr "" #: target/out/prefPages/widgets.js:55 msgid "Active Background color" msgstr "" #: target/out/prefPages/widgets.js:62 msgid "Thickness" msgstr "" #: target/out/prefPages/widgets.js:66 msgid "Set this to 0 to use default thickness" msgstr "" #: target/out/prefPages/widgets.js:76 msgid "Widgets" msgstr "" #: target/out/prefPages/widgets.js:83 target/out/prefPages/widgets.js:136 #: target/out/prefPages/widgets.js:162 target/out/prefPages/widgets.js:224 msgid "Media Widget" msgstr "" #: target/out/prefPages/widgets.js:88 msgid "Turn on to make the media widget visible on the Quick Settings panel" msgstr "" #: target/out/prefPages/widgets.js:92 target/out/prefPages/widgets.js:280 #: target/out/prefPages/widgets.js:343 msgid "Compact mode" msgstr "" #: target/out/prefPages/widgets.js:93 msgid "" "Make Media Controls widget smaller\n" "Make it more similar in size to the notification message" msgstr "" #: target/out/prefPages/widgets.js:99 msgid "Control buttons opacity" msgstr "" #: target/out/prefPages/widgets.js:100 msgid "Set this to 255 to make opaque, and 0 to make transparent" msgstr "" #: target/out/prefPages/widgets.js:108 msgid "Show next button" msgstr "" #: target/out/prefPages/widgets.js:109 msgid "Add next contorl button next to description" msgstr "" #: target/out/prefPages/widgets.js:115 msgid "Show previous button" msgstr "" #: target/out/prefPages/widgets.js:116 msgid "Add previous contorl button next to description" msgstr "" #: target/out/prefPages/widgets.js:122 msgid "Show pause button" msgstr "" #: target/out/prefPages/widgets.js:123 msgid "Add pause contorl button next to description" msgstr "" #: target/out/prefPages/widgets.js:129 target/out/prefPages/widgets.js:138 msgid "Show progress bar" msgstr "" #: target/out/prefPages/widgets.js:130 target/out/prefPages/widgets.js:139 msgid "Add progress bar under description" msgstr "" #: target/out/prefPages/widgets.js:155 target/out/prefPages/widgets.js:164 msgid "Gradient background" msgstr "" #: target/out/prefPages/widgets.js:156 target/out/prefPages/widgets.js:169 msgid "" "Use gradient background extracted from cover image\n" "May affect performance slightly" msgstr "" #: target/out/prefPages/widgets.js:174 msgid "Base background color" msgstr "" #: target/out/prefPages/widgets.js:182 msgid "Start opacity" msgstr "" #: target/out/prefPages/widgets.js:183 msgid "Adjust left side transparency, Set this to 1000 to make opaque" msgstr "" #: target/out/prefPages/widgets.js:190 msgid "Start color" msgstr "" #: target/out/prefPages/widgets.js:191 msgid "Adjust left side background color mixing, Set this to 1000 to show extracted color" msgstr "" #: target/out/prefPages/widgets.js:198 msgid "End opacity" msgstr "" #: target/out/prefPages/widgets.js:199 msgid "Adjust right side transparency, Set this to 1000 to make opaque" msgstr "" #: target/out/prefPages/widgets.js:206 msgid "End color" msgstr "" #: target/out/prefPages/widgets.js:207 msgid "Adjust right side background color mixing, Set this to 1000 to show extracted color" msgstr "" #: target/out/prefPages/widgets.js:216 target/out/prefPages/widgets.js:226 msgid "Round clip effect" msgstr "" #: target/out/prefPages/widgets.js:217 target/out/prefPages/widgets.js:231 msgid "Use round clip effect to make transition more natural" msgstr "" #: target/out/prefPages/widgets.js:234 msgid "Padding adjustment" msgstr "" #: target/out/prefPages/widgets.js:236 msgid "Adjust clip effect padding, edit this if your theme has a different margin or padding" msgstr "" #: target/out/prefPages/widgets.js:253 target/out/prefPages/widgets.js:318 #: target/out/prefPages/widgets.js:350 msgid "Remove shadow" msgstr "" #: target/out/prefPages/widgets.js:254 msgid "" "Remove shadow from media message\n" "Use if your theme creates unnecessary shadows" msgstr "" #: target/out/prefPages/widgets.js:260 msgid "Smooth scroll speed" msgstr "" #: target/out/prefPages/widgets.js:261 msgid "Adjust trackpad and trackpoint scroll speed, negative number for invert direction" msgstr "" #: target/out/prefPages/widgets.js:271 msgid "Notifications Widget" msgstr "" #: target/out/prefPages/widgets.js:276 msgid "Turn on to make the notifications widget visible on the Quick Settings panel" msgstr "" #: target/out/prefPages/widgets.js:281 msgid "Make notifications smaller" msgstr "" #: target/out/prefPages/widgets.js:287 target/out/prefPages/widgets.js:418 msgid "Max height" msgstr "" #: target/out/prefPages/widgets.js:288 #, javascript-format msgid "Set maximum height of the Notifications widget, default is %d. Set this to 0 to disable max height" msgstr "" #: target/out/prefPages/widgets.js:296 target/out/prefPages/widgets.js:441 msgid "Fade out offset" msgstr "" #: target/out/prefPages/widgets.js:297 target/out/prefPages/widgets.js:442 msgid "Set position of the fade out effect begins. Set this to 0 to disable fade out effect. default is 46" msgstr "" #: target/out/prefPages/widgets.js:304 msgid "Auto hide" msgstr "" #: target/out/prefPages/widgets.js:305 msgid "Hide the Notifications widget when have no notifications" msgstr "" #: target/out/prefPages/widgets.js:311 msgid "Use native controls" msgstr "" #: target/out/prefPages/widgets.js:312 msgid "Use native dnd switch and clear button" msgstr "" #: target/out/prefPages/widgets.js:319 msgid "" "Remove shadow from notification message\n" "Use if your theme creates unnecessary shadows" msgstr "" #: target/out/prefPages/widgets.js:325 target/out/prefPages/widgets.js:427 msgid "Show scrollbar" msgstr "" #: target/out/prefPages/widgets.js:326 msgid "Show scrollbar on message list" msgstr "" #: target/out/prefPages/widgets.js:334 msgid "Weather Widget" msgstr "" #: target/out/prefPages/widgets.js:339 msgid "Turn on to make the weather widget visible on the Quick Settings panel" msgstr "" #: target/out/prefPages/widgets.js:344 msgid "Make weather widget smaller" msgstr "" #: target/out/prefPages/widgets.js:351 msgid "" "Remove shadow from weather widget\n" "Use if your theme creates unnecessary shadows" msgstr "" #: target/out/prefPages/widgets.js:357 msgid "Click command" msgstr "" #: target/out/prefPages/widgets.js:363 msgid "Show location" msgstr "" #: target/out/prefPages/widgets.js:364 msgid "Show the location label on header" msgstr "" #: target/out/prefPages/widgets.js:373 msgid "Forecast interval" msgstr "" #: target/out/prefPages/widgets.js:374 msgid "Adjust forecast interval in hour" msgstr "" #: target/out/prefPages/widgets.js:381 msgid "Max forecasts" msgstr "" #: target/out/prefPages/widgets.js:382 msgid "Adjust max forecasts" msgstr "" #: target/out/prefPages/widgets.js:388 target/out/prefPages/widgets.js:456 msgid "Volume mixer Widget" msgstr "" #: target/out/prefPages/widgets.js:393 msgid "Turn on to make the volume mixer widget visible on the Quick Settings panel" msgstr "" #: target/out/prefPages/widgets.js:397 msgid "Label text" msgstr "" #: target/out/prefPages/widgets.js:398 msgid "Choose label above slider text source" msgstr "" #: target/out/prefPages/widgets.js:400 msgid "Both" msgstr "" #: target/out/prefPages/widgets.js:401 msgid "Title" msgstr "" #: target/out/prefPages/widgets.js:402 msgid "Description" msgstr "" #: target/out/prefPages/widgets.js:403 msgid "None" msgstr "" #: target/out/prefPages/widgets.js:411 msgid "Label opacity" msgstr "" #: target/out/prefPages/widgets.js:412 msgid "" "Adjust label opacity.\n" "Set this to 255 to make opaque, and 0 to make transparent" msgstr "" #: target/out/prefPages/widgets.js:419 #, javascript-format msgid "Set maximum height of the Volume mixer widget, default is %d. Set this to 0 to disable max height" msgstr "" #: target/out/prefPages/widgets.js:428 msgid "Show scrollbar on mixer list" msgstr "" #: target/out/prefPages/widgets.js:434 msgid "Show stream icon" msgstr "" #: target/out/prefPages/widgets.js:435 msgid "Show stream icon above mixer sliders" msgstr "" #: target/out/prefPages/widgets.js:450 target/out/prefPages/widgets.js:458 msgid "Attach to output slider" msgstr "" #: target/out/prefPages/widgets.js:451 target/out/prefPages/widgets.js:459 msgid "Attach volume mixer menu button to output slider. Use if you prefer compact layout" msgstr "" #: target/out/prefPages/widgets.js:468 msgid "Menu icon" msgstr "" #: target/out/prefPages/about.js:12 target/out/prefPages/about.js:32 msgid "About" msgstr "" #: target/out/prefPages/about.js:33 msgid "Common extension informations" msgstr "" #: target/out/prefPages/about.js:36 target/out/prefPages/about.js:40 msgid "Changelogs" msgstr "" #: target/out/prefPages/about.js:37 target/out/prefPages/about.js:41 msgid "View the change history for this extension" msgstr "" #: target/out/prefPages/about.js:50 target/out/prefPages/about.js:57 msgid "License of codes" msgstr "" #: target/out/prefPages/about.js:63 target/out/prefPages/about.js:65 #: target/out/prefPages/about.js:69 msgid "Contributors" msgstr "" #: target/out/prefPages/about.js:64 target/out/prefPages/about.js:70 msgid "The creators of this extension" msgstr "" #: target/out/prefPages/about.js:74 msgid "More contributors" msgstr "" #: target/out/prefPages/about.js:75 msgid "See more contributors on github" msgstr "" #: target/out/prefPages/about.js:85 msgid "Link" msgstr "" #: target/out/prefPages/about.js:86 msgid "External links about this extension" msgstr "" #: target/out/prefPages/about.js:90 msgid "Donate via github sponsors" msgstr "" #: target/out/prefPages/about.js:91 msgid "Support development!" msgstr "" #: target/out/prefPages/about.js:97 msgid "Rate and comment the extension!" msgstr "" #: target/out/prefPages/about.js:102 msgid "Github Repository" msgstr "" #: target/out/prefPages/about.js:103 msgid "" "Add Star on Repository is helping me a lot!\n" "Please, if you found bug from this extension, you can make issue to make me know that!\n" "Or, you can create PR with wonderful features!" msgstr "" #: target/out/prefPages/about.js:109 msgid "Add translation to this extension!" msgstr "" #: target/out/prefPages/about.js:115 msgid "Debug" msgstr "" #: target/out/prefPages/about.js:116 msgid "Extension debugging options" msgstr "" #: target/out/prefPages/about.js:120 msgid "Expose environment" msgstr "" #: target/out/prefPages/about.js:121 msgid "Expose extension environment to globalThis.qst" msgstr "" #: target/out/prefPages/about.js:126 msgid "Show layout border" msgstr "" #: target/out/prefPages/about.js:127 msgid "Show layout borders on Quick Settings" msgstr "" #: target/out/prefPages/about.js:132 msgid "Log level" msgstr "" #: target/out/prefPages/about.js:135 msgid "none" msgstr "" #: target/out/prefPages/about.js:136 msgid "error" msgstr "" #: target/out/prefPages/about.js:137 msgid "info" msgstr "" #: target/out/prefPages/about.js:138 msgid "debug" msgstr "" #: target/out/prefPages/toggles.js:12 msgid "Toggles" msgstr "" #: target/out/prefPages/toggles.js:19 msgid "DND Quick Toggle" msgstr "" #: target/out/prefPages/toggles.js:20 msgid "Turn on to add the DND quick toggle on the Quick Settings panel" msgstr "" #: target/out/prefPages/toggles.js:28 msgid "DND indicator position" msgstr "" #: target/out/prefPages/toggles.js:29 msgid "Set DND indicator position" msgstr "" #: target/out/prefPages/toggles.js:33 msgid "System Tray" msgstr "" #: target/out/prefPages/toggles.js:34 msgid "Date Menu Button" msgstr "" #: target/out/prefPages/toggles.js:41 msgid "Unsafe Mode Quick Toggle" msgstr "" #: target/out/prefPages/toggles.js:42 msgid "Turn on to add the unsafe quick toggle on the Quick Settings panel" msgstr "" #: target/out/prefPages/toggles.js:50 msgid "Save last session state" msgstr "" #: target/out/prefPages/toggles.js:51 msgid "Turn on to save last session unsafe state" msgstr "" #: target/out/prefPages/menu.js:9 target/out/prefPages/menu.js:141 msgid "Advanced animation style" msgstr "" #: target/out/prefPages/menu.js:13 msgid "Open Duration" msgstr "" #: target/out/prefPages/menu.js:14 msgid "Open animation duration in microseconds" msgstr "" #: target/out/prefPages/menu.js:21 msgid "Close Duration" msgstr "" #: target/out/prefPages/menu.js:22 msgid "Close animation duration in microseconds" msgstr "" #: target/out/prefPages/menu.js:29 msgid "Grid Content Opacity" msgstr "" #: target/out/prefPages/menu.js:30 msgid "" "Adjust grid content opacity.\n" "Set this to 255 to make opaque, and 0 to make transparent" msgstr "" #: target/out/prefPages/menu.js:37 msgid "Background Blur Radius" msgstr "" #: target/out/prefPages/menu.js:38 msgid "" "Adjust background blur radius.\n" "Set this to 0 to disable blur effect" msgstr "" #: target/out/prefPages/menu.js:45 msgid "Background Brightness" msgstr "" #: target/out/prefPages/menu.js:46 msgid "" "Adjust background brightness.\n" "Set this to 1000 to disable brightness control effect.\n" "Not impacts on gnome-shell's default dim effect." msgstr "" #: target/out/prefPages/menu.js:53 msgid "Background Opacity" msgstr "" #: target/out/prefPages/menu.js:54 msgid "" "Adjust background opacity.\n" "Set this to 255 to make opaque, and 0 to make transparent" msgstr "" #: target/out/prefPages/menu.js:61 msgid "Background X Scale" msgstr "" #: target/out/prefPages/menu.js:62 msgid "Adjust background x scale, 1000 means 1.0 scale" msgstr "" #: target/out/prefPages/menu.js:69 msgid "Background Y Scale" msgstr "" #: target/out/prefPages/menu.js:70 msgid "Adjust background y scale, 1000 means 1.0 scale" msgstr "" #: target/out/prefPages/menu.js:84 msgid "Menu" msgstr "" #: target/out/prefPages/menu.js:91 msgid "Overlay Mode" msgstr "" #: target/out/prefPages/menu.js:92 msgid "Display toggle, power, and sound menus as overlay" msgstr "" #: target/out/prefPages/menu.js:101 msgid "Overlay Width" msgstr "" #: target/out/prefPages/menu.js:102 msgid "" "Adjust overlay menu width\n" "Set this to 0 to disable adjusting" msgstr "" #: target/out/prefPages/menu.js:109 msgid "Overlay Animation Duration" msgstr "" #: target/out/prefPages/menu.js:110 msgid "" "Custom menu open animation duration in microseconds\n" "Set this to 0 to disable custom animation" msgstr "" #: target/out/prefPages/menu.js:117 msgid "Overlay Animation Style" msgstr "" #: target/out/prefPages/menu.js:118 msgid "Custom menu open animation style" msgstr "" #: target/out/prefPages/menu.js:120 msgid "Flyout" msgstr "" #: target/out/prefPages/menu.js:121 msgid "Dialog" msgstr "" #: target/out/prefPages/menu.js:130 target/out/prefPages/menu.js:143 msgid "Animation" msgstr "" #: target/out/prefPages/menu.js:131 msgid "" "Add menu animation on toggle menu opening and closing\n" "To get the best feel, turn on overlay mode" msgstr "" #: target/out/prefPages/menu.js:142 msgid "Adjust speed, blur, scale, and opacity" msgstr "" #: target/out/prefPages/layout.js:25 msgid "The item not found" msgstr "" #: target/out/prefPages/layout.js:28 msgid "No changes" msgstr "" #: target/out/prefPages/layout.js:31 msgid "The same item already exists" msgstr "" #: target/out/prefPages/layout.js:40 #, javascript-format msgid "Properties of %s" msgstr "" #: target/out/prefPages/layout.js:47 msgid "Save" msgstr "" #: target/out/prefPages/layout.js:64 msgid "Toggle editor" msgstr "" #: target/out/prefPages/layout.js:84 msgid "This option requires full gnome-shell reloading" msgstr "" #: target/out/prefPages/layout.js:160 target/out/prefPages/layout.js:278 #: target/out/prefPages/layout.js:437 target/out/prefPages/layout.js:672 msgid "Hide" msgstr "" #: target/out/prefPages/layout.js:232 #, javascript-format msgid "My item #%d" msgstr "" #: target/out/prefPages/layout.js:250 msgid "New Item" msgstr "" #: target/out/prefPages/layout.js:261 target/out/prefPages/layout.js:610 #: target/out/prefPages/layout.js:737 target/out/prefPages/layout.js:787 #: target/out/prefPages/layout.js:813 msgid "Ordering and Hiding" msgstr "" #: target/out/prefPages/layout.js:273 target/out/prefPages/layout.js:432 msgid "Friendly Name" msgstr "" #: target/out/prefPages/layout.js:283 msgid "Title Regex (Javascript Regex)" msgstr "" #: target/out/prefPages/layout.js:288 target/out/prefPages/layout.js:442 msgid "Constructor Name" msgstr "" #: target/out/prefPages/layout.js:294 target/out/prefPages/layout.js:448 msgid "GType Name" msgstr "" #: target/out/prefPages/layout.js:302 target/out/prefPages/layout.js:456 msgid "This is the comment for easy identification in the settings list. It has no effect on the behavior of the extension" msgstr "" #: target/out/prefPages/layout.js:307 target/out/prefPages/layout.js:461 msgid "Javascript constructor name" msgstr "" #: target/out/prefPages/layout.js:312 target/out/prefPages/layout.js:466 msgid "GObject gtype name. You can get this value by calling GObject.type_name_from_instance" msgstr "" #: target/out/prefPages/layout.js:342 msgid "Keyboard Backlight" msgstr "" #: target/out/prefPages/layout.js:388 target/out/prefPages/layout.js:538 msgid "Unordered items" msgstr "" #: target/out/prefPages/layout.js:486 msgid "Remote Access Applet" msgstr "" #: target/out/prefPages/layout.js:487 msgid "Camera" msgstr "" #: target/out/prefPages/layout.js:488 msgid "Volume Input" msgstr "" #: target/out/prefPages/layout.js:489 msgid "Location" msgstr "" #: target/out/prefPages/layout.js:490 msgid "Thunderbolt" msgstr "" #: target/out/prefPages/layout.js:492 msgid "Network" msgstr "" #: target/out/prefPages/layout.js:495 msgid "Volume Output" msgstr "" #: target/out/prefPages/layout.js:497 msgid "System (Battery)" msgstr "" #: target/out/prefPages/layout.js:618 msgid "Desktop Spacer" msgstr "" #: target/out/prefPages/layout.js:629 msgid "Laptop Spacer" msgstr "" #: target/out/prefPages/layout.js:641 msgid "Capture button" msgstr "" #: target/out/prefPages/layout.js:647 msgid "Settings button" msgstr "" #: target/out/prefPages/layout.js:653 msgid "Lock button" msgstr "" #: target/out/prefPages/layout.js:659 msgid "Shutdown button" msgstr "" #: target/out/prefPages/layout.js:665 msgid "Battery button" msgstr "" #: target/out/prefPages/layout.js:711 msgid "Layout" msgstr "" #: target/out/prefPages/layout.js:718 msgid "Quick Toggles Layout" msgstr "" #: target/out/prefPages/layout.js:719 target/out/prefPages/layout.js:734 msgid "Adjust quick toggles layout" msgstr "" #: target/out/prefPages/layout.js:738 msgid "Reorder and hide quick toggles" msgstr "" #: target/out/prefPages/layout.js:745 msgid "System Indicators" msgstr "" #: target/out/prefPages/layout.js:746 msgid "Adjust system indicators layout and style" msgstr "" #: target/out/prefPages/layout.js:751 msgid "Accent screen sharing indicator" msgstr "" #: target/out/prefPages/layout.js:752 msgid "Use shell accent color on screen sharing indicator" msgstr "" #: target/out/prefPages/layout.js:757 msgid "Accent screen recording indicator" msgstr "" #: target/out/prefPages/layout.js:758 msgid "Use shell accent color on screen recording indicator" msgstr "" #: target/out/prefPages/layout.js:763 msgid "Privacy indicators style" msgstr "" #: target/out/prefPages/layout.js:764 msgid "Use monochrome or shell accent color on privarcy indicators" msgstr "" #: target/out/prefPages/layout.js:767 msgid "Accent" msgstr "" #: target/out/prefPages/layout.js:768 msgid "Monochrome" msgstr "" #: target/out/prefPages/layout.js:777 msgid "Adjust system indicators" msgstr "" #: target/out/prefPages/layout.js:788 msgid "Reorder and hide system indicators" msgstr "" #: target/out/prefPages/layout.js:795 msgid "System Items Layout" msgstr "" #: target/out/prefPages/layout.js:800 target/out/prefPages/layout.js:815 msgid "Adjust system items layout" msgstr "" #: target/out/prefPages/layout.js:804 msgid "Hide layout box" msgstr "" #: target/out/prefPages/layout.js:805 msgid "Hide all buttons and layout box" msgstr "" #: target/out/prefPages/layout.js:814 msgid "Reorder and hide system items" msgstr "" #: target/out/prefPages/layout.js:823 msgid "Date Menu" msgstr "" #: target/out/prefPages/layout.js:824 msgid "Adjust Date Menu layout" msgstr "" #: target/out/prefPages/layout.js:828 msgid "Hide left box" msgstr "" #: target/out/prefPages/layout.js:829 msgid "Hide the left box of the date menu, which contains notifications and media control" msgstr "" #: target/out/prefPages/layout.js:834 msgid "Hide right box" msgstr "" #: target/out/prefPages/layout.js:835 msgid "Hide the right box of the date menu, which contains calendar, world clock and weather" msgstr "" #: target/out/prefPages/layout.js:840 msgid "Disable menu" msgstr "" #: target/out/prefPages/layout.js:841 msgid "Do not open date menu when the date menu button clicked" msgstr "" ================================================ FILE: po/de.po ================================================ msgid "" msgstr "" "Project-Id-Version: quick-settings-tweaker\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-07-20 15:32+0000\n" "PO-Revision-Date: 2025-07-16 23:47+0200\n" "Last-Translator: Andreas Rohr \n" "Language-Team: German\n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Crowdin-Project: quick-settings-tweaker\n" "X-Crowdin-Project-ID: 809722\n" "X-Crowdin-Language: de\n" "X-Crowdin-File: quick-settings-tweaks@qwreey.pot\n" "X-Crowdin-File-ID: 4\n" "X-Generator: Poedit 3.6\n" #: target/out/libs/prefs/components.js:57 msgid "Details" msgstr "Details" #: target/out/libs/prefs/components.js:144 msgid "This feature marked as experimental" msgstr "Diese Funktion wurde als experimentell markiert" #: target/out/libs/prefs/components.js:274 msgid "Reset to default" msgstr "Auf Standard zurücksetzen" #: target/out/libs/prefs/components.js:512 msgid "Theme default" msgstr "Standard-Theme" #: target/out/libs/prefs/components.js:853 msgid "Homepage" msgstr "Homepage" #: target/out/libs/prefs/components.js:859 #: target/out/libs/prefs/components.js:863 target/out/prefPages/about.js:49 #: target/out/prefPages/about.js:51 target/out/prefPages/about.js:56 msgid "License" msgstr "Lizenz" #: target/out/libs/prefs/components.js:860 msgid "Loading ..." msgstr "Laden ..." #: target/out/libs/prefs/components.js:869 msgid "Affected Files" msgstr "Betroffene Dateien" #: target/out/libs/prefs/components.js:924 msgid "Changelog" msgstr "Changelog" #: target/out/libs/prefs/components.js:938 msgid "(Current)" msgstr "(Aktuell)" #: target/out/libs/prefs/components.js:969 #, javascript-format msgid "> **Date:** %s" msgstr "> **Datum:** %s" #: target/out/libs/prefs/components.js:970 #, javascript-format msgid "> **Git Hash:** %s" msgstr "> **Git Hash:** %s" #: target/out/libs/prefs/components.js:971 #, javascript-format msgid "> **Build Number:** %d" msgstr "> **Build Nummer:** %d" #: target/out/libs/prefs/components.js:1034 msgid "Padding" msgstr "Padding" #: target/out/libs/prefs/components.js:1038 msgid "Top" msgstr "Oben" #: target/out/libs/prefs/components.js:1049 msgid "Bottom" msgstr "Unten" #: target/out/libs/prefs/components.js:1060 msgid "Left" msgstr "Links" #: target/out/libs/prefs/components.js:1071 msgid "Right" msgstr "Rechts" #: target/out/prefs.js:60 msgid "Stable" msgstr "Stabil" #: target/out/prefs.js:63 msgid "Development" msgstr "Entwicklung" #: target/out/prefs.js:66 msgid "Preview" msgstr "Vorschau" #: target/out/prefs.js:69 msgid "(Github Release)" msgstr "(Github Release)" #: target/out/prefs.js:72 msgid "(Built from source)" msgstr "(Aus Quelle gebaut)" #: target/out/features/widget/notifications.js:26 msgid "No Notifications" msgstr "Keine Benachrichtigungen" #: target/out/features/widget/notifications.js:58 #: target/out/features/widget/notifications.js:122 msgid "Clear" msgstr "Löschen" #: target/out/features/widget/notifications.js:76 msgid "Notifications" msgstr "Benachrichtigungen" #: target/out/features/widget/notifications.js:105 #: target/out/features/toggle/dndQuickToggle.js:10 #: target/out/prefPages/layout.js:345 target/out/prefPages/layout.js:485 msgid "Do Not Disturb" msgstr "Nicht stören" #: target/out/features/widget/media.js:118 msgid "Unknown title" msgstr "Unbekannter Titel" #: target/out/features/widget/media.js:888 msgid "Media" msgstr "Medien" #: target/out/features/widget/volumeMixer.js:105 msgid "Volume changed" msgstr "Lautstärke geändert" #: target/out/features/widget/volumeMixer.js:463 msgid "Open volumx mixer" msgstr "Lautstärkemixer öffnen" #: target/out/features/widget/volumeMixer.js:480 msgid "Volume Mixer" msgstr "Lautstärkemixer" #: target/out/features/widget/weather.js:73 msgid "Weather" msgstr "Wetter" #: target/out/features/widget/weather.js:192 msgid "Location has not been set" msgstr "Standort wurde nicht festgelegt" #: target/out/features/toggle/unsafeQuickToggle.js:11 #: target/out/prefPages/layout.js:346 target/out/prefPages/layout.js:496 msgid "Unsafe Mode" msgstr "Unsicherer Modus" #: target/out/prefPages/widgets.js:11 msgid "Handle radius" msgstr "Handle-Radius" #: target/out/prefPages/widgets.js:12 msgid "Set this to 0 to use default radius" msgstr "Setze dies auf 0, um den Standard-Radius zu verwenden" #: target/out/prefPages/widgets.js:18 msgid "Handle color" msgstr "Handle Farbe" #: target/out/prefPages/widgets.js:36 msgid "Slider style" msgstr "Slider-Stil" #: target/out/prefPages/widgets.js:39 msgid "Slim" msgstr "Schmal" #: target/out/prefPages/widgets.js:40 target/out/prefPages/layout.js:766 msgid "Default" msgstr "Vorgabe" #: target/out/prefPages/widgets.js:48 target/out/prefPages/widgets.js:173 msgid "Background color" msgstr "Hintergrundfarbe" #: target/out/prefPages/widgets.js:55 msgid "Active Background color" msgstr "Aktive Hintergrundfarbe" #: target/out/prefPages/widgets.js:62 msgid "Thickness" msgstr "" #: target/out/prefPages/widgets.js:66 msgid "Set this to 0 to use default thickness" msgstr "" #: target/out/prefPages/widgets.js:76 msgid "Widgets" msgstr "Widgets" #: target/out/prefPages/widgets.js:83 target/out/prefPages/widgets.js:136 #: target/out/prefPages/widgets.js:162 target/out/prefPages/widgets.js:224 msgid "Media Widget" msgstr "Medien-Widget" #: target/out/prefPages/widgets.js:88 msgid "Turn on to make the media widget visible on the Quick Settings panel" msgstr "Einschalten, um das Medien-Widget in den Schnelleinstellungen sichtbar zu machen" #: target/out/prefPages/widgets.js:92 target/out/prefPages/widgets.js:280 #: target/out/prefPages/widgets.js:343 msgid "Compact mode" msgstr "Kompakter Modus" #: target/out/prefPages/widgets.js:93 msgid "" "Make Media Controls widget smaller\n" "Make it more similar in size to the notification message" msgstr "" "Verkleinern Sie das Widget „Mediensteuerung“\\n\n" "Passen Sie die Größe der Benachrichtigungsnachricht an" #: target/out/prefPages/widgets.js:99 msgid "Control buttons opacity" msgstr "Deckkraft der Steuertasten" #: target/out/prefPages/widgets.js:100 msgid "Set this to 255 to make opaque, and 0 to make transparent" msgstr "Setze dies auf 255, um undurchsichtig zu machen und 0 um transparent zu machen" #: target/out/prefPages/widgets.js:108 msgid "Show next button" msgstr "Nächste Schaltfläche anzeigen" #: target/out/prefPages/widgets.js:109 msgid "Add next contorl button next to description" msgstr "Nächste Control-Taste neben der Beschreibung hinzufügen" #: target/out/prefPages/widgets.js:115 msgid "Show previous button" msgstr "Vorherige Schaltfläche anzeigen" #: target/out/prefPages/widgets.js:116 msgid "Add previous contorl button next to description" msgstr "Vorherige Control-Taste neben der Beschreibung hinzufügen" #: target/out/prefPages/widgets.js:122 msgid "Show pause button" msgstr "Pause-Button anzeigen" #: target/out/prefPages/widgets.js:123 msgid "Add pause contorl button next to description" msgstr "Füge Control-Taste neben der Beschreibung hinzu" #: target/out/prefPages/widgets.js:129 target/out/prefPages/widgets.js:138 msgid "Show progress bar" msgstr "Fortschrittsleiste anzeigen" #: target/out/prefPages/widgets.js:130 target/out/prefPages/widgets.js:139 msgid "Add progress bar under description" msgstr "Fortschrittsleiste unter Beschreibung hinzufügen" #: target/out/prefPages/widgets.js:155 target/out/prefPages/widgets.js:164 msgid "Gradient background" msgstr "Farbverlauf Hintergrund" #: target/out/prefPages/widgets.js:156 target/out/prefPages/widgets.js:169 msgid "" "Use gradient background extracted from cover image\n" "May affect performance slightly" msgstr "" "Hintergrund des Farbverlaufs des Covers\n" "kann die Leistung leicht beeinflussen" #: target/out/prefPages/widgets.js:174 msgid "Base background color" msgstr "Hintergrundfarbe Basis" #: target/out/prefPages/widgets.js:182 msgid "Start opacity" msgstr "" #: target/out/prefPages/widgets.js:183 msgid "Adjust left side transparency, Set this to 1000 to make opaque" msgstr "Linksseitige Transparenz anpassen. Auf 1000 setzen, um undurchsichtig zu machen" #: target/out/prefPages/widgets.js:190 msgid "Start color" msgstr "" #: target/out/prefPages/widgets.js:191 msgid "Adjust left side background color mixing, Set this to 1000 to show extracted color" msgstr "Linke Hintergrundfarbenmischung anpassen. Setze diese auf 1000 um, die extrahierte Farbe anzuzeigen" #: target/out/prefPages/widgets.js:198 msgid "End opacity" msgstr "" #: target/out/prefPages/widgets.js:199 msgid "Adjust right side transparency, Set this to 1000 to make opaque" msgstr "Rechtsseitige Transparenz einstellen, auf 1000 setzen, um undurchsichtig zu machen" #: target/out/prefPages/widgets.js:206 msgid "End color" msgstr "" #: target/out/prefPages/widgets.js:207 msgid "Adjust right side background color mixing, Set this to 1000 to show extracted color" msgstr "Anpassung der rechten Seite des Hintergrundfarbenmix auf 1000 setzen, um die extrahierte Farbe anzuzeigen" #: target/out/prefPages/widgets.js:216 target/out/prefPages/widgets.js:226 msgid "Round clip effect" msgstr "Clip-Effekt runden" #: target/out/prefPages/widgets.js:217 target/out/prefPages/widgets.js:231 msgid "Use round clip effect to make transition more natural" msgstr "Benutze den runden Clip-Effekt, um den Übergang natürlicher zu machen" #: target/out/prefPages/widgets.js:234 msgid "Padding adjustment" msgstr "Polsteranpassung" #: target/out/prefPages/widgets.js:236 msgid "Adjust clip effect padding, edit this if your theme has a different margin or padding" msgstr "Passen Sie Clip-Effekt an, bearbeiten Sie diese, wenn Ihr Theme einen anderen Rand oder Polster hat" #: target/out/prefPages/widgets.js:253 target/out/prefPages/widgets.js:318 #: target/out/prefPages/widgets.js:350 msgid "Remove shadow" msgstr "Schatten entfernen" #: target/out/prefPages/widgets.js:254 msgid "" "Remove shadow from media message\n" "Use if your theme creates unnecessary shadows" msgstr "" "Schatten von Medien-Nachricht entfernen\n" "Benutzen, wenn Ihr Theme unnötige Schatten erstellt" #: target/out/prefPages/widgets.js:260 msgid "Smooth scroll speed" msgstr "Glatte Scrollgeschwindigkeit" #: target/out/prefPages/widgets.js:261 msgid "Adjust trackpad and trackpoint scroll speed, negative number for invert direction" msgstr "Trackpad und Trackpoint-Scrollgeschwindigkeit anpassen, negative Zahl für Invert-Richtung" #: target/out/prefPages/widgets.js:271 msgid "Notifications Widget" msgstr "Benachrichtigungs-Widget" #: target/out/prefPages/widgets.js:276 msgid "Turn on to make the notifications widget visible on the Quick Settings panel" msgstr "Einschalten, um das Benachrichtigungs-Widget in den Schnelleinstellungen sichtbar zu machen" #: target/out/prefPages/widgets.js:281 msgid "Make notifications smaller" msgstr "Benachrichtigungen verkleinern" #: target/out/prefPages/widgets.js:287 target/out/prefPages/widgets.js:418 msgid "Max height" msgstr "Maximale Höhe" #: target/out/prefPages/widgets.js:288 #, javascript-format msgid "Set maximum height of the Notifications widget, default is %d. Set this to 0 to disable max height" msgstr "Legen Sie die maximale Höhe des Benachrichtigungs-Widgets fest, Standard ist %d. Setzen Sie dies auf 0, um die maximale Höhe zu deaktivieren" #: target/out/prefPages/widgets.js:296 target/out/prefPages/widgets.js:441 msgid "Fade out offset" msgstr "Ausblenden Offset" #: target/out/prefPages/widgets.js:297 target/out/prefPages/widgets.js:442 msgid "Set position of the fade out effect begins. Set this to 0 to disable fade out effect. default is 46" msgstr "Setze die Position des Ausblendeffekts ein. Setze dies auf 0, um den Ausblendeffekt zu deaktivieren. Standard ist 46" #: target/out/prefPages/widgets.js:304 msgid "Auto hide" msgstr "Auto-Verstecken" #: target/out/prefPages/widgets.js:305 msgid "Hide the Notifications widget when have no notifications" msgstr "Das Benachrichtigungs-Widget ausblenden, wenn keine Benachrichtigungen vorhanden sind" #: target/out/prefPages/widgets.js:311 msgid "Use native controls" msgstr "Native Steuerelemente verwenden" #: target/out/prefPages/widgets.js:312 msgid "Use native dnd switch and clear button" msgstr "Benutze DND-Schalter und Löschen-Taste" #: target/out/prefPages/widgets.js:319 msgid "" "Remove shadow from notification message\n" "Use if your theme creates unnecessary shadows" msgstr "" "Schatten aus der Benachrichtigungsnachricht entfernen\n" "Benutzen, wenn Ihr Template unnötige Schatten erstellt" #: target/out/prefPages/widgets.js:325 target/out/prefPages/widgets.js:427 msgid "Show scrollbar" msgstr "Scrollbar anzeigen" #: target/out/prefPages/widgets.js:326 msgid "Show scrollbar on message list" msgstr "Scrollbar in der Nachrichtenliste anzeigen" #: target/out/prefPages/widgets.js:334 msgid "Weather Widget" msgstr "Wetter-Widget" #: target/out/prefPages/widgets.js:339 msgid "Turn on to make the weather widget visible on the Quick Settings panel" msgstr "Einschalten, um das Wetter-Widget in den Schnelleinstellungen sichtbar zu machen" #: target/out/prefPages/widgets.js:344 msgid "Make weather widget smaller" msgstr "Wetter-Widget verkleinern" #: target/out/prefPages/widgets.js:351 msgid "" "Remove shadow from weather widget\n" "Use if your theme creates unnecessary shadows" msgstr "" "Schatten vom Wetter-Widget entfernen\n" "Verwenden Sie diese Option, wenn Ihr Design unnötige Schatten erzeugt" #: target/out/prefPages/widgets.js:357 msgid "Click command" msgstr "Klick Befehl" #: target/out/prefPages/widgets.js:363 msgid "Show location" msgstr "Standort anzeigen" #: target/out/prefPages/widgets.js:364 msgid "Show the location label on header" msgstr "Standortbezeichnung im Kopfbereich anzeigen" #: target/out/prefPages/widgets.js:373 msgid "Forecast interval" msgstr "Prognoseintervall" #: target/out/prefPages/widgets.js:374 msgid "Adjust forecast interval in hour" msgstr "Vorhersageintervall in Stunde anpassen" #: target/out/prefPages/widgets.js:381 msgid "Max forecasts" msgstr "Maximale Vorhersagen" #: target/out/prefPages/widgets.js:382 msgid "Adjust max forecasts" msgstr "Maximale Vorhersagen anpassen" #: target/out/prefPages/widgets.js:388 target/out/prefPages/widgets.js:456 msgid "Volume mixer Widget" msgstr "Lautstärkeregler Widget" #: target/out/prefPages/widgets.js:393 msgid "Turn on to make the volume mixer widget visible on the Quick Settings panel" msgstr "Einschalten, um das Lautstärkeregler Widget in den Schnelleinstellungen sichtbar zu machen" #: target/out/prefPages/widgets.js:397 msgid "Label text" msgstr "Text der Beschriftung" #: target/out/prefPages/widgets.js:398 msgid "Choose label above slider text source" msgstr "Label über Slider-Textquelle wählen" #: target/out/prefPages/widgets.js:400 msgid "Both" msgstr "Beides" #: target/out/prefPages/widgets.js:401 msgid "Title" msgstr "Titel" #: target/out/prefPages/widgets.js:402 msgid "Description" msgstr "Beschreibung" #: target/out/prefPages/widgets.js:403 msgid "None" msgstr "Keine" #: target/out/prefPages/widgets.js:411 msgid "Label opacity" msgstr "Deckkraft des Labels" #: target/out/prefPages/widgets.js:412 msgid "" "Adjust label opacity.\n" "Set this to 255 to make opaque, and 0 to make transparent" msgstr "" "Deckkraft des Labels anpassen.\n" "Setze dies auf 255, um undurchsichtig zu machen, und 0 um transparent zu machen" #: target/out/prefPages/widgets.js:419 #, javascript-format msgid "Set maximum height of the Volume mixer widget, default is %d. Set this to 0 to disable max height" msgstr "Legen Sie die maximale Höhe des Volume Mixer Widgets fest, Standard ist %d. Setzen Sie dies auf 0, um die maximale Höhe zu deaktivieren" #: target/out/prefPages/widgets.js:428 msgid "Show scrollbar on mixer list" msgstr "Scrollbar in der Mixer-Liste anzeigen" #: target/out/prefPages/widgets.js:434 msgid "Show stream icon" msgstr "Stream-Symbol anzeigen" #: target/out/prefPages/widgets.js:435 msgid "Show stream icon above mixer sliders" msgstr "Stream-Symbol über Mixer-Schieberegler anzeigen" #: target/out/prefPages/widgets.js:450 target/out/prefPages/widgets.js:458 msgid "Attach to output slider" msgstr "An Ausgaberegler anhängen" #: target/out/prefPages/widgets.js:451 target/out/prefPages/widgets.js:459 msgid "Attach volume mixer menu button to output slider. Use if you prefer compact layout" msgstr "Lautstärkeregler an den Ausgaberegler anhängen. Benutzen, wenn Sie ein kompaktes Layout bevorzugen" #: target/out/prefPages/widgets.js:468 msgid "Menu icon" msgstr "Menüsymbol" #: target/out/prefPages/about.js:12 target/out/prefPages/about.js:32 msgid "About" msgstr "Über" #: target/out/prefPages/about.js:33 msgid "Common extension informations" msgstr "Allgemeine Erweiterungsinformationen" #: target/out/prefPages/about.js:36 target/out/prefPages/about.js:40 msgid "Changelogs" msgstr "Changelogs" #: target/out/prefPages/about.js:37 target/out/prefPages/about.js:41 msgid "View the change history for this extension" msgstr "Änderungshistorie für diese Erweiterung anzeigen" #: target/out/prefPages/about.js:50 target/out/prefPages/about.js:57 msgid "License of codes" msgstr "Codelizenz" #: target/out/prefPages/about.js:63 target/out/prefPages/about.js:65 #: target/out/prefPages/about.js:69 msgid "Contributors" msgstr "Mitwirkende" #: target/out/prefPages/about.js:64 target/out/prefPages/about.js:70 msgid "The creators of this extension" msgstr "Die Ersteller dieser Erweiterung" #: target/out/prefPages/about.js:74 msgid "More contributors" msgstr "Mehr Mitwirkende" #: target/out/prefPages/about.js:75 msgid "See more contributors on github" msgstr "Mehr Mitwirkende auf Github ansehen" #: target/out/prefPages/about.js:85 msgid "Link" msgstr "Link" #: target/out/prefPages/about.js:86 msgid "External links about this extension" msgstr "Externe Links zu dieser Erweiterung" #: target/out/prefPages/about.js:90 msgid "Donate via github sponsors" msgstr "Spenden über GitHub Sponsoren" #: target/out/prefPages/about.js:91 msgid "Support development!" msgstr "Entwicklung unterstützen!" #: target/out/prefPages/about.js:97 msgid "Rate and comment the extension!" msgstr "Bewerten und kommentieren Sie die Erweiterung!" #: target/out/prefPages/about.js:102 msgid "Github Repository" msgstr "Github Repository" #: target/out/prefPages/about.js:103 msgid "" "Add Star on Repository is helping me a lot!\n" "Please, if you found bug from this extension, you can make issue to make me know that!\n" "Or, you can create PR with wonderful features!" msgstr "" "Das Hinzufügen eines Sterns zum Repository hilft mir sehr!\n" "Wenn Sie einen Fehler in dieser Erweiterung finden, können Sie mir das Problem melden!\n" "Oder Sie können einen PR mit tollen Funktionen erstellen!" #: target/out/prefPages/about.js:109 msgid "Add translation to this extension!" msgstr "Übersetzung zu dieser Erweiterung hinzufügen!" #: target/out/prefPages/about.js:115 msgid "Debug" msgstr "Debug" #: target/out/prefPages/about.js:116 msgid "Extension debugging options" msgstr "Debug-Optionen" #: target/out/prefPages/about.js:120 msgid "Expose environment" msgstr "Umgebung freigeben" #: target/out/prefPages/about.js:121 msgid "Expose extension environment to globalThis.qst" msgstr "Erweiterungsumgebung globalThis.qst anzeigen" #: target/out/prefPages/about.js:126 msgid "Show layout border" msgstr "Layout-Rahmen anzeigen" #: target/out/prefPages/about.js:127 msgid "Show layout borders on Quick Settings" msgstr "Layout-Ränder in Schnelleinstellungen anzeigen" #: target/out/prefPages/about.js:132 msgid "Log level" msgstr "Log-Level" #: target/out/prefPages/about.js:135 msgid "none" msgstr "keine" #: target/out/prefPages/about.js:136 msgid "error" msgstr "fehlerhaft" #: target/out/prefPages/about.js:137 msgid "info" msgstr "Info" #: target/out/prefPages/about.js:138 msgid "debug" msgstr "Debug" #: target/out/prefPages/toggles.js:12 msgid "Toggles" msgstr "Toggles" #: target/out/prefPages/toggles.js:19 msgid "DND Quick Toggle" msgstr "DND Quick Toggle" #: target/out/prefPages/toggles.js:20 msgid "Turn on to add the DND quick toggle on the Quick Settings panel" msgstr "Aktivieren, um den DND-Schnellschalter in den Schnelleinstellungen hinzuzufügen" #: target/out/prefPages/toggles.js:28 msgid "DND indicator position" msgstr "DND-Indikatorposition" #: target/out/prefPages/toggles.js:29 msgid "Set DND indicator position" msgstr "DND-Indikatorposition festlegen" #: target/out/prefPages/toggles.js:33 msgid "System Tray" msgstr "System Tray" #: target/out/prefPages/toggles.js:34 msgid "Date Menu Button" msgstr "Datumsmenü-Taste" #: target/out/prefPages/toggles.js:41 msgid "Unsafe Mode Quick Toggle" msgstr "Unsicherer Modus Schnellwechsel" #: target/out/prefPages/toggles.js:42 msgid "Turn on to add the unsafe quick toggle on the Quick Settings panel" msgstr "Einschalten, um den unsicheren Schnelleinstellungen hinzuzufügen" #: target/out/prefPages/toggles.js:50 msgid "Save last session state" msgstr "Letzten Sitzungsstatus speichern" #: target/out/prefPages/toggles.js:51 msgid "Turn on to save last session unsafe state" msgstr "Aktivieren, um den unsicheren Status der letzten Sitzung zu speichern" #: target/out/prefPages/menu.js:9 target/out/prefPages/menu.js:141 msgid "Advanced animation style" msgstr "Erweiterter Animationsstil" #: target/out/prefPages/menu.js:13 msgid "Open Duration" msgstr "Öffne Dauer" #: target/out/prefPages/menu.js:14 msgid "Open animation duration in microseconds" msgstr "Animationsdauer in Mikrosekunden öffnen" #: target/out/prefPages/menu.js:21 msgid "Close Duration" msgstr "Dauer schließen" #: target/out/prefPages/menu.js:22 msgid "Close animation duration in microseconds" msgstr "Dauer der Animation in Mikrosekunden schließen" #: target/out/prefPages/menu.js:29 msgid "Grid Content Opacity" msgstr "Deckkraft des Gitters" #: target/out/prefPages/menu.js:30 msgid "" "Adjust grid content opacity.\n" "Set this to 255 to make opaque, and 0 to make transparent" msgstr "" "Deckkraft des Gitters anpassen.\n" "Auf 255 setzen, um Deckkraft zu erzeugen, und 0 um transparent zu machen" #: target/out/prefPages/menu.js:37 msgid "Background Blur Radius" msgstr "Hintergrundunschärfe-Radius" #: target/out/prefPages/menu.js:38 msgid "" "Adjust background blur radius.\n" "Set this to 0 to disable blur effect" msgstr "" "Hintergrundunschärfe-Radius anpassen.\n" "Setze dies auf 0, um Unschärfe-Effekt zu deaktivieren" #: target/out/prefPages/menu.js:45 msgid "Background Brightness" msgstr "Hintergrundhelligkeit" #: target/out/prefPages/menu.js:46 msgid "" "Adjust background brightness.\n" "Set this to 1000 to disable brightness control effect.\n" "Not impacts on gnome-shell's default dim effect." msgstr "" "Hintergrundhelligkeit anpassen.\n" "Setze dies auf 1000 um, den Helligkeitskontroll-Effekt zu deaktivieren.\n" "Wirkt sich nicht auf Gnome-Shells Standard-Dim-Effekt aus." #: target/out/prefPages/menu.js:53 msgid "Background Opacity" msgstr "Hintergrundtransparenz" #: target/out/prefPages/menu.js:54 msgid "" "Adjust background opacity.\n" "Set this to 255 to make opaque, and 0 to make transparent" msgstr "" "Deckkraft des Hintergrunds anpassen.\n" "Setze dies auf 255, um undurchsichtig zu machen, und 0 um transparent zu machen" #: target/out/prefPages/menu.js:61 msgid "Background X Scale" msgstr "Hintergrund X Skala" #: target/out/prefPages/menu.js:62 msgid "Adjust background x scale, 1000 means 1.0 scale" msgstr "Hintergrund x Skalierung anpassen, 1000 bedeutet 1,0 Skala" #: target/out/prefPages/menu.js:69 msgid "Background Y Scale" msgstr "Hintergrund Y-Skala" #: target/out/prefPages/menu.js:70 msgid "Adjust background y scale, 1000 means 1.0 scale" msgstr "Hintergrund y Skalierung anpassen, 1000 bedeutet 1,0 Skala" #: target/out/prefPages/menu.js:84 msgid "Menu" msgstr "Menü" #: target/out/prefPages/menu.js:91 msgid "Overlay Mode" msgstr "Overlay Mode" #: target/out/prefPages/menu.js:92 msgid "Display toggle, power, and sound menus as overlay" msgstr "Schalt-, Power- und Sound-Menüs als Overlay anzeigen" #: target/out/prefPages/menu.js:101 msgid "Overlay Width" msgstr "Overlay-Breite" #: target/out/prefPages/menu.js:102 msgid "" "Adjust overlay menu width\n" "Set this to 0 to disable adjusting" msgstr "" "Überlagerungsmenü Breite\n" "Auf 0 setzen, um Anpassung zu deaktivieren" #: target/out/prefPages/menu.js:109 msgid "Overlay Animation Duration" msgstr "Dauer der Overlay-Animation" #: target/out/prefPages/menu.js:110 msgid "" "Custom menu open animation duration in microseconds\n" "Set this to 0 to disable custom animation" msgstr "" "Angepasste Menü-Animationsdauer in Mikrosekunden\n" "Setze dies auf 0, um benutzerdefinierte Animation zu deaktivieren" #: target/out/prefPages/menu.js:117 msgid "Overlay Animation Style" msgstr "Animationsstil überlagern" #: target/out/prefPages/menu.js:118 msgid "Custom menu open animation style" msgstr "Animationsstil des Menüs öffnen" #: target/out/prefPages/menu.js:120 msgid "Flyout" msgstr "Flyout" #: target/out/prefPages/menu.js:121 msgid "Dialog" msgstr "Dialog" #: target/out/prefPages/menu.js:130 target/out/prefPages/menu.js:143 msgid "Animation" msgstr "Animation" #: target/out/prefPages/menu.js:131 msgid "" "Add menu animation on toggle menu opening and closing\n" "To get the best feel, turn on overlay mode" msgstr "" "Menüanimation beim Öffnen und Schließen des Menüs\n" "hinzufügen, um das beste Gefühl zu erhalten, aktivieren Sie den Overlay-Modus" #: target/out/prefPages/menu.js:142 msgid "Adjust speed, blur, scale, and opacity" msgstr "Schnelligkeit, Unschärfe, Skalierung und Deckkraft anpassen" #: target/out/prefPages/layout.js:25 msgid "The item not found" msgstr "Das Element nicht gefunden" #: target/out/prefPages/layout.js:28 msgid "No changes" msgstr "Keine Änderungen" #: target/out/prefPages/layout.js:31 msgid "The same item already exists" msgstr "Das gleiche Element existiert bereits" #: target/out/prefPages/layout.js:40 #, javascript-format msgid "Properties of %s" msgstr "Objekte von %s" #: target/out/prefPages/layout.js:47 msgid "Save" msgstr "Speichern" #: target/out/prefPages/layout.js:64 msgid "Toggle editor" msgstr "Editor umschalten" #: target/out/prefPages/layout.js:84 msgid "This option requires full gnome-shell reloading" msgstr "Diese Option erfordert ein vollständiges Nachladen von Gnome-Shell" #: target/out/prefPages/layout.js:160 target/out/prefPages/layout.js:278 #: target/out/prefPages/layout.js:437 target/out/prefPages/layout.js:672 msgid "Hide" msgstr "Verstecken" #: target/out/prefPages/layout.js:232 #, javascript-format msgid "My item #%d" msgstr "Mein Artikel #%d" #: target/out/prefPages/layout.js:250 msgid "New Item" msgstr "Neues Element" #: target/out/prefPages/layout.js:261 target/out/prefPages/layout.js:610 #: target/out/prefPages/layout.js:737 target/out/prefPages/layout.js:787 #: target/out/prefPages/layout.js:813 msgid "Ordering and Hiding" msgstr "Reihenfolge und Verstecken" #: target/out/prefPages/layout.js:273 target/out/prefPages/layout.js:432 msgid "Friendly Name" msgstr "Freundlicher Name" #: target/out/prefPages/layout.js:283 msgid "Title Regex (Javascript Regex)" msgstr "Titel Regex (Javascript Regex)" #: target/out/prefPages/layout.js:288 target/out/prefPages/layout.js:442 msgid "Constructor Name" msgstr "Name des Konstrukteurs" #: target/out/prefPages/layout.js:294 target/out/prefPages/layout.js:448 msgid "GType Name" msgstr "GType Name" #: target/out/prefPages/layout.js:302 target/out/prefPages/layout.js:456 msgid "This is the comment for easy identification in the settings list. It has no effect on the behavior of the extension" msgstr "Dies ist der Kommentar zur einfachen Identifizierung in der Einstellungsliste. Er hat keine Auswirkung auf das Verhalten der Erweiterung" #: target/out/prefPages/layout.js:307 target/out/prefPages/layout.js:461 msgid "Javascript constructor name" msgstr "Name des Javascript-Konstruktors" #: target/out/prefPages/layout.js:312 target/out/prefPages/layout.js:466 msgid "GObject gtype name. You can get this value by calling GObject.type_name_from_instance" msgstr "GObject gtype Name. Sie können diesen Wert erhalten, indem Sie GObject.type_name_from_instance aufrufen" #: target/out/prefPages/layout.js:342 msgid "Keyboard Backlight" msgstr "Tastaturbeleuchtung" #: target/out/prefPages/layout.js:388 target/out/prefPages/layout.js:538 msgid "Unordered items" msgstr "Unbestellte Artikel" #: target/out/prefPages/layout.js:486 msgid "Remote Access Applet" msgstr "Remote-Zugangs-Applet" #: target/out/prefPages/layout.js:487 msgid "Camera" msgstr "Kamera" #: target/out/prefPages/layout.js:488 msgid "Volume Input" msgstr "Volume Input" #: target/out/prefPages/layout.js:489 msgid "Location" msgstr "Standort" #: target/out/prefPages/layout.js:490 msgid "Thunderbolt" msgstr "Donnerblitz" #: target/out/prefPages/layout.js:492 msgid "Network" msgstr "Netzwerk" #: target/out/prefPages/layout.js:495 msgid "Volume Output" msgstr "Lautstärke-Ausgabe" #: target/out/prefPages/layout.js:497 msgid "System (Battery)" msgstr "System (Groß)" #: target/out/prefPages/layout.js:618 msgid "Desktop Spacer" msgstr "Desktop-Abstand" #: target/out/prefPages/layout.js:629 msgid "Laptop Spacer" msgstr "Laptop-Spacer" #: target/out/prefPages/layout.js:641 msgid "Capture button" msgstr "Aufnahme-Button" #: target/out/prefPages/layout.js:647 msgid "Settings button" msgstr "Einstellungen-Schaltfläche" #: target/out/prefPages/layout.js:653 msgid "Lock button" msgstr "Sperren-Taste" #: target/out/prefPages/layout.js:659 msgid "Shutdown button" msgstr "Herunterfahren-Schaltfläche" #: target/out/prefPages/layout.js:665 msgid "Battery button" msgstr "Akku-Taste" #: target/out/prefPages/layout.js:711 msgid "Layout" msgstr "Layout" #: target/out/prefPages/layout.js:718 msgid "Quick Toggles Layout" msgstr "Schnellwechsel-Layout" #: target/out/prefPages/layout.js:719 target/out/prefPages/layout.js:734 msgid "Adjust quick toggles layout" msgstr "Schnellschaltlayout anpassen" #: target/out/prefPages/layout.js:738 msgid "Reorder and hide quick toggles" msgstr "Schnellschalter neu anordnen und ausblenden" #: target/out/prefPages/layout.js:745 msgid "System Indicators" msgstr "Systemindikatoren" #: target/out/prefPages/layout.js:746 msgid "Adjust system indicators layout and style" msgstr "Layout und Stil der Systemindikatoren anpassen" #: target/out/prefPages/layout.js:751 msgid "Accent screen sharing indicator" msgstr "Display-Sharing-Indikator" #: target/out/prefPages/layout.js:752 msgid "Use shell accent color on screen sharing indicator" msgstr "Shell-Akzentfarbe für Bildschirmfreigabe verwenden" #: target/out/prefPages/layout.js:757 msgid "Accent screen recording indicator" msgstr "Display-Aufnahme-Indikator" #: target/out/prefPages/layout.js:758 msgid "Use shell accent color on screen recording indicator" msgstr "Shell-Akzentfarbe für Bildschirmaufzeichnung verwenden" #: target/out/prefPages/layout.js:763 msgid "Privacy indicators style" msgstr "Stil der Datenschutzindikatoren" #: target/out/prefPages/layout.js:764 msgid "Use monochrome or shell accent color on privarcy indicators" msgstr "Verwenden Sie monochrome oder Shell-Akzentfarbe in Privatsachen Indikatoren" #: target/out/prefPages/layout.js:767 msgid "Accent" msgstr "Akzent" #: target/out/prefPages/layout.js:768 msgid "Monochrome" msgstr "Monochrom" #: target/out/prefPages/layout.js:777 msgid "Adjust system indicators" msgstr "Systemindikatoren anpassen" #: target/out/prefPages/layout.js:788 msgid "Reorder and hide system indicators" msgstr "Systemindikatoren neu anordnen und verstecken" #: target/out/prefPages/layout.js:795 msgid "System Items Layout" msgstr "Layout der Systemelemente" #: target/out/prefPages/layout.js:800 target/out/prefPages/layout.js:815 msgid "Adjust system items layout" msgstr "Layout der Systemelemente anpassen" #: target/out/prefPages/layout.js:804 msgid "Hide layout box" msgstr "Layoutbox ausblenden" #: target/out/prefPages/layout.js:805 msgid "Hide all buttons and layout box" msgstr "Alle Buttons und Layout-Box ausblenden" #: target/out/prefPages/layout.js:814 msgid "Reorder and hide system items" msgstr "Systemelemente neu anordnen und verstecken" #: target/out/prefPages/layout.js:823 msgid "Date Menu" msgstr "Datumsmenü" #: target/out/prefPages/layout.js:824 msgid "Adjust Date Menu layout" msgstr "Datumsmenü-Layout anpassen" #: target/out/prefPages/layout.js:828 msgid "Hide left box" msgstr "Linkskiste ausblenden" #: target/out/prefPages/layout.js:829 msgid "Hide the left box of the date menu, which contains notifications and media control" msgstr "Verstecke das linke Feld des Datumsmenüs, welches Benachrichtigungen und Medienkontrolle enthält" #: target/out/prefPages/layout.js:834 msgid "Hide right box" msgstr "Verstecke rechte Box" #: target/out/prefPages/layout.js:835 msgid "Hide the right box of the date menu, which contains calendar, world clock and weather" msgstr "Verstecke das rechte Feld des Datumsmenüs, welches Kalender, Weltzeit und Wetter enthält" #: target/out/prefPages/layout.js:840 msgid "Disable menu" msgstr "Menü deaktivieren" #: target/out/prefPages/layout.js:841 msgid "Do not open date menu when the date menu button clicked" msgstr "Datumsmenü nicht öffnen, wenn der Datumsmenü-Button angeklickt wurde" #~ msgid "Height" #~ msgstr "Höhe" #~ msgid "Set this to 0 to use default height" #~ msgstr "Auf 0 setzen, um die Standardhöhe zu verwenden" #~ msgid "Start opaque" #~ msgstr "Starte Deckkraft" #~ msgid "End opaque" #~ msgstr "Undurchsichtig beenden" #~ msgid "Hide Notifications" #~ msgstr "Benachrichtigungen ausblenden" #~ msgid "Hide notifications on the date menu" #~ msgstr "Benachrichtigungen im Datumsmenü ausblenden" #~ msgid "Hide Media Control" #~ msgstr "Mediensteuerung ausblenden" #~ msgid "Hide media control on the date menu" #~ msgstr "Mediensteuerung im Datumsmenü ausblenden" ================================================ FILE: po/en.po ================================================ # AUTHORS # qwreey75 (aka qwreey) https://github.com/qwreey75/, 2023. # DodoLeDev https://github.com/DodoLeDev, 2023 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: 1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-07-20 15:34+0000\n" "Language: en\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: target/out/libs/prefs/components.js:57 msgid "Details" msgstr "" #: target/out/libs/prefs/components.js:144 msgid "This feature marked as experimental" msgstr "" #: target/out/libs/prefs/components.js:274 msgid "Reset to default" msgstr "" #: target/out/libs/prefs/components.js:512 msgid "Theme default" msgstr "" #: target/out/libs/prefs/components.js:853 msgid "Homepage" msgstr "" #: target/out/libs/prefs/components.js:859 #: target/out/libs/prefs/components.js:863 target/out/prefPages/about.js:49 #: target/out/prefPages/about.js:51 target/out/prefPages/about.js:56 msgid "License" msgstr "" #: target/out/libs/prefs/components.js:860 msgid "Loading ..." msgstr "" #: target/out/libs/prefs/components.js:869 msgid "Affected Files" msgstr "" #: target/out/libs/prefs/components.js:924 msgid "Changelog" msgstr "" #: target/out/libs/prefs/components.js:938 msgid "(Current)" msgstr "" #: target/out/libs/prefs/components.js:969 #, javascript-format msgid "> **Date:** %s" msgstr "" #: target/out/libs/prefs/components.js:970 #, javascript-format msgid "> **Git Hash:** %s" msgstr "" #: target/out/libs/prefs/components.js:971 #, javascript-format msgid "> **Build Number:** %d" msgstr "" #: target/out/libs/prefs/components.js:1034 msgid "Padding" msgstr "" #: target/out/libs/prefs/components.js:1038 msgid "Top" msgstr "Top" #: target/out/libs/prefs/components.js:1049 msgid "Bottom" msgstr "Bottom" #: target/out/libs/prefs/components.js:1060 msgid "Left" msgstr "" #: target/out/libs/prefs/components.js:1071 msgid "Right" msgstr "" #: target/out/prefs.js:60 msgid "Stable" msgstr "" #: target/out/prefs.js:63 msgid "Development" msgstr "" #: target/out/prefs.js:66 msgid "Preview" msgstr "" #: target/out/prefs.js:69 msgid "(Github Release)" msgstr "" #: target/out/prefs.js:72 msgid "(Built from source)" msgstr "" #: target/out/features/widget/notifications.js:26 msgid "No Notifications" msgstr "No Notifications" #: target/out/features/widget/notifications.js:58 #: target/out/features/widget/notifications.js:122 msgid "Clear" msgstr "Clear" # Quick settings notifications title text # Notifications title #: target/out/features/widget/notifications.js:76 msgid "Notifications" msgstr "Notifications" #: target/out/features/widget/notifications.js:105 #: target/out/features/toggle/dndQuickToggle.js:10 #: target/out/prefPages/layout.js:345 target/out/prefPages/layout.js:485 msgid "Do Not Disturb" msgstr "Do Not Disturb" #: target/out/features/widget/media.js:118 msgid "Unknown title" msgstr "" #: target/out/features/widget/media.js:888 msgid "Media" msgstr "" #: target/out/features/widget/volumeMixer.js:105 msgid "Volume changed" msgstr "Volume changed" #: target/out/features/widget/volumeMixer.js:463 msgid "Open volumx mixer" msgstr "" #: target/out/features/widget/volumeMixer.js:480 msgid "Volume Mixer" msgstr "Volume Mixer" #: target/out/features/widget/weather.js:73 msgid "Weather" msgstr "" #: target/out/features/widget/weather.js:192 msgid "Location has not been set" msgstr "" # Unsafe mode #: target/out/features/toggle/unsafeQuickToggle.js:11 #: target/out/prefPages/layout.js:346 target/out/prefPages/layout.js:496 msgid "Unsafe Mode" msgstr "Unsafe Mode" #: target/out/prefPages/widgets.js:11 msgid "Handle radius" msgstr "" #: target/out/prefPages/widgets.js:12 msgid "Set this to 0 to use default radius" msgstr "" #: target/out/prefPages/widgets.js:18 msgid "Handle color" msgstr "" #: target/out/prefPages/widgets.js:36 msgid "Slider style" msgstr "" #: target/out/prefPages/widgets.js:39 msgid "Slim" msgstr "" #: target/out/prefPages/widgets.js:40 target/out/prefPages/layout.js:766 msgid "Default" msgstr "" #: target/out/prefPages/widgets.js:48 target/out/prefPages/widgets.js:173 msgid "Background color" msgstr "" #: target/out/prefPages/widgets.js:55 msgid "Active Background color" msgstr "" #: target/out/prefPages/widgets.js:62 msgid "Thickness" msgstr "" #: target/out/prefPages/widgets.js:66 msgid "Set this to 0 to use default thickness" msgstr "" #: target/out/prefPages/widgets.js:76 msgid "Widgets" msgstr "" #: target/out/prefPages/widgets.js:83 target/out/prefPages/widgets.js:136 #: target/out/prefPages/widgets.js:162 target/out/prefPages/widgets.js:224 msgid "Media Widget" msgstr "" #: target/out/prefPages/widgets.js:88 msgid "Turn on to make the media widget visible on the Quick Settings panel" msgstr "" #: target/out/prefPages/widgets.js:92 target/out/prefPages/widgets.js:280 #: target/out/prefPages/widgets.js:343 msgid "Compact mode" msgstr "" #: target/out/prefPages/widgets.js:93 msgid "" "Make Media Controls widget smaller\n" "Make it more similar in size to the notification message" msgstr "" "Make Media Controls widget smaller\n" "Make it more similar in size to the notification message" #: target/out/prefPages/widgets.js:99 msgid "Control buttons opacity" msgstr "" #: target/out/prefPages/widgets.js:100 msgid "Set this to 255 to make opaque, and 0 to make transparent" msgstr "" #: target/out/prefPages/widgets.js:108 msgid "Show next button" msgstr "" #: target/out/prefPages/widgets.js:109 msgid "Add next contorl button next to description" msgstr "" #: target/out/prefPages/widgets.js:115 msgid "Show previous button" msgstr "" #: target/out/prefPages/widgets.js:116 msgid "Add previous contorl button next to description" msgstr "" #: target/out/prefPages/widgets.js:122 msgid "Show pause button" msgstr "" #: target/out/prefPages/widgets.js:123 msgid "Add pause contorl button next to description" msgstr "" #: target/out/prefPages/widgets.js:129 target/out/prefPages/widgets.js:138 msgid "Show progress bar" msgstr "" #: target/out/prefPages/widgets.js:130 target/out/prefPages/widgets.js:139 msgid "Add progress bar under description" msgstr "" #: target/out/prefPages/widgets.js:155 target/out/prefPages/widgets.js:164 msgid "Gradient background" msgstr "" #: target/out/prefPages/widgets.js:156 target/out/prefPages/widgets.js:169 msgid "" "Use gradient background extracted from cover image\n" "May affect performance slightly" msgstr "" #: target/out/prefPages/widgets.js:174 msgid "Base background color" msgstr "" #: target/out/prefPages/widgets.js:182 msgid "Start opacity" msgstr "" #: target/out/prefPages/widgets.js:183 msgid "Adjust left side transparency, Set this to 1000 to make opaque" msgstr "" #: target/out/prefPages/widgets.js:190 msgid "Start color" msgstr "" #: target/out/prefPages/widgets.js:191 msgid "Adjust left side background color mixing, Set this to 1000 to show extracted color" msgstr "" #: target/out/prefPages/widgets.js:198 msgid "End opacity" msgstr "" #: target/out/prefPages/widgets.js:199 msgid "Adjust right side transparency, Set this to 1000 to make opaque" msgstr "" #: target/out/prefPages/widgets.js:206 msgid "End color" msgstr "" #: target/out/prefPages/widgets.js:207 msgid "Adjust right side background color mixing, Set this to 1000 to show extracted color" msgstr "" #: target/out/prefPages/widgets.js:216 target/out/prefPages/widgets.js:226 msgid "Round clip effect" msgstr "" #: target/out/prefPages/widgets.js:217 target/out/prefPages/widgets.js:231 msgid "Use round clip effect to make transition more natural" msgstr "" #: target/out/prefPages/widgets.js:234 msgid "Padding adjustment" msgstr "" #: target/out/prefPages/widgets.js:236 msgid "Adjust clip effect padding, edit this if your theme has a different margin or padding" msgstr "" #: target/out/prefPages/widgets.js:253 target/out/prefPages/widgets.js:318 #: target/out/prefPages/widgets.js:350 msgid "Remove shadow" msgstr "" #: target/out/prefPages/widgets.js:254 msgid "" "Remove shadow from media message\n" "Use if your theme creates unnecessary shadows" msgstr "" #: target/out/prefPages/widgets.js:260 msgid "Smooth scroll speed" msgstr "" #: target/out/prefPages/widgets.js:261 msgid "Adjust trackpad and trackpoint scroll speed, negative number for invert direction" msgstr "" #: target/out/prefPages/widgets.js:271 msgid "Notifications Widget" msgstr "" #: target/out/prefPages/widgets.js:276 msgid "Turn on to make the notifications widget visible on the Quick Settings panel" msgstr "" #: target/out/prefPages/widgets.js:281 msgid "Make notifications smaller" msgstr "" #: target/out/prefPages/widgets.js:287 target/out/prefPages/widgets.js:418 msgid "Max height" msgstr "Max height" #: target/out/prefPages/widgets.js:288 #, javascript-format msgid "Set maximum height of the Notifications widget, default is %d. Set this to 0 to disable max height" msgstr "" #: target/out/prefPages/widgets.js:296 target/out/prefPages/widgets.js:441 msgid "Fade out offset" msgstr "" #: target/out/prefPages/widgets.js:297 target/out/prefPages/widgets.js:442 msgid "Set position of the fade out effect begins. Set this to 0 to disable fade out effect. default is 46" msgstr "" #: target/out/prefPages/widgets.js:304 msgid "Auto hide" msgstr "" #: target/out/prefPages/widgets.js:305 msgid "Hide the Notifications widget when have no notifications" msgstr "Hide the Notifications widget when have no notifications" #: target/out/prefPages/widgets.js:311 msgid "Use native controls" msgstr "Use native controls" #: target/out/prefPages/widgets.js:312 msgid "Use native dnd switch and clear button" msgstr "Use native dnd switch and clear button" #: target/out/prefPages/widgets.js:319 msgid "" "Remove shadow from notification message\n" "Use if your theme creates unnecessary shadows" msgstr "" #: target/out/prefPages/widgets.js:325 target/out/prefPages/widgets.js:427 msgid "Show scrollbar" msgstr "" #: target/out/prefPages/widgets.js:326 msgid "Show scrollbar on message list" msgstr "" #: target/out/prefPages/widgets.js:334 msgid "Weather Widget" msgstr "" #: target/out/prefPages/widgets.js:339 msgid "Turn on to make the weather widget visible on the Quick Settings panel" msgstr "" #: target/out/prefPages/widgets.js:344 msgid "Make weather widget smaller" msgstr "" #: target/out/prefPages/widgets.js:351 msgid "" "Remove shadow from weather widget\n" "Use if your theme creates unnecessary shadows" msgstr "" #: target/out/prefPages/widgets.js:357 msgid "Click command" msgstr "" #: target/out/prefPages/widgets.js:363 msgid "Show location" msgstr "" #: target/out/prefPages/widgets.js:364 msgid "Show the location label on header" msgstr "" #: target/out/prefPages/widgets.js:373 msgid "Forecast interval" msgstr "" #: target/out/prefPages/widgets.js:374 msgid "Adjust forecast interval in hour" msgstr "" #: target/out/prefPages/widgets.js:381 msgid "Max forecasts" msgstr "" #: target/out/prefPages/widgets.js:382 msgid "Adjust max forecasts" msgstr "" #: target/out/prefPages/widgets.js:388 target/out/prefPages/widgets.js:456 msgid "Volume mixer Widget" msgstr "" #: target/out/prefPages/widgets.js:393 msgid "Turn on to make the volume mixer widget visible on the Quick Settings panel" msgstr "" #: target/out/prefPages/widgets.js:397 msgid "Label text" msgstr "" #: target/out/prefPages/widgets.js:398 msgid "Choose label above slider text source" msgstr "" #: target/out/prefPages/widgets.js:400 msgid "Both" msgstr "" #: target/out/prefPages/widgets.js:401 msgid "Title" msgstr "" #: target/out/prefPages/widgets.js:402 msgid "Description" msgstr "" #: target/out/prefPages/widgets.js:403 msgid "None" msgstr "" #: target/out/prefPages/widgets.js:411 msgid "Label opacity" msgstr "" #: target/out/prefPages/widgets.js:412 msgid "" "Adjust label opacity.\n" "Set this to 255 to make opaque, and 0 to make transparent" msgstr "" #: target/out/prefPages/widgets.js:419 #, javascript-format msgid "Set maximum height of the Volume mixer widget, default is %d. Set this to 0 to disable max height" msgstr "" #: target/out/prefPages/widgets.js:428 msgid "Show scrollbar on mixer list" msgstr "" #: target/out/prefPages/widgets.js:434 msgid "Show stream icon" msgstr "" #: target/out/prefPages/widgets.js:435 msgid "Show stream icon above mixer sliders" msgstr "" #: target/out/prefPages/widgets.js:450 target/out/prefPages/widgets.js:458 msgid "Attach to output slider" msgstr "" #: target/out/prefPages/widgets.js:451 target/out/prefPages/widgets.js:459 msgid "Attach volume mixer menu button to output slider. Use if you prefer compact layout" msgstr "" #: target/out/prefPages/widgets.js:468 msgid "Menu icon" msgstr "" #: target/out/prefPages/about.js:12 target/out/prefPages/about.js:32 msgid "About" msgstr "About" #: target/out/prefPages/about.js:33 msgid "Common extension informations" msgstr "" #: target/out/prefPages/about.js:36 target/out/prefPages/about.js:40 msgid "Changelogs" msgstr "" #: target/out/prefPages/about.js:37 target/out/prefPages/about.js:41 msgid "View the change history for this extension" msgstr "" #: target/out/prefPages/about.js:50 target/out/prefPages/about.js:57 msgid "License of codes" msgstr "" #: target/out/prefPages/about.js:63 target/out/prefPages/about.js:65 #: target/out/prefPages/about.js:69 msgid "Contributors" msgstr "" #: target/out/prefPages/about.js:64 target/out/prefPages/about.js:70 msgid "The creators of this extension" msgstr "The creators of this extension" #: target/out/prefPages/about.js:74 msgid "More contributors" msgstr "" #: target/out/prefPages/about.js:75 msgid "See more contributors on github" msgstr "" #: target/out/prefPages/about.js:85 msgid "Link" msgstr "" #: target/out/prefPages/about.js:86 msgid "External links about this extension" msgstr "" #: target/out/prefPages/about.js:90 msgid "Donate via github sponsors" msgstr "" #: target/out/prefPages/about.js:91 msgid "Support development!" msgstr "Support development!" #: target/out/prefPages/about.js:97 msgid "Rate and comment the extension!" msgstr "Rate and comment the extension!" #: target/out/prefPages/about.js:102 msgid "Github Repository" msgstr "Github Repository" #: target/out/prefPages/about.js:103 msgid "" "Add Star on Repository is helping me a lot!\n" "Please, if you found bug from this extension, you can make issue to make me know that!\n" "Or, you can create PR with wonderful features!" msgstr "" "Add Star on Repository is helping me a lot!\n" "Please, if you found bug from this extension, you can make issue to make me know that!\n" "Or, you can create PR with wonderful features!" #: target/out/prefPages/about.js:109 msgid "Add translation to this extension!" msgstr "" #: target/out/prefPages/about.js:115 msgid "Debug" msgstr "" #: target/out/prefPages/about.js:116 msgid "Extension debugging options" msgstr "" #: target/out/prefPages/about.js:120 msgid "Expose environment" msgstr "" #: target/out/prefPages/about.js:121 msgid "Expose extension environment to globalThis.qst" msgstr "" #: target/out/prefPages/about.js:126 msgid "Show layout border" msgstr "" #: target/out/prefPages/about.js:127 msgid "Show layout borders on Quick Settings" msgstr "" #: target/out/prefPages/about.js:132 msgid "Log level" msgstr "" #: target/out/prefPages/about.js:135 msgid "none" msgstr "" #: target/out/prefPages/about.js:136 msgid "error" msgstr "" #: target/out/prefPages/about.js:137 msgid "info" msgstr "" #: target/out/prefPages/about.js:138 msgid "debug" msgstr "" #: target/out/prefPages/toggles.js:12 msgid "Toggles" msgstr "" #: target/out/prefPages/toggles.js:19 msgid "DND Quick Toggle" msgstr "DND Quick Toggle" #: target/out/prefPages/toggles.js:20 msgid "Turn on to add the DND quick toggle on the Quick Settings panel" msgstr "" #: target/out/prefPages/toggles.js:28 msgid "DND indicator position" msgstr "" #: target/out/prefPages/toggles.js:29 msgid "Set DND indicator position" msgstr "" #: target/out/prefPages/toggles.js:33 msgid "System Tray" msgstr "" #: target/out/prefPages/toggles.js:34 msgid "Date Menu Button" msgstr "" #: target/out/prefPages/toggles.js:41 msgid "Unsafe Mode Quick Toggle" msgstr "Unsafe Mode Quick Toggle" #: target/out/prefPages/toggles.js:42 msgid "Turn on to add the unsafe quick toggle on the Quick Settings panel" msgstr "" #: target/out/prefPages/toggles.js:50 msgid "Save last session state" msgstr "" #: target/out/prefPages/toggles.js:51 msgid "Turn on to save last session unsafe state" msgstr "" #: target/out/prefPages/menu.js:9 target/out/prefPages/menu.js:141 msgid "Advanced animation style" msgstr "" #: target/out/prefPages/menu.js:13 msgid "Open Duration" msgstr "" #: target/out/prefPages/menu.js:14 msgid "Open animation duration in microseconds" msgstr "" #: target/out/prefPages/menu.js:21 msgid "Close Duration" msgstr "" #: target/out/prefPages/menu.js:22 msgid "Close animation duration in microseconds" msgstr "" #: target/out/prefPages/menu.js:29 msgid "Grid Content Opacity" msgstr "" #: target/out/prefPages/menu.js:30 msgid "" "Adjust grid content opacity.\n" "Set this to 255 to make opaque, and 0 to make transparent" msgstr "" #: target/out/prefPages/menu.js:37 msgid "Background Blur Radius" msgstr "" #: target/out/prefPages/menu.js:38 msgid "" "Adjust background blur radius.\n" "Set this to 0 to disable blur effect" msgstr "" #: target/out/prefPages/menu.js:45 msgid "Background Brightness" msgstr "" #: target/out/prefPages/menu.js:46 msgid "" "Adjust background brightness.\n" "Set this to 1000 to disable brightness control effect.\n" "Not impacts on gnome-shell's default dim effect." msgstr "" #: target/out/prefPages/menu.js:53 msgid "Background Opacity" msgstr "" #: target/out/prefPages/menu.js:54 msgid "" "Adjust background opacity.\n" "Set this to 255 to make opaque, and 0 to make transparent" msgstr "" #: target/out/prefPages/menu.js:61 msgid "Background X Scale" msgstr "" #: target/out/prefPages/menu.js:62 msgid "Adjust background x scale, 1000 means 1.0 scale" msgstr "" #: target/out/prefPages/menu.js:69 msgid "Background Y Scale" msgstr "" #: target/out/prefPages/menu.js:70 msgid "Adjust background y scale, 1000 means 1.0 scale" msgstr "" #: target/out/prefPages/menu.js:84 msgid "Menu" msgstr "" #: target/out/prefPages/menu.js:91 msgid "Overlay Mode" msgstr "" #: target/out/prefPages/menu.js:92 msgid "Display toggle, power, and sound menus as overlay" msgstr "" #: target/out/prefPages/menu.js:101 msgid "Overlay Width" msgstr "" #: target/out/prefPages/menu.js:102 msgid "" "Adjust overlay menu width\n" "Set this to 0 to disable adjusting" msgstr "" #: target/out/prefPages/menu.js:109 msgid "Overlay Animation Duration" msgstr "" #: target/out/prefPages/menu.js:110 msgid "" "Custom menu open animation duration in microseconds\n" "Set this to 0 to disable custom animation" msgstr "" #: target/out/prefPages/menu.js:117 msgid "Overlay Animation Style" msgstr "" #: target/out/prefPages/menu.js:118 msgid "Custom menu open animation style" msgstr "" #: target/out/prefPages/menu.js:120 msgid "Flyout" msgstr "" #: target/out/prefPages/menu.js:121 msgid "Dialog" msgstr "" #: target/out/prefPages/menu.js:130 target/out/prefPages/menu.js:143 msgid "Animation" msgstr "" #: target/out/prefPages/menu.js:131 msgid "" "Add menu animation on toggle menu opening and closing\n" "To get the best feel, turn on overlay mode" msgstr "" #: target/out/prefPages/menu.js:142 msgid "Adjust speed, blur, scale, and opacity" msgstr "" #: target/out/prefPages/layout.js:25 msgid "The item not found" msgstr "" #: target/out/prefPages/layout.js:28 msgid "No changes" msgstr "" #: target/out/prefPages/layout.js:31 msgid "The same item already exists" msgstr "" #: target/out/prefPages/layout.js:40 #, javascript-format msgid "Properties of %s" msgstr "" #: target/out/prefPages/layout.js:47 msgid "Save" msgstr "" #: target/out/prefPages/layout.js:64 msgid "Toggle editor" msgstr "" #: target/out/prefPages/layout.js:84 msgid "This option requires full gnome-shell reloading" msgstr "" #: target/out/prefPages/layout.js:160 target/out/prefPages/layout.js:278 #: target/out/prefPages/layout.js:437 target/out/prefPages/layout.js:672 msgid "Hide" msgstr "" #: target/out/prefPages/layout.js:232 #, javascript-format msgid "My item #%d" msgstr "" #: target/out/prefPages/layout.js:250 msgid "New Item" msgstr "" #: target/out/prefPages/layout.js:261 target/out/prefPages/layout.js:610 #: target/out/prefPages/layout.js:737 target/out/prefPages/layout.js:787 #: target/out/prefPages/layout.js:813 msgid "Ordering and Hiding" msgstr "" #: target/out/prefPages/layout.js:273 target/out/prefPages/layout.js:432 msgid "Friendly Name" msgstr "" #: target/out/prefPages/layout.js:283 msgid "Title Regex (Javascript Regex)" msgstr "" #: target/out/prefPages/layout.js:288 target/out/prefPages/layout.js:442 msgid "Constructor Name" msgstr "" #: target/out/prefPages/layout.js:294 target/out/prefPages/layout.js:448 msgid "GType Name" msgstr "" #: target/out/prefPages/layout.js:302 target/out/prefPages/layout.js:456 msgid "This is the comment for easy identification in the settings list. It has no effect on the behavior of the extension" msgstr "" #: target/out/prefPages/layout.js:307 target/out/prefPages/layout.js:461 msgid "Javascript constructor name" msgstr "" #: target/out/prefPages/layout.js:312 target/out/prefPages/layout.js:466 msgid "GObject gtype name. You can get this value by calling GObject.type_name_from_instance" msgstr "" #: target/out/prefPages/layout.js:342 msgid "Keyboard Backlight" msgstr "" #: target/out/prefPages/layout.js:388 target/out/prefPages/layout.js:538 msgid "Unordered items" msgstr "" #: target/out/prefPages/layout.js:486 msgid "Remote Access Applet" msgstr "" #: target/out/prefPages/layout.js:487 msgid "Camera" msgstr "" #: target/out/prefPages/layout.js:488 msgid "Volume Input" msgstr "" #: target/out/prefPages/layout.js:489 msgid "Location" msgstr "" #: target/out/prefPages/layout.js:490 msgid "Thunderbolt" msgstr "" #: target/out/prefPages/layout.js:492 msgid "Network" msgstr "" #: target/out/prefPages/layout.js:495 msgid "Volume Output" msgstr "" #: target/out/prefPages/layout.js:497 msgid "System (Battery)" msgstr "" #: target/out/prefPages/layout.js:618 msgid "Desktop Spacer" msgstr "" #: target/out/prefPages/layout.js:629 msgid "Laptop Spacer" msgstr "" #: target/out/prefPages/layout.js:641 msgid "Capture button" msgstr "" #: target/out/prefPages/layout.js:647 msgid "Settings button" msgstr "" #: target/out/prefPages/layout.js:653 msgid "Lock button" msgstr "" #: target/out/prefPages/layout.js:659 msgid "Shutdown button" msgstr "" #: target/out/prefPages/layout.js:665 msgid "Battery button" msgstr "" #: target/out/prefPages/layout.js:711 msgid "Layout" msgstr "" #: target/out/prefPages/layout.js:718 msgid "Quick Toggles Layout" msgstr "" #: target/out/prefPages/layout.js:719 target/out/prefPages/layout.js:734 msgid "Adjust quick toggles layout" msgstr "" #: target/out/prefPages/layout.js:738 msgid "Reorder and hide quick toggles" msgstr "" #: target/out/prefPages/layout.js:745 msgid "System Indicators" msgstr "" #: target/out/prefPages/layout.js:746 msgid "Adjust system indicators layout and style" msgstr "" #: target/out/prefPages/layout.js:751 msgid "Accent screen sharing indicator" msgstr "" #: target/out/prefPages/layout.js:752 msgid "Use shell accent color on screen sharing indicator" msgstr "" #: target/out/prefPages/layout.js:757 msgid "Accent screen recording indicator" msgstr "" #: target/out/prefPages/layout.js:758 msgid "Use shell accent color on screen recording indicator" msgstr "" #: target/out/prefPages/layout.js:763 msgid "Privacy indicators style" msgstr "" #: target/out/prefPages/layout.js:764 msgid "Use monochrome or shell accent color on privarcy indicators" msgstr "" #: target/out/prefPages/layout.js:767 msgid "Accent" msgstr "" #: target/out/prefPages/layout.js:768 msgid "Monochrome" msgstr "" #: target/out/prefPages/layout.js:777 msgid "Adjust system indicators" msgstr "" #: target/out/prefPages/layout.js:788 msgid "Reorder and hide system indicators" msgstr "" #: target/out/prefPages/layout.js:795 msgid "System Items Layout" msgstr "" #: target/out/prefPages/layout.js:800 target/out/prefPages/layout.js:815 msgid "Adjust system items layout" msgstr "" #: target/out/prefPages/layout.js:804 msgid "Hide layout box" msgstr "" #: target/out/prefPages/layout.js:805 msgid "Hide all buttons and layout box" msgstr "" #: target/out/prefPages/layout.js:814 msgid "Reorder and hide system items" msgstr "" #: target/out/prefPages/layout.js:823 msgid "Date Menu" msgstr "" #: target/out/prefPages/layout.js:824 msgid "Adjust Date Menu layout" msgstr "" #: target/out/prefPages/layout.js:828 msgid "Hide left box" msgstr "" #: target/out/prefPages/layout.js:829 msgid "Hide the left box of the date menu, which contains notifications and media control" msgstr "" #: target/out/prefPages/layout.js:834 msgid "Hide right box" msgstr "" #: target/out/prefPages/layout.js:835 msgid "Hide the right box of the date menu, which contains calendar, world clock and weather" msgstr "" #: target/out/prefPages/layout.js:840 msgid "Disable menu" msgstr "" #: target/out/prefPages/layout.js:841 msgid "Do not open date menu when the date menu button clicked" msgstr "" #~ msgid "Donate via patreon" #~ msgstr "Donate via patreon" #~ msgid "Set maximum height of the Notifications widget. default is 292" #~ msgstr "Set maximum height of the Notifications widget. default is 292" #~ msgid "Other" #~ msgstr "Other" #~ msgid "" #~ "Hide notifications on date menu.\n" #~ "*this option removes media control on date menu too*" #~ msgstr "" #~ "Hide notifications on date menu.\n" #~ "*this option removes media control on date menu too*" #~ msgid "Hide media control on date menu." #~ msgstr "Hide media control on date menu." #~ msgid "Sound Settings" #~ msgstr "Sound Settings" #~ msgid "Notification Widget" #~ msgstr "Notification Widget" #~ msgid "Turn on to make the notification widget visible on the Quick Settings panel" #~ msgstr "Turn on to make the notification widget visible on the Quick Settings panel" #~ msgid "Links" #~ msgstr "Links" #~ msgid "Contributor" #~ msgstr "Contributor" #~ msgid "Add Application to filtering" #~ msgstr "Add Application to filtering" #~ msgid "Add" #~ msgstr "Add" #~ msgid "Cancel" #~ msgstr "Cancel" #~ msgid "Application name" #~ msgstr "Application name" #~ msgid "General" #~ msgstr "General" #~ msgid "Enchant input/output slider" #~ msgstr "Enchant input/output slider" #~ msgid "Show current audio output selection" #~ msgstr "Show current audio output selection" #~ msgid "Always show the current audio output selection above the volume slider" #~ msgstr "Always show the current audio output selection above the volume slider" #~ msgid "Show current audio input selection" #~ msgstr "Show current audio input selection" #~ msgid "Always show the current audio input selection above the volume slider" #~ msgstr "Always show the current audio input selection above the volume slider" #~ msgid "Always show input" #~ msgstr "Always show input" #~ msgid "Always show the audio input volume slider, even when there is no audio input stream." #~ msgstr "Always show the audio input volume slider, even when there is no audio input stream." #~ msgid "Add volume mixer (PulseAudio, Pipewire)" #~ msgstr "Add volume mixer (PulseAudio, Pipewire)" #~ msgid "" #~ "Turn on to make the volume mixer visible\n" #~ "Forked from https://github.com/mymindstorm/gnome-volume-mixer" #~ msgstr "Turn on to make the volume mixer visible. Forked from https://github.com/mymindstorm/gnome-volume-mixer" #~ msgid "Position" #~ msgstr "Position" #~ msgid "Set volume mixer position" #~ msgstr "Set volume mixer position" #~ msgid "Top (Below Output/Input slider)" #~ msgstr "Top (Below Output/Input slider)" #~ msgid "Show stream Description" #~ msgstr "Show stream Description" #~ msgid "Show audio stream description above the slider" #~ msgstr "Show audio stream description above the slider" #~ msgid "Show stream Icon" #~ msgstr "Show stream Icon" #~ msgid "Show application icon in front of the slider" #~ msgstr "Show application icon in front of the slider" #~ msgid "Filter applications shown in the volume mixer." #~ msgstr "Filter applications shown in the volume mixer." #~ msgid "Filter Mode" #~ msgstr "Filter Mode" #~ msgid "Blacklist" #~ msgstr "Blacklist" #~ msgid "Whitelist" #~ msgstr "Whitelist" #~ msgid "Using Javascript Regex" #~ msgstr "Using Javascript Regex" #~ msgid "Use Javascript RegExp for filtering app name or description" #~ msgstr "Use Javascript RegExp for filtering app name or description" #~ msgid "Check Stream Description" #~ msgstr "Check Stream Description" #~ msgid "Check Description also" #~ msgstr "Check Description also" #~ msgid "Add more buttons" #~ msgstr "Add more buttons" #~ msgid "Turn on the buttons you want to add on Quick Settings" #~ msgstr "Turn on the buttons you want to add on Quick Settings" #~ msgid "Turn on to make the DND quick toggle visible on the Quick Settings panel" #~ msgstr "Turn on to make the DND quick toggle visible on the Quick Settings panel" #~ msgid "Turn on to make the unsafe quick toggle visible on the Quick Settings panel" #~ msgstr "Turn on to make the unsafe quick toggle visible on the Quick Settings panel" #~ msgid "This extension is distributed with license GPL 3+" #~ msgstr "This extension is distributed with license GPL 3+" #~ msgid "excludes Third-party. Third party codes follow their license" #~ msgstr "excludes Third-party. Third party codes follow their license" #~ msgid "Extension Version" #~ msgstr "Extension Version" #~ msgid "Unknown (Built from source)" #~ msgstr "Unknown (Built from source)" #~ msgid "Third party LICENSE" #~ msgstr "Third party LICENSE" #~ msgid "LICENSE OF CODES WHICH USED ON THIS EXTENSION" #~ msgstr "LICENSE OF CODES WHICH USED ON THIS EXTENSION" #~ msgid "Media Controls widget" #~ msgstr "Media Controls widget" #~ msgid "Turn on to make the Media Control widget visible on the Quick Settings panel" #~ msgstr "Turn on to make the Media Control widget visible on the Quick Settings panel" #~ msgid "Compact Mode" #~ msgstr "Compact Mode" #~ msgid "Auto Hide" #~ msgstr "Auto Hide" #~ msgid "Quick Toggles" #~ msgstr "Quick Toggles" #~ msgid "Fix Weather Widget Overflow" #~ msgstr "Fix Weather Widget Overflow" #~ msgid "Fix overflow visual bug of weather widget in datemenu" #~ msgstr "Fix overflow visual bug of weather widget in datemenu" #~ msgid "Remove Notifications On Date Menu" #~ msgstr "Remove Notifications On Date Menu" #~ msgid "Remove Media Control On Date Menu" #~ msgstr "Remove Media Control On Date Menu" #~ msgid "Do not adjust the border radius of contents." #~ msgstr "Do not adjust the border radius of contents." #~ msgid "Don't adjust the border of messages and media controls." #~ msgstr "Don't adjust the border of messages and media controls." #~ msgid "Do not remove the shadow of contents." #~ msgstr "Do not remove the shadow of contents." #~ msgid "Don't remove the shadow of messages and media controls." #~ msgstr "Don't remove the shadow of messages and media controls." #~ msgid "Set Notifications widget position" #~ msgstr "Set Notifications widget position" #~ msgid "Buttons to remove" #~ msgstr "Buttons to remove" #~ msgid "Turn on the buttons you want to remove from Quick Settings" #~ msgstr "Turn on the buttons you want to remove from Quick Settings" #~ msgid "Remove chosen buttons from quick panel" #~ msgstr "Remove chosen buttons from quick panel" #~ msgid "Forked from my extension https://github.com/qwreey75/gnome-quick-settings-button-remover" #~ msgstr "Forked from my extension https://github.com/qwreey75/gnome-quick-settings-button-remover" #~ msgid "This feature is unstable sometime" #~ msgstr "This feature is unstable sometime" #~ msgid "" #~ "When lock/unlock with gnome-screensaver, unexpected behavior occurs\n" #~ "Please do not report issue about known issue, Almost duplicated\n" #~ "Known issue:\n" #~ " button doesn't remove after lockscreen\n" #~ " modal get bigger after lockscreen" #~ msgstr "" #~ "When lock/unlock with gnome-screensaver, unexpected behavior occurs\n" #~ "Please do not report issue about known issue, Almost duplicated\n" #~ "Known issue:\n" #~ " button doesn't remove after lockscreen\n" #~ " modal get bigger after lockscreen" #~ msgid "Please turn off if some bug occurred" #~ msgstr "Please turn off if some bug occurred" #~ msgid "Unknown" #~ msgstr "Unknown" #~ msgid "" #~ "Do not separate Quick Settings and Notifications widgets, \byou should enable this option because separated panels can make many visual bugs\n" #~ "(such as margin or padding not matching with the theme)" #~ msgstr "" #~ "Do not separate Quick Settings and Notifications widgets, \byou should enable this option because separated panels can make many visual bugs\n" #~ "(such as margin or padding not matching with the theme)" #~ msgid "Information" #~ msgstr "Information" #~ msgid "Version" #~ msgstr "Version" #~ msgid "" #~ "Forked from https://github.com/mymindstorm/gnome-volume-mixer\n" #~ "This feature works well with both PulseAudio and Pipewire protocols" #~ msgstr "" #~ "Forked from https://github.com/mymindstorm/gnome-volume-mixer\n" #~ "This feature works well with both PulseAudio and Pipewire protocols" #~ msgid "Visible" #~ msgstr "Visible" #~ msgid "Turn on to make the volume mixer visible" #~ msgstr "Turn on to make the volume mixer visible" #~ msgid "Application Filtering" #~ msgstr "Application Filtering" #~ msgid "Input/Output" #~ msgstr "Input/Output" #~ msgid "Add notifications widget" #~ msgstr "Add notifications widget" #~ msgid "" #~ "Reference from https://github.com/Aylur/gnome-extensions\n" #~ "Source code of that is not used on this extension" #~ msgstr "" #~ "Reference from https://github.com/Aylur/gnome-extensions\n" #~ "Source code of that is not used on this extension" #~ msgid "Media Controls" #~ msgstr "Media Controls" #~ msgid "Add Media Controls widget" #~ msgstr "Add Media Controls widget" ================================================ FILE: po/ja.po ================================================ # 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-07-20 15:34+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: ja\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: target/out/libs/prefs/components.js:57 msgid "Details" msgstr "" #: target/out/libs/prefs/components.js:144 msgid "This feature marked as experimental" msgstr "" #: target/out/libs/prefs/components.js:274 msgid "Reset to default" msgstr "" #: target/out/libs/prefs/components.js:512 msgid "Theme default" msgstr "" #: target/out/libs/prefs/components.js:853 msgid "Homepage" msgstr "" #: target/out/libs/prefs/components.js:859 #: target/out/libs/prefs/components.js:863 target/out/prefPages/about.js:49 #: target/out/prefPages/about.js:51 target/out/prefPages/about.js:56 msgid "License" msgstr "" #: target/out/libs/prefs/components.js:860 msgid "Loading ..." msgstr "" #: target/out/libs/prefs/components.js:869 msgid "Affected Files" msgstr "" #: target/out/libs/prefs/components.js:924 msgid "Changelog" msgstr "" #: target/out/libs/prefs/components.js:938 msgid "(Current)" msgstr "" #: target/out/libs/prefs/components.js:969 #, javascript-format msgid "> **Date:** %s" msgstr "" #: target/out/libs/prefs/components.js:970 #, javascript-format msgid "> **Git Hash:** %s" msgstr "" #: target/out/libs/prefs/components.js:971 #, javascript-format msgid "> **Build Number:** %d" msgstr "" #: target/out/libs/prefs/components.js:1034 msgid "Padding" msgstr "" #: target/out/libs/prefs/components.js:1038 msgid "Top" msgstr "" #: target/out/libs/prefs/components.js:1049 msgid "Bottom" msgstr "" #: target/out/libs/prefs/components.js:1060 msgid "Left" msgstr "" #: target/out/libs/prefs/components.js:1071 msgid "Right" msgstr "" #: target/out/prefs.js:60 msgid "Stable" msgstr "" #: target/out/prefs.js:63 msgid "Development" msgstr "" #: target/out/prefs.js:66 msgid "Preview" msgstr "" #: target/out/prefs.js:69 msgid "(Github Release)" msgstr "" #: target/out/prefs.js:72 msgid "(Built from source)" msgstr "" #: target/out/features/widget/notifications.js:26 msgid "No Notifications" msgstr "" #: target/out/features/widget/notifications.js:58 #: target/out/features/widget/notifications.js:122 msgid "Clear" msgstr "" #: target/out/features/widget/notifications.js:76 msgid "Notifications" msgstr "" #: target/out/features/widget/notifications.js:105 #: target/out/features/toggle/dndQuickToggle.js:10 #: target/out/prefPages/layout.js:345 target/out/prefPages/layout.js:485 msgid "Do Not Disturb" msgstr "" #: target/out/features/widget/media.js:118 msgid "Unknown title" msgstr "" #: target/out/features/widget/media.js:888 msgid "Media" msgstr "" #: target/out/features/widget/volumeMixer.js:105 msgid "Volume changed" msgstr "" #: target/out/features/widget/volumeMixer.js:463 msgid "Open volumx mixer" msgstr "" #: target/out/features/widget/volumeMixer.js:480 msgid "Volume Mixer" msgstr "" #: target/out/features/widget/weather.js:73 msgid "Weather" msgstr "" #: target/out/features/widget/weather.js:192 msgid "Location has not been set" msgstr "" #: target/out/features/toggle/unsafeQuickToggle.js:11 #: target/out/prefPages/layout.js:346 target/out/prefPages/layout.js:496 msgid "Unsafe Mode" msgstr "" #: target/out/prefPages/widgets.js:11 msgid "Handle radius" msgstr "" #: target/out/prefPages/widgets.js:12 msgid "Set this to 0 to use default radius" msgstr "" #: target/out/prefPages/widgets.js:18 msgid "Handle color" msgstr "" #: target/out/prefPages/widgets.js:36 msgid "Slider style" msgstr "" #: target/out/prefPages/widgets.js:39 msgid "Slim" msgstr "" #: target/out/prefPages/widgets.js:40 target/out/prefPages/layout.js:766 msgid "Default" msgstr "" #: target/out/prefPages/widgets.js:48 target/out/prefPages/widgets.js:173 msgid "Background color" msgstr "" #: target/out/prefPages/widgets.js:55 msgid "Active Background color" msgstr "" #: target/out/prefPages/widgets.js:62 msgid "Thickness" msgstr "" #: target/out/prefPages/widgets.js:66 msgid "Set this to 0 to use default thickness" msgstr "" #: target/out/prefPages/widgets.js:76 msgid "Widgets" msgstr "" #: target/out/prefPages/widgets.js:83 target/out/prefPages/widgets.js:136 #: target/out/prefPages/widgets.js:162 target/out/prefPages/widgets.js:224 msgid "Media Widget" msgstr "" #: target/out/prefPages/widgets.js:88 msgid "Turn on to make the media widget visible on the Quick Settings panel" msgstr "" #: target/out/prefPages/widgets.js:92 target/out/prefPages/widgets.js:280 #: target/out/prefPages/widgets.js:343 msgid "Compact mode" msgstr "" #: target/out/prefPages/widgets.js:93 msgid "" "Make Media Controls widget smaller\n" "Make it more similar in size to the notification message" msgstr "" #: target/out/prefPages/widgets.js:99 msgid "Control buttons opacity" msgstr "" #: target/out/prefPages/widgets.js:100 msgid "Set this to 255 to make opaque, and 0 to make transparent" msgstr "" #: target/out/prefPages/widgets.js:108 msgid "Show next button" msgstr "" #: target/out/prefPages/widgets.js:109 msgid "Add next contorl button next to description" msgstr "" #: target/out/prefPages/widgets.js:115 msgid "Show previous button" msgstr "" #: target/out/prefPages/widgets.js:116 msgid "Add previous contorl button next to description" msgstr "" #: target/out/prefPages/widgets.js:122 msgid "Show pause button" msgstr "" #: target/out/prefPages/widgets.js:123 msgid "Add pause contorl button next to description" msgstr "" #: target/out/prefPages/widgets.js:129 target/out/prefPages/widgets.js:138 msgid "Show progress bar" msgstr "" #: target/out/prefPages/widgets.js:130 target/out/prefPages/widgets.js:139 msgid "Add progress bar under description" msgstr "" #: target/out/prefPages/widgets.js:155 target/out/prefPages/widgets.js:164 msgid "Gradient background" msgstr "" #: target/out/prefPages/widgets.js:156 target/out/prefPages/widgets.js:169 msgid "" "Use gradient background extracted from cover image\n" "May affect performance slightly" msgstr "" #: target/out/prefPages/widgets.js:174 msgid "Base background color" msgstr "" #: target/out/prefPages/widgets.js:182 msgid "Start opacity" msgstr "" #: target/out/prefPages/widgets.js:183 msgid "Adjust left side transparency, Set this to 1000 to make opaque" msgstr "" #: target/out/prefPages/widgets.js:190 msgid "Start color" msgstr "" #: target/out/prefPages/widgets.js:191 msgid "Adjust left side background color mixing, Set this to 1000 to show extracted color" msgstr "" #: target/out/prefPages/widgets.js:198 msgid "End opacity" msgstr "" #: target/out/prefPages/widgets.js:199 msgid "Adjust right side transparency, Set this to 1000 to make opaque" msgstr "" #: target/out/prefPages/widgets.js:206 msgid "End color" msgstr "" #: target/out/prefPages/widgets.js:207 msgid "Adjust right side background color mixing, Set this to 1000 to show extracted color" msgstr "" #: target/out/prefPages/widgets.js:216 target/out/prefPages/widgets.js:226 msgid "Round clip effect" msgstr "" #: target/out/prefPages/widgets.js:217 target/out/prefPages/widgets.js:231 msgid "Use round clip effect to make transition more natural" msgstr "" #: target/out/prefPages/widgets.js:234 msgid "Padding adjustment" msgstr "" #: target/out/prefPages/widgets.js:236 msgid "Adjust clip effect padding, edit this if your theme has a different margin or padding" msgstr "" #: target/out/prefPages/widgets.js:253 target/out/prefPages/widgets.js:318 #: target/out/prefPages/widgets.js:350 msgid "Remove shadow" msgstr "" #: target/out/prefPages/widgets.js:254 msgid "" "Remove shadow from media message\n" "Use if your theme creates unnecessary shadows" msgstr "" #: target/out/prefPages/widgets.js:260 msgid "Smooth scroll speed" msgstr "" #: target/out/prefPages/widgets.js:261 msgid "Adjust trackpad and trackpoint scroll speed, negative number for invert direction" msgstr "" #: target/out/prefPages/widgets.js:271 msgid "Notifications Widget" msgstr "" #: target/out/prefPages/widgets.js:276 msgid "Turn on to make the notifications widget visible on the Quick Settings panel" msgstr "" #: target/out/prefPages/widgets.js:281 msgid "Make notifications smaller" msgstr "" #: target/out/prefPages/widgets.js:287 target/out/prefPages/widgets.js:418 msgid "Max height" msgstr "" #: target/out/prefPages/widgets.js:288 #, javascript-format msgid "Set maximum height of the Notifications widget, default is %d. Set this to 0 to disable max height" msgstr "" #: target/out/prefPages/widgets.js:296 target/out/prefPages/widgets.js:441 msgid "Fade out offset" msgstr "" #: target/out/prefPages/widgets.js:297 target/out/prefPages/widgets.js:442 msgid "Set position of the fade out effect begins. Set this to 0 to disable fade out effect. default is 46" msgstr "" #: target/out/prefPages/widgets.js:304 msgid "Auto hide" msgstr "" #: target/out/prefPages/widgets.js:305 msgid "Hide the Notifications widget when have no notifications" msgstr "" #: target/out/prefPages/widgets.js:311 msgid "Use native controls" msgstr "" #: target/out/prefPages/widgets.js:312 msgid "Use native dnd switch and clear button" msgstr "" #: target/out/prefPages/widgets.js:319 msgid "" "Remove shadow from notification message\n" "Use if your theme creates unnecessary shadows" msgstr "" #: target/out/prefPages/widgets.js:325 target/out/prefPages/widgets.js:427 msgid "Show scrollbar" msgstr "" #: target/out/prefPages/widgets.js:326 msgid "Show scrollbar on message list" msgstr "" #: target/out/prefPages/widgets.js:334 msgid "Weather Widget" msgstr "" #: target/out/prefPages/widgets.js:339 msgid "Turn on to make the weather widget visible on the Quick Settings panel" msgstr "" #: target/out/prefPages/widgets.js:344 msgid "Make weather widget smaller" msgstr "" #: target/out/prefPages/widgets.js:351 msgid "" "Remove shadow from weather widget\n" "Use if your theme creates unnecessary shadows" msgstr "" #: target/out/prefPages/widgets.js:357 msgid "Click command" msgstr "" #: target/out/prefPages/widgets.js:363 msgid "Show location" msgstr "" #: target/out/prefPages/widgets.js:364 msgid "Show the location label on header" msgstr "" #: target/out/prefPages/widgets.js:373 msgid "Forecast interval" msgstr "" #: target/out/prefPages/widgets.js:374 msgid "Adjust forecast interval in hour" msgstr "" #: target/out/prefPages/widgets.js:381 msgid "Max forecasts" msgstr "" #: target/out/prefPages/widgets.js:382 msgid "Adjust max forecasts" msgstr "" #: target/out/prefPages/widgets.js:388 target/out/prefPages/widgets.js:456 msgid "Volume mixer Widget" msgstr "" #: target/out/prefPages/widgets.js:393 msgid "Turn on to make the volume mixer widget visible on the Quick Settings panel" msgstr "" #: target/out/prefPages/widgets.js:397 msgid "Label text" msgstr "" #: target/out/prefPages/widgets.js:398 msgid "Choose label above slider text source" msgstr "" #: target/out/prefPages/widgets.js:400 msgid "Both" msgstr "" #: target/out/prefPages/widgets.js:401 msgid "Title" msgstr "" #: target/out/prefPages/widgets.js:402 msgid "Description" msgstr "" #: target/out/prefPages/widgets.js:403 msgid "None" msgstr "" #: target/out/prefPages/widgets.js:411 msgid "Label opacity" msgstr "" #: target/out/prefPages/widgets.js:412 msgid "" "Adjust label opacity.\n" "Set this to 255 to make opaque, and 0 to make transparent" msgstr "" #: target/out/prefPages/widgets.js:419 #, javascript-format msgid "Set maximum height of the Volume mixer widget, default is %d. Set this to 0 to disable max height" msgstr "" #: target/out/prefPages/widgets.js:428 msgid "Show scrollbar on mixer list" msgstr "" #: target/out/prefPages/widgets.js:434 msgid "Show stream icon" msgstr "" #: target/out/prefPages/widgets.js:435 msgid "Show stream icon above mixer sliders" msgstr "" #: target/out/prefPages/widgets.js:450 target/out/prefPages/widgets.js:458 msgid "Attach to output slider" msgstr "" #: target/out/prefPages/widgets.js:451 target/out/prefPages/widgets.js:459 msgid "Attach volume mixer menu button to output slider. Use if you prefer compact layout" msgstr "" #: target/out/prefPages/widgets.js:468 msgid "Menu icon" msgstr "" #: target/out/prefPages/about.js:12 target/out/prefPages/about.js:32 msgid "About" msgstr "" #: target/out/prefPages/about.js:33 msgid "Common extension informations" msgstr "" #: target/out/prefPages/about.js:36 target/out/prefPages/about.js:40 msgid "Changelogs" msgstr "" #: target/out/prefPages/about.js:37 target/out/prefPages/about.js:41 msgid "View the change history for this extension" msgstr "" #: target/out/prefPages/about.js:50 target/out/prefPages/about.js:57 msgid "License of codes" msgstr "" #: target/out/prefPages/about.js:63 target/out/prefPages/about.js:65 #: target/out/prefPages/about.js:69 msgid "Contributors" msgstr "" #: target/out/prefPages/about.js:64 target/out/prefPages/about.js:70 msgid "The creators of this extension" msgstr "" #: target/out/prefPages/about.js:74 msgid "More contributors" msgstr "" #: target/out/prefPages/about.js:75 msgid "See more contributors on github" msgstr "" #: target/out/prefPages/about.js:85 msgid "Link" msgstr "" #: target/out/prefPages/about.js:86 msgid "External links about this extension" msgstr "" #: target/out/prefPages/about.js:90 msgid "Donate via github sponsors" msgstr "" #: target/out/prefPages/about.js:91 msgid "Support development!" msgstr "" #: target/out/prefPages/about.js:97 msgid "Rate and comment the extension!" msgstr "" #: target/out/prefPages/about.js:102 msgid "Github Repository" msgstr "" #: target/out/prefPages/about.js:103 msgid "" "Add Star on Repository is helping me a lot!\n" "Please, if you found bug from this extension, you can make issue to make me know that!\n" "Or, you can create PR with wonderful features!" msgstr "" #: target/out/prefPages/about.js:109 msgid "Add translation to this extension!" msgstr "" #: target/out/prefPages/about.js:115 msgid "Debug" msgstr "" #: target/out/prefPages/about.js:116 msgid "Extension debugging options" msgstr "" #: target/out/prefPages/about.js:120 msgid "Expose environment" msgstr "" #: target/out/prefPages/about.js:121 msgid "Expose extension environment to globalThis.qst" msgstr "" #: target/out/prefPages/about.js:126 msgid "Show layout border" msgstr "" #: target/out/prefPages/about.js:127 msgid "Show layout borders on Quick Settings" msgstr "" #: target/out/prefPages/about.js:132 msgid "Log level" msgstr "" #: target/out/prefPages/about.js:135 msgid "none" msgstr "" #: target/out/prefPages/about.js:136 msgid "error" msgstr "" #: target/out/prefPages/about.js:137 msgid "info" msgstr "" #: target/out/prefPages/about.js:138 msgid "debug" msgstr "" #: target/out/prefPages/toggles.js:12 msgid "Toggles" msgstr "" #: target/out/prefPages/toggles.js:19 msgid "DND Quick Toggle" msgstr "" #: target/out/prefPages/toggles.js:20 msgid "Turn on to add the DND quick toggle on the Quick Settings panel" msgstr "" #: target/out/prefPages/toggles.js:28 msgid "DND indicator position" msgstr "" #: target/out/prefPages/toggles.js:29 msgid "Set DND indicator position" msgstr "" #: target/out/prefPages/toggles.js:33 msgid "System Tray" msgstr "" #: target/out/prefPages/toggles.js:34 msgid "Date Menu Button" msgstr "" #: target/out/prefPages/toggles.js:41 msgid "Unsafe Mode Quick Toggle" msgstr "" #: target/out/prefPages/toggles.js:42 msgid "Turn on to add the unsafe quick toggle on the Quick Settings panel" msgstr "" #: target/out/prefPages/toggles.js:50 msgid "Save last session state" msgstr "" #: target/out/prefPages/toggles.js:51 msgid "Turn on to save last session unsafe state" msgstr "" #: target/out/prefPages/menu.js:9 target/out/prefPages/menu.js:141 msgid "Advanced animation style" msgstr "" #: target/out/prefPages/menu.js:13 msgid "Open Duration" msgstr "" #: target/out/prefPages/menu.js:14 msgid "Open animation duration in microseconds" msgstr "" #: target/out/prefPages/menu.js:21 msgid "Close Duration" msgstr "" #: target/out/prefPages/menu.js:22 msgid "Close animation duration in microseconds" msgstr "" #: target/out/prefPages/menu.js:29 msgid "Grid Content Opacity" msgstr "" #: target/out/prefPages/menu.js:30 msgid "" "Adjust grid content opacity.\n" "Set this to 255 to make opaque, and 0 to make transparent" msgstr "" #: target/out/prefPages/menu.js:37 msgid "Background Blur Radius" msgstr "" #: target/out/prefPages/menu.js:38 msgid "" "Adjust background blur radius.\n" "Set this to 0 to disable blur effect" msgstr "" #: target/out/prefPages/menu.js:45 msgid "Background Brightness" msgstr "" #: target/out/prefPages/menu.js:46 msgid "" "Adjust background brightness.\n" "Set this to 1000 to disable brightness control effect.\n" "Not impacts on gnome-shell's default dim effect." msgstr "" #: target/out/prefPages/menu.js:53 msgid "Background Opacity" msgstr "" #: target/out/prefPages/menu.js:54 msgid "" "Adjust background opacity.\n" "Set this to 255 to make opaque, and 0 to make transparent" msgstr "" #: target/out/prefPages/menu.js:61 msgid "Background X Scale" msgstr "" #: target/out/prefPages/menu.js:62 msgid "Adjust background x scale, 1000 means 1.0 scale" msgstr "" #: target/out/prefPages/menu.js:69 msgid "Background Y Scale" msgstr "" #: target/out/prefPages/menu.js:70 msgid "Adjust background y scale, 1000 means 1.0 scale" msgstr "" #: target/out/prefPages/menu.js:84 msgid "Menu" msgstr "" #: target/out/prefPages/menu.js:91 msgid "Overlay Mode" msgstr "" #: target/out/prefPages/menu.js:92 msgid "Display toggle, power, and sound menus as overlay" msgstr "" #: target/out/prefPages/menu.js:101 msgid "Overlay Width" msgstr "" #: target/out/prefPages/menu.js:102 msgid "" "Adjust overlay menu width\n" "Set this to 0 to disable adjusting" msgstr "" #: target/out/prefPages/menu.js:109 msgid "Overlay Animation Duration" msgstr "" #: target/out/prefPages/menu.js:110 msgid "" "Custom menu open animation duration in microseconds\n" "Set this to 0 to disable custom animation" msgstr "" #: target/out/prefPages/menu.js:117 msgid "Overlay Animation Style" msgstr "" #: target/out/prefPages/menu.js:118 msgid "Custom menu open animation style" msgstr "" #: target/out/prefPages/menu.js:120 msgid "Flyout" msgstr "" #: target/out/prefPages/menu.js:121 msgid "Dialog" msgstr "" #: target/out/prefPages/menu.js:130 target/out/prefPages/menu.js:143 msgid "Animation" msgstr "" #: target/out/prefPages/menu.js:131 msgid "" "Add menu animation on toggle menu opening and closing\n" "To get the best feel, turn on overlay mode" msgstr "" #: target/out/prefPages/menu.js:142 msgid "Adjust speed, blur, scale, and opacity" msgstr "" #: target/out/prefPages/layout.js:25 msgid "The item not found" msgstr "" #: target/out/prefPages/layout.js:28 msgid "No changes" msgstr "" #: target/out/prefPages/layout.js:31 msgid "The same item already exists" msgstr "" #: target/out/prefPages/layout.js:40 #, javascript-format msgid "Properties of %s" msgstr "" #: target/out/prefPages/layout.js:47 msgid "Save" msgstr "" #: target/out/prefPages/layout.js:64 msgid "Toggle editor" msgstr "" #: target/out/prefPages/layout.js:84 msgid "This option requires full gnome-shell reloading" msgstr "" #: target/out/prefPages/layout.js:160 target/out/prefPages/layout.js:278 #: target/out/prefPages/layout.js:437 target/out/prefPages/layout.js:672 msgid "Hide" msgstr "" #: target/out/prefPages/layout.js:232 #, javascript-format msgid "My item #%d" msgstr "" #: target/out/prefPages/layout.js:250 msgid "New Item" msgstr "" #: target/out/prefPages/layout.js:261 target/out/prefPages/layout.js:610 #: target/out/prefPages/layout.js:737 target/out/prefPages/layout.js:787 #: target/out/prefPages/layout.js:813 msgid "Ordering and Hiding" msgstr "" #: target/out/prefPages/layout.js:273 target/out/prefPages/layout.js:432 msgid "Friendly Name" msgstr "" #: target/out/prefPages/layout.js:283 msgid "Title Regex (Javascript Regex)" msgstr "" #: target/out/prefPages/layout.js:288 target/out/prefPages/layout.js:442 msgid "Constructor Name" msgstr "" #: target/out/prefPages/layout.js:294 target/out/prefPages/layout.js:448 msgid "GType Name" msgstr "" #: target/out/prefPages/layout.js:302 target/out/prefPages/layout.js:456 msgid "This is the comment for easy identification in the settings list. It has no effect on the behavior of the extension" msgstr "" #: target/out/prefPages/layout.js:307 target/out/prefPages/layout.js:461 msgid "Javascript constructor name" msgstr "" #: target/out/prefPages/layout.js:312 target/out/prefPages/layout.js:466 msgid "GObject gtype name. You can get this value by calling GObject.type_name_from_instance" msgstr "" #: target/out/prefPages/layout.js:342 msgid "Keyboard Backlight" msgstr "" #: target/out/prefPages/layout.js:388 target/out/prefPages/layout.js:538 msgid "Unordered items" msgstr "" #: target/out/prefPages/layout.js:486 msgid "Remote Access Applet" msgstr "" #: target/out/prefPages/layout.js:487 msgid "Camera" msgstr "" #: target/out/prefPages/layout.js:488 msgid "Volume Input" msgstr "" #: target/out/prefPages/layout.js:489 msgid "Location" msgstr "" #: target/out/prefPages/layout.js:490 msgid "Thunderbolt" msgstr "" #: target/out/prefPages/layout.js:492 msgid "Network" msgstr "" #: target/out/prefPages/layout.js:495 msgid "Volume Output" msgstr "" #: target/out/prefPages/layout.js:497 msgid "System (Battery)" msgstr "" #: target/out/prefPages/layout.js:618 msgid "Desktop Spacer" msgstr "" #: target/out/prefPages/layout.js:629 msgid "Laptop Spacer" msgstr "" #: target/out/prefPages/layout.js:641 msgid "Capture button" msgstr "" #: target/out/prefPages/layout.js:647 msgid "Settings button" msgstr "" #: target/out/prefPages/layout.js:653 msgid "Lock button" msgstr "" #: target/out/prefPages/layout.js:659 msgid "Shutdown button" msgstr "" #: target/out/prefPages/layout.js:665 msgid "Battery button" msgstr "" #: target/out/prefPages/layout.js:711 msgid "Layout" msgstr "" #: target/out/prefPages/layout.js:718 msgid "Quick Toggles Layout" msgstr "" #: target/out/prefPages/layout.js:719 target/out/prefPages/layout.js:734 msgid "Adjust quick toggles layout" msgstr "" #: target/out/prefPages/layout.js:738 msgid "Reorder and hide quick toggles" msgstr "" #: target/out/prefPages/layout.js:745 msgid "System Indicators" msgstr "" #: target/out/prefPages/layout.js:746 msgid "Adjust system indicators layout and style" msgstr "" #: target/out/prefPages/layout.js:751 msgid "Accent screen sharing indicator" msgstr "" #: target/out/prefPages/layout.js:752 msgid "Use shell accent color on screen sharing indicator" msgstr "" #: target/out/prefPages/layout.js:757 msgid "Accent screen recording indicator" msgstr "" #: target/out/prefPages/layout.js:758 msgid "Use shell accent color on screen recording indicator" msgstr "" #: target/out/prefPages/layout.js:763 msgid "Privacy indicators style" msgstr "" #: target/out/prefPages/layout.js:764 msgid "Use monochrome or shell accent color on privarcy indicators" msgstr "" #: target/out/prefPages/layout.js:767 msgid "Accent" msgstr "" #: target/out/prefPages/layout.js:768 msgid "Monochrome" msgstr "" #: target/out/prefPages/layout.js:777 msgid "Adjust system indicators" msgstr "" #: target/out/prefPages/layout.js:788 msgid "Reorder and hide system indicators" msgstr "" #: target/out/prefPages/layout.js:795 msgid "System Items Layout" msgstr "" #: target/out/prefPages/layout.js:800 target/out/prefPages/layout.js:815 msgid "Adjust system items layout" msgstr "" #: target/out/prefPages/layout.js:804 msgid "Hide layout box" msgstr "" #: target/out/prefPages/layout.js:805 msgid "Hide all buttons and layout box" msgstr "" #: target/out/prefPages/layout.js:814 msgid "Reorder and hide system items" msgstr "" #: target/out/prefPages/layout.js:823 msgid "Date Menu" msgstr "" #: target/out/prefPages/layout.js:824 msgid "Adjust Date Menu layout" msgstr "" #: target/out/prefPages/layout.js:828 msgid "Hide left box" msgstr "" #: target/out/prefPages/layout.js:829 msgid "Hide the left box of the date menu, which contains notifications and media control" msgstr "" #: target/out/prefPages/layout.js:834 msgid "Hide right box" msgstr "" #: target/out/prefPages/layout.js:835 msgid "Hide the right box of the date menu, which contains calendar, world clock and weather" msgstr "" #: target/out/prefPages/layout.js:840 msgid "Disable menu" msgstr "" #: target/out/prefPages/layout.js:841 msgid "Do not open date menu when the date menu button clicked" msgstr "" ================================================ FILE: po/ko.po ================================================ # AUTHORS # qwreey75 (aka qwreey) https://github.com/qwreey75/, 2023. # msgid "" msgstr "" "Project-Id-Version: 1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-07-20 15:34+0000\n" "PO-Revision-Date: 2025-07-15 12:36+0000\n" "Last-Translator: Qwreey \n" "Language-Team: Korean \n" "Language: ko\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Weblate 5.10.2\n" #: target/out/libs/prefs/components.js:57 msgid "Details" msgstr "자세히" #: target/out/libs/prefs/components.js:144 msgid "This feature marked as experimental" msgstr "이 기능은 실험적입니다" #: target/out/libs/prefs/components.js:274 msgid "Reset to default" msgstr "기본값으로 재설정" #: target/out/libs/prefs/components.js:512 msgid "Theme default" msgstr "테마 기본값" #: target/out/libs/prefs/components.js:853 msgid "Homepage" msgstr "홈페이지" #: target/out/libs/prefs/components.js:859 #: target/out/libs/prefs/components.js:863 target/out/prefPages/about.js:49 #: target/out/prefPages/about.js:51 target/out/prefPages/about.js:56 msgid "License" msgstr "라이선스" #: target/out/libs/prefs/components.js:860 msgid "Loading ..." msgstr "로드중 ..." #: target/out/libs/prefs/components.js:869 msgid "Affected Files" msgstr "영향받은 파일들" #: target/out/libs/prefs/components.js:924 msgid "Changelog" msgstr "변경사항" #: target/out/libs/prefs/components.js:938 msgid "(Current)" msgstr "(현재)" #: target/out/libs/prefs/components.js:969 #, javascript-format msgid "> **Date:** %s" msgstr "> **날짜:** %s" #: target/out/libs/prefs/components.js:970 #, javascript-format msgid "> **Git Hash:** %s" msgstr "> **깃 해시:** %s" #: target/out/libs/prefs/components.js:971 #, javascript-format msgid "> **Build Number:** %d" msgstr "> **빌드 넘버:** %d" #: target/out/libs/prefs/components.js:1034 msgid "Padding" msgstr "여백" #: target/out/libs/prefs/components.js:1038 msgid "Top" msgstr "상단" #: target/out/libs/prefs/components.js:1049 msgid "Bottom" msgstr "하단" #: target/out/libs/prefs/components.js:1060 msgid "Left" msgstr "좌" #: target/out/libs/prefs/components.js:1071 msgid "Right" msgstr "우" #: target/out/prefs.js:60 msgid "Stable" msgstr "안정 빌드" #: target/out/prefs.js:63 msgid "Development" msgstr "개발 빌드" #: target/out/prefs.js:66 msgid "Preview" msgstr "프리뷰 빌드" #: target/out/prefs.js:69 msgid "(Github Release)" msgstr "(깃허브 릴리즈)" #: target/out/prefs.js:72 msgid "(Built from source)" msgstr "(소스에서 빌드됨)" #: target/out/features/widget/notifications.js:26 msgid "No Notifications" msgstr "알림이 없습니다" #: target/out/features/widget/notifications.js:58 #: target/out/features/widget/notifications.js:122 msgid "Clear" msgstr "모두 읽음" # Quick settings notifications title text #: target/out/features/widget/notifications.js:76 msgid "Notifications" msgstr "알림" #: target/out/features/widget/notifications.js:105 #: target/out/features/toggle/dndQuickToggle.js:10 #: target/out/prefPages/layout.js:345 target/out/prefPages/layout.js:485 msgid "Do Not Disturb" msgstr "방해 금지 모드" #: target/out/features/widget/media.js:118 msgid "Unknown title" msgstr "알 수 없는 제목" #: target/out/features/widget/media.js:888 msgid "Media" msgstr "미디어" #: target/out/features/widget/volumeMixer.js:105 msgid "Volume changed" msgstr "볼륨 변경됨" #: target/out/features/widget/volumeMixer.js:463 msgid "Open volumx mixer" msgstr "볼륨 믹서 열기" #: target/out/features/widget/volumeMixer.js:480 msgid "Volume Mixer" msgstr "볼륨 믹서" #: target/out/features/widget/weather.js:73 msgid "Weather" msgstr "날씨" #: target/out/features/widget/weather.js:192 msgid "Location has not been set" msgstr "위치가 지정되지 않았습니다" #: target/out/features/toggle/unsafeQuickToggle.js:11 #: target/out/prefPages/layout.js:346 target/out/prefPages/layout.js:496 msgid "Unsafe Mode" msgstr "위험 모드" #: target/out/prefPages/widgets.js:11 msgid "Handle radius" msgstr "핸들 반지름" #: target/out/prefPages/widgets.js:12 msgid "Set this to 0 to use default radius" msgstr "0 으로 설정하여 기본 반지름을 사용합니다" #: target/out/prefPages/widgets.js:18 msgid "Handle color" msgstr "핸들 색깔" #: target/out/prefPages/widgets.js:36 msgid "Slider style" msgstr "슬라이더 스타일" #: target/out/prefPages/widgets.js:39 msgid "Slim" msgstr "슬림" #: target/out/prefPages/widgets.js:40 target/out/prefPages/layout.js:766 msgid "Default" msgstr "기본" #: target/out/prefPages/widgets.js:48 target/out/prefPages/widgets.js:173 msgid "Background color" msgstr "배경 색깔" #: target/out/prefPages/widgets.js:55 msgid "Active Background color" msgstr "활성화된 배경 색깔" #: target/out/prefPages/widgets.js:62 msgid "Thickness" msgstr "" #: target/out/prefPages/widgets.js:66 msgid "Set this to 0 to use default thickness" msgstr "" #: target/out/prefPages/widgets.js:76 msgid "Widgets" msgstr "위젯" #: target/out/prefPages/widgets.js:83 target/out/prefPages/widgets.js:136 #: target/out/prefPages/widgets.js:162 target/out/prefPages/widgets.js:224 msgid "Media Widget" msgstr "미디어 위젯" #: target/out/prefPages/widgets.js:88 msgid "Turn on to make the media widget visible on the Quick Settings panel" msgstr "퀵 패널에 미디어 위젯을 보여줍니다" #: target/out/prefPages/widgets.js:92 target/out/prefPages/widgets.js:280 #: target/out/prefPages/widgets.js:343 msgid "Compact mode" msgstr "레이아웃 축소" #: target/out/prefPages/widgets.js:93 msgid "" "Make Media Controls widget smaller\n" "Make it more similar in size to the notification message" msgstr "" "미디어 컨트롤 위젯을 작게 만듭니다\n" "알림 메시지와 비슷한 크기로 조정됩니다" #: target/out/prefPages/widgets.js:99 msgid "Control buttons opacity" msgstr "컨트롤 버튼 투명도" #: target/out/prefPages/widgets.js:100 msgid "Set this to 255 to make opaque, and 0 to make transparent" msgstr "255로 설정해 불투명하게, 0으로 설정해 투명하게 만듭니다" #: target/out/prefPages/widgets.js:108 msgid "Show next button" msgstr "다음 버튼 보이기" #: target/out/prefPages/widgets.js:109 msgid "Add next contorl button next to description" msgstr "다음 버튼을 설명 옆에 추가합니다" #: target/out/prefPages/widgets.js:115 msgid "Show previous button" msgstr "이전 버튼 보이기" #: target/out/prefPages/widgets.js:116 msgid "Add previous contorl button next to description" msgstr "이전 버튼을 설명 옆에 추가합니다" #: target/out/prefPages/widgets.js:122 msgid "Show pause button" msgstr "멈춤 버튼 보이기" #: target/out/prefPages/widgets.js:123 msgid "Add pause contorl button next to description" msgstr "멈춤 버튼을 설명 옆에 추가합니다" #: target/out/prefPages/widgets.js:129 target/out/prefPages/widgets.js:138 msgid "Show progress bar" msgstr "재생 바 보이기" #: target/out/prefPages/widgets.js:130 target/out/prefPages/widgets.js:139 msgid "Add progress bar under description" msgstr "미디어 설명 아래에 재생 바를 보여줍니다" #: target/out/prefPages/widgets.js:155 target/out/prefPages/widgets.js:164 msgid "Gradient background" msgstr "그라데이션 배경" #: target/out/prefPages/widgets.js:156 target/out/prefPages/widgets.js:169 msgid "" "Use gradient background extracted from cover image\n" "May affect performance slightly" msgstr "" "커버 이미지로부터 추출된 색으로 배경에 그라데이션을 줍니다\n" "성능에 영향을 미칠 수 있습니다" #: target/out/prefPages/widgets.js:174 msgid "Base background color" msgstr "기반 배경 색깔" #: target/out/prefPages/widgets.js:182 msgid "Start opacity" msgstr "" #: target/out/prefPages/widgets.js:183 msgid "Adjust left side transparency, Set this to 1000 to make opaque" msgstr "왼쪽 구석의 투명도를 설정합니다, 1000 으로 설정하여 완전히 불투명하게 만듭니다" #: target/out/prefPages/widgets.js:190 msgid "Start color" msgstr "" #: target/out/prefPages/widgets.js:191 msgid "Adjust left side background color mixing, Set this to 1000 to show extracted color" msgstr "왼쪽 구석의 배경 믹싱을 조절합니다, 1000 으로 설정하여 추출된 색을 그대로 보여줍니다" #: target/out/prefPages/widgets.js:198 msgid "End opacity" msgstr "" #: target/out/prefPages/widgets.js:199 msgid "Adjust right side transparency, Set this to 1000 to make opaque" msgstr "오른쪽 구석의 투명도를 설정합니다, 1000 으로 설정하여 완전히 불투명하게 만듭니다" #: target/out/prefPages/widgets.js:206 msgid "End color" msgstr "" #: target/out/prefPages/widgets.js:207 msgid "Adjust right side background color mixing, Set this to 1000 to show extracted color" msgstr "오른쪽 구석의 배경 믹싱을 조절합니다, 1000 으로 설정하여 추출된 색을 그대로 보여줍니다" #: target/out/prefPages/widgets.js:216 target/out/prefPages/widgets.js:226 msgid "Round clip effect" msgstr "둥글게 자르기 효과" #: target/out/prefPages/widgets.js:217 target/out/prefPages/widgets.js:231 msgid "Use round clip effect to make transition more natural" msgstr "둥글게 자르는 효과를 사용해 트랜지션을 더욱 자연스럽게 만듭니다" #: target/out/prefPages/widgets.js:234 msgid "Padding adjustment" msgstr "여백 조절" #: target/out/prefPages/widgets.js:236 msgid "Adjust clip effect padding, edit this if your theme has a different margin or padding" msgstr "자르는 효과의 여백을 조절합니다, 테마가 다른 여백을 가지고 있다면 여백을 조절하세요" #: target/out/prefPages/widgets.js:253 target/out/prefPages/widgets.js:318 #: target/out/prefPages/widgets.js:350 msgid "Remove shadow" msgstr "그림자 제거" #: target/out/prefPages/widgets.js:254 msgid "" "Remove shadow from media message\n" "Use if your theme creates unnecessary shadows" msgstr "" "미디어 메시지에서 그림자를 지웁니다\n" "사용중인 테마가 불필요한 그림자를 만드는 경우에 사용하십시오" #: target/out/prefPages/widgets.js:260 msgid "Smooth scroll speed" msgstr "부드러운 스크롤 속도" #: target/out/prefPages/widgets.js:261 msgid "Adjust trackpad and trackpoint scroll speed, negative number for invert direction" msgstr "트랙패드 또는 트랙포인트 스크롤 속도를 조절합니다, 음수 값을 사용해 방향을 뒤집을 수 있습니다" #: target/out/prefPages/widgets.js:271 msgid "Notifications Widget" msgstr "알림 위젯" #: target/out/prefPages/widgets.js:276 msgid "Turn on to make the notifications widget visible on the Quick Settings panel" msgstr "퀵 패널에 알림 위젯을 보여줍니다" #: target/out/prefPages/widgets.js:281 msgid "Make notifications smaller" msgstr "알림을 작게 만듭니다" #: target/out/prefPages/widgets.js:287 target/out/prefPages/widgets.js:418 msgid "Max height" msgstr "최대 높이" #: target/out/prefPages/widgets.js:288 #, javascript-format msgid "Set maximum height of the Notifications widget, default is %d. Set this to 0 to disable max height" msgstr "알림 위젯의 최대 높이를 지정합니다. 기본값은 %d 입니다. 0 으로 설정하여 높이 제한을 해제합니다" #: target/out/prefPages/widgets.js:296 target/out/prefPages/widgets.js:441 msgid "Fade out offset" msgstr "페이드 아웃 오프셋" #: target/out/prefPages/widgets.js:297 target/out/prefPages/widgets.js:442 msgid "Set position of the fade out effect begins. Set this to 0 to disable fade out effect. default is 46" msgstr "페이드 아웃 효과가 시작되는 위치를 지정합니다. 0 으로 설정하여 페이드 아웃 효과를 비활성화합니다. 기본값은 46 입니다" #: target/out/prefPages/widgets.js:304 msgid "Auto hide" msgstr "자동 숨김" #: target/out/prefPages/widgets.js:305 msgid "Hide the Notifications widget when have no notifications" msgstr "표시할 알림이 없으면 알림 위젯을 자동으로 숨깁니다" #: target/out/prefPages/widgets.js:311 msgid "Use native controls" msgstr "네이티브 컨트롤 사용" #: target/out/prefPages/widgets.js:312 msgid "Use native dnd switch and clear button" msgstr "\"방해 금지 스위치\"와 \"알림 모두 읽기 버튼\"에 그놈의 기본 컨트롤을 사용합니다" #: target/out/prefPages/widgets.js:319 msgid "" "Remove shadow from notification message\n" "Use if your theme creates unnecessary shadows" msgstr "" "알림 메시지에서 그림자를 지웁니다\n" "사용중인 테마가 불필요한 그림자를 만드는 경우에 사용하십시오" #: target/out/prefPages/widgets.js:325 target/out/prefPages/widgets.js:427 msgid "Show scrollbar" msgstr "스크롤바 보이기" #: target/out/prefPages/widgets.js:326 msgid "Show scrollbar on message list" msgstr "스크롤바를 메시지 목록에 보여줍니다" #: target/out/prefPages/widgets.js:334 msgid "Weather Widget" msgstr "날씨 위젯" #: target/out/prefPages/widgets.js:339 msgid "Turn on to make the weather widget visible on the Quick Settings panel" msgstr "퀵 패널에 날씨 위젯을 보여줍니다" #: target/out/prefPages/widgets.js:344 msgid "Make weather widget smaller" msgstr "날씨 위젯을 작게 만듭니다" #: target/out/prefPages/widgets.js:351 msgid "" "Remove shadow from weather widget\n" "Use if your theme creates unnecessary shadows" msgstr "" "날씨 위젯에서 그림자를 지웁니다\n" "사용중인 테마가 불필요한 그림자를 만드는 경우에 사용하십시오" #: target/out/prefPages/widgets.js:357 msgid "Click command" msgstr "클릭 커맨드" #: target/out/prefPages/widgets.js:363 msgid "Show location" msgstr "위치 보이기" #: target/out/prefPages/widgets.js:364 msgid "Show the location label on header" msgstr "위치 라벨을 해더에 보여줍니다" #: target/out/prefPages/widgets.js:373 msgid "Forecast interval" msgstr "예보 간격" #: target/out/prefPages/widgets.js:374 msgid "Adjust forecast interval in hour" msgstr "예보 간격을 시간 단위로 조절합니다" #: target/out/prefPages/widgets.js:381 msgid "Max forecasts" msgstr "최대 예보 수" #: target/out/prefPages/widgets.js:382 msgid "Adjust max forecasts" msgstr "최대 예보 수를 조절합니다" #: target/out/prefPages/widgets.js:388 target/out/prefPages/widgets.js:456 msgid "Volume mixer Widget" msgstr "볼륨 믹서 위젯" #: target/out/prefPages/widgets.js:393 msgid "Turn on to make the volume mixer widget visible on the Quick Settings panel" msgstr "퀵 패널에 볼륨 믹서 위젯을 보여줍니다" #: target/out/prefPages/widgets.js:397 msgid "Label text" msgstr "" #: target/out/prefPages/widgets.js:398 msgid "Choose label above slider text source" msgstr "" #: target/out/prefPages/widgets.js:400 msgid "Both" msgstr "둘 다" #: target/out/prefPages/widgets.js:401 msgid "Title" msgstr "제목" #: target/out/prefPages/widgets.js:402 msgid "Description" msgstr "설명" #: target/out/prefPages/widgets.js:403 msgid "None" msgstr "" #: target/out/prefPages/widgets.js:411 msgid "Label opacity" msgstr "" #: target/out/prefPages/widgets.js:412 msgid "" "Adjust label opacity.\n" "Set this to 255 to make opaque, and 0 to make transparent" msgstr "" #: target/out/prefPages/widgets.js:419 #, javascript-format msgid "Set maximum height of the Volume mixer widget, default is %d. Set this to 0 to disable max height" msgstr "" #: target/out/prefPages/widgets.js:428 msgid "Show scrollbar on mixer list" msgstr "" #: target/out/prefPages/widgets.js:434 msgid "Show stream icon" msgstr "스트림 아이콘 보이기" #: target/out/prefPages/widgets.js:435 msgid "Show stream icon above mixer sliders" msgstr "" #: target/out/prefPages/widgets.js:450 target/out/prefPages/widgets.js:458 msgid "Attach to output slider" msgstr "출력 슬라이더에 메뉴 부착" #: target/out/prefPages/widgets.js:451 target/out/prefPages/widgets.js:459 msgid "Attach volume mixer menu button to output slider. Use if you prefer compact layout" msgstr "출력 슬라이더에 볼륨 믹서를 여는 메뉴 버튼을 부착합니다. 만약 간결한 레이아웃을 원하는 경우 사용하세요" #: target/out/prefPages/widgets.js:468 msgid "Menu icon" msgstr "메뉴 아이콘" #: target/out/prefPages/about.js:12 target/out/prefPages/about.js:32 msgid "About" msgstr "정보" #: target/out/prefPages/about.js:33 msgid "Common extension informations" msgstr "일반적인 확장 정보들" #: target/out/prefPages/about.js:36 target/out/prefPages/about.js:40 msgid "Changelogs" msgstr "변경 사항들" #: target/out/prefPages/about.js:37 target/out/prefPages/about.js:41 msgid "View the change history for this extension" msgstr "확장 프로그램의 변경 기록들을 봅니다" #: target/out/prefPages/about.js:50 target/out/prefPages/about.js:57 msgid "License of codes" msgstr "코드의 라이선스" #: target/out/prefPages/about.js:63 target/out/prefPages/about.js:65 #: target/out/prefPages/about.js:69 msgid "Contributors" msgstr "기여자들" #: target/out/prefPages/about.js:64 target/out/prefPages/about.js:70 msgid "The creators of this extension" msgstr "이 확장 프로그램을 만든 이들" #: target/out/prefPages/about.js:74 msgid "More contributors" msgstr "더 많은 기여자들" #: target/out/prefPages/about.js:75 msgid "See more contributors on github" msgstr "깃허브에서 더 많은 기여자들을 봅니다" #: target/out/prefPages/about.js:85 msgid "Link" msgstr "링크" #: target/out/prefPages/about.js:86 msgid "External links about this extension" msgstr "익스텐션과 관련된 외부 링크" #: target/out/prefPages/about.js:90 msgid "Donate via github sponsors" msgstr "" #: target/out/prefPages/about.js:91 msgid "Support development!" msgstr "개발을 지원해주세요!" #: target/out/prefPages/about.js:97 msgid "Rate and comment the extension!" msgstr "확장 프로그램을 평가해주세요!" #: target/out/prefPages/about.js:102 msgid "Github Repository" msgstr "Github 저장소" #: target/out/prefPages/about.js:103 msgid "" "Add Star on Repository is helping me a lot!\n" "Please, if you found bug from this extension, you can make issue to make me know that!\n" "Or, you can create PR with wonderful features!" msgstr "" "저장소에 Star를 남겨주신다면 제게 큰 도움이 됩니다!\n" "버그를 찾은 경우, Issue 를 남겨 저희가 알 수 있게 해주세요!\n" "환상적인 기능을 만들어 PR 을 남기는 것도 환영입니다!" #: target/out/prefPages/about.js:109 msgid "Add translation to this extension!" msgstr "확장 번역에 기여해주세요!" #: target/out/prefPages/about.js:115 msgid "Debug" msgstr "디버깅" #: target/out/prefPages/about.js:116 msgid "Extension debugging options" msgstr "확장 디버깅 옵션" #: target/out/prefPages/about.js:120 msgid "Expose environment" msgstr "환경 노출" #: target/out/prefPages/about.js:121 msgid "Expose extension environment to globalThis.qst" msgstr "익스텐션 환경을 globalThis.qst 에 노출시킵니다" #: target/out/prefPages/about.js:126 msgid "Show layout border" msgstr "레이아웃 보더 보이기" #: target/out/prefPages/about.js:127 msgid "Show layout borders on Quick Settings" msgstr "퀵 패널의 레이아웃 보더들을 보여줍니다" #: target/out/prefPages/about.js:132 msgid "Log level" msgstr "로그 수준" #: target/out/prefPages/about.js:135 msgid "none" msgstr "안함" #: target/out/prefPages/about.js:136 msgid "error" msgstr "오류" #: target/out/prefPages/about.js:137 msgid "info" msgstr "정보" #: target/out/prefPages/about.js:138 msgid "debug" msgstr "디버깅" #: target/out/prefPages/toggles.js:12 msgid "Toggles" msgstr "토글" #: target/out/prefPages/toggles.js:19 msgid "DND Quick Toggle" msgstr "방해 금지 모드 퀵 토글" #: target/out/prefPages/toggles.js:20 msgid "Turn on to add the DND quick toggle on the Quick Settings panel" msgstr "활성화하여 방해 금지 퀵 토글을 퀵 패널에 추가합니다" #: target/out/prefPages/toggles.js:28 msgid "DND indicator position" msgstr "방해 금지 인디케이터 위치" #: target/out/prefPages/toggles.js:29 msgid "Set DND indicator position" msgstr "방해 금지 인디케이터의 위치를 설정합니다" #: target/out/prefPages/toggles.js:33 msgid "System Tray" msgstr "시스템 트레이" #: target/out/prefPages/toggles.js:34 msgid "Date Menu Button" msgstr "날짜 메뉴 버튼" #: target/out/prefPages/toggles.js:41 msgid "Unsafe Mode Quick Toggle" msgstr "위험 모드 퀵 토글" #: target/out/prefPages/toggles.js:42 msgid "Turn on to add the unsafe quick toggle on the Quick Settings panel" msgstr "활성화하여 위험모드 퀵 토글을 퀵 패널에 추가합니다" #: target/out/prefPages/toggles.js:50 msgid "Save last session state" msgstr "이전 세션 상태를 저장하기" #: target/out/prefPages/toggles.js:51 msgid "Turn on to save last session unsafe state" msgstr "활성화하여 세션 위험모드 상태를 저장합니다" #: target/out/prefPages/menu.js:9 target/out/prefPages/menu.js:141 msgid "Advanced animation style" msgstr "애니메이션 스타일" #: target/out/prefPages/menu.js:13 msgid "Open Duration" msgstr "여는 애니메이션 시간" #: target/out/prefPages/menu.js:14 msgid "Open animation duration in microseconds" msgstr "여는 애니메이션의 재생 시간입니다. 마이크로초 단위를 사용합니다" #: target/out/prefPages/menu.js:21 msgid "Close Duration" msgstr "닫는 애니메이션 시간" #: target/out/prefPages/menu.js:22 msgid "Close animation duration in microseconds" msgstr "닫는 애니메이션의 재생 시간입니다. 마이크로초 단위를 사용합니다" #: target/out/prefPages/menu.js:29 msgid "Grid Content Opacity" msgstr "토글 그리드 투명도" #: target/out/prefPages/menu.js:30 msgid "" "Adjust grid content opacity.\n" "Set this to 255 to make opaque, and 0 to make transparent" msgstr "" #: target/out/prefPages/menu.js:37 msgid "Background Blur Radius" msgstr "배경 흐림 반경" #: target/out/prefPages/menu.js:38 msgid "" "Adjust background blur radius.\n" "Set this to 0 to disable blur effect" msgstr "" "배경 흐림 처리의 정도를 조절합니다\n" "0으로 설정하면 블러 효과가 비활성화됩니다" #: target/out/prefPages/menu.js:45 msgid "Background Brightness" msgstr "배경 밝기" #: target/out/prefPages/menu.js:46 msgid "" "Adjust background brightness.\n" "Set this to 1000 to disable brightness control effect.\n" "Not impacts on gnome-shell's default dim effect." msgstr "" "배경 밝기를 조절합니다.\n" "1000 으로 설정하여 밝기 조절을 비활성화합니다.\n" "그놈 셸의 기본 dim 효과에는 영향을 미치지 않습니다" #: target/out/prefPages/menu.js:53 msgid "Background Opacity" msgstr "배경 투명도" #: target/out/prefPages/menu.js:54 msgid "" "Adjust background opacity.\n" "Set this to 255 to make opaque, and 0 to make transparent" msgstr "" #: target/out/prefPages/menu.js:61 msgid "Background X Scale" msgstr "배경 X축 스케일" #: target/out/prefPages/menu.js:62 msgid "Adjust background x scale, 1000 means 1.0 scale" msgstr "배경의 가로 스케일을 조절합니다. 1000 은 1.0 (100%) 을 의미합니다" #: target/out/prefPages/menu.js:69 msgid "Background Y Scale" msgstr "배경 Y축 스케일" #: target/out/prefPages/menu.js:70 msgid "Adjust background y scale, 1000 means 1.0 scale" msgstr "배경의 세로 스케일을 조절합니다, 1000 은 1.0 (100%) 를 의미합니다" #: target/out/prefPages/menu.js:84 msgid "Menu" msgstr "메뉴" #: target/out/prefPages/menu.js:91 msgid "Overlay Mode" msgstr "오버레이 모드" #: target/out/prefPages/menu.js:92 msgid "Display toggle, power, and sound menus as overlay" msgstr "토글, 전원, 사운드 메뉴를 오버레이로 보여줍니다" #: target/out/prefPages/menu.js:101 msgid "Overlay Width" msgstr "오버레이 너비" #: target/out/prefPages/menu.js:102 msgid "" "Adjust overlay menu width\n" "Set this to 0 to disable adjusting" msgstr "" "오버레이 메뉴의 너비를 조절합니다\n" "0으로 설정하면 조절이 비활성화됩니다" #: target/out/prefPages/menu.js:109 msgid "Overlay Animation Duration" msgstr "오버레이 애니메이션 시간" #: target/out/prefPages/menu.js:110 msgid "" "Custom menu open animation duration in microseconds\n" "Set this to 0 to disable custom animation" msgstr "" "커스텀 메뉴 오픈 애니메이션의 시간입니다. 마이크로초 단위를 사용합니다\n" "0으로 설정하면 커스텀 애니메이션 효과가 비활성화됩니다" #: target/out/prefPages/menu.js:117 msgid "Overlay Animation Style" msgstr "오버레이 애니메이션 스타일" #: target/out/prefPages/menu.js:118 msgid "Custom menu open animation style" msgstr "메뉴 여는 애니메이션 조정" #: target/out/prefPages/menu.js:120 msgid "Flyout" msgstr "플라이아웃" #: target/out/prefPages/menu.js:121 msgid "Dialog" msgstr "대화 상자" #: target/out/prefPages/menu.js:130 target/out/prefPages/menu.js:143 msgid "Animation" msgstr "애니메이션" #: target/out/prefPages/menu.js:131 msgid "" "Add menu animation on toggle menu opening and closing\n" "To get the best feel, turn on overlay mode" msgstr "" "토글 메뉴를 여닫을 때 애니메이션을 줍니다\n" "극적인 효과를 위해서는 오버레이 모드와 같이 사용하세요" #: target/out/prefPages/menu.js:142 msgid "Adjust speed, blur, scale, and opacity" msgstr "속도, 흐림 효과, 스케일, 투명도를 조절합니다" #: target/out/prefPages/layout.js:25 msgid "The item not found" msgstr "" #: target/out/prefPages/layout.js:28 msgid "No changes" msgstr "변경사항 없음" #: target/out/prefPages/layout.js:31 msgid "The same item already exists" msgstr "이미 같은 아이템이 존재합니다" #: target/out/prefPages/layout.js:40 #, javascript-format msgid "Properties of %s" msgstr "%s 의 세부사항" #: target/out/prefPages/layout.js:47 msgid "Save" msgstr "저장" #: target/out/prefPages/layout.js:64 msgid "Toggle editor" msgstr "토글 편집기" #: target/out/prefPages/layout.js:84 msgid "This option requires full gnome-shell reloading" msgstr "이 옵션은 그놈 셸의 완전한 재시작이 필요합니다" #: target/out/prefPages/layout.js:160 target/out/prefPages/layout.js:278 #: target/out/prefPages/layout.js:437 target/out/prefPages/layout.js:672 msgid "Hide" msgstr "숨김" #: target/out/prefPages/layout.js:232 #, javascript-format msgid "My item #%d" msgstr "내 아이템 %d" #: target/out/prefPages/layout.js:250 msgid "New Item" msgstr "새로운 아이템" #: target/out/prefPages/layout.js:261 target/out/prefPages/layout.js:610 #: target/out/prefPages/layout.js:737 target/out/prefPages/layout.js:787 #: target/out/prefPages/layout.js:813 msgid "Ordering and Hiding" msgstr "정렬과 숨김" #: target/out/prefPages/layout.js:273 target/out/prefPages/layout.js:432 msgid "Friendly Name" msgstr "표시용 이름" #: target/out/prefPages/layout.js:283 msgid "Title Regex (Javascript Regex)" msgstr "제목 정규표현식 (자바스크립트 정규표현식)" #: target/out/prefPages/layout.js:288 target/out/prefPages/layout.js:442 msgid "Constructor Name" msgstr "생성자 이름" #: target/out/prefPages/layout.js:294 target/out/prefPages/layout.js:448 msgid "GType Name" msgstr "GType 이름" #: target/out/prefPages/layout.js:302 target/out/prefPages/layout.js:456 msgid "This is the comment for easy identification in the settings list. It has no effect on the behavior of the extension" msgstr "목록에서 쉽게 구분하기 위한 주석입니다. 확장의 기능에는 아무런 영향을 미치지 않습니다" #: target/out/prefPages/layout.js:307 target/out/prefPages/layout.js:461 msgid "Javascript constructor name" msgstr "자바스크립트 생성자 이름" #: target/out/prefPages/layout.js:312 target/out/prefPages/layout.js:466 msgid "GObject gtype name. You can get this value by calling GObject.type_name_from_instance" msgstr "GObject 의 gtype 이름. GObject.type_name_from_instance 를 호출하여 확인할 수 있습니다" #: target/out/prefPages/layout.js:342 msgid "Keyboard Backlight" msgstr "키보드 백라이트" #: target/out/prefPages/layout.js:388 target/out/prefPages/layout.js:538 msgid "Unordered items" msgstr "정렬되지 않은 아이템들" #: target/out/prefPages/layout.js:486 msgid "Remote Access Applet" msgstr "원격 접근 애플릿" #: target/out/prefPages/layout.js:487 msgid "Camera" msgstr "카메라" #: target/out/prefPages/layout.js:488 msgid "Volume Input" msgstr "입력 볼륨" #: target/out/prefPages/layout.js:489 msgid "Location" msgstr "위치" #: target/out/prefPages/layout.js:490 msgid "Thunderbolt" msgstr "썬더볼트" #: target/out/prefPages/layout.js:492 msgid "Network" msgstr "네트워크" #: target/out/prefPages/layout.js:495 msgid "Volume Output" msgstr "출력 볼륨" #: target/out/prefPages/layout.js:497 msgid "System (Battery)" msgstr "시스템 (베터리)" #: target/out/prefPages/layout.js:618 msgid "Desktop Spacer" msgstr "데스크톱 여백" #: target/out/prefPages/layout.js:629 msgid "Laptop Spacer" msgstr "랩톱 여백" #: target/out/prefPages/layout.js:641 msgid "Capture button" msgstr "캡처 버튼" #: target/out/prefPages/layout.js:647 msgid "Settings button" msgstr "설정 버튼" #: target/out/prefPages/layout.js:653 msgid "Lock button" msgstr "잠금 버튼" #: target/out/prefPages/layout.js:659 msgid "Shutdown button" msgstr "종료 버튼" #: target/out/prefPages/layout.js:665 msgid "Battery button" msgstr "배터리 버튼" #: target/out/prefPages/layout.js:711 msgid "Layout" msgstr "레이아웃" #: target/out/prefPages/layout.js:718 msgid "Quick Toggles Layout" msgstr "퀵 토글 레이아웃" #: target/out/prefPages/layout.js:719 target/out/prefPages/layout.js:734 msgid "Adjust quick toggles layout" msgstr "퀵 토글 레이아웃을 조절합니다" #: target/out/prefPages/layout.js:738 msgid "Reorder and hide quick toggles" msgstr "퀵 토글을 정렬하거나 숨깁니다" #: target/out/prefPages/layout.js:745 msgid "System Indicators" msgstr "시스템 인디케이터" #: target/out/prefPages/layout.js:746 msgid "Adjust system indicators layout and style" msgstr "시스템 인디케이터의 레이아웃과 스타일을 조절합니다" #: target/out/prefPages/layout.js:751 msgid "Accent screen sharing indicator" msgstr "강조 색상 화면 공유 인디케이터" #: target/out/prefPages/layout.js:752 msgid "Use shell accent color on screen sharing indicator" msgstr "셸의 강조 색상을 화면 공유 인디케이터에 배경으로 사용합니다" #: target/out/prefPages/layout.js:757 msgid "Accent screen recording indicator" msgstr "강조 색상 화면 녹화 인디케이터" #: target/out/prefPages/layout.js:758 msgid "Use shell accent color on screen recording indicator" msgstr "셸의 강조 색상을 화면 녹화 인디케이터에 배경으로 사용합니다" #: target/out/prefPages/layout.js:763 msgid "Privacy indicators style" msgstr "프라이버시 인디케이터 스타일" #: target/out/prefPages/layout.js:764 msgid "Use monochrome or shell accent color on privarcy indicators" msgstr "단색 또는 셸의 강조 색상을 프라이버시 인디케이터에 아이콘 색으로 사용합니다" #: target/out/prefPages/layout.js:767 msgid "Accent" msgstr "강조 색상" #: target/out/prefPages/layout.js:768 msgid "Monochrome" msgstr "단색" #: target/out/prefPages/layout.js:777 msgid "Adjust system indicators" msgstr "시스템 인디케이터 조절" #: target/out/prefPages/layout.js:788 msgid "Reorder and hide system indicators" msgstr "시스템 인디케이터를 정렬하거나 숨깁니다" #: target/out/prefPages/layout.js:795 msgid "System Items Layout" msgstr "시스템 아이템 레이아웃" #: target/out/prefPages/layout.js:800 target/out/prefPages/layout.js:815 msgid "Adjust system items layout" msgstr "시스템 요소의 레이아웃을 조정합니다" #: target/out/prefPages/layout.js:804 msgid "Hide layout box" msgstr "레이아웃 상자 숨기기" #: target/out/prefPages/layout.js:805 msgid "Hide all buttons and layout box" msgstr "모든 버튼과 레이아웃 박스를 숨깁니다" #: target/out/prefPages/layout.js:814 msgid "Reorder and hide system items" msgstr "시스템 아이템을 정렬하거나 숨깁니다" #: target/out/prefPages/layout.js:823 msgid "Date Menu" msgstr "달력 메뉴" #: target/out/prefPages/layout.js:824 msgid "Adjust Date Menu layout" msgstr "달력 메뉴의 레이아웃을 조절합니다" #: target/out/prefPages/layout.js:828 msgid "Hide left box" msgstr "왼쪽 상자 숨기기" #: target/out/prefPages/layout.js:829 msgid "Hide the left box of the date menu, which contains notifications and media control" msgstr "날짜 메뉴의 알림과 미디어 컨트롤이 있는 왼쪽 레이아웃을 숨깁니다" #: target/out/prefPages/layout.js:834 msgid "Hide right box" msgstr "오른쪽 상자 숨기기" #: target/out/prefPages/layout.js:835 msgid "Hide the right box of the date menu, which contains calendar, world clock and weather" msgstr "날짜 메뉴의 칼렌더와 세계 시간, 날씨가 있는 오른쪽 레이아웃을 숨깁니다" #: target/out/prefPages/layout.js:840 msgid "Disable menu" msgstr "메뉴 비활성화" #: target/out/prefPages/layout.js:841 msgid "Do not open date menu when the date menu button clicked" msgstr "날짜 메뉴 버튼을 눌렀을 때 날짜 메뉴가 열림을 비활성화합니다" #~ msgid "Height" #~ msgstr "높이" #~ msgid "Set this to 0 to use default height" #~ msgstr "0 으로 설정하여 기본 높이를 사용합니다" #~ msgid "Start opaque" #~ msgstr "시작 불투명도" #~ msgid "End opaque" #~ msgstr "끝 불투명도" #~ msgid "Hide Notifications" #~ msgstr "알림 숨김" #~ msgid "Hide notifications on the date menu" #~ msgstr "알림을 날짜 메뉴에서 숨깁니다" #~ msgid "Hide Media Control" #~ msgstr "미디어 컨트롤 숨김" #~ msgid "Hide media control on the date menu" #~ msgstr "미디어 컨트롤을 날짜 메뉴에서 숨깁니다" #~ msgid "Donate via patreon" #~ msgstr "Patreon으로 후원" #~ msgid "" #~ "Use gradient background extracted from cover image\n" #~ "May affect performance" #~ msgstr "커버 이미지로부터 추출된 색으로 배경에 그라데이션을 줍니다성능에 영향을 미칠 수 있습니다" #~ msgid "Set maximum height of the Notifications widget. default is 292" #~ msgstr "알림 위젯의 최대 높이(px)를 설정합니다. 기본값은 292입니다" #~ msgid "Other" #~ msgstr "기타" #~ msgid "" #~ "Hide notifications on date menu.\n" #~ "*this option removes media control on date menu too*" #~ msgstr "" #~ "달력 메뉴에서 알림 항목을 제거합니다.\n" #~ "*이 옵션은 달력 메뉴에서 미디어 컨트롤 영역도 같이 제거합니다*" #~ msgid "Hide media control on date menu." #~ msgstr "달력 메뉴에서 미디어 컨트롤 항목을 제거합니다." #~ msgid "" #~ "Adjust grid content opacity.\n" #~ "Set this to 255 to opaque, and 0 to transparent" #~ msgstr "" #~ "토글 그리드 콘텐츠의 투명도를 조절합니다\n" #~ "255로 하면 완전히 불투명해지고, 0으로 하면 완전히 투명해집니다" #~ msgid "" #~ "Adjust background opacity.\n" #~ "Set this to 255 to opaque, and 0 to transparent" #~ msgstr "" #~ "배경 투명도를 조절합니다\n" #~ "255로 하면 완전히 불투명해지고, 0으로 하면 완전히 투명해집니다" #~ msgid "Sound Settings" #~ msgstr "소리 설정" #~ msgid "Notification Widget" #~ msgstr "알림 위젯" #~ msgid "Turn on to make the notification widget visible on the Quick Settings panel" #~ msgstr "퀵 패널에 알림 위젯을 보여줍니다" #~ msgid "Links" #~ msgstr "링크" #~ msgid "Contributor" #~ msgstr "기여자" #~ msgid "System Items" #~ msgstr "시스템 요소" #~ msgid "Hide layout" #~ msgstr "레이아웃 숨김" #~ msgid "Add Application to filtering" #~ msgstr "필터링할 애플리케이션 추가" #~ msgid "Add" #~ msgstr "추가" #~ msgid "Cancel" #~ msgstr "취소" #~ msgid "Application name" #~ msgstr "애플리케이션 이름" #~ msgid "General" #~ msgstr "일반" #~ msgid "Enchant input/output slider" #~ msgstr "입력/출력 슬라이더를 강화합니다" #~ msgid "Show current audio output selection" #~ msgstr "오디오 출력 장치 표시" #~ msgid "Always show the current audio output selection above the volume slider" #~ msgstr "항상 사용 중인 오디오 출력 장치를 볼륨 슬라이더 위에 보여줍니다" #~ msgid "Show current audio input selection" #~ msgstr "오디오 입력 장치 표시" #~ msgid "Always show the current audio input selection above the volume slider" #~ msgstr "항상 사용 중인 오디오 입력 장치를 볼륨 슬라이더 위에 보여줍니다" #~ msgid "Always show input" #~ msgstr "항상 입력 볼륨 바 표시" #~ msgid "Always show the audio input volume slider, even when there is no audio input stream." #~ msgstr "오디오 입력 스트림이 없더라도 항상 오디오 입력 볼륨 슬라이더를 보여줍니다." #~ msgid "Add volume mixer (PulseAudio, Pipewire)" #~ msgstr "볼륨 믹서 추가 (PulseAudio, Pipewire)" #~ msgid "" #~ "Turn on to make the volume mixer visible\n" #~ "Forked from https://github.com/mymindstorm/gnome-volume-mixer" #~ msgstr "" #~ "볼륨 믹서를 활성화합니다\n" #~ "https://github.com/mymindstorm/gnome-volume-mixer 에서 포크된 기능입니다" #~ msgid "Position" #~ msgstr "위치" #~ msgid "Set volume mixer position" #~ msgstr "볼륨 믹서의 위치를 선택합니다" #~ msgid "Top (Below Output/Input slider)" #~ msgstr "상단 (입력/출력 슬라이더 밑에 표시됩니다)" #~ msgid "Show stream Description" #~ msgstr "스트림 설명 표시" #~ msgid "Show audio stream description above the slider" #~ msgstr "오디오 스트림의 설명을 슬라이더 아래에 표시합니다" #~ msgid "Show stream Icon" #~ msgstr "스트림 아이콘 표시" #~ msgid "Show application icon in front of the slider" #~ msgstr "애플리케이션 아이콘을 슬라이더 앞에 추가합니다" #~ msgid "Filter applications shown in the volume mixer." #~ msgstr "볼륨 믹서에 보일 애플리케이션을 필터링합니다." #~ msgid "Filter Mode" #~ msgstr "필터 모드" #~ msgid "Blacklist" #~ msgstr "블랙리스트" #~ msgid "Whitelist" #~ msgstr "화이트리스트" #~ msgid "Using Javascript Regex" #~ msgstr "정규 표현식 사용" #~ msgid "Use Javascript RegExp for filtering app name or description" #~ msgstr "자바스크립트의 정규 표현식을 사용해 애플리케이션 이름 혹은 설명을 필터링합니다" #~ msgid "Check Stream Description" #~ msgstr "스트림 설명도 확인" #~ msgid "Check Description also" #~ msgstr "스트림의 설명도 필터링에 사용합니다" #~ msgid "Add more buttons" #~ msgstr "버튼 추가" #~ msgid "Turn on the buttons you want to add on Quick Settings" #~ msgstr "퀵 패널에 추가하려는 버튼을 체크하세요" #~ msgid "Turn on to make the DND quick toggle visible on the Quick Settings panel" #~ msgstr "방해 금지 모드 퀵 토글을 퀵 패널에 보여줍니다" #~ msgid "Turn on to make the unsafe quick toggle visible on the Quick Settings panel" #~ msgstr "위험 모드 퀵 토글을 퀵 패널에 보여줍니다" #~ msgid "This extension is distributed with license GPL 3+" #~ msgstr "이 확장 프로그램은 GPL 3+ 라이선스 아래 배포됩니다" #~ msgid "excludes Third-party. Third party codes follow their license" #~ msgstr "서드파티는 제외합니다. 서드파티 코드는 각각 원본 코드의 라이선스를 따릅니다" #~ msgid "Extension Version" #~ msgstr "확장프로그램 버전" #~ msgid "Unknown (Built from source)" #~ msgstr "알 수 없음 (소스에서 직접 빌드됨)" #~ msgid "Third party LICENSE" #~ msgstr "서드파티 라이선스" #~ msgid "LICENSE OF CODES WHICH USED ON THIS EXTENSION" #~ msgstr "*이 확장 프로그램에 포함되어있는 일부 코드의 라이선스입니다*" #~ msgid "Media Controls widget" #~ msgstr "미디어 컨트롤 위젯" #~ msgid "Turn on to make the Media Control widget visible on the Quick Settings panel" #~ msgstr "미디어 위젯을 퀵패널에 추가합니다" #~ msgid "Compact Mode" #~ msgstr "깔끔한 모드" #~ msgid "Auto Hide" #~ msgstr "자동 숨기기" #~ msgid "Quick Toggles" #~ msgstr "퀵 토글" #~ msgid "Fix Weather Widget Overflow" #~ msgstr "날씨 위젯 오버플로우 고치기" #~ msgid "Fix overflow visual bug of weather widget in datemenu" #~ msgstr "날짜 메뉴의 날씨 위젯이 흘러 넘쳐 보이는 비쥬얼 버그를 고칩니다" #~ msgid "Remove Notifications On Date Menu" #~ msgstr "날짜 메뉴 알림 제거" #~ msgid "Remove Media Control On Date Menu" #~ msgstr "날짜 메뉴 미디어 컨트롤 제거" #~ msgid "Do not adjust the border radius of contents." #~ msgstr "콘텐츠의 가장자리 둥글기 정도를 조정하지 않기" #~ msgid "Don't adjust the border of messages and media controls." #~ msgstr "메시지와 미디어 컨트롤의 가장자리 둥글기 정도를 조정하지 않습니다" #~ msgid "Do not remove the shadow of contents." #~ msgstr "콘텐츠의 그림자 지우지 않기" #~ msgid "Don't remove the shadow of messages and media controls." #~ msgstr "메시지와 미디어 컨트롤의 그림자를 지우지 않습니다" #~ msgid "Set Notifications widget position" #~ msgstr "알림 위젯의 위치" #~ msgid "Buttons to remove" #~ msgstr "지울 버튼" #~ msgid "Turn on the buttons you want to remove from Quick Settings" #~ msgstr "퀵패널에서 지우고 싶은 버튼을 채크하세요" #~ msgid "Remove chosen buttons from quick panel" #~ msgstr "선택한 버튼들이 퀵패널에서 제거됩니다" #~ msgid "Forked from my extension https://github.com/qwreey75/gnome-quick-settings-button-remover" #~ msgstr "나의 익스텐션 https://github.com/qwreey75/gnome-quick-settings-button-remover 에서 포크되었습니다" #~ msgid "This feature is unstable sometime" #~ msgstr "이 기능은 때때로 불안정합니다" #~ msgid "" #~ "When lock/unlock with gnome-screensaver, unexpected behavior occurs\n" #~ "Please do not report issue about known issue, Almost duplicated\n" #~ "Known issue:\n" #~ " button doesn't remove after lockscreen\n" #~ " modal get bigger after lockscreen" #~ msgstr "" #~ "그놈 화면 보호기를 켜고 끌 때, 예상하지 않은 동작이 발생합니다\n" #~ "알려진 이슈를 보고하지 마세요. 대부분 버그 리포트가 존재합니다\n" #~ "알려진 이슈:\n" #~ " 버튼이 화면 보호기가 작동한 후 지워지지 않습니다\n" #~ " 패널이 화면 보호기가 작동한 후 더 크게 보입니다" #~ msgid "Please turn off if some bug occurred" #~ msgstr "문제가 발생하면 끄십시오" #~ msgid "Unknown" #~ msgstr "알 수 없음" #~ msgid "Information" #~ msgstr "정보" #~ msgid "Version" #~ msgstr "버전" #~ msgid "" #~ "Forked from https://github.com/mymindstorm/gnome-volume-mixer\n" #~ "This feature works well with both PulseAudio and Pipewire protocols" #~ msgstr "" #~ "https://github.com/mymindstorm/gnome-volume-mixer 에서 포크된 기능입니다\n" #~ "이 기능은 PulseAudio 와 Pipewire 프로토콜에서 모두 잘 작동합니다" #~ msgid "Visible" #~ msgstr "보이기" #~ msgid "Turn on to make the volume mixer visible" #~ msgstr "볼륨 믹서를 보이게 합니다" #~ msgid "Application Filtering" #~ msgstr "애플리케이션 필터링" #~ msgid "Input/Output" #~ msgstr "입력/출력" #~ msgid "Add notifications widget" #~ msgstr "알림 위젯을 추가합니다" #~ msgid "" #~ "Reference from https://github.com/Aylur/gnome-extensions\n" #~ "Source code of that is not used on this extension" #~ msgstr "" #~ "https://github.com/Aylur/gnome-extensions 에서 영감받았습니다\n" #~ "해당 저장소의 소스코드 자체는 이 확장프로그램에 사용되지 않았습니다" #~ msgid "Media Controls" #~ msgstr "미디어 컨트롤" #~ msgid "Add Media Controls widget" #~ msgstr "미디어 컨트롤 위젯 추가" ================================================ FILE: po/pl.po ================================================ # 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. # Adam Lewicki , 2025. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-07-20 15:34+0000\n" "PO-Revision-Date: 2025-03-13 13:35+0100\n" "Last-Translator: \n" "Language-Team: \n" "Language: po\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 3.4.4\n" #: target/out/libs/prefs/components.js:57 msgid "Details" msgstr "Szczegóły" #: target/out/libs/prefs/components.js:144 msgid "This feature marked as experimental" msgstr "Funkcja eksperymentalna" #: target/out/libs/prefs/components.js:274 msgid "Reset to default" msgstr "Przywróć ustawienia domyślne" #: target/out/libs/prefs/components.js:512 msgid "Theme default" msgstr "Domyślnie dla motywu" #: target/out/libs/prefs/components.js:853 msgid "Homepage" msgstr "Strona główna" #: target/out/libs/prefs/components.js:859 #: target/out/libs/prefs/components.js:863 target/out/prefPages/about.js:49 #: target/out/prefPages/about.js:51 target/out/prefPages/about.js:56 msgid "License" msgstr "Licencje" #: target/out/libs/prefs/components.js:860 msgid "Loading ..." msgstr "Ładowanie..." #: target/out/libs/prefs/components.js:869 msgid "Affected Files" msgstr "Uwzględnione pliki" #: target/out/libs/prefs/components.js:924 msgid "Changelog" msgstr "Dziennik zmian" #: target/out/libs/prefs/components.js:938 msgid "(Current)" msgstr "(Aktualnie)" #: target/out/libs/prefs/components.js:969 #, javascript-format msgid "> **Date:** %s" msgstr "> **Data:** %s" #: target/out/libs/prefs/components.js:970 #, javascript-format msgid "> **Git Hash:** %s" msgstr "> **Git Hash:** %s" #: target/out/libs/prefs/components.js:971 #, javascript-format msgid "> **Build Number:** %d" msgstr "> **Komplikacja:** %d" #: target/out/libs/prefs/components.js:1034 msgid "Padding" msgstr "Wypełnienie" #: target/out/libs/prefs/components.js:1038 msgid "Top" msgstr "U góry" #: target/out/libs/prefs/components.js:1049 msgid "Bottom" msgstr "Na dole" #: target/out/libs/prefs/components.js:1060 msgid "Left" msgstr "Po lewej" #: target/out/libs/prefs/components.js:1071 msgid "Right" msgstr "Po prawej" #: target/out/prefs.js:60 msgid "Stable" msgstr "Stabilna" #: target/out/prefs.js:63 msgid "Development" msgstr "Rozwojowa" #: target/out/prefs.js:66 msgid "Preview" msgstr "Podgląd" #: target/out/prefs.js:69 msgid "(Github Release)" msgstr "(Wydanie GitHub)" #: target/out/prefs.js:72 msgid "(Built from source)" msgstr "(Skompilowane ze źródła)" #: target/out/features/widget/notifications.js:26 msgid "No Notifications" msgstr "Brak powiadomień" #: target/out/features/widget/notifications.js:58 #: target/out/features/widget/notifications.js:122 msgid "Clear" msgstr "Wyczyść" #: target/out/features/widget/notifications.js:76 msgid "Notifications" msgstr "Powiadomienia" #: target/out/features/widget/notifications.js:105 #: target/out/features/toggle/dndQuickToggle.js:10 #: target/out/prefPages/layout.js:345 target/out/prefPages/layout.js:485 msgid "Do Not Disturb" msgstr "Nie przeszkadzać" #: target/out/features/widget/media.js:118 msgid "Unknown title" msgstr "Nieznany tytuł" #: target/out/features/widget/media.js:888 msgid "Media" msgstr "Media" #: target/out/features/widget/volumeMixer.js:105 msgid "Volume changed" msgstr "Zmieniono głośność" #: target/out/features/widget/volumeMixer.js:463 msgid "Open volumx mixer" msgstr "Otwórz poziomy głośności" #: target/out/features/widget/volumeMixer.js:480 msgid "Volume Mixer" msgstr "Poziomy głośności" #: target/out/features/widget/weather.js:73 msgid "Weather" msgstr "Pogoda" #: target/out/features/widget/weather.js:192 msgid "Location has not been set" msgstr "Nie ustawiono lokalizacji" #: target/out/features/toggle/unsafeQuickToggle.js:11 #: target/out/prefPages/layout.js:346 target/out/prefPages/layout.js:496 msgid "Unsafe Mode" msgstr "Tryb niezabezpieczony" #: target/out/prefPages/widgets.js:11 msgid "Handle radius" msgstr "Promień przytwierdzenia" #: target/out/prefPages/widgets.js:12 msgid "Set this to 0 to use default radius" msgstr "0 - domyślny prommień" #: target/out/prefPages/widgets.js:18 msgid "Handle color" msgstr "Kolor przytwierdzenia" #: target/out/prefPages/widgets.js:36 msgid "Slider style" msgstr "Styl suwaka" #: target/out/prefPages/widgets.js:39 msgid "Slim" msgstr "Wąski" #: target/out/prefPages/widgets.js:40 target/out/prefPages/layout.js:766 msgid "Default" msgstr "Domyślny" #: target/out/prefPages/widgets.js:48 target/out/prefPages/widgets.js:173 msgid "Background color" msgstr "Kolor tła" #: target/out/prefPages/widgets.js:55 msgid "Active Background color" msgstr "Aktywny kolor tła" #: target/out/prefPages/widgets.js:62 msgid "Thickness" msgstr "" #: target/out/prefPages/widgets.js:66 msgid "Set this to 0 to use default thickness" msgstr "" #: target/out/prefPages/widgets.js:76 msgid "Widgets" msgstr "Widżety" #: target/out/prefPages/widgets.js:83 target/out/prefPages/widgets.js:136 #: target/out/prefPages/widgets.js:162 target/out/prefPages/widgets.js:224 msgid "Media Widget" msgstr "Media" #: target/out/prefPages/widgets.js:88 msgid "Turn on to make the media widget visible on the Quick Settings panel" msgstr "Pokazuj widżet na panelu szybkich ustawień" #: target/out/prefPages/widgets.js:92 target/out/prefPages/widgets.js:280 #: target/out/prefPages/widgets.js:343 msgid "Compact mode" msgstr "Tryb kompaktowy" #: target/out/prefPages/widgets.js:93 msgid "" "Make Media Controls widget smaller\n" "Make it more similar in size to the notification message" msgstr "" "Mały widźet mediów\n" "Uczyń go bardziej podobnym do komunikatu powiadomienia" #: target/out/prefPages/widgets.js:99 msgid "Control buttons opacity" msgstr "Przezroczystość przycików sterowania" #: target/out/prefPages/widgets.js:100 msgid "Set this to 255 to make opaque, and 0 to make transparent" msgstr "255 - nieprzezroczyste, 0 - przezroczyste" #: target/out/prefPages/widgets.js:108 msgid "Show next button" msgstr "Przycisk dalej" #: target/out/prefPages/widgets.js:109 msgid "Add next contorl button next to description" msgstr "Dodaj przycisk 'Dalej' obok opisu" #: target/out/prefPages/widgets.js:115 msgid "Show previous button" msgstr "Przycisk wstecz" #: target/out/prefPages/widgets.js:116 msgid "Add previous contorl button next to description" msgstr "Dodaj przycisk 'Wstecz' obok opisu" #: target/out/prefPages/widgets.js:122 msgid "Show pause button" msgstr "Przycisk wstrzymaj" #: target/out/prefPages/widgets.js:123 msgid "Add pause contorl button next to description" msgstr "Dodaj przycisk 'Wstrzymaj' obok opisu" #: target/out/prefPages/widgets.js:129 target/out/prefPages/widgets.js:138 msgid "Show progress bar" msgstr "Pasek postępu" #: target/out/prefPages/widgets.js:130 target/out/prefPages/widgets.js:139 msgid "Add progress bar under description" msgstr "Dodaj pasek postępu pod opisem" #: target/out/prefPages/widgets.js:155 target/out/prefPages/widgets.js:164 msgid "Gradient background" msgstr "Gradient tła" #: target/out/prefPages/widgets.js:156 target/out/prefPages/widgets.js:169 msgid "" "Use gradient background extracted from cover image\n" "May affect performance slightly" msgstr "" "Użyj gradientu tła z okładki\n" "Może wpłynąć na wydajność" #: target/out/prefPages/widgets.js:174 msgid "Base background color" msgstr "Kolor tła" #: target/out/prefPages/widgets.js:182 msgid "Start opacity" msgstr "" #: target/out/prefPages/widgets.js:183 msgid "Adjust left side transparency, Set this to 1000 to make opaque" msgstr "Dostosuj przezroczystość po lewej stronie. 1000 oznacza brak przezroczystości" #: target/out/prefPages/widgets.js:190 msgid "Start color" msgstr "" #: target/out/prefPages/widgets.js:191 msgid "Adjust left side background color mixing, Set this to 1000 to show extracted color" msgstr "Dostosuj mieszanie koloru po lewej stronie. 1000 oznacza kolor pobrany" #: target/out/prefPages/widgets.js:198 msgid "End opacity" msgstr "" #: target/out/prefPages/widgets.js:199 msgid "Adjust right side transparency, Set this to 1000 to make opaque" msgstr "Dostosuj przezroczystość po prawej stronie. 1000 oznacza brak przezroczystości" #: target/out/prefPages/widgets.js:206 msgid "End color" msgstr "" #: target/out/prefPages/widgets.js:207 msgid "Adjust right side background color mixing, Set this to 1000 to show extracted color" msgstr "Dostosuj mieszanie koloru po prawej stronie. 1000 oznacza kolor pobrany" #: target/out/prefPages/widgets.js:216 target/out/prefPages/widgets.js:226 msgid "Round clip effect" msgstr "Zaokrąglenie" #: target/out/prefPages/widgets.js:217 target/out/prefPages/widgets.js:231 msgid "Use round clip effect to make transition more natural" msgstr "Użyj zaokrąglenia, aby efekt był bardziej naturalny" #: target/out/prefPages/widgets.js:234 msgid "Padding adjustment" msgstr "Dostosowywanie wypełnienia" #: target/out/prefPages/widgets.js:236 msgid "Adjust clip effect padding, edit this if your theme has a different margin or padding" msgstr "Dostosuj efekt wypełnienia, jeśli Twój motyw ma inny margines wypełnieia" #: target/out/prefPages/widgets.js:253 target/out/prefPages/widgets.js:318 #: target/out/prefPages/widgets.js:350 msgid "Remove shadow" msgstr "Usuń cień" #: target/out/prefPages/widgets.js:254 msgid "" "Remove shadow from media message\n" "Use if your theme creates unnecessary shadows" msgstr "" "Usuń cień z powiadomień mediów\n" "Użyj, jeśli motyw tworzy niepotrzebne cienie" #: target/out/prefPages/widgets.js:260 msgid "Smooth scroll speed" msgstr "Kontrla prędkości przewijania" #: target/out/prefPages/widgets.js:261 msgid "Adjust trackpad and trackpoint scroll speed, negative number for invert direction" msgstr "Dostosuj prędkość przewijania panelu dotykowego lub rolki. Wartość ujemna odwraca kierunek" #: target/out/prefPages/widgets.js:271 msgid "Notifications Widget" msgstr "Powiadomienia" #: target/out/prefPages/widgets.js:276 msgid "Turn on to make the notifications widget visible on the Quick Settings panel" msgstr "Pokazuj widżet na panelu szybkich ustawień" #: target/out/prefPages/widgets.js:281 msgid "Make notifications smaller" msgstr "Zmniejsz powiadomienia" #: target/out/prefPages/widgets.js:287 target/out/prefPages/widgets.js:418 msgid "Max height" msgstr "Maksymalna wysokość" #: target/out/prefPages/widgets.js:288 #, javascript-format msgid "Set maximum height of the Notifications widget, default is %d. Set this to 0 to disable max height" msgstr "Ustaw maksymalną wysokość powiadomienia, domyślnie %d. Wartość 0 - wyłącza" #: target/out/prefPages/widgets.js:296 target/out/prefPages/widgets.js:441 msgid "Fade out offset" msgstr "Odstęp zanikania" #: target/out/prefPages/widgets.js:297 target/out/prefPages/widgets.js:442 msgid "Set position of the fade out effect begins. Set this to 0 to disable fade out effect. default is 46" msgstr "Ostaw początek pozycji zanikania. 0 - wyłączenie efektu, domyślnie 46" #: target/out/prefPages/widgets.js:304 msgid "Auto hide" msgstr "Automatyczne ukrywanie" #: target/out/prefPages/widgets.js:305 msgid "Hide the Notifications widget when have no notifications" msgstr "Ukryj widźet powiadomień, jeśli ich nie ma" #: target/out/prefPages/widgets.js:311 msgid "Use native controls" msgstr "Użyj wbudowanej kontroli" #: target/out/prefPages/widgets.js:312 msgid "Use native dnd switch and clear button" msgstr "Użyj wbudowanego przycisku Nie przeszkadzać i przycisku Wyczyść" #: target/out/prefPages/widgets.js:319 msgid "" "Remove shadow from notification message\n" "Use if your theme creates unnecessary shadows" msgstr "" "Usuń cień z powiadomień\n" "Użyj, jeśli motyw tworzy nieporzebne cienie" #: target/out/prefPages/widgets.js:325 target/out/prefPages/widgets.js:427 msgid "Show scrollbar" msgstr "Pokaż pasek przewijania" #: target/out/prefPages/widgets.js:326 msgid "Show scrollbar on message list" msgstr "Pokaż pasek przewijania" #: target/out/prefPages/widgets.js:334 msgid "Weather Widget" msgstr "Pogoda" #: target/out/prefPages/widgets.js:339 msgid "Turn on to make the weather widget visible on the Quick Settings panel" msgstr "Pokazuj widźet w panelu szybkich ustawień" #: target/out/prefPages/widgets.js:344 msgid "Make weather widget smaller" msgstr "Zmienjsz widźet pogody" #: target/out/prefPages/widgets.js:351 msgid "" "Remove shadow from weather widget\n" "Use if your theme creates unnecessary shadows" msgstr "" "Usuń cień z powiadomień\n" "Użyj, jeśli motyw tworzy nieporzebne cienie" #: target/out/prefPages/widgets.js:357 msgid "Click command" msgstr "Polecenie kliknięcia" #: target/out/prefPages/widgets.js:363 msgid "Show location" msgstr "Pokaż lokalizację" #: target/out/prefPages/widgets.js:364 msgid "Show the location label on header" msgstr "Pokaż lokalizację w nagłówku" #: target/out/prefPages/widgets.js:373 msgid "Forecast interval" msgstr "Odstęp aktualizacji prognozy" #: target/out/prefPages/widgets.js:374 msgid "Adjust forecast interval in hour" msgstr "Dostisuj odstęp aktualiacji prognozy" #: target/out/prefPages/widgets.js:381 msgid "Max forecasts" msgstr "Ilość dni" #: target/out/prefPages/widgets.js:382 msgid "Adjust max forecasts" msgstr "Maksymalna ilość dni" #: target/out/prefPages/widgets.js:388 target/out/prefPages/widgets.js:456 msgid "Volume mixer Widget" msgstr "Poziomy głośności" #: target/out/prefPages/widgets.js:393 msgid "Turn on to make the volume mixer widget visible on the Quick Settings panel" msgstr "Pokazuj widźet w panelu szubkich ustawień" #: target/out/prefPages/widgets.js:397 msgid "Label text" msgstr "Etykieta" #: target/out/prefPages/widgets.js:398 msgid "Choose label above slider text source" msgstr "Wybierz etykietę pod żródłem treści suwaka" #: target/out/prefPages/widgets.js:400 msgid "Both" msgstr "Oba" #: target/out/prefPages/widgets.js:401 msgid "Title" msgstr "Tytuł" #: target/out/prefPages/widgets.js:402 msgid "Description" msgstr "Opis" #: target/out/prefPages/widgets.js:403 msgid "None" msgstr "Brak" #: target/out/prefPages/widgets.js:411 msgid "Label opacity" msgstr "Przezroczystość" #: target/out/prefPages/widgets.js:412 msgid "" "Adjust label opacity.\n" "Set this to 255 to make opaque, and 0 to make transparent" msgstr "" "Dostosuj przezroczystość etykiety.\n" "255 - nieprzezroczyste, 0 - przezroczyste" #: target/out/prefPages/widgets.js:419 #, javascript-format msgid "Set maximum height of the Volume mixer widget, default is %d. Set this to 0 to disable max height" msgstr "Ustaw maksymalną wysokość widźetu, domyslnie %d. Wartość 0 - wyłącza" #: target/out/prefPages/widgets.js:428 msgid "Show scrollbar on mixer list" msgstr "Pasek przewijania" #: target/out/prefPages/widgets.js:434 msgid "Show stream icon" msgstr "Ikona strumienia" #: target/out/prefPages/widgets.js:435 msgid "Show stream icon above mixer sliders" msgstr "Pokaż ikone strumienia nad suwakiem" #: target/out/prefPages/widgets.js:450 target/out/prefPages/widgets.js:458 msgid "Attach to output slider" msgstr "Załącz do suwaka wyjścia" #: target/out/prefPages/widgets.js:451 target/out/prefPages/widgets.js:459 msgid "Attach volume mixer menu button to output slider. Use if you prefer compact layout" msgstr "Załącz poziomy głośności do suwaka wyjścia. Uzywaj, jeśli wolisz tryb kompaktowy" #: target/out/prefPages/widgets.js:468 msgid "Menu icon" msgstr "Ikona menu" #: target/out/prefPages/about.js:12 target/out/prefPages/about.js:32 msgid "About" msgstr "O programie" #: target/out/prefPages/about.js:33 msgid "Common extension informations" msgstr "Podstawowe informacje o rozszerzeniu" #: target/out/prefPages/about.js:36 target/out/prefPages/about.js:40 msgid "Changelogs" msgstr "Dziennik zmian" #: target/out/prefPages/about.js:37 target/out/prefPages/about.js:41 msgid "View the change history for this extension" msgstr "Wyświetl historię zmian tego rozszerzenia" #: target/out/prefPages/about.js:50 target/out/prefPages/about.js:57 msgid "License of codes" msgstr "Licencja" #: target/out/prefPages/about.js:63 target/out/prefPages/about.js:65 #: target/out/prefPages/about.js:69 msgid "Contributors" msgstr "Współtwórcy" #: target/out/prefPages/about.js:64 target/out/prefPages/about.js:70 msgid "The creators of this extension" msgstr "Twórcy tego rozszerzenia" #: target/out/prefPages/about.js:74 msgid "More contributors" msgstr "Więcej współtwórców" #: target/out/prefPages/about.js:75 msgid "See more contributors on github" msgstr "Więcej na GitHub" #: target/out/prefPages/about.js:85 msgid "Link" msgstr "Odnośnik" #: target/out/prefPages/about.js:86 msgid "External links about this extension" msgstr "Odnośniki zewnętrzne" #: target/out/prefPages/about.js:90 msgid "Donate via github sponsors" msgstr "Dotacje za pomoca sponsorów GitHub" #: target/out/prefPages/about.js:91 msgid "Support development!" msgstr "Wspomóż twórców!" #: target/out/prefPages/about.js:97 msgid "Rate and comment the extension!" msgstr "Oceń i skomentuj rozszerzenie!" #: target/out/prefPages/about.js:102 msgid "Github Repository" msgstr "Repozytorium GitHub" #: target/out/prefPages/about.js:103 msgid "" "Add Star on Repository is helping me a lot!\n" "Please, if you found bug from this extension, you can make issue to make me know that!\n" "Or, you can create PR with wonderful features!" msgstr "" "Dodanie gwiazdki w repozytorium bardzo mi pomaga!\n" "Jeśli znalazłeś błąd tego rozszerzenia, możesz zgłosić go, aby powiadomić nas o nim!\n" "Lub możesz stworzyć PR ze wspaniałymi funkcjami!" #: target/out/prefPages/about.js:109 msgid "Add translation to this extension!" msgstr "Dodaj tłumaczenie do tego rozszerzenia!" #: target/out/prefPages/about.js:115 msgid "Debug" msgstr "Debuguj" #: target/out/prefPages/about.js:116 msgid "Extension debugging options" msgstr "Opcje" #: target/out/prefPages/about.js:120 msgid "Expose environment" msgstr "Wystaw środowisko" #: target/out/prefPages/about.js:121 msgid "Expose extension environment to globalThis.qst" msgstr "Wystaw środowisko na globalThis.qst" #: target/out/prefPages/about.js:126 msgid "Show layout border" msgstr "Granice układu" #: target/out/prefPages/about.js:127 msgid "Show layout borders on Quick Settings" msgstr "Pokaż granice ukladu panela szybkich ustawień" #: target/out/prefPages/about.js:132 msgid "Log level" msgstr "Poziom dziennika zdarzeń" #: target/out/prefPages/about.js:135 msgid "none" msgstr "brak" #: target/out/prefPages/about.js:136 msgid "error" msgstr "błąd" #: target/out/prefPages/about.js:137 msgid "info" msgstr "info" #: target/out/prefPages/about.js:138 msgid "debug" msgstr "debug" #: target/out/prefPages/toggles.js:12 msgid "Toggles" msgstr "Przełączniki" #: target/out/prefPages/toggles.js:19 msgid "DND Quick Toggle" msgstr "Nie przeszkadzać" #: target/out/prefPages/toggles.js:20 msgid "Turn on to add the DND quick toggle on the Quick Settings panel" msgstr "Włącz przycisk w ustalonej pozycji" #: target/out/prefPages/toggles.js:28 msgid "DND indicator position" msgstr "Pozycja" #: target/out/prefPages/toggles.js:29 msgid "Set DND indicator position" msgstr "Ustaw pozycję" #: target/out/prefPages/toggles.js:33 msgid "System Tray" msgstr "Panel szybkich ustawień" #: target/out/prefPages/toggles.js:34 msgid "Date Menu Button" msgstr "Menu daty" #: target/out/prefPages/toggles.js:41 msgid "Unsafe Mode Quick Toggle" msgstr "Tryb niezabezpieczony" #: target/out/prefPages/toggles.js:42 msgid "Turn on to add the unsafe quick toggle on the Quick Settings panel" msgstr "Włącz przycisk w panelu szybkich ustawień" #: target/out/prefPages/toggles.js:50 msgid "Save last session state" msgstr "Pamiętaj stan" #: target/out/prefPages/toggles.js:51 msgid "Turn on to save last session unsafe state" msgstr "Włącz zapamiętywanie ostatniego stanu" #: target/out/prefPages/menu.js:9 target/out/prefPages/menu.js:141 msgid "Advanced animation style" msgstr "Dostosowywanie" #: target/out/prefPages/menu.js:13 msgid "Open Duration" msgstr "Czas" #: target/out/prefPages/menu.js:14 msgid "Open animation duration in microseconds" msgstr "Czas otwarcia w mikrosekundach" #: target/out/prefPages/menu.js:21 msgid "Close Duration" msgstr "Zamknięcie" #: target/out/prefPages/menu.js:22 msgid "Close animation duration in microseconds" msgstr "Czas zamkniecia w mikrosekundach" #: target/out/prefPages/menu.js:29 msgid "Grid Content Opacity" msgstr "Przezroczystość" #: target/out/prefPages/menu.js:30 msgid "" "Adjust grid content opacity.\n" "Set this to 255 to make opaque, and 0 to make transparent" msgstr "" "Dostosuj przezroczystość zawartości siatki.\n" "255 - nieprzeroczyste, 0 - przezroczyste" #: target/out/prefPages/menu.js:37 msgid "Background Blur Radius" msgstr "Rozmycie" #: target/out/prefPages/menu.js:38 msgid "" "Adjust background blur radius.\n" "Set this to 0 to disable blur effect" msgstr "" "Dostsuj rozmycie tła.\n" "0 - bez rozycia tła" #: target/out/prefPages/menu.js:45 msgid "Background Brightness" msgstr "Jasność" #: target/out/prefPages/menu.js:46 msgid "" "Adjust background brightness.\n" "Set this to 1000 to disable brightness control effect.\n" "Not impacts on gnome-shell's default dim effect." msgstr "" "1000 - wyłącza zarządzanie jasnością.\n" "nie wpływa na domyślny efekt powłoki GNOME." #: target/out/prefPages/menu.js:53 msgid "Background Opacity" msgstr "Przezroczystość" #: target/out/prefPages/menu.js:54 msgid "" "Adjust background opacity.\n" "Set this to 255 to make opaque, and 0 to make transparent" msgstr "" "Dostosuj przezroczystość tła.\n" "255 - nieprzeroczyste, 0 - przezroczyste" #: target/out/prefPages/menu.js:61 msgid "Background X Scale" msgstr "Skalowanie w osi X" #: target/out/prefPages/menu.js:62 msgid "Adjust background x scale, 1000 means 1.0 scale" msgstr "Dostosuj skalowanie w osi X, 1000 oznaza skalę 1.0" #: target/out/prefPages/menu.js:69 msgid "Background Y Scale" msgstr "Skalowanie w osi Y" #: target/out/prefPages/menu.js:70 msgid "Adjust background y scale, 1000 means 1.0 scale" msgstr "Dostosuj skalowanie w osi Y, 1000 oznaza skalę 1.0" #: target/out/prefPages/menu.js:84 msgid "Menu" msgstr "Menu" #: target/out/prefPages/menu.js:91 msgid "Overlay Mode" msgstr "Tryb nakładania" #: target/out/prefPages/menu.js:92 msgid "Display toggle, power, and sound menus as overlay" msgstr "Nakładaj na przełączniki, zasilanie oraz wyjścia audio dodatkowe menu" #: target/out/prefPages/menu.js:101 msgid "Overlay Width" msgstr "Szerokość" #: target/out/prefPages/menu.js:102 msgid "" "Adjust overlay menu width\n" "Set this to 0 to disable adjusting" msgstr "" "Dostosuj szerokość dodatkowego menu\n" "0 - wyłącza" #: target/out/prefPages/menu.js:109 msgid "Overlay Animation Duration" msgstr "Czas animacji" #: target/out/prefPages/menu.js:110 msgid "" "Custom menu open animation duration in microseconds\n" "Set this to 0 to disable custom animation" msgstr "" "Czas otwarcia animacji w mikrosekundach\n" "0 - wyłącza" #: target/out/prefPages/menu.js:117 msgid "Overlay Animation Style" msgstr "Styl" #: target/out/prefPages/menu.js:118 msgid "Custom menu open animation style" msgstr "Rodzaj animacji" #: target/out/prefPages/menu.js:120 msgid "Flyout" msgstr "Wylatywanie" #: target/out/prefPages/menu.js:121 msgid "Dialog" msgstr "Okno" #: target/out/prefPages/menu.js:130 target/out/prefPages/menu.js:143 msgid "Animation" msgstr "Animacja" #: target/out/prefPages/menu.js:131 msgid "" "Add menu animation on toggle menu opening and closing\n" "To get the best feel, turn on overlay mode" msgstr "" "Dodaj animację do otwierania oraz zamykania menu\n" "Włącz tryb nakładania, dla lepszego efektu" #: target/out/prefPages/menu.js:142 msgid "Adjust speed, blur, scale, and opacity" msgstr "Dostosuj pręszkość, rozycie, skalowanie oraz przezroczystość" #: target/out/prefPages/layout.js:25 msgid "The item not found" msgstr "NIe znaleziono elementu" #: target/out/prefPages/layout.js:28 msgid "No changes" msgstr "Brak zmian" #: target/out/prefPages/layout.js:31 msgid "The same item already exists" msgstr "Taki element już istnieje" #: target/out/prefPages/layout.js:40 #, javascript-format msgid "Properties of %s" msgstr "Właściwości %s" #: target/out/prefPages/layout.js:47 msgid "Save" msgstr "Zapisz" #: target/out/prefPages/layout.js:64 msgid "Toggle editor" msgstr "Edytor przełącznika" #: target/out/prefPages/layout.js:84 msgid "This option requires full gnome-shell reloading" msgstr "Opcja wymaga przeładowania powłoki GNOME" #: target/out/prefPages/layout.js:160 target/out/prefPages/layout.js:278 #: target/out/prefPages/layout.js:437 target/out/prefPages/layout.js:672 msgid "Hide" msgstr "Ukryj" #: target/out/prefPages/layout.js:232 #, javascript-format msgid "My item #%d" msgstr "Mój element #%d" #: target/out/prefPages/layout.js:250 msgid "New Item" msgstr "Nowy element" #: target/out/prefPages/layout.js:261 target/out/prefPages/layout.js:610 #: target/out/prefPages/layout.js:737 target/out/prefPages/layout.js:787 #: target/out/prefPages/layout.js:813 msgid "Ordering and Hiding" msgstr "Ukrywanie i kolejność" #: target/out/prefPages/layout.js:273 target/out/prefPages/layout.js:432 msgid "Friendly Name" msgstr "Nazwa przełącznika" #: target/out/prefPages/layout.js:283 msgid "Title Regex (Javascript Regex)" msgstr "Tytuł Regex (JavaScript Regex)" #: target/out/prefPages/layout.js:288 target/out/prefPages/layout.js:442 msgid "Constructor Name" msgstr "Nazwa" #: target/out/prefPages/layout.js:294 target/out/prefPages/layout.js:448 msgid "GType Name" msgstr "Nazwa GType" #: target/out/prefPages/layout.js:302 target/out/prefPages/layout.js:456 msgid "This is the comment for easy identification in the settings list. It has no effect on the behavior of the extension" msgstr "To jest komentarz do łatwej identyfikacji na liście ustawień. Nie ma on wpływu na zachowanie rozszerzenia" #: target/out/prefPages/layout.js:307 target/out/prefPages/layout.js:461 msgid "Javascript constructor name" msgstr "Nazwa konstruktora JavaScript" #: target/out/prefPages/layout.js:312 target/out/prefPages/layout.js:466 msgid "GObject gtype name. You can get this value by calling GObject.type_name_from_instance" msgstr "Nazwa typu GObject. Możesz uzyskać tę wartość, wywołując GObject.type_name_from_instance" #: target/out/prefPages/layout.js:342 msgid "Keyboard Backlight" msgstr "Podświetlenie klawiatury" #: target/out/prefPages/layout.js:388 target/out/prefPages/layout.js:538 msgid "Unordered items" msgstr "Elementy bez kolejności" #: target/out/prefPages/layout.js:486 msgid "Remote Access Applet" msgstr "Aplet dostępu zdalnego" #: target/out/prefPages/layout.js:487 msgid "Camera" msgstr "Aparat" #: target/out/prefPages/layout.js:488 msgid "Volume Input" msgstr "Wejście audio" #: target/out/prefPages/layout.js:489 msgid "Location" msgstr "Lokalizacja" #: target/out/prefPages/layout.js:490 msgid "Thunderbolt" msgstr "Thunderbolt" #: target/out/prefPages/layout.js:492 msgid "Network" msgstr "Sieć" #: target/out/prefPages/layout.js:495 msgid "Volume Output" msgstr "Wyjscie audio" #: target/out/prefPages/layout.js:497 msgid "System (Battery)" msgstr "System (bateria)" #: target/out/prefPages/layout.js:618 msgid "Desktop Spacer" msgstr "Pusta przestrzeń pulpitu" #: target/out/prefPages/layout.js:629 msgid "Laptop Spacer" msgstr "Pusta przestrzeń laptopa" #: target/out/prefPages/layout.js:641 msgid "Capture button" msgstr "Przechwytywanie" #: target/out/prefPages/layout.js:647 msgid "Settings button" msgstr "Ustawienia" #: target/out/prefPages/layout.js:653 msgid "Lock button" msgstr "Zablokuj" #: target/out/prefPages/layout.js:659 msgid "Shutdown button" msgstr "Wyłącz" #: target/out/prefPages/layout.js:665 msgid "Battery button" msgstr "Bateria" #: target/out/prefPages/layout.js:711 msgid "Layout" msgstr "Układ" #: target/out/prefPages/layout.js:718 msgid "Quick Toggles Layout" msgstr "Układ przełączników" #: target/out/prefPages/layout.js:719 target/out/prefPages/layout.js:734 msgid "Adjust quick toggles layout" msgstr "Dostosuj układ przełączników" #: target/out/prefPages/layout.js:738 msgid "Reorder and hide quick toggles" msgstr "Zmień kolejność i ukryj" #: target/out/prefPages/layout.js:745 msgid "System Indicators" msgstr "Wskaźniki systemowe" #: target/out/prefPages/layout.js:746 msgid "Adjust system indicators layout and style" msgstr "Dostosuj układ oraz styl wskaźników systemowych" #: target/out/prefPages/layout.js:751 msgid "Accent screen sharing indicator" msgstr "Udostępnianie" #: target/out/prefPages/layout.js:752 msgid "Use shell accent color on screen sharing indicator" msgstr "Użyj koloru powłoki" #: target/out/prefPages/layout.js:757 msgid "Accent screen recording indicator" msgstr "Nagrywanie ekranu" #: target/out/prefPages/layout.js:758 msgid "Use shell accent color on screen recording indicator" msgstr "Użyj koloru powłoki" #: target/out/prefPages/layout.js:763 msgid "Privacy indicators style" msgstr "Prywatność" #: target/out/prefPages/layout.js:764 msgid "Use monochrome or shell accent color on privarcy indicators" msgstr "Użyj koloru powłoki" #: target/out/prefPages/layout.js:767 msgid "Accent" msgstr "Kolor akcentu" #: target/out/prefPages/layout.js:768 msgid "Monochrome" msgstr "Monochromatyczny" #: target/out/prefPages/layout.js:777 msgid "Adjust system indicators" msgstr "Dostosuj wskaźniki systemowe" #: target/out/prefPages/layout.js:788 msgid "Reorder and hide system indicators" msgstr "Zmień i ukryj wskaźniki systemowe" #: target/out/prefPages/layout.js:795 msgid "System Items Layout" msgstr "Elementy systemowe" #: target/out/prefPages/layout.js:800 target/out/prefPages/layout.js:815 msgid "Adjust system items layout" msgstr "Dostosuj układ elementów systemowych" #: target/out/prefPages/layout.js:804 msgid "Hide layout box" msgstr "Elementy systemowe" #: target/out/prefPages/layout.js:805 msgid "Hide all buttons and layout box" msgstr "Ukryj wszystkie przyciski" #: target/out/prefPages/layout.js:814 msgid "Reorder and hide system items" msgstr "Zmień kolejność i ukryj elementy" #: target/out/prefPages/layout.js:823 msgid "Date Menu" msgstr "Data" #: target/out/prefPages/layout.js:824 msgid "Adjust Date Menu layout" msgstr "Dostosuj układ menu daty" #: target/out/prefPages/layout.js:828 msgid "Hide left box" msgstr "Lewy panel" #: target/out/prefPages/layout.js:829 msgid "Hide the left box of the date menu, which contains notifications and media control" msgstr "Ukryj lewy panel, który zawiera powiadomienia oraz sterownie mediami" #: target/out/prefPages/layout.js:834 msgid "Hide right box" msgstr "Prawy panel" #: target/out/prefPages/layout.js:835 msgid "Hide the right box of the date menu, which contains calendar, world clock and weather" msgstr "Ukryj prawy panel. który zawiera kalendarz, zegar światowy oraz pogodę" #: target/out/prefPages/layout.js:840 msgid "Disable menu" msgstr "Wyłącz menu" #: target/out/prefPages/layout.js:841 msgid "Do not open date menu when the date menu button clicked" msgstr "Nie otwieraj menu po jego kliknięciu" #~ msgid "Height" #~ msgstr "Wysokość" #~ msgid "Set this to 0 to use default height" #~ msgstr "0 - domyślna wysokość" #~ msgid "Start opaque" #~ msgstr "Wyłącz przezroczystość" #~ msgid "End opaque" #~ msgstr "Włącz przezroczystość" #~ msgid "Hide Notifications" #~ msgstr "Przestrzeń powiadomień" #~ msgid "Hide notifications on the date menu" #~ msgstr "Ukryj przestrzeń powiadomień" #~ msgid "Hide Media Control" #~ msgstr "Sterowanie mediami" #~ msgid "Hide media control on the date menu" #~ msgstr "Ukryj sterowanie mediami" ================================================ FILE: po/pt.po ================================================ # AUTHORS # DanGLES3 https://github.com/DanGLES3, 2023. # msgid "" msgstr "" "Project-Id-Version: 1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-07-20 15:34+0000\n" "PO-Revision-Date: 2025-03-09 17:10+0000\n" "Last-Translator: Duarte Souto Assunção \n" "Language-Team: Portuguese \n" "Language: pt\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" "X-Generator: Weblate 5.10.2\n" #: target/out/libs/prefs/components.js:57 msgid "Details" msgstr "Detalhes" #: target/out/libs/prefs/components.js:144 msgid "This feature marked as experimental" msgstr "Esta funcionalidade é experimental" #: target/out/libs/prefs/components.js:274 msgid "Reset to default" msgstr "Redefinir para o padrão" #: target/out/libs/prefs/components.js:512 msgid "Theme default" msgstr "Tema padrão" #: target/out/libs/prefs/components.js:853 msgid "Homepage" msgstr "Página principal" #: target/out/libs/prefs/components.js:859 #: target/out/libs/prefs/components.js:863 target/out/prefPages/about.js:49 #: target/out/prefPages/about.js:51 target/out/prefPages/about.js:56 msgid "License" msgstr "Licença" #: target/out/libs/prefs/components.js:860 msgid "Loading ..." msgstr "A carregar..." #: target/out/libs/prefs/components.js:869 msgid "Affected Files" msgstr "Ficheiros afetados" #: target/out/libs/prefs/components.js:924 msgid "Changelog" msgstr "Mudança" #: target/out/libs/prefs/components.js:938 msgid "(Current)" msgstr "Atual" #: target/out/libs/prefs/components.js:969 #, javascript-format msgid "> **Date:** %s" msgstr "> **Data:** %s" #: target/out/libs/prefs/components.js:970 #, javascript-format msgid "> **Git Hash:** %s" msgstr "" #: target/out/libs/prefs/components.js:971 #, javascript-format msgid "> **Build Number:** %d" msgstr "" #: target/out/libs/prefs/components.js:1034 msgid "Padding" msgstr "" #: target/out/libs/prefs/components.js:1038 msgid "Top" msgstr "Superior" #: target/out/libs/prefs/components.js:1049 msgid "Bottom" msgstr "Inferior" #: target/out/libs/prefs/components.js:1060 msgid "Left" msgstr "Esquerda" #: target/out/libs/prefs/components.js:1071 msgid "Right" msgstr "Direita" #: target/out/prefs.js:60 msgid "Stable" msgstr "Estável" #: target/out/prefs.js:63 msgid "Development" msgstr "Desenvolvimento" #: target/out/prefs.js:66 msgid "Preview" msgstr "Pré-visualização" #: target/out/prefs.js:69 msgid "(Github Release)" msgstr "" #: target/out/prefs.js:72 msgid "(Built from source)" msgstr "" #: target/out/features/widget/notifications.js:26 msgid "No Notifications" msgstr "Nenhuma notificação" #: target/out/features/widget/notifications.js:58 #: target/out/features/widget/notifications.js:122 msgid "Clear" msgstr "Limpar" # Quick settings notifications title text # Notifications title #: target/out/features/widget/notifications.js:76 msgid "Notifications" msgstr "Notificações" #: target/out/features/widget/notifications.js:105 #: target/out/features/toggle/dndQuickToggle.js:10 #: target/out/prefPages/layout.js:345 target/out/prefPages/layout.js:485 msgid "Do Not Disturb" msgstr "Não Perturbe" #: target/out/features/widget/media.js:118 msgid "Unknown title" msgstr "Título desconhecido" #: target/out/features/widget/media.js:888 msgid "Media" msgstr "Mídia" #: target/out/features/widget/volumeMixer.js:105 msgid "Volume changed" msgstr "Volume alterado" #: target/out/features/widget/volumeMixer.js:463 msgid "Open volumx mixer" msgstr "Abrir mixer de volume" #: target/out/features/widget/volumeMixer.js:480 msgid "Volume Mixer" msgstr "Mixer de Volume" #: target/out/features/widget/weather.js:73 msgid "Weather" msgstr "Clima" #: target/out/features/widget/weather.js:192 msgid "Location has not been set" msgstr "Localização não foi definida" #: target/out/features/toggle/unsafeQuickToggle.js:11 #: target/out/prefPages/layout.js:346 target/out/prefPages/layout.js:496 msgid "Unsafe Mode" msgstr "Modo Inseguro" #: target/out/prefPages/widgets.js:11 msgid "Handle radius" msgstr "" #: target/out/prefPages/widgets.js:12 msgid "Set this to 0 to use default radius" msgstr "Coloque a 0 para usar o raio padrão" #: target/out/prefPages/widgets.js:18 msgid "Handle color" msgstr "" #: target/out/prefPages/widgets.js:36 msgid "Slider style" msgstr "Estilo do slider" #: target/out/prefPages/widgets.js:39 msgid "Slim" msgstr "Magro" #: target/out/prefPages/widgets.js:40 target/out/prefPages/layout.js:766 msgid "Default" msgstr "Padrão" #: target/out/prefPages/widgets.js:48 target/out/prefPages/widgets.js:173 msgid "Background color" msgstr "Cor de fundo" #: target/out/prefPages/widgets.js:55 msgid "Active Background color" msgstr "Cor de fundo ativa" #: target/out/prefPages/widgets.js:62 msgid "Thickness" msgstr "" #: target/out/prefPages/widgets.js:66 msgid "Set this to 0 to use default thickness" msgstr "" #: target/out/prefPages/widgets.js:76 msgid "Widgets" msgstr "Widgets" #: target/out/prefPages/widgets.js:83 target/out/prefPages/widgets.js:136 #: target/out/prefPages/widgets.js:162 target/out/prefPages/widgets.js:224 msgid "Media Widget" msgstr "Widget de Mídia" #: target/out/prefPages/widgets.js:88 msgid "Turn on to make the media widget visible on the Quick Settings panel" msgstr "Ligue para visualizar o widget de mídia no Painel de Definições Rápidas" #: target/out/prefPages/widgets.js:92 target/out/prefPages/widgets.js:280 #: target/out/prefPages/widgets.js:343 msgid "Compact mode" msgstr "Modo compacto" #: target/out/prefPages/widgets.js:93 msgid "" "Make Media Controls widget smaller\n" "Make it more similar in size to the notification message" msgstr "" "Deixar o widget de Controles de Mídia menor\n" "Deixá-lo com tamanho similar a uma mensagem de notificação" #: target/out/prefPages/widgets.js:99 msgid "Control buttons opacity" msgstr "Opacidade do botão de controlo" #: target/out/prefPages/widgets.js:100 msgid "Set this to 255 to make opaque, and 0 to make transparent" msgstr "Coloque a 255 para opaco ou 0 para transparente" #: target/out/prefPages/widgets.js:108 msgid "Show next button" msgstr "Mostrar o próximo botão" #: target/out/prefPages/widgets.js:109 msgid "Add next contorl button next to description" msgstr "Adicionar o próximo botão de controle a seguir à descrição" #: target/out/prefPages/widgets.js:115 msgid "Show previous button" msgstr "Mostrar botão anterior" #: target/out/prefPages/widgets.js:116 msgid "Add previous contorl button next to description" msgstr "" #: target/out/prefPages/widgets.js:122 msgid "Show pause button" msgstr "Mostrar botão de pausa" #: target/out/prefPages/widgets.js:123 msgid "Add pause contorl button next to description" msgstr "" #: target/out/prefPages/widgets.js:129 target/out/prefPages/widgets.js:138 msgid "Show progress bar" msgstr "Mostrar barra de progresso" #: target/out/prefPages/widgets.js:130 target/out/prefPages/widgets.js:139 msgid "Add progress bar under description" msgstr "Adicionar barra de progresso abaixo da descrição" #: target/out/prefPages/widgets.js:155 target/out/prefPages/widgets.js:164 msgid "Gradient background" msgstr "Fundo degradê" #: target/out/prefPages/widgets.js:156 target/out/prefPages/widgets.js:169 msgid "" "Use gradient background extracted from cover image\n" "May affect performance slightly" msgstr "" "Usar fundo degradê extraído da imagem de capa\n" "Pode afetar a preformance ligeiramente" #: target/out/prefPages/widgets.js:174 msgid "Base background color" msgstr "Cor de fundo base" #: target/out/prefPages/widgets.js:182 msgid "Start opacity" msgstr "" #: target/out/prefPages/widgets.js:183 msgid "Adjust left side transparency, Set this to 1000 to make opaque" msgstr "Ajustar transparência do lado esquerdo, Coloque a 1000 para opaco" #: target/out/prefPages/widgets.js:190 msgid "Start color" msgstr "" #: target/out/prefPages/widgets.js:191 msgid "Adjust left side background color mixing, Set this to 1000 to show extracted color" msgstr "" #: target/out/prefPages/widgets.js:198 msgid "End opacity" msgstr "" #: target/out/prefPages/widgets.js:199 msgid "Adjust right side transparency, Set this to 1000 to make opaque" msgstr "" #: target/out/prefPages/widgets.js:206 msgid "End color" msgstr "" #: target/out/prefPages/widgets.js:207 msgid "Adjust right side background color mixing, Set this to 1000 to show extracted color" msgstr "" #: target/out/prefPages/widgets.js:216 target/out/prefPages/widgets.js:226 msgid "Round clip effect" msgstr "Efeito de clip redondo" #: target/out/prefPages/widgets.js:217 target/out/prefPages/widgets.js:231 msgid "Use round clip effect to make transition more natural" msgstr "Usar efeito de clip redondo para fazer transição mais natural" #: target/out/prefPages/widgets.js:234 #, fuzzy msgid "Padding adjustment" msgstr "Ajuste de padding" #: target/out/prefPages/widgets.js:236 msgid "Adjust clip effect padding, edit this if your theme has a different margin or padding" msgstr "" #: target/out/prefPages/widgets.js:253 target/out/prefPages/widgets.js:318 #: target/out/prefPages/widgets.js:350 msgid "Remove shadow" msgstr "Remover sombra" #: target/out/prefPages/widgets.js:254 msgid "" "Remove shadow from media message\n" "Use if your theme creates unnecessary shadows" msgstr "" "Remover sobra da mensagem de mídia\n" "Use se o seu tema cria sombras desnecessárias" #: target/out/prefPages/widgets.js:260 msgid "Smooth scroll speed" msgstr "Velocidade de scroll suave" #: target/out/prefPages/widgets.js:261 msgid "Adjust trackpad and trackpoint scroll speed, negative number for invert direction" msgstr "" #: target/out/prefPages/widgets.js:271 msgid "Notifications Widget" msgstr "Widget de notificação" #: target/out/prefPages/widgets.js:276 msgid "Turn on to make the notifications widget visible on the Quick Settings panel" msgstr "" #: target/out/prefPages/widgets.js:281 msgid "Make notifications smaller" msgstr "Fazer notificações mais pequenas" #: target/out/prefPages/widgets.js:287 target/out/prefPages/widgets.js:418 msgid "Max height" msgstr "Altura máxima" #: target/out/prefPages/widgets.js:288 #, javascript-format msgid "Set maximum height of the Notifications widget, default is %d. Set this to 0 to disable max height" msgstr "" #: target/out/prefPages/widgets.js:296 target/out/prefPages/widgets.js:441 msgid "Fade out offset" msgstr "" #: target/out/prefPages/widgets.js:297 target/out/prefPages/widgets.js:442 msgid "Set position of the fade out effect begins. Set this to 0 to disable fade out effect. default is 46" msgstr "" #: target/out/prefPages/widgets.js:304 msgid "Auto hide" msgstr "Esconder automáticamente" #: target/out/prefPages/widgets.js:305 msgid "Hide the Notifications widget when have no notifications" msgstr "Ocultar o widget de Notificações quando não houver nenhuma notificação" #: target/out/prefPages/widgets.js:311 msgid "Use native controls" msgstr "Usar controles nativos" #: target/out/prefPages/widgets.js:312 msgid "Use native dnd switch and clear button" msgstr "Usar interruptor do Não Perturbe e botão Limpar nativos" #: target/out/prefPages/widgets.js:319 msgid "" "Remove shadow from notification message\n" "Use if your theme creates unnecessary shadows" msgstr "" "Remover sombra da mensagem de notificação\n" "Use se o seu tema cria sombras desnecessárias" #: target/out/prefPages/widgets.js:325 target/out/prefPages/widgets.js:427 msgid "Show scrollbar" msgstr "Mostrar barra de scroll" #: target/out/prefPages/widgets.js:326 msgid "Show scrollbar on message list" msgstr "Mostrar barra de scroll na lista de mensagens" #: target/out/prefPages/widgets.js:334 msgid "Weather Widget" msgstr "Widget de Clima" #: target/out/prefPages/widgets.js:339 msgid "Turn on to make the weather widget visible on the Quick Settings panel" msgstr "Ligue para fazer o widget de clima visível no Painel de Definições Rápidas" #: target/out/prefPages/widgets.js:344 msgid "Make weather widget smaller" msgstr "Fazer widget de clima mais pequeno" #: target/out/prefPages/widgets.js:351 msgid "" "Remove shadow from weather widget\n" "Use if your theme creates unnecessary shadows" msgstr "" "Remover sombra do widget de clima\n" "Use se o seu tema cria sombras desnecessárias" #: target/out/prefPages/widgets.js:357 msgid "Click command" msgstr "Comando de clique" #: target/out/prefPages/widgets.js:363 msgid "Show location" msgstr "Mostrar localização" #: target/out/prefPages/widgets.js:364 msgid "Show the location label on header" msgstr "Mostrar a etiqueta de localização no título" #: target/out/prefPages/widgets.js:373 msgid "Forecast interval" msgstr "Intervalo de previsão" #: target/out/prefPages/widgets.js:374 msgid "Adjust forecast interval in hour" msgstr "Ajustar intervalo de previsão em hora" #: target/out/prefPages/widgets.js:381 msgid "Max forecasts" msgstr "Máximas previsões" #: target/out/prefPages/widgets.js:382 msgid "Adjust max forecasts" msgstr "Ajustar máximas previsões" #: target/out/prefPages/widgets.js:388 target/out/prefPages/widgets.js:456 msgid "Volume mixer Widget" msgstr "Widget de mixer de volume" #: target/out/prefPages/widgets.js:393 msgid "Turn on to make the volume mixer widget visible on the Quick Settings panel" msgstr "" #: target/out/prefPages/widgets.js:397 msgid "Label text" msgstr "Etiqueta de texto" #: target/out/prefPages/widgets.js:398 msgid "Choose label above slider text source" msgstr "" #: target/out/prefPages/widgets.js:400 msgid "Both" msgstr "Ambos" #: target/out/prefPages/widgets.js:401 msgid "Title" msgstr "Título" #: target/out/prefPages/widgets.js:402 msgid "Description" msgstr "Descrição" #: target/out/prefPages/widgets.js:403 msgid "None" msgstr "Nenhum" #: target/out/prefPages/widgets.js:411 msgid "Label opacity" msgstr "Opacidade de etiqueta" #: target/out/prefPages/widgets.js:412 msgid "" "Adjust label opacity.\n" "Set this to 255 to make opaque, and 0 to make transparent" msgstr "" "Ajustar opacidade de etiqueta\n" "Coloque a 255 para opaco ou 0 para transparente" #: target/out/prefPages/widgets.js:419 #, javascript-format msgid "Set maximum height of the Volume mixer widget, default is %d. Set this to 0 to disable max height" msgstr "" #: target/out/prefPages/widgets.js:428 msgid "Show scrollbar on mixer list" msgstr "Mostrar barra de scroll na lista do mixer" #: target/out/prefPages/widgets.js:434 msgid "Show stream icon" msgstr "Mostrar ícone de stream" #: target/out/prefPages/widgets.js:435 msgid "Show stream icon above mixer sliders" msgstr "Mostar ícone de stream acima dos sliders do mixer" #: target/out/prefPages/widgets.js:450 target/out/prefPages/widgets.js:458 msgid "Attach to output slider" msgstr "Afixar ao slider de saída" #: target/out/prefPages/widgets.js:451 target/out/prefPages/widgets.js:459 msgid "Attach volume mixer menu button to output slider. Use if you prefer compact layout" msgstr "" #: target/out/prefPages/widgets.js:468 msgid "Menu icon" msgstr "Ícone de menu" #: target/out/prefPages/about.js:12 target/out/prefPages/about.js:32 msgid "About" msgstr "Sobre" #: target/out/prefPages/about.js:33 msgid "Common extension informations" msgstr "Informações de extensão comuns" #: target/out/prefPages/about.js:36 target/out/prefPages/about.js:40 msgid "Changelogs" msgstr "Mudanças" #: target/out/prefPages/about.js:37 target/out/prefPages/about.js:41 msgid "View the change history for this extension" msgstr "Ver o histórico de mudanças desta extensão" #: target/out/prefPages/about.js:50 target/out/prefPages/about.js:57 msgid "License of codes" msgstr "Licença de códigos" #: target/out/prefPages/about.js:63 target/out/prefPages/about.js:65 #: target/out/prefPages/about.js:69 msgid "Contributors" msgstr "Contribuidores" #: target/out/prefPages/about.js:64 target/out/prefPages/about.js:70 msgid "The creators of this extension" msgstr "Os criadores desta extensão" #: target/out/prefPages/about.js:74 msgid "More contributors" msgstr "Mais contribuições" #: target/out/prefPages/about.js:75 msgid "See more contributors on github" msgstr "Ver mais contruibuições no github" #: target/out/prefPages/about.js:85 msgid "Link" msgstr "Link" #: target/out/prefPages/about.js:86 msgid "External links about this extension" msgstr "Links externos sobre esta extensão" #: target/out/prefPages/about.js:90 msgid "Donate via github sponsors" msgstr "Doar via github sponsors" #: target/out/prefPages/about.js:91 msgid "Support development!" msgstr "Apoie o desenvolvimento!" #: target/out/prefPages/about.js:97 msgid "Rate and comment the extension!" msgstr "Classifique e comente sobre a extensão!" #: target/out/prefPages/about.js:102 msgid "Github Repository" msgstr "Repositório do GitHub" #: target/out/prefPages/about.js:103 msgid "" "Add Star on Repository is helping me a lot!\n" "Please, if you found bug from this extension, you can make issue to make me know that!\n" "Or, you can create PR with wonderful features!" msgstr "" "Dar uma estrela no repositório me ajuda muito!\n" "Por favor, se encontrar um problema com esta extensão, pode criar um relato de problema para me avisar disso!\n" "Ou pode criar um PR com funcionalidades incríveis!" #: target/out/prefPages/about.js:109 msgid "Add translation to this extension!" msgstr "Adicione uma tradução para esta extensão!" #: target/out/prefPages/about.js:115 msgid "Debug" msgstr "Debug" #: target/out/prefPages/about.js:116 msgid "Extension debugging options" msgstr "Opções de debug da extensão" #: target/out/prefPages/about.js:120 msgid "Expose environment" msgstr "Expor ambiente" #: target/out/prefPages/about.js:121 msgid "Expose extension environment to globalThis.qst" msgstr "Expor ambiente de extensão para globalThis.qst" #: target/out/prefPages/about.js:126 msgid "Show layout border" msgstr "Mostar borda do esquema" #: target/out/prefPages/about.js:127 msgid "Show layout borders on Quick Settings" msgstr "Mostrar esquema de bordas nas Definições Rápidas" #: target/out/prefPages/about.js:132 msgid "Log level" msgstr "Nível de log" #: target/out/prefPages/about.js:135 msgid "none" msgstr "nenhum" #: target/out/prefPages/about.js:136 msgid "error" msgstr "erro" #: target/out/prefPages/about.js:137 msgid "info" msgstr "informação" #: target/out/prefPages/about.js:138 msgid "debug" msgstr "debug" #: target/out/prefPages/toggles.js:12 msgid "Toggles" msgstr "Botões" #: target/out/prefPages/toggles.js:19 msgid "DND Quick Toggle" msgstr "Botão Rápido do Não Perturbe" #: target/out/prefPages/toggles.js:20 msgid "Turn on to add the DND quick toggle on the Quick Settings panel" msgstr "Ligue para adicionar o botão rápido de Não Perturbe no Painel de Definições Rápidas" #: target/out/prefPages/toggles.js:28 msgid "DND indicator position" msgstr "Indicador de posição do Não Perturbe" #: target/out/prefPages/toggles.js:29 msgid "Set DND indicator position" msgstr "Definir posição do indicador de Não Perturbe" #: target/out/prefPages/toggles.js:33 msgid "System Tray" msgstr "Tray de Sistema" #: target/out/prefPages/toggles.js:34 msgid "Date Menu Button" msgstr "Botão do Menu da Data" #: target/out/prefPages/toggles.js:41 msgid "Unsafe Mode Quick Toggle" msgstr "Quick Toggle do Modo Inseguro" #: target/out/prefPages/toggles.js:42 msgid "Turn on to add the unsafe quick toggle on the Quick Settings panel" msgstr "" #: target/out/prefPages/toggles.js:50 msgid "Save last session state" msgstr "Salvar o estado da última sessão" #: target/out/prefPages/toggles.js:51 msgid "Turn on to save last session unsafe state" msgstr "" #: target/out/prefPages/menu.js:9 target/out/prefPages/menu.js:141 msgid "Advanced animation style" msgstr "Estilo de animação avançado" #: target/out/prefPages/menu.js:13 msgid "Open Duration" msgstr "Duração de abertura" #: target/out/prefPages/menu.js:14 msgid "Open animation duration in microseconds" msgstr "" #: target/out/prefPages/menu.js:21 msgid "Close Duration" msgstr "Fechar Duração" #: target/out/prefPages/menu.js:22 msgid "Close animation duration in microseconds" msgstr "" #: target/out/prefPages/menu.js:29 msgid "Grid Content Opacity" msgstr "Opacidade do Conteúdo da Grelha" #: target/out/prefPages/menu.js:30 msgid "" "Adjust grid content opacity.\n" "Set this to 255 to make opaque, and 0 to make transparent" msgstr "" #: target/out/prefPages/menu.js:37 msgid "Background Blur Radius" msgstr "Raio do blur de fundo" #: target/out/prefPages/menu.js:38 msgid "" "Adjust background blur radius.\n" "Set this to 0 to disable blur effect" msgstr "" #: target/out/prefPages/menu.js:45 msgid "Background Brightness" msgstr "Brilho do fundo" #: target/out/prefPages/menu.js:46 msgid "" "Adjust background brightness.\n" "Set this to 1000 to disable brightness control effect.\n" "Not impacts on gnome-shell's default dim effect." msgstr "" #: target/out/prefPages/menu.js:53 msgid "Background Opacity" msgstr "Opacidade do Fundo" #: target/out/prefPages/menu.js:54 msgid "" "Adjust background opacity.\n" "Set this to 255 to make opaque, and 0 to make transparent" msgstr "" #: target/out/prefPages/menu.js:61 msgid "Background X Scale" msgstr "Escala X do fundo" #: target/out/prefPages/menu.js:62 msgid "Adjust background x scale, 1000 means 1.0 scale" msgstr "" #: target/out/prefPages/menu.js:69 msgid "Background Y Scale" msgstr "Escala Y do fundo" #: target/out/prefPages/menu.js:70 msgid "Adjust background y scale, 1000 means 1.0 scale" msgstr "" #: target/out/prefPages/menu.js:84 msgid "Menu" msgstr "Menu" #: target/out/prefPages/menu.js:91 msgid "Overlay Mode" msgstr "" #: target/out/prefPages/menu.js:92 msgid "Display toggle, power, and sound menus as overlay" msgstr "" #: target/out/prefPages/menu.js:101 msgid "Overlay Width" msgstr "" #: target/out/prefPages/menu.js:102 msgid "" "Adjust overlay menu width\n" "Set this to 0 to disable adjusting" msgstr "" #: target/out/prefPages/menu.js:109 msgid "Overlay Animation Duration" msgstr "" #: target/out/prefPages/menu.js:110 msgid "" "Custom menu open animation duration in microseconds\n" "Set this to 0 to disable custom animation" msgstr "" #: target/out/prefPages/menu.js:117 msgid "Overlay Animation Style" msgstr "" #: target/out/prefPages/menu.js:118 msgid "Custom menu open animation style" msgstr "" #: target/out/prefPages/menu.js:120 msgid "Flyout" msgstr "" #: target/out/prefPages/menu.js:121 msgid "Dialog" msgstr "Diálogo" #: target/out/prefPages/menu.js:130 target/out/prefPages/menu.js:143 msgid "Animation" msgstr "Animação" #: target/out/prefPages/menu.js:131 msgid "" "Add menu animation on toggle menu opening and closing\n" "To get the best feel, turn on overlay mode" msgstr "" #: target/out/prefPages/menu.js:142 msgid "Adjust speed, blur, scale, and opacity" msgstr "Ajustar velocidade, blur, escala e opacidade" #: target/out/prefPages/layout.js:25 msgid "The item not found" msgstr "O ítem não encontrado" #: target/out/prefPages/layout.js:28 msgid "No changes" msgstr "Nenhuma mudança" #: target/out/prefPages/layout.js:31 msgid "The same item already exists" msgstr "Este ítem já existe" #: target/out/prefPages/layout.js:40 #, javascript-format msgid "Properties of %s" msgstr "Propriedades de %s" #: target/out/prefPages/layout.js:47 msgid "Save" msgstr "Salvar" #: target/out/prefPages/layout.js:64 msgid "Toggle editor" msgstr "Ligar editor" #: target/out/prefPages/layout.js:84 msgid "This option requires full gnome-shell reloading" msgstr "" #: target/out/prefPages/layout.js:160 target/out/prefPages/layout.js:278 #: target/out/prefPages/layout.js:437 target/out/prefPages/layout.js:672 msgid "Hide" msgstr "Esconder" #: target/out/prefPages/layout.js:232 #, javascript-format msgid "My item #%d" msgstr "Meu item #%d" #: target/out/prefPages/layout.js:250 msgid "New Item" msgstr "Novo item" #: target/out/prefPages/layout.js:261 target/out/prefPages/layout.js:610 #: target/out/prefPages/layout.js:737 target/out/prefPages/layout.js:787 #: target/out/prefPages/layout.js:813 msgid "Ordering and Hiding" msgstr "" #: target/out/prefPages/layout.js:273 target/out/prefPages/layout.js:432 msgid "Friendly Name" msgstr "Nome amigável" #: target/out/prefPages/layout.js:283 msgid "Title Regex (Javascript Regex)" msgstr "Regex de Título (Regex de Javascript)" #: target/out/prefPages/layout.js:288 target/out/prefPages/layout.js:442 msgid "Constructor Name" msgstr "Nome do construtor" #: target/out/prefPages/layout.js:294 target/out/prefPages/layout.js:448 msgid "GType Name" msgstr "" #: target/out/prefPages/layout.js:302 target/out/prefPages/layout.js:456 msgid "This is the comment for easy identification in the settings list. It has no effect on the behavior of the extension" msgstr "" #: target/out/prefPages/layout.js:307 target/out/prefPages/layout.js:461 msgid "Javascript constructor name" msgstr "Nome do construtor de Javascript" #: target/out/prefPages/layout.js:312 target/out/prefPages/layout.js:466 msgid "GObject gtype name. You can get this value by calling GObject.type_name_from_instance" msgstr "" #: target/out/prefPages/layout.js:342 msgid "Keyboard Backlight" msgstr "Luz de teclado" #: target/out/prefPages/layout.js:388 target/out/prefPages/layout.js:538 msgid "Unordered items" msgstr "" #: target/out/prefPages/layout.js:486 msgid "Remote Access Applet" msgstr "" #: target/out/prefPages/layout.js:487 msgid "Camera" msgstr "Câmera" #: target/out/prefPages/layout.js:488 msgid "Volume Input" msgstr "Entrada de volume" #: target/out/prefPages/layout.js:489 msgid "Location" msgstr "Localização" #: target/out/prefPages/layout.js:490 msgid "Thunderbolt" msgstr "Thunderbolt" #: target/out/prefPages/layout.js:492 msgid "Network" msgstr "Rede" #: target/out/prefPages/layout.js:495 msgid "Volume Output" msgstr "Saída de volume" #: target/out/prefPages/layout.js:497 msgid "System (Battery)" msgstr "Sistema (Bateria)" #: target/out/prefPages/layout.js:618 msgid "Desktop Spacer" msgstr "" #: target/out/prefPages/layout.js:629 msgid "Laptop Spacer" msgstr "" #: target/out/prefPages/layout.js:641 msgid "Capture button" msgstr "Botão de captura" #: target/out/prefPages/layout.js:647 msgid "Settings button" msgstr "Botão de definições" #: target/out/prefPages/layout.js:653 msgid "Lock button" msgstr "Botão de bloqueio" #: target/out/prefPages/layout.js:659 msgid "Shutdown button" msgstr "Botão de desligar" #: target/out/prefPages/layout.js:665 msgid "Battery button" msgstr "Botão de bateria" #: target/out/prefPages/layout.js:711 msgid "Layout" msgstr "Esquema" #: target/out/prefPages/layout.js:718 msgid "Quick Toggles Layout" msgstr "Esquema de Botões Rápidos" #: target/out/prefPages/layout.js:719 target/out/prefPages/layout.js:734 msgid "Adjust quick toggles layout" msgstr "" #: target/out/prefPages/layout.js:738 msgid "Reorder and hide quick toggles" msgstr "" #: target/out/prefPages/layout.js:745 msgid "System Indicators" msgstr "Indicadores de sistema" #: target/out/prefPages/layout.js:746 msgid "Adjust system indicators layout and style" msgstr "" #: target/out/prefPages/layout.js:751 msgid "Accent screen sharing indicator" msgstr "" #: target/out/prefPages/layout.js:752 msgid "Use shell accent color on screen sharing indicator" msgstr "Usar cor de destaque da shell no indicador de partilha de ecrã" #: target/out/prefPages/layout.js:757 msgid "Accent screen recording indicator" msgstr "Indicador de gravação no ecrã destaque" #: target/out/prefPages/layout.js:758 msgid "Use shell accent color on screen recording indicator" msgstr "Usar cor de destaque de shell no indicador de gravação de ecrã" #: target/out/prefPages/layout.js:763 msgid "Privacy indicators style" msgstr "Estilo de indicadores de privacidade" #: target/out/prefPages/layout.js:764 msgid "Use monochrome or shell accent color on privarcy indicators" msgstr "" #: target/out/prefPages/layout.js:767 msgid "Accent" msgstr "Destaque" #: target/out/prefPages/layout.js:768 msgid "Monochrome" msgstr "" #: target/out/prefPages/layout.js:777 msgid "Adjust system indicators" msgstr "Ajustar indicadores de sistema" #: target/out/prefPages/layout.js:788 msgid "Reorder and hide system indicators" msgstr "Reordenar e esconder indicadores de sistema" #: target/out/prefPages/layout.js:795 msgid "System Items Layout" msgstr "Esquema de itens de sistema" #: target/out/prefPages/layout.js:800 target/out/prefPages/layout.js:815 msgid "Adjust system items layout" msgstr "Ajustar esquema de itens de sistema" #: target/out/prefPages/layout.js:804 msgid "Hide layout box" msgstr "Esconder caixa de esquema" #: target/out/prefPages/layout.js:805 msgid "Hide all buttons and layout box" msgstr "Esconder todos os botões e caixa de esquema" #: target/out/prefPages/layout.js:814 msgid "Reorder and hide system items" msgstr "Reordenar e esconder itens de sistema" #: target/out/prefPages/layout.js:823 msgid "Date Menu" msgstr "Menu de Data" #: target/out/prefPages/layout.js:824 msgid "Adjust Date Menu layout" msgstr "Ajustar esquema do Menu de Data" #: target/out/prefPages/layout.js:828 msgid "Hide left box" msgstr "Esconder caixa da esquerda" #: target/out/prefPages/layout.js:829 msgid "Hide the left box of the date menu, which contains notifications and media control" msgstr "Esconder caixa da esquerda do menu de data, que contém notificações e controlo de mídia" #: target/out/prefPages/layout.js:834 msgid "Hide right box" msgstr "Esconder caixa da direita" #: target/out/prefPages/layout.js:835 msgid "Hide the right box of the date menu, which contains calendar, world clock and weather" msgstr "Esconder caixa da direita do menu de data, que contém calendário, relógio mundial e clima" #: target/out/prefPages/layout.js:840 msgid "Disable menu" msgstr "Desabilitar menu" #: target/out/prefPages/layout.js:841 msgid "Do not open date menu when the date menu button clicked" msgstr "Não abrir menu de data quando for clicado" #~ msgid "Height" #~ msgstr "Altura" #~ msgid "Set this to 0 to use default height" #~ msgstr "Coloque a 0 para usar a altura padrão" #~ msgid "Start opaque" #~ msgstr "Começar opaco" #~ msgid "End opaque" #~ msgstr "Terminar opaco" #~ msgid "Hide Notifications" #~ msgstr "Esconder Notificações" #~ msgid "Hide notifications on the date menu" #~ msgstr "Esconder notificações no menu de data" #~ msgid "Hide Media Control" #~ msgstr "Esconder controle de mídia" #~ msgid "Hide media control on the date menu" #~ msgstr "Esconder controle de mídia no menu de data" #~ msgid "Donate via patreon" #~ msgstr "Doar pelo Patreon" #~ msgid "Set maximum height of the Notifications widget. default is 292" #~ msgstr "Defina a altura máxima do widget de Notificações. O padrão é 292" #~ msgid "Other" #~ msgstr "Outros" #~ msgid "" #~ "Hide notifications on date menu.\n" #~ "*this option removes media control on date menu too*" #~ msgstr "" #~ "Ocultar notificações no menu de data.\n" #~ "*esta opção também remove os controles de mídia no menu de data*" #~ msgid "Hide media control on date menu." #~ msgstr "Ocultar controles de mídia no menu de data." #~ msgid "Sound Settings" #~ msgstr "Configurações de som" #~ msgid "Notification Widget" #~ msgstr "Widget de notificação" #~ msgid "Turn on to make the notification widget visible on the Quick Settings panel" #~ msgstr "Ative para deixar o widget de notificação visível no painel de Configurações Rápidas" #~ msgid "Links" #~ msgstr "Links" #~ msgid "Contributor" #~ msgstr "Colaborador" #~ msgid "Add Application to filtering" #~ msgstr "Adicionar aplicativo ao filtro" #~ msgid "Add" #~ msgstr "Adicionar" #~ msgid "Cancel" #~ msgstr "Cancelar" #~ msgid "Application name" #~ msgstr "Nome do aplicativo" #~ msgid "General" #~ msgstr "Geral" #~ msgid "Enchant input/output slider" #~ msgstr "Personalize o slider de entrada/saída" #~ msgid "Show current audio output selection" #~ msgstr "Mostrar saída de áudio atual" #~ msgid "Always show the current audio output selection above the volume slider" #~ msgstr "Sempre mostrar a saída de áudio atualmente selecionada acima do slider de volume" #~ msgid "Show current audio input selection" #~ msgstr "Mostrar entrada de áudio atual" #~ msgid "Always show the current audio input selection above the volume slider" #~ msgstr "Sempre mostrar a entrada de áudio atualmente selecionada acima do slider de volume" #~ msgid "Always show input" #~ msgstr "Sempre mostrar entrada" #~ msgid "Always show the audio input volume slider, even when there is no audio input stream." #~ msgstr "Sempre mostrar o slider de volume da entrada de áudio, mesmo quando não houver fluxo de entrada de áudio." #~ msgid "Add volume mixer (PulseAudio, Pipewire)" #~ msgstr "Adicionar mixer de volume (PulseAudio, PipeWire)" #~ msgid "" #~ "Turn on to make the volume mixer visible\n" #~ "Forked from https://github.com/mymindstorm/gnome-volume-mixer" #~ msgstr "" #~ "Ative para tornar visível o mixer de volume\n" #~ "Uma ramificação de https://github.com/mymindstorm/gnome-volume-mixer" #~ msgid "Position" #~ msgstr "Posição" #~ msgid "Set volume mixer position" #~ msgstr "Definir posição do mixer de volume" #~ msgid "Top (Below Output/Input slider)" #~ msgstr "Superior (sob o slider de saída/entrada)" #~ msgid "Show stream Description" #~ msgstr "Mostrar descrição do fluxo" #~ msgid "Show audio stream description above the slider" #~ msgstr "Mostrar descrição do fluxo de áudio acima do slider" #~ msgid "Show stream Icon" #~ msgstr "Mostrar ícone do fluxo" #~ msgid "Show application icon in front of the slider" #~ msgstr "Mostrar ícone do aplicativo na frente do slider" #~ msgid "Filter applications shown in the volume mixer." #~ msgstr "Filtrar aplicativos mostrados no mixer de volume." #~ msgid "Filter Mode" #~ msgstr "Modo de Filtragem" #~ msgid "Blacklist" #~ msgstr "Lista negra" #~ msgid "Whitelist" #~ msgstr "Lista branca" #~ msgid "Using Javascript Regex" #~ msgstr "Usar Regex do Javascript" #~ msgid "Use Javascript RegExp for filtering app name or description" #~ msgstr "Usar RegExp do Javascript para filtrar nomes ou descrições de aplicativos" #~ msgid "Check Stream Description" #~ msgstr "Conferir descrição do fluxo" #~ msgid "Check Description also" #~ msgstr "Conferir também a descrição" #~ msgid "Add more buttons" #~ msgstr "Adicionar botões" #~ msgid "Turn on the buttons you want to add on Quick Settings" #~ msgstr "Ative os botões que você deseja adicionar às Configurações Rápidas" #~ msgid "Turn on to make the DND quick toggle visible on the Quick Settings panel" #~ msgstr "Ative para deixar o Quick Toggle do Não Perturbe visível no painel de Configurações Rápidas" #~ msgid "Turn on to make the unsafe quick toggle visible on the Quick Settings panel" #~ msgstr "Ative para deixar o Quick Toggle do Modo Inseguro visível no painel de Configurações Rápidas" #~ msgid "This extension is distributed with license GPL 3+" #~ msgstr "Esta extensão é distribuída sob a licença GPL 3+" #~ msgid "excludes Third-party. Third party codes follow their license" #~ msgstr "Exclui terceiros. Código de terceiros segue suas próprias licenças" #~ msgid "Extension Version" #~ msgstr "Versão da extensão" #~ msgid "Unknown (Built from source)" #~ msgstr "Desconhecida (compilada do código-fonte)" #~ msgid "Third party LICENSE" #~ msgstr "Licenças de Terceiros" #~ msgid "LICENSE OF CODES WHICH USED ON THIS EXTENSION" #~ msgstr "Licenças de códigos que foram utilizados nesta extensão" #~ msgid "Media Controls widget" #~ msgstr "Widget de controles de mídia" #~ msgid "Turn on to make the Media Control widget visible on the Quick Settings panel" #~ msgstr "Ative para deixar o widget de Controles de Mídia visível no painel de Configurações Rápidas" #~ msgid "Compact Mode" #~ msgstr "Modo compacto" #~ msgid "Auto Hide" #~ msgstr "Ocultar automaticamente" #~ msgid "Quick Toggles" #~ msgstr "Quick Toggles" #~ msgid "Fix Weather Widget Overflow" #~ msgstr "Corrigir transbordamento do widget de Meteorologia" #~ msgid "Fix overflow visual bug of weather widget in datemenu" #~ msgstr "Corrigir problema visual de transbordamento do widget de Meteorologia no menu de data" #~ msgid "Remove Notifications On Date Menu" #~ msgstr "Remover notificações no menu de data" #~ msgid "Remove Media Control On Date Menu" #~ msgstr "Remover controles de mídia no menu de data" #~ msgid "Do not adjust the border radius of contents." #~ msgstr "Não ajustar o raio de curvatura das bordas dos conteúdos." #~ msgid "Don't adjust the border of messages and media controls." #~ msgstr "Não ajustar as bordas das mensagens e dos controles de mídia." #~ msgid "Do not remove the shadow of contents." #~ msgstr "Não remover as sombras dos conteúdos." #~ msgid "Don't remove the shadow of messages and media controls." #~ msgstr "Não remover as sombras das mensagens e dos controles de mídia." #~ msgid "Set Notifications widget position" #~ msgstr "Definir posição do widget de Notificações" #~ msgid "Buttons to remove" #~ msgstr "Remover botões" #~ msgid "Turn on the buttons you want to remove from Quick Settings" #~ msgstr "Ative os botões que você deseja remover das Configurações Rápidas" #~ msgid "Remove chosen buttons from quick panel" #~ msgstr "Remover botões escolhidos do painel de Configurações Rápidas" #~ msgid "Forked from my extension https://github.com/qwreey75/gnome-quick-settings-button-remover" #~ msgstr "Uma ramificação da minha extensão https://github.com/qwreey75/gnome-quick-settings-button-remover" #~ msgid "This feature is unstable sometime" #~ msgstr "Esta funcionalidade às vezes pode ser instável" #~ msgid "" #~ "When lock/unlock with gnome-screensaver, unexpected behavior occurs\n" #~ "Please do not report issue about known issue, Almost duplicated\n" #~ "Known issue:\n" #~ " button doesn't remove after lockscreen\n" #~ " modal get bigger after lockscreen" #~ msgstr "" #~ "Ao bloquear/desbloquear com o gnome-screensaver, um comportamento inesperado ocorre\n" #~ "Favor não criar um relato de problema sobre um problema já conhecido, quase duplicado\n" #~ "Problemas conhecidos:\n" #~ " botão não é removido após a tela de bloqueio\n" #~ " modal fica maior após a tela de bloqueio" #~ msgid "Please turn off if some bug occurred" #~ msgstr "Favor desativar se algum problema ocorrer" #~ msgid "Unknown" #~ msgstr "Desconhecido" #~ msgid "" #~ "Do not separate Quick Settings and Notifications widgets, \byou should enable this option because separated panels can make many visual bugs\n" #~ "(such as margin or padding not matching with the theme)" #~ msgstr "" #~ "Não separar os widgets de Configurações Rápidas e de Notificações \\bvocê deve ativar esta opção porque painéis separados podem gerar vários problemas visuais\n" #~ "(como margens e espaçamentos não corresponderem ao tema)" ================================================ FILE: po/quick-settings-tweaks@qwreey.pot ================================================ # 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-07-20 15:34+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=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: target/out/libs/prefs/components.js:57 msgid "Details" msgstr "" #: target/out/libs/prefs/components.js:144 msgid "This feature marked as experimental" msgstr "" #: target/out/libs/prefs/components.js:274 msgid "Reset to default" msgstr "" #: target/out/libs/prefs/components.js:512 msgid "Theme default" msgstr "" #: target/out/libs/prefs/components.js:853 msgid "Homepage" msgstr "" #: target/out/libs/prefs/components.js:859 #: target/out/libs/prefs/components.js:863 target/out/prefPages/about.js:49 #: target/out/prefPages/about.js:51 target/out/prefPages/about.js:56 msgid "License" msgstr "" #: target/out/libs/prefs/components.js:860 msgid "Loading ..." msgstr "" #: target/out/libs/prefs/components.js:869 msgid "Affected Files" msgstr "" #: target/out/libs/prefs/components.js:924 msgid "Changelog" msgstr "" #: target/out/libs/prefs/components.js:938 msgid "(Current)" msgstr "" #: target/out/libs/prefs/components.js:969 #, javascript-format msgid "> **Date:** %s" msgstr "" #: target/out/libs/prefs/components.js:970 #, javascript-format msgid "> **Git Hash:** %s" msgstr "" #: target/out/libs/prefs/components.js:971 #, javascript-format msgid "> **Build Number:** %d" msgstr "" #: target/out/libs/prefs/components.js:1034 msgid "Padding" msgstr "" #: target/out/libs/prefs/components.js:1038 msgid "Top" msgstr "" #: target/out/libs/prefs/components.js:1049 msgid "Bottom" msgstr "" #: target/out/libs/prefs/components.js:1060 msgid "Left" msgstr "" #: target/out/libs/prefs/components.js:1071 msgid "Right" msgstr "" #: target/out/prefs.js:60 msgid "Stable" msgstr "" #: target/out/prefs.js:63 msgid "Development" msgstr "" #: target/out/prefs.js:66 msgid "Preview" msgstr "" #: target/out/prefs.js:69 msgid "(Github Release)" msgstr "" #: target/out/prefs.js:72 msgid "(Built from source)" msgstr "" #: target/out/features/widget/notifications.js:26 msgid "No Notifications" msgstr "" #: target/out/features/widget/notifications.js:58 #: target/out/features/widget/notifications.js:122 msgid "Clear" msgstr "" #: target/out/features/widget/notifications.js:76 msgid "Notifications" msgstr "" #: target/out/features/widget/notifications.js:105 #: target/out/features/toggle/dndQuickToggle.js:10 #: target/out/prefPages/layout.js:345 target/out/prefPages/layout.js:485 msgid "Do Not Disturb" msgstr "" #: target/out/features/widget/media.js:118 msgid "Unknown title" msgstr "" #: target/out/features/widget/media.js:888 msgid "Media" msgstr "" #: target/out/features/widget/volumeMixer.js:105 msgid "Volume changed" msgstr "" #: target/out/features/widget/volumeMixer.js:463 msgid "Open volumx mixer" msgstr "" #: target/out/features/widget/volumeMixer.js:480 msgid "Volume Mixer" msgstr "" #: target/out/features/widget/weather.js:73 msgid "Weather" msgstr "" #: target/out/features/widget/weather.js:192 msgid "Location has not been set" msgstr "" #: target/out/features/toggle/unsafeQuickToggle.js:11 #: target/out/prefPages/layout.js:346 target/out/prefPages/layout.js:496 msgid "Unsafe Mode" msgstr "" #: target/out/prefPages/widgets.js:11 msgid "Handle radius" msgstr "" #: target/out/prefPages/widgets.js:12 msgid "Set this to 0 to use default radius" msgstr "" #: target/out/prefPages/widgets.js:18 msgid "Handle color" msgstr "" #: target/out/prefPages/widgets.js:36 msgid "Slider style" msgstr "" #: target/out/prefPages/widgets.js:39 msgid "Slim" msgstr "" #: target/out/prefPages/widgets.js:40 target/out/prefPages/layout.js:766 msgid "Default" msgstr "" #: target/out/prefPages/widgets.js:48 target/out/prefPages/widgets.js:173 msgid "Background color" msgstr "" #: target/out/prefPages/widgets.js:55 msgid "Active Background color" msgstr "" #: target/out/prefPages/widgets.js:62 msgid "Thickness" msgstr "" #: target/out/prefPages/widgets.js:66 msgid "Set this to 0 to use default thickness" msgstr "" #: target/out/prefPages/widgets.js:76 msgid "Widgets" msgstr "" #: target/out/prefPages/widgets.js:83 target/out/prefPages/widgets.js:136 #: target/out/prefPages/widgets.js:162 target/out/prefPages/widgets.js:224 msgid "Media Widget" msgstr "" #: target/out/prefPages/widgets.js:88 msgid "Turn on to make the media widget visible on the Quick Settings panel" msgstr "" #: target/out/prefPages/widgets.js:92 target/out/prefPages/widgets.js:280 #: target/out/prefPages/widgets.js:343 msgid "Compact mode" msgstr "" #: target/out/prefPages/widgets.js:93 msgid "" "Make Media Controls widget smaller\n" "Make it more similar in size to the notification message" msgstr "" #: target/out/prefPages/widgets.js:99 msgid "Control buttons opacity" msgstr "" #: target/out/prefPages/widgets.js:100 msgid "Set this to 255 to make opaque, and 0 to make transparent" msgstr "" #: target/out/prefPages/widgets.js:108 msgid "Show next button" msgstr "" #: target/out/prefPages/widgets.js:109 msgid "Add next contorl button next to description" msgstr "" #: target/out/prefPages/widgets.js:115 msgid "Show previous button" msgstr "" #: target/out/prefPages/widgets.js:116 msgid "Add previous contorl button next to description" msgstr "" #: target/out/prefPages/widgets.js:122 msgid "Show pause button" msgstr "" #: target/out/prefPages/widgets.js:123 msgid "Add pause contorl button next to description" msgstr "" #: target/out/prefPages/widgets.js:129 target/out/prefPages/widgets.js:138 msgid "Show progress bar" msgstr "" #: target/out/prefPages/widgets.js:130 target/out/prefPages/widgets.js:139 msgid "Add progress bar under description" msgstr "" #: target/out/prefPages/widgets.js:155 target/out/prefPages/widgets.js:164 msgid "Gradient background" msgstr "" #: target/out/prefPages/widgets.js:156 target/out/prefPages/widgets.js:169 msgid "" "Use gradient background extracted from cover image\n" "May affect performance slightly" msgstr "" #: target/out/prefPages/widgets.js:174 msgid "Base background color" msgstr "" #: target/out/prefPages/widgets.js:182 msgid "Start opacity" msgstr "" #: target/out/prefPages/widgets.js:183 msgid "Adjust left side transparency, Set this to 1000 to make opaque" msgstr "" #: target/out/prefPages/widgets.js:190 msgid "Start color" msgstr "" #: target/out/prefPages/widgets.js:191 msgid "" "Adjust left side background color mixing, Set this to 1000 to show extracted " "color" msgstr "" #: target/out/prefPages/widgets.js:198 msgid "End opacity" msgstr "" #: target/out/prefPages/widgets.js:199 msgid "Adjust right side transparency, Set this to 1000 to make opaque" msgstr "" #: target/out/prefPages/widgets.js:206 msgid "End color" msgstr "" #: target/out/prefPages/widgets.js:207 msgid "" "Adjust right side background color mixing, Set this to 1000 to show " "extracted color" msgstr "" #: target/out/prefPages/widgets.js:216 target/out/prefPages/widgets.js:226 msgid "Round clip effect" msgstr "" #: target/out/prefPages/widgets.js:217 target/out/prefPages/widgets.js:231 msgid "Use round clip effect to make transition more natural" msgstr "" #: target/out/prefPages/widgets.js:234 msgid "Padding adjustment" msgstr "" #: target/out/prefPages/widgets.js:236 msgid "" "Adjust clip effect padding, edit this if your theme has a different margin " "or padding" msgstr "" #: target/out/prefPages/widgets.js:253 target/out/prefPages/widgets.js:318 #: target/out/prefPages/widgets.js:350 msgid "Remove shadow" msgstr "" #: target/out/prefPages/widgets.js:254 msgid "" "Remove shadow from media message\n" "Use if your theme creates unnecessary shadows" msgstr "" #: target/out/prefPages/widgets.js:260 msgid "Smooth scroll speed" msgstr "" #: target/out/prefPages/widgets.js:261 msgid "" "Adjust trackpad and trackpoint scroll speed, negative number for invert " "direction" msgstr "" #: target/out/prefPages/widgets.js:271 msgid "Notifications Widget" msgstr "" #: target/out/prefPages/widgets.js:276 msgid "" "Turn on to make the notifications widget visible on the Quick Settings panel" msgstr "" #: target/out/prefPages/widgets.js:281 msgid "Make notifications smaller" msgstr "" #: target/out/prefPages/widgets.js:287 target/out/prefPages/widgets.js:418 msgid "Max height" msgstr "" #: target/out/prefPages/widgets.js:288 #, javascript-format msgid "" "Set maximum height of the Notifications widget, default is %d. Set this to 0 " "to disable max height" msgstr "" #: target/out/prefPages/widgets.js:296 target/out/prefPages/widgets.js:441 msgid "Fade out offset" msgstr "" #: target/out/prefPages/widgets.js:297 target/out/prefPages/widgets.js:442 msgid "" "Set position of the fade out effect begins. Set this to 0 to disable fade " "out effect. default is 46" msgstr "" #: target/out/prefPages/widgets.js:304 msgid "Auto hide" msgstr "" #: target/out/prefPages/widgets.js:305 msgid "Hide the Notifications widget when have no notifications" msgstr "" #: target/out/prefPages/widgets.js:311 msgid "Use native controls" msgstr "" #: target/out/prefPages/widgets.js:312 msgid "Use native dnd switch and clear button" msgstr "" #: target/out/prefPages/widgets.js:319 msgid "" "Remove shadow from notification message\n" "Use if your theme creates unnecessary shadows" msgstr "" #: target/out/prefPages/widgets.js:325 target/out/prefPages/widgets.js:427 msgid "Show scrollbar" msgstr "" #: target/out/prefPages/widgets.js:326 msgid "Show scrollbar on message list" msgstr "" #: target/out/prefPages/widgets.js:334 msgid "Weather Widget" msgstr "" #: target/out/prefPages/widgets.js:339 msgid "Turn on to make the weather widget visible on the Quick Settings panel" msgstr "" #: target/out/prefPages/widgets.js:344 msgid "Make weather widget smaller" msgstr "" #: target/out/prefPages/widgets.js:351 msgid "" "Remove shadow from weather widget\n" "Use if your theme creates unnecessary shadows" msgstr "" #: target/out/prefPages/widgets.js:357 msgid "Click command" msgstr "" #: target/out/prefPages/widgets.js:363 msgid "Show location" msgstr "" #: target/out/prefPages/widgets.js:364 msgid "Show the location label on header" msgstr "" #: target/out/prefPages/widgets.js:373 msgid "Forecast interval" msgstr "" #: target/out/prefPages/widgets.js:374 msgid "Adjust forecast interval in hour" msgstr "" #: target/out/prefPages/widgets.js:381 msgid "Max forecasts" msgstr "" #: target/out/prefPages/widgets.js:382 msgid "Adjust max forecasts" msgstr "" #: target/out/prefPages/widgets.js:388 target/out/prefPages/widgets.js:456 msgid "Volume mixer Widget" msgstr "" #: target/out/prefPages/widgets.js:393 msgid "" "Turn on to make the volume mixer widget visible on the Quick Settings panel" msgstr "" #: target/out/prefPages/widgets.js:397 msgid "Label text" msgstr "" #: target/out/prefPages/widgets.js:398 msgid "Choose label above slider text source" msgstr "" #: target/out/prefPages/widgets.js:400 msgid "Both" msgstr "" #: target/out/prefPages/widgets.js:401 msgid "Title" msgstr "" #: target/out/prefPages/widgets.js:402 msgid "Description" msgstr "" #: target/out/prefPages/widgets.js:403 msgid "None" msgstr "" #: target/out/prefPages/widgets.js:411 msgid "Label opacity" msgstr "" #: target/out/prefPages/widgets.js:412 msgid "" "Adjust label opacity.\n" "Set this to 255 to make opaque, and 0 to make transparent" msgstr "" #: target/out/prefPages/widgets.js:419 #, javascript-format msgid "" "Set maximum height of the Volume mixer widget, default is %d. Set this to 0 " "to disable max height" msgstr "" #: target/out/prefPages/widgets.js:428 msgid "Show scrollbar on mixer list" msgstr "" #: target/out/prefPages/widgets.js:434 msgid "Show stream icon" msgstr "" #: target/out/prefPages/widgets.js:435 msgid "Show stream icon above mixer sliders" msgstr "" #: target/out/prefPages/widgets.js:450 target/out/prefPages/widgets.js:458 msgid "Attach to output slider" msgstr "" #: target/out/prefPages/widgets.js:451 target/out/prefPages/widgets.js:459 msgid "" "Attach volume mixer menu button to output slider. Use if you prefer compact " "layout" msgstr "" #: target/out/prefPages/widgets.js:468 msgid "Menu icon" msgstr "" #: target/out/prefPages/about.js:12 target/out/prefPages/about.js:32 msgid "About" msgstr "" #: target/out/prefPages/about.js:33 msgid "Common extension informations" msgstr "" #: target/out/prefPages/about.js:36 target/out/prefPages/about.js:40 msgid "Changelogs" msgstr "" #: target/out/prefPages/about.js:37 target/out/prefPages/about.js:41 msgid "View the change history for this extension" msgstr "" #: target/out/prefPages/about.js:50 target/out/prefPages/about.js:57 msgid "License of codes" msgstr "" #: target/out/prefPages/about.js:63 target/out/prefPages/about.js:65 #: target/out/prefPages/about.js:69 msgid "Contributors" msgstr "" #: target/out/prefPages/about.js:64 target/out/prefPages/about.js:70 msgid "The creators of this extension" msgstr "" #: target/out/prefPages/about.js:74 msgid "More contributors" msgstr "" #: target/out/prefPages/about.js:75 msgid "See more contributors on github" msgstr "" #: target/out/prefPages/about.js:85 msgid "Link" msgstr "" #: target/out/prefPages/about.js:86 msgid "External links about this extension" msgstr "" #: target/out/prefPages/about.js:90 msgid "Donate via github sponsors" msgstr "" #: target/out/prefPages/about.js:91 msgid "Support development!" msgstr "" #: target/out/prefPages/about.js:97 msgid "Rate and comment the extension!" msgstr "" #: target/out/prefPages/about.js:102 msgid "Github Repository" msgstr "" #: target/out/prefPages/about.js:103 msgid "" "Add Star on Repository is helping me a lot!\n" "Please, if you found bug from this extension, you can make issue to make me " "know that!\n" "Or, you can create PR with wonderful features!" msgstr "" #: target/out/prefPages/about.js:109 msgid "Add translation to this extension!" msgstr "" #: target/out/prefPages/about.js:115 msgid "Debug" msgstr "" #: target/out/prefPages/about.js:116 msgid "Extension debugging options" msgstr "" #: target/out/prefPages/about.js:120 msgid "Expose environment" msgstr "" #: target/out/prefPages/about.js:121 msgid "Expose extension environment to globalThis.qst" msgstr "" #: target/out/prefPages/about.js:126 msgid "Show layout border" msgstr "" #: target/out/prefPages/about.js:127 msgid "Show layout borders on Quick Settings" msgstr "" #: target/out/prefPages/about.js:132 msgid "Log level" msgstr "" #: target/out/prefPages/about.js:135 msgid "none" msgstr "" #: target/out/prefPages/about.js:136 msgid "error" msgstr "" #: target/out/prefPages/about.js:137 msgid "info" msgstr "" #: target/out/prefPages/about.js:138 msgid "debug" msgstr "" #: target/out/prefPages/toggles.js:12 msgid "Toggles" msgstr "" #: target/out/prefPages/toggles.js:19 msgid "DND Quick Toggle" msgstr "" #: target/out/prefPages/toggles.js:20 msgid "Turn on to add the DND quick toggle on the Quick Settings panel" msgstr "" #: target/out/prefPages/toggles.js:28 msgid "DND indicator position" msgstr "" #: target/out/prefPages/toggles.js:29 msgid "Set DND indicator position" msgstr "" #: target/out/prefPages/toggles.js:33 msgid "System Tray" msgstr "" #: target/out/prefPages/toggles.js:34 msgid "Date Menu Button" msgstr "" #: target/out/prefPages/toggles.js:41 msgid "Unsafe Mode Quick Toggle" msgstr "" #: target/out/prefPages/toggles.js:42 msgid "Turn on to add the unsafe quick toggle on the Quick Settings panel" msgstr "" #: target/out/prefPages/toggles.js:50 msgid "Save last session state" msgstr "" #: target/out/prefPages/toggles.js:51 msgid "Turn on to save last session unsafe state" msgstr "" #: target/out/prefPages/menu.js:9 target/out/prefPages/menu.js:141 msgid "Advanced animation style" msgstr "" #: target/out/prefPages/menu.js:13 msgid "Open Duration" msgstr "" #: target/out/prefPages/menu.js:14 msgid "Open animation duration in microseconds" msgstr "" #: target/out/prefPages/menu.js:21 msgid "Close Duration" msgstr "" #: target/out/prefPages/menu.js:22 msgid "Close animation duration in microseconds" msgstr "" #: target/out/prefPages/menu.js:29 msgid "Grid Content Opacity" msgstr "" #: target/out/prefPages/menu.js:30 msgid "" "Adjust grid content opacity.\n" "Set this to 255 to make opaque, and 0 to make transparent" msgstr "" #: target/out/prefPages/menu.js:37 msgid "Background Blur Radius" msgstr "" #: target/out/prefPages/menu.js:38 msgid "" "Adjust background blur radius.\n" "Set this to 0 to disable blur effect" msgstr "" #: target/out/prefPages/menu.js:45 msgid "Background Brightness" msgstr "" #: target/out/prefPages/menu.js:46 msgid "" "Adjust background brightness.\n" "Set this to 1000 to disable brightness control effect.\n" "Not impacts on gnome-shell's default dim effect." msgstr "" #: target/out/prefPages/menu.js:53 msgid "Background Opacity" msgstr "" #: target/out/prefPages/menu.js:54 msgid "" "Adjust background opacity.\n" "Set this to 255 to make opaque, and 0 to make transparent" msgstr "" #: target/out/prefPages/menu.js:61 msgid "Background X Scale" msgstr "" #: target/out/prefPages/menu.js:62 msgid "Adjust background x scale, 1000 means 1.0 scale" msgstr "" #: target/out/prefPages/menu.js:69 msgid "Background Y Scale" msgstr "" #: target/out/prefPages/menu.js:70 msgid "Adjust background y scale, 1000 means 1.0 scale" msgstr "" #: target/out/prefPages/menu.js:84 msgid "Menu" msgstr "" #: target/out/prefPages/menu.js:91 msgid "Overlay Mode" msgstr "" #: target/out/prefPages/menu.js:92 msgid "Display toggle, power, and sound menus as overlay" msgstr "" #: target/out/prefPages/menu.js:101 msgid "Overlay Width" msgstr "" #: target/out/prefPages/menu.js:102 msgid "" "Adjust overlay menu width\n" "Set this to 0 to disable adjusting" msgstr "" #: target/out/prefPages/menu.js:109 msgid "Overlay Animation Duration" msgstr "" #: target/out/prefPages/menu.js:110 msgid "" "Custom menu open animation duration in microseconds\n" "Set this to 0 to disable custom animation" msgstr "" #: target/out/prefPages/menu.js:117 msgid "Overlay Animation Style" msgstr "" #: target/out/prefPages/menu.js:118 msgid "Custom menu open animation style" msgstr "" #: target/out/prefPages/menu.js:120 msgid "Flyout" msgstr "" #: target/out/prefPages/menu.js:121 msgid "Dialog" msgstr "" #: target/out/prefPages/menu.js:130 target/out/prefPages/menu.js:143 msgid "Animation" msgstr "" #: target/out/prefPages/menu.js:131 msgid "" "Add menu animation on toggle menu opening and closing\n" "To get the best feel, turn on overlay mode" msgstr "" #: target/out/prefPages/menu.js:142 msgid "Adjust speed, blur, scale, and opacity" msgstr "" #: target/out/prefPages/layout.js:25 msgid "The item not found" msgstr "" #: target/out/prefPages/layout.js:28 msgid "No changes" msgstr "" #: target/out/prefPages/layout.js:31 msgid "The same item already exists" msgstr "" #: target/out/prefPages/layout.js:40 #, javascript-format msgid "Properties of %s" msgstr "" #: target/out/prefPages/layout.js:47 msgid "Save" msgstr "" #: target/out/prefPages/layout.js:64 msgid "Toggle editor" msgstr "" #: target/out/prefPages/layout.js:84 msgid "This option requires full gnome-shell reloading" msgstr "" #: target/out/prefPages/layout.js:160 target/out/prefPages/layout.js:278 #: target/out/prefPages/layout.js:437 target/out/prefPages/layout.js:672 msgid "Hide" msgstr "" #: target/out/prefPages/layout.js:232 #, javascript-format msgid "My item #%d" msgstr "" #: target/out/prefPages/layout.js:250 msgid "New Item" msgstr "" #: target/out/prefPages/layout.js:261 target/out/prefPages/layout.js:610 #: target/out/prefPages/layout.js:737 target/out/prefPages/layout.js:787 #: target/out/prefPages/layout.js:813 msgid "Ordering and Hiding" msgstr "" #: target/out/prefPages/layout.js:273 target/out/prefPages/layout.js:432 msgid "Friendly Name" msgstr "" #: target/out/prefPages/layout.js:283 msgid "Title Regex (Javascript Regex)" msgstr "" #: target/out/prefPages/layout.js:288 target/out/prefPages/layout.js:442 msgid "Constructor Name" msgstr "" #: target/out/prefPages/layout.js:294 target/out/prefPages/layout.js:448 msgid "GType Name" msgstr "" #: target/out/prefPages/layout.js:302 target/out/prefPages/layout.js:456 msgid "" "This is the comment for easy identification in the settings list. It has no " "effect on the behavior of the extension" msgstr "" #: target/out/prefPages/layout.js:307 target/out/prefPages/layout.js:461 msgid "Javascript constructor name" msgstr "" #: target/out/prefPages/layout.js:312 target/out/prefPages/layout.js:466 msgid "" "GObject gtype name. You can get this value by calling " "GObject.type_name_from_instance" msgstr "" #: target/out/prefPages/layout.js:342 msgid "Keyboard Backlight" msgstr "" #: target/out/prefPages/layout.js:388 target/out/prefPages/layout.js:538 msgid "Unordered items" msgstr "" #: target/out/prefPages/layout.js:486 msgid "Remote Access Applet" msgstr "" #: target/out/prefPages/layout.js:487 msgid "Camera" msgstr "" #: target/out/prefPages/layout.js:488 msgid "Volume Input" msgstr "" #: target/out/prefPages/layout.js:489 msgid "Location" msgstr "" #: target/out/prefPages/layout.js:490 msgid "Thunderbolt" msgstr "" #: target/out/prefPages/layout.js:492 msgid "Network" msgstr "" #: target/out/prefPages/layout.js:495 msgid "Volume Output" msgstr "" #: target/out/prefPages/layout.js:497 msgid "System (Battery)" msgstr "" #: target/out/prefPages/layout.js:618 msgid "Desktop Spacer" msgstr "" #: target/out/prefPages/layout.js:629 msgid "Laptop Spacer" msgstr "" #: target/out/prefPages/layout.js:641 msgid "Capture button" msgstr "" #: target/out/prefPages/layout.js:647 msgid "Settings button" msgstr "" #: target/out/prefPages/layout.js:653 msgid "Lock button" msgstr "" #: target/out/prefPages/layout.js:659 msgid "Shutdown button" msgstr "" #: target/out/prefPages/layout.js:665 msgid "Battery button" msgstr "" #: target/out/prefPages/layout.js:711 msgid "Layout" msgstr "" #: target/out/prefPages/layout.js:718 msgid "Quick Toggles Layout" msgstr "" #: target/out/prefPages/layout.js:719 target/out/prefPages/layout.js:734 msgid "Adjust quick toggles layout" msgstr "" #: target/out/prefPages/layout.js:738 msgid "Reorder and hide quick toggles" msgstr "" #: target/out/prefPages/layout.js:745 msgid "System Indicators" msgstr "" #: target/out/prefPages/layout.js:746 msgid "Adjust system indicators layout and style" msgstr "" #: target/out/prefPages/layout.js:751 msgid "Accent screen sharing indicator" msgstr "" #: target/out/prefPages/layout.js:752 msgid "Use shell accent color on screen sharing indicator" msgstr "" #: target/out/prefPages/layout.js:757 msgid "Accent screen recording indicator" msgstr "" #: target/out/prefPages/layout.js:758 msgid "Use shell accent color on screen recording indicator" msgstr "" #: target/out/prefPages/layout.js:763 msgid "Privacy indicators style" msgstr "" #: target/out/prefPages/layout.js:764 msgid "Use monochrome or shell accent color on privarcy indicators" msgstr "" #: target/out/prefPages/layout.js:767 msgid "Accent" msgstr "" #: target/out/prefPages/layout.js:768 msgid "Monochrome" msgstr "" #: target/out/prefPages/layout.js:777 msgid "Adjust system indicators" msgstr "" #: target/out/prefPages/layout.js:788 msgid "Reorder and hide system indicators" msgstr "" #: target/out/prefPages/layout.js:795 msgid "System Items Layout" msgstr "" #: target/out/prefPages/layout.js:800 target/out/prefPages/layout.js:815 msgid "Adjust system items layout" msgstr "" #: target/out/prefPages/layout.js:804 msgid "Hide layout box" msgstr "" #: target/out/prefPages/layout.js:805 msgid "Hide all buttons and layout box" msgstr "" #: target/out/prefPages/layout.js:814 msgid "Reorder and hide system items" msgstr "" #: target/out/prefPages/layout.js:823 msgid "Date Menu" msgstr "" #: target/out/prefPages/layout.js:824 msgid "Adjust Date Menu layout" msgstr "" #: target/out/prefPages/layout.js:828 msgid "Hide left box" msgstr "" #: target/out/prefPages/layout.js:829 msgid "" "Hide the left box of the date menu, which contains notifications and media " "control" msgstr "" #: target/out/prefPages/layout.js:834 msgid "Hide right box" msgstr "" #: target/out/prefPages/layout.js:835 msgid "" "Hide the right box of the date menu, which contains calendar, world clock " "and weather" msgstr "" #: target/out/prefPages/layout.js:840 msgid "Disable menu" msgstr "" #: target/out/prefPages/layout.js:841 msgid "Do not open date menu when the date menu button clicked" msgstr "" ================================================ FILE: po/ru.po ================================================ # AUTHORS # David Lapshin https://github.com/daudix-UFO, 2023. # msgid "" msgstr "" "Project-Id-Version: 1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-07-20 15:34+0000\n" "PO-Revision-Date: 2024-01-31 13:38+0000\n" "Last-Translator: \"Droid.SUGI\" \n" "Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Generator: Weblate 5.2.1\n" #: target/out/libs/prefs/components.js:57 msgid "Details" msgstr "" #: target/out/libs/prefs/components.js:144 msgid "This feature marked as experimental" msgstr "" #: target/out/libs/prefs/components.js:274 msgid "Reset to default" msgstr "" #: target/out/libs/prefs/components.js:512 msgid "Theme default" msgstr "" #: target/out/libs/prefs/components.js:853 msgid "Homepage" msgstr "" #: target/out/libs/prefs/components.js:859 #: target/out/libs/prefs/components.js:863 target/out/prefPages/about.js:49 #: target/out/prefPages/about.js:51 target/out/prefPages/about.js:56 msgid "License" msgstr "" #: target/out/libs/prefs/components.js:860 msgid "Loading ..." msgstr "" #: target/out/libs/prefs/components.js:869 msgid "Affected Files" msgstr "" #: target/out/libs/prefs/components.js:924 msgid "Changelog" msgstr "" #: target/out/libs/prefs/components.js:938 msgid "(Current)" msgstr "" #: target/out/libs/prefs/components.js:969 #, javascript-format msgid "> **Date:** %s" msgstr "" #: target/out/libs/prefs/components.js:970 #, javascript-format msgid "> **Git Hash:** %s" msgstr "" #: target/out/libs/prefs/components.js:971 #, javascript-format msgid "> **Build Number:** %d" msgstr "" #: target/out/libs/prefs/components.js:1034 msgid "Padding" msgstr "" #: target/out/libs/prefs/components.js:1038 msgid "Top" msgstr "Верх" #: target/out/libs/prefs/components.js:1049 msgid "Bottom" msgstr "Низ" #: target/out/libs/prefs/components.js:1060 msgid "Left" msgstr "" #: target/out/libs/prefs/components.js:1071 msgid "Right" msgstr "" #: target/out/prefs.js:60 msgid "Stable" msgstr "" #: target/out/prefs.js:63 msgid "Development" msgstr "" #: target/out/prefs.js:66 msgid "Preview" msgstr "" #: target/out/prefs.js:69 msgid "(Github Release)" msgstr "" #: target/out/prefs.js:72 msgid "(Built from source)" msgstr "" #: target/out/features/widget/notifications.js:26 msgid "No Notifications" msgstr "Нет уведомлений" #: target/out/features/widget/notifications.js:58 #: target/out/features/widget/notifications.js:122 msgid "Clear" msgstr "Очистить" # Quick settings notifications title text # Notifications title #: target/out/features/widget/notifications.js:76 msgid "Notifications" msgstr "Уведомления" #: target/out/features/widget/notifications.js:105 #: target/out/features/toggle/dndQuickToggle.js:10 #: target/out/prefPages/layout.js:345 target/out/prefPages/layout.js:485 msgid "Do Not Disturb" msgstr "Не беспокоить" #: target/out/features/widget/media.js:118 msgid "Unknown title" msgstr "" #: target/out/features/widget/media.js:888 msgid "Media" msgstr "" #: target/out/features/widget/volumeMixer.js:105 msgid "Volume changed" msgstr "Громкость изменена" #: target/out/features/widget/volumeMixer.js:463 msgid "Open volumx mixer" msgstr "" #: target/out/features/widget/volumeMixer.js:480 msgid "Volume Mixer" msgstr "Микшер громкости" #: target/out/features/widget/weather.js:73 msgid "Weather" msgstr "" #: target/out/features/widget/weather.js:192 msgid "Location has not been set" msgstr "" #: target/out/features/toggle/unsafeQuickToggle.js:11 #: target/out/prefPages/layout.js:346 target/out/prefPages/layout.js:496 msgid "Unsafe Mode" msgstr "Небезопасный режим" #: target/out/prefPages/widgets.js:11 msgid "Handle radius" msgstr "" #: target/out/prefPages/widgets.js:12 msgid "Set this to 0 to use default radius" msgstr "" #: target/out/prefPages/widgets.js:18 msgid "Handle color" msgstr "" #: target/out/prefPages/widgets.js:36 msgid "Slider style" msgstr "" #: target/out/prefPages/widgets.js:39 msgid "Slim" msgstr "" #: target/out/prefPages/widgets.js:40 target/out/prefPages/layout.js:766 msgid "Default" msgstr "" #: target/out/prefPages/widgets.js:48 target/out/prefPages/widgets.js:173 msgid "Background color" msgstr "" #: target/out/prefPages/widgets.js:55 msgid "Active Background color" msgstr "" #: target/out/prefPages/widgets.js:62 msgid "Thickness" msgstr "" #: target/out/prefPages/widgets.js:66 msgid "Set this to 0 to use default thickness" msgstr "" #: target/out/prefPages/widgets.js:76 msgid "Widgets" msgstr "" #: target/out/prefPages/widgets.js:83 target/out/prefPages/widgets.js:136 #: target/out/prefPages/widgets.js:162 target/out/prefPages/widgets.js:224 msgid "Media Widget" msgstr "" #: target/out/prefPages/widgets.js:88 msgid "Turn on to make the media widget visible on the Quick Settings panel" msgstr "" #: target/out/prefPages/widgets.js:92 target/out/prefPages/widgets.js:280 #: target/out/prefPages/widgets.js:343 msgid "Compact mode" msgstr "" #: target/out/prefPages/widgets.js:93 msgid "" "Make Media Controls widget smaller\n" "Make it more similar in size to the notification message" msgstr "" "Сделать виджет управлением медиа меньше\n" "Сделать его размер более схожим на уведомление" #: target/out/prefPages/widgets.js:99 msgid "Control buttons opacity" msgstr "" #: target/out/prefPages/widgets.js:100 msgid "Set this to 255 to make opaque, and 0 to make transparent" msgstr "" #: target/out/prefPages/widgets.js:108 msgid "Show next button" msgstr "" #: target/out/prefPages/widgets.js:109 msgid "Add next contorl button next to description" msgstr "" #: target/out/prefPages/widgets.js:115 msgid "Show previous button" msgstr "" #: target/out/prefPages/widgets.js:116 msgid "Add previous contorl button next to description" msgstr "" #: target/out/prefPages/widgets.js:122 msgid "Show pause button" msgstr "" #: target/out/prefPages/widgets.js:123 msgid "Add pause contorl button next to description" msgstr "" #: target/out/prefPages/widgets.js:129 target/out/prefPages/widgets.js:138 msgid "Show progress bar" msgstr "" #: target/out/prefPages/widgets.js:130 target/out/prefPages/widgets.js:139 msgid "Add progress bar under description" msgstr "" #: target/out/prefPages/widgets.js:155 target/out/prefPages/widgets.js:164 msgid "Gradient background" msgstr "" #: target/out/prefPages/widgets.js:156 target/out/prefPages/widgets.js:169 msgid "" "Use gradient background extracted from cover image\n" "May affect performance slightly" msgstr "" #: target/out/prefPages/widgets.js:174 msgid "Base background color" msgstr "" #: target/out/prefPages/widgets.js:182 msgid "Start opacity" msgstr "" #: target/out/prefPages/widgets.js:183 msgid "Adjust left side transparency, Set this to 1000 to make opaque" msgstr "" #: target/out/prefPages/widgets.js:190 msgid "Start color" msgstr "" #: target/out/prefPages/widgets.js:191 msgid "Adjust left side background color mixing, Set this to 1000 to show extracted color" msgstr "" #: target/out/prefPages/widgets.js:198 msgid "End opacity" msgstr "" #: target/out/prefPages/widgets.js:199 msgid "Adjust right side transparency, Set this to 1000 to make opaque" msgstr "" #: target/out/prefPages/widgets.js:206 msgid "End color" msgstr "" #: target/out/prefPages/widgets.js:207 msgid "Adjust right side background color mixing, Set this to 1000 to show extracted color" msgstr "" #: target/out/prefPages/widgets.js:216 target/out/prefPages/widgets.js:226 msgid "Round clip effect" msgstr "" #: target/out/prefPages/widgets.js:217 target/out/prefPages/widgets.js:231 msgid "Use round clip effect to make transition more natural" msgstr "" #: target/out/prefPages/widgets.js:234 msgid "Padding adjustment" msgstr "" #: target/out/prefPages/widgets.js:236 msgid "Adjust clip effect padding, edit this if your theme has a different margin or padding" msgstr "" #: target/out/prefPages/widgets.js:253 target/out/prefPages/widgets.js:318 #: target/out/prefPages/widgets.js:350 msgid "Remove shadow" msgstr "" #: target/out/prefPages/widgets.js:254 msgid "" "Remove shadow from media message\n" "Use if your theme creates unnecessary shadows" msgstr "" #: target/out/prefPages/widgets.js:260 msgid "Smooth scroll speed" msgstr "" #: target/out/prefPages/widgets.js:261 msgid "Adjust trackpad and trackpoint scroll speed, negative number for invert direction" msgstr "" #: target/out/prefPages/widgets.js:271 msgid "Notifications Widget" msgstr "" #: target/out/prefPages/widgets.js:276 msgid "Turn on to make the notifications widget visible on the Quick Settings panel" msgstr "" #: target/out/prefPages/widgets.js:281 msgid "Make notifications smaller" msgstr "" #: target/out/prefPages/widgets.js:287 target/out/prefPages/widgets.js:418 msgid "Max height" msgstr "Максимальная высота" #: target/out/prefPages/widgets.js:288 #, javascript-format msgid "Set maximum height of the Notifications widget, default is %d. Set this to 0 to disable max height" msgstr "" #: target/out/prefPages/widgets.js:296 target/out/prefPages/widgets.js:441 msgid "Fade out offset" msgstr "" #: target/out/prefPages/widgets.js:297 target/out/prefPages/widgets.js:442 msgid "Set position of the fade out effect begins. Set this to 0 to disable fade out effect. default is 46" msgstr "" #: target/out/prefPages/widgets.js:304 msgid "Auto hide" msgstr "" #: target/out/prefPages/widgets.js:305 msgid "Hide the Notifications widget when have no notifications" msgstr "Прятать виджет уведомлений когда нет уведомлений" #: target/out/prefPages/widgets.js:311 msgid "Use native controls" msgstr "Использовать нативное управление" #: target/out/prefPages/widgets.js:312 msgid "Use native dnd switch and clear button" msgstr "Использовать встроенные кнопки Не Беспокоить и очистки" #: target/out/prefPages/widgets.js:319 msgid "" "Remove shadow from notification message\n" "Use if your theme creates unnecessary shadows" msgstr "" #: target/out/prefPages/widgets.js:325 target/out/prefPages/widgets.js:427 msgid "Show scrollbar" msgstr "" #: target/out/prefPages/widgets.js:326 msgid "Show scrollbar on message list" msgstr "" #: target/out/prefPages/widgets.js:334 msgid "Weather Widget" msgstr "" #: target/out/prefPages/widgets.js:339 msgid "Turn on to make the weather widget visible on the Quick Settings panel" msgstr "" #: target/out/prefPages/widgets.js:344 msgid "Make weather widget smaller" msgstr "" #: target/out/prefPages/widgets.js:351 msgid "" "Remove shadow from weather widget\n" "Use if your theme creates unnecessary shadows" msgstr "" #: target/out/prefPages/widgets.js:357 msgid "Click command" msgstr "" #: target/out/prefPages/widgets.js:363 msgid "Show location" msgstr "" #: target/out/prefPages/widgets.js:364 msgid "Show the location label on header" msgstr "" #: target/out/prefPages/widgets.js:373 msgid "Forecast interval" msgstr "" #: target/out/prefPages/widgets.js:374 msgid "Adjust forecast interval in hour" msgstr "" #: target/out/prefPages/widgets.js:381 msgid "Max forecasts" msgstr "" #: target/out/prefPages/widgets.js:382 msgid "Adjust max forecasts" msgstr "" #: target/out/prefPages/widgets.js:388 target/out/prefPages/widgets.js:456 msgid "Volume mixer Widget" msgstr "" #: target/out/prefPages/widgets.js:393 msgid "Turn on to make the volume mixer widget visible on the Quick Settings panel" msgstr "" #: target/out/prefPages/widgets.js:397 msgid "Label text" msgstr "" #: target/out/prefPages/widgets.js:398 msgid "Choose label above slider text source" msgstr "" #: target/out/prefPages/widgets.js:400 msgid "Both" msgstr "" #: target/out/prefPages/widgets.js:401 msgid "Title" msgstr "" #: target/out/prefPages/widgets.js:402 msgid "Description" msgstr "" #: target/out/prefPages/widgets.js:403 msgid "None" msgstr "" #: target/out/prefPages/widgets.js:411 msgid "Label opacity" msgstr "" #: target/out/prefPages/widgets.js:412 msgid "" "Adjust label opacity.\n" "Set this to 255 to make opaque, and 0 to make transparent" msgstr "" #: target/out/prefPages/widgets.js:419 #, javascript-format msgid "Set maximum height of the Volume mixer widget, default is %d. Set this to 0 to disable max height" msgstr "" #: target/out/prefPages/widgets.js:428 msgid "Show scrollbar on mixer list" msgstr "" #: target/out/prefPages/widgets.js:434 msgid "Show stream icon" msgstr "" #: target/out/prefPages/widgets.js:435 msgid "Show stream icon above mixer sliders" msgstr "" #: target/out/prefPages/widgets.js:450 target/out/prefPages/widgets.js:458 msgid "Attach to output slider" msgstr "" #: target/out/prefPages/widgets.js:451 target/out/prefPages/widgets.js:459 msgid "Attach volume mixer menu button to output slider. Use if you prefer compact layout" msgstr "" #: target/out/prefPages/widgets.js:468 msgid "Menu icon" msgstr "" #: target/out/prefPages/about.js:12 target/out/prefPages/about.js:32 msgid "About" msgstr "О расширении" #: target/out/prefPages/about.js:33 msgid "Common extension informations" msgstr "" #: target/out/prefPages/about.js:36 target/out/prefPages/about.js:40 msgid "Changelogs" msgstr "" #: target/out/prefPages/about.js:37 target/out/prefPages/about.js:41 msgid "View the change history for this extension" msgstr "" #: target/out/prefPages/about.js:50 target/out/prefPages/about.js:57 msgid "License of codes" msgstr "" #: target/out/prefPages/about.js:63 target/out/prefPages/about.js:65 #: target/out/prefPages/about.js:69 msgid "Contributors" msgstr "" #: target/out/prefPages/about.js:64 target/out/prefPages/about.js:70 msgid "The creators of this extension" msgstr "Создатели этого расширения" #: target/out/prefPages/about.js:74 msgid "More contributors" msgstr "" #: target/out/prefPages/about.js:75 msgid "See more contributors on github" msgstr "" #: target/out/prefPages/about.js:85 msgid "Link" msgstr "" #: target/out/prefPages/about.js:86 msgid "External links about this extension" msgstr "" #: target/out/prefPages/about.js:90 msgid "Donate via github sponsors" msgstr "" #: target/out/prefPages/about.js:91 msgid "Support development!" msgstr "Поддержите разработку!" #: target/out/prefPages/about.js:97 msgid "Rate and comment the extension!" msgstr "Оцените и прокомментируйте расширение!" #: target/out/prefPages/about.js:102 msgid "Github Repository" msgstr "Репозиторий Github" #: target/out/prefPages/about.js:103 msgid "" "Add Star on Repository is helping me a lot!\n" "Please, if you found bug from this extension, you can make issue to make me know that!\n" "Or, you can create PR with wonderful features!" msgstr "" "Добавление звездочки в репозиторий нам очень помогает!\n" "Пожалуйста, если вы нашли ошибку в этом расширении, создайте проблему, чтобы мы знали об этом!\n" "Или вы можете создать PR с новыми функциями!" #: target/out/prefPages/about.js:109 msgid "Add translation to this extension!" msgstr "Добавьте перевод в это расширение!" #: target/out/prefPages/about.js:115 msgid "Debug" msgstr "" #: target/out/prefPages/about.js:116 msgid "Extension debugging options" msgstr "" #: target/out/prefPages/about.js:120 msgid "Expose environment" msgstr "" #: target/out/prefPages/about.js:121 msgid "Expose extension environment to globalThis.qst" msgstr "" #: target/out/prefPages/about.js:126 msgid "Show layout border" msgstr "" #: target/out/prefPages/about.js:127 msgid "Show layout borders on Quick Settings" msgstr "" #: target/out/prefPages/about.js:132 msgid "Log level" msgstr "" #: target/out/prefPages/about.js:135 msgid "none" msgstr "" #: target/out/prefPages/about.js:136 msgid "error" msgstr "" #: target/out/prefPages/about.js:137 msgid "info" msgstr "" #: target/out/prefPages/about.js:138 msgid "debug" msgstr "" #: target/out/prefPages/toggles.js:12 msgid "Toggles" msgstr "" #: target/out/prefPages/toggles.js:19 msgid "DND Quick Toggle" msgstr "Кнопка переключения DND" #: target/out/prefPages/toggles.js:20 msgid "Turn on to add the DND quick toggle on the Quick Settings panel" msgstr "" #: target/out/prefPages/toggles.js:28 msgid "DND indicator position" msgstr "" #: target/out/prefPages/toggles.js:29 msgid "Set DND indicator position" msgstr "" #: target/out/prefPages/toggles.js:33 msgid "System Tray" msgstr "" #: target/out/prefPages/toggles.js:34 msgid "Date Menu Button" msgstr "" #: target/out/prefPages/toggles.js:41 msgid "Unsafe Mode Quick Toggle" msgstr "Кнопка переключения небезопасного режима" #: target/out/prefPages/toggles.js:42 msgid "Turn on to add the unsafe quick toggle on the Quick Settings panel" msgstr "" #: target/out/prefPages/toggles.js:50 msgid "Save last session state" msgstr "" #: target/out/prefPages/toggles.js:51 msgid "Turn on to save last session unsafe state" msgstr "" #: target/out/prefPages/menu.js:9 target/out/prefPages/menu.js:141 msgid "Advanced animation style" msgstr "" #: target/out/prefPages/menu.js:13 msgid "Open Duration" msgstr "" #: target/out/prefPages/menu.js:14 msgid "Open animation duration in microseconds" msgstr "" #: target/out/prefPages/menu.js:21 msgid "Close Duration" msgstr "" #: target/out/prefPages/menu.js:22 msgid "Close animation duration in microseconds" msgstr "" #: target/out/prefPages/menu.js:29 msgid "Grid Content Opacity" msgstr "" #: target/out/prefPages/menu.js:30 msgid "" "Adjust grid content opacity.\n" "Set this to 255 to make opaque, and 0 to make transparent" msgstr "" #: target/out/prefPages/menu.js:37 msgid "Background Blur Radius" msgstr "" #: target/out/prefPages/menu.js:38 msgid "" "Adjust background blur radius.\n" "Set this to 0 to disable blur effect" msgstr "" #: target/out/prefPages/menu.js:45 msgid "Background Brightness" msgstr "" #: target/out/prefPages/menu.js:46 msgid "" "Adjust background brightness.\n" "Set this to 1000 to disable brightness control effect.\n" "Not impacts on gnome-shell's default dim effect." msgstr "" #: target/out/prefPages/menu.js:53 msgid "Background Opacity" msgstr "" #: target/out/prefPages/menu.js:54 msgid "" "Adjust background opacity.\n" "Set this to 255 to make opaque, and 0 to make transparent" msgstr "" #: target/out/prefPages/menu.js:61 msgid "Background X Scale" msgstr "" #: target/out/prefPages/menu.js:62 msgid "Adjust background x scale, 1000 means 1.0 scale" msgstr "" #: target/out/prefPages/menu.js:69 msgid "Background Y Scale" msgstr "" #: target/out/prefPages/menu.js:70 msgid "Adjust background y scale, 1000 means 1.0 scale" msgstr "" #: target/out/prefPages/menu.js:84 msgid "Menu" msgstr "" #: target/out/prefPages/menu.js:91 msgid "Overlay Mode" msgstr "" #: target/out/prefPages/menu.js:92 msgid "Display toggle, power, and sound menus as overlay" msgstr "" #: target/out/prefPages/menu.js:101 msgid "Overlay Width" msgstr "" #: target/out/prefPages/menu.js:102 msgid "" "Adjust overlay menu width\n" "Set this to 0 to disable adjusting" msgstr "" #: target/out/prefPages/menu.js:109 msgid "Overlay Animation Duration" msgstr "" #: target/out/prefPages/menu.js:110 msgid "" "Custom menu open animation duration in microseconds\n" "Set this to 0 to disable custom animation" msgstr "" #: target/out/prefPages/menu.js:117 msgid "Overlay Animation Style" msgstr "" #: target/out/prefPages/menu.js:118 msgid "Custom menu open animation style" msgstr "" #: target/out/prefPages/menu.js:120 msgid "Flyout" msgstr "" #: target/out/prefPages/menu.js:121 msgid "Dialog" msgstr "" #: target/out/prefPages/menu.js:130 target/out/prefPages/menu.js:143 msgid "Animation" msgstr "" #: target/out/prefPages/menu.js:131 msgid "" "Add menu animation on toggle menu opening and closing\n" "To get the best feel, turn on overlay mode" msgstr "" #: target/out/prefPages/menu.js:142 msgid "Adjust speed, blur, scale, and opacity" msgstr "" #: target/out/prefPages/layout.js:25 msgid "The item not found" msgstr "" #: target/out/prefPages/layout.js:28 msgid "No changes" msgstr "" #: target/out/prefPages/layout.js:31 msgid "The same item already exists" msgstr "" #: target/out/prefPages/layout.js:40 #, javascript-format msgid "Properties of %s" msgstr "" #: target/out/prefPages/layout.js:47 msgid "Save" msgstr "" #: target/out/prefPages/layout.js:64 msgid "Toggle editor" msgstr "" #: target/out/prefPages/layout.js:84 msgid "This option requires full gnome-shell reloading" msgstr "" #: target/out/prefPages/layout.js:160 target/out/prefPages/layout.js:278 #: target/out/prefPages/layout.js:437 target/out/prefPages/layout.js:672 msgid "Hide" msgstr "" #: target/out/prefPages/layout.js:232 #, javascript-format msgid "My item #%d" msgstr "" #: target/out/prefPages/layout.js:250 msgid "New Item" msgstr "" #: target/out/prefPages/layout.js:261 target/out/prefPages/layout.js:610 #: target/out/prefPages/layout.js:737 target/out/prefPages/layout.js:787 #: target/out/prefPages/layout.js:813 msgid "Ordering and Hiding" msgstr "" #: target/out/prefPages/layout.js:273 target/out/prefPages/layout.js:432 msgid "Friendly Name" msgstr "" #: target/out/prefPages/layout.js:283 msgid "Title Regex (Javascript Regex)" msgstr "" #: target/out/prefPages/layout.js:288 target/out/prefPages/layout.js:442 msgid "Constructor Name" msgstr "" #: target/out/prefPages/layout.js:294 target/out/prefPages/layout.js:448 msgid "GType Name" msgstr "" #: target/out/prefPages/layout.js:302 target/out/prefPages/layout.js:456 msgid "This is the comment for easy identification in the settings list. It has no effect on the behavior of the extension" msgstr "" #: target/out/prefPages/layout.js:307 target/out/prefPages/layout.js:461 msgid "Javascript constructor name" msgstr "" #: target/out/prefPages/layout.js:312 target/out/prefPages/layout.js:466 msgid "GObject gtype name. You can get this value by calling GObject.type_name_from_instance" msgstr "" #: target/out/prefPages/layout.js:342 msgid "Keyboard Backlight" msgstr "" #: target/out/prefPages/layout.js:388 target/out/prefPages/layout.js:538 msgid "Unordered items" msgstr "" #: target/out/prefPages/layout.js:486 msgid "Remote Access Applet" msgstr "" #: target/out/prefPages/layout.js:487 msgid "Camera" msgstr "" #: target/out/prefPages/layout.js:488 msgid "Volume Input" msgstr "" #: target/out/prefPages/layout.js:489 msgid "Location" msgstr "" #: target/out/prefPages/layout.js:490 msgid "Thunderbolt" msgstr "" #: target/out/prefPages/layout.js:492 msgid "Network" msgstr "" #: target/out/prefPages/layout.js:495 msgid "Volume Output" msgstr "" #: target/out/prefPages/layout.js:497 msgid "System (Battery)" msgstr "" #: target/out/prefPages/layout.js:618 msgid "Desktop Spacer" msgstr "" #: target/out/prefPages/layout.js:629 msgid "Laptop Spacer" msgstr "" #: target/out/prefPages/layout.js:641 msgid "Capture button" msgstr "" #: target/out/prefPages/layout.js:647 msgid "Settings button" msgstr "" #: target/out/prefPages/layout.js:653 msgid "Lock button" msgstr "" #: target/out/prefPages/layout.js:659 msgid "Shutdown button" msgstr "" #: target/out/prefPages/layout.js:665 msgid "Battery button" msgstr "" #: target/out/prefPages/layout.js:711 msgid "Layout" msgstr "" #: target/out/prefPages/layout.js:718 msgid "Quick Toggles Layout" msgstr "" #: target/out/prefPages/layout.js:719 target/out/prefPages/layout.js:734 msgid "Adjust quick toggles layout" msgstr "" #: target/out/prefPages/layout.js:738 msgid "Reorder and hide quick toggles" msgstr "" #: target/out/prefPages/layout.js:745 msgid "System Indicators" msgstr "" #: target/out/prefPages/layout.js:746 msgid "Adjust system indicators layout and style" msgstr "" #: target/out/prefPages/layout.js:751 msgid "Accent screen sharing indicator" msgstr "" #: target/out/prefPages/layout.js:752 msgid "Use shell accent color on screen sharing indicator" msgstr "" #: target/out/prefPages/layout.js:757 msgid "Accent screen recording indicator" msgstr "" #: target/out/prefPages/layout.js:758 msgid "Use shell accent color on screen recording indicator" msgstr "" #: target/out/prefPages/layout.js:763 msgid "Privacy indicators style" msgstr "" #: target/out/prefPages/layout.js:764 msgid "Use monochrome or shell accent color on privarcy indicators" msgstr "" #: target/out/prefPages/layout.js:767 msgid "Accent" msgstr "" #: target/out/prefPages/layout.js:768 msgid "Monochrome" msgstr "" #: target/out/prefPages/layout.js:777 msgid "Adjust system indicators" msgstr "" #: target/out/prefPages/layout.js:788 msgid "Reorder and hide system indicators" msgstr "" #: target/out/prefPages/layout.js:795 msgid "System Items Layout" msgstr "" #: target/out/prefPages/layout.js:800 target/out/prefPages/layout.js:815 msgid "Adjust system items layout" msgstr "" #: target/out/prefPages/layout.js:804 msgid "Hide layout box" msgstr "" #: target/out/prefPages/layout.js:805 msgid "Hide all buttons and layout box" msgstr "" #: target/out/prefPages/layout.js:814 msgid "Reorder and hide system items" msgstr "" #: target/out/prefPages/layout.js:823 msgid "Date Menu" msgstr "" #: target/out/prefPages/layout.js:824 msgid "Adjust Date Menu layout" msgstr "" #: target/out/prefPages/layout.js:828 msgid "Hide left box" msgstr "" #: target/out/prefPages/layout.js:829 msgid "Hide the left box of the date menu, which contains notifications and media control" msgstr "" #: target/out/prefPages/layout.js:834 msgid "Hide right box" msgstr "" #: target/out/prefPages/layout.js:835 msgid "Hide the right box of the date menu, which contains calendar, world clock and weather" msgstr "" #: target/out/prefPages/layout.js:840 msgid "Disable menu" msgstr "" #: target/out/prefPages/layout.js:841 msgid "Do not open date menu when the date menu button clicked" msgstr "" #~ msgid "Donate via patreon" #~ msgstr "Пожертвование через patreon" #~ msgid "Other" #~ msgstr "Другое" #~ msgid "" #~ "Hide notifications on date menu.\n" #~ "*this option removes media control on date menu too*" #~ msgstr "" #~ "Скрыть уведомления в меню даты.\n" #~ "*эта опция также удаляет управление мультимедиа в меню даты*" #~ msgid "Hide media control on date menu." #~ msgstr "Скрыть управление мультимедиа в меню даты." #~ msgid "Links" #~ msgstr "Ссылки" #~ msgid "Contributor" #~ msgstr "Участники" #~ msgid "Add Application to filtering" #~ msgstr "Добавить приложение в фильтрацию" #~ msgid "Add" #~ msgstr "Добавить" #~ msgid "Cancel" #~ msgstr "Отменить" #~ msgid "Application name" #~ msgstr "Название приложения" #~ msgid "General" #~ msgstr "Общие" #~ msgid "Enchant input/output slider" #~ msgstr "Расширенный ползунок ввода/вывода" #~ msgid "Add more buttons" #~ msgstr "Добавить больше кнопок" #~ msgid "Turn on the buttons you want to add on Quick Settings" #~ msgstr "Включите кнопки, которые вы хотите добавить в быстрые настройки" #~ msgid "Turn on to make the DND quick toggle visible on the Quick Settings panel" #~ msgstr "Включите, чтобы сделать кнопку DND видимой на панели быстрых настроек" #~ msgid "Turn on to make the unsafe quick toggle visible on the Quick Settings panel" #~ msgstr "Включите, чтобы сделать кнопку небезопасного режима видимой на панели быстрых настроек" #~ msgid "This extension is distributed with license GPL 3+" #~ msgstr "Это расширение распространяется под лицензией GPL 3+" #~ msgid "excludes Third-party. Third party codes follow their license" #~ msgstr "исключая сторонние разработки. Сторонние разработки следуют своей лицензии" #~ msgid "Extension Version" #~ msgstr "Версия расширения" #~ msgid "Unknown (Built from source)" #~ msgstr "Неизвестно (создано из исходного кода)" #~ msgid "Third party LICENSE" #~ msgstr "ЛИЦЕНЗИЯ третьей стороны" #~ msgid "LICENSE OF CODES WHICH USED ON THIS EXTENSION" #~ msgstr "ЛИЦЕНЗИИ НА РАЗРАБОТКИ, КОТОРЫЕ ИСПОЛЬЗОВАЛИСЬ В ЭТОМ РАСШИРЕНИИ" #~ msgid "Quick Toggles" #~ msgstr "Быстрые настройки" #~ msgid "Fix Weather Widget Overflow" #~ msgstr "Исправление переполнения виджета погоды" #~ msgid "Fix overflow visual bug of weather widget in datemenu" #~ msgstr "Исправление визуальной ошибки переполнения виджета погоды в меню даты" #~ msgid "Remove Notifications On Date Menu" #~ msgstr "Удалить уведомления в меню даты" #~ msgid "Remove Media Control On Date Menu" #~ msgstr "Удалить управление мультимедиа в меню даты" #~ msgid "Do not adjust the border radius of contents." #~ msgstr "Не изменяйте радиус границы контента." #~ msgid "Don't adjust the border of messages and media controls." #~ msgstr "Не меняйте границы сообщений и элементов управления мультимедиа." #~ msgid "Do not remove the shadow of contents." #~ msgstr "Не удаляйте тень контента." #~ msgid "Don't remove the shadow of messages and media controls." #~ msgstr "Не удаляйте тень сообщений и элементов управления мультимедиа." #~ msgid "Buttons to remove" #~ msgstr "Удаление кнопок" #~ msgid "Turn on the buttons you want to remove from Quick Settings" #~ msgstr "Включите кнопки, которые вы хотите удалить из быстрых настроек" #~ msgid "Remove chosen buttons from quick panel" #~ msgstr "Удалить выбранные кнопки с панели быстрого доступа" #~ msgid "Forked from my extension https://github.com/qwreey75/gnome-quick-settings-button-remover" #~ msgstr "Форкнуто с расширения https://github.com/qwreey75/gnome-quick-settings-button-remover" #~ msgid "This feature is unstable sometime" #~ msgstr "Иногда эта функция работает нестабильно" #~ msgid "" #~ "When lock/unlock with gnome-screensaver, unexpected behavior occurs\n" #~ "Please do not report issue about known issue, Almost duplicated\n" #~ "Known issue:\n" #~ " button doesn't remove after lockscreen\n" #~ " modal get bigger after lockscreen" #~ msgstr "" #~ "При блокировке/разблокировке с помощью gnome-screensaver происходит неожиданное поведение\n" #~ "Пожалуйста, не сообщайте об известной проблеме, часто дублируется\n" #~ "Известная проблема:\n" #~ " кнопка не убирается после блокировки экрана\n" #~ " модальное окно становится больше после блокировки экрана" #~ msgid "Please turn off if some bug occurred" #~ msgstr "Пожалуйста, отключите, если произошла какая-то ошибка" #~ msgid "Unknown" #~ msgstr "Неизвестно" #~ msgid " (invisible by system)" #~ msgstr " (невидимые системой)" #~ msgid "Show current audio output selection" #~ msgstr "Показывать текущий аудиовыход" #~ msgid "Always show the current audio output selection above the volume slider" #~ msgstr "Всегда показывать текущий выбор аудиовыхода над ползунком громкости" #~ msgid "Show current audio input selection" #~ msgstr "Показывать текущий выбор аудиовхода" #~ msgid "Always show the current audio input selection above the volume slider" #~ msgstr "Всегда показывать текущий выбор аудиовхода над ползунком громкости" #~ msgid "Always show input" #~ msgstr "Всегда показывать ввод" #~ msgid "Always show the audio input volume slider, even when there is no audio input stream." #~ msgstr "Всегда показывать аудиовход над ползунком громкости, даже когда нету потока аудиовхода." #~ msgid "Add volume mixer (PulseAudio, Pipewire)" #~ msgstr "Добавить микшер громкости (PulseAudio, Pipewire)" #~ msgid "" #~ "Turn on to make the volume mixer visible\n" #~ "Forked from https://github.com/mymindstorm/gnome-volume-mixer" #~ msgstr "" #~ "Включить чтобы микшер громкости был видимым\n" #~ "Ответвление с https://github.com/mymindstorm/gnome-volume-mixer" #~ msgid "Position" #~ msgstr "Позиция" #~ msgid "Set volume mixer position" #~ msgstr "Установить позицию микшера громкости" #~ msgid "Top (Below Output/Input slider)" #~ msgstr "Верх (Снизу от ползунка выхода/входа)" #~ msgid "Show stream Description" #~ msgstr "Показывать описание потока" #~ msgid "Show audio stream description above the slider" #~ msgstr "Показывать описание аудиопотока надо ползунком" #~ msgid "Show stream Icon" #~ msgstr "Показывать иконку потока" #~ msgid "Show application icon in front of the slider" #~ msgstr "Показывать иконку приложения в начале ползунка" #~ msgid "Filter applications shown in the volume mixer." #~ msgstr "Фильтровать приложения показанные в микшере громкости." #~ msgid "Filter Mode" #~ msgstr "Режим фильтра" #~ msgid "Blacklist" #~ msgstr "Чёрный Список" #~ msgid "Whitelist" #~ msgstr "Белый Список" #~ msgid "Using Javascript Regex" #~ msgstr "Используя JavaScript Regex" #~ msgid "Use Javascript RegExp for filtering app name or description" #~ msgstr "Использовать JavaScript RegExp для фильтрации названия приложения или описания" #~ msgid "Check Stream Description" #~ msgstr "Проверять описание потока" #~ msgid "Check Description also" #~ msgstr "Также проверять описание" #~ msgid "Noti&Media" #~ msgstr "Увед&Медиа" #~ msgid "Media Controls widget" #~ msgstr "Виджет управлением медиа" #~ msgid "Turn on to make the Media Control widget visible on the Quick Settings panel" #~ msgstr "Включите чтобы сделать виджет управлением медиа видимым на панели быстрых настроек" #~ msgid "Compact Mode" #~ msgstr "Компакт Режим" #~ msgid "Notification Widget" #~ msgstr "Виджет уведомления" #~ msgid "Turn on to make the notification widget visible on the Quick Settings panel" #~ msgstr "Включите чтобы сделать виджет уведомления видимым на панели быстрых настроек" #~ msgid "Set maximum height of the Notifications widget. default is 292" #~ msgstr "Установить максимальную высоту виджета уведомлений. По умолчанию 292" #~ msgid "Set Notifications widget position" #~ msgstr "Установить позицию виджета уведмолений" #~ msgid "Attach to QS panel" #~ msgstr "Прикрепить к панели QS" #~ msgid "Auto Hide" #~ msgstr "Прятать автоматически" #~ msgid "Sound Settings" #~ msgstr "Настройки звука" ================================================ FILE: po/ta.po ================================================ #Killersparrow1 msgid "" msgstr "" "Project-Id-Version: 1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-07-20 15:34+0000\n" "PO-Revision-Date: 2025-11-01 09:55+IST\n" "Last-Translator: LeoDas \n" "Language-Team: Tamil\n" "Language: ta\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: target/out/libs/prefs/components.js:57 msgid "Details" msgstr "விவரங்கள்" #: target/out/libs/prefs/components.js:144 msgid "This feature marked as experimental" msgstr "இந்தச் செயல்பாடு சோதனைக்குரியதாகக் குறிக்கப்பட்டுள்ளது" #: target/out/libs/prefs/components.js:274 msgid "Reset to default" msgstr "இயல்புநிலைக்கு மீட்டமை" #: target/out/libs/prefs/components.js:512 msgid "Theme default" msgstr "கருப்பொருள் இயல்புநிலை" #: target/out/libs/prefs/components.js:853 msgid "Homepage" msgstr "முகப்புப் பக்கம்" #: target/out/libs/prefs/components.js:859 #: target/out/libs/prefs/components.js:863 target/out/prefPages/about.js:49 #: target/out/prefPages/about.js:51 target/out/prefPages/about.js:56 msgid "License" msgstr "உரிமம்" #: target/out/libs/prefs/components.js:860 msgid "Loading ..." msgstr "ஏற்றுகிறது..." #: target/out/libs/prefs/components.js:869 msgid "Affected Files" msgstr "பாதிக்கப்பட்ட கோப்புகள்" #: target/out/libs/prefs/components.js:924 msgid "Changelog" msgstr "மாற்றப் பதிவு" #: target/out/libs/prefs/components.js:938 msgid "(Current)" msgstr "(தற்போதைய)" #: target/out/libs/prefs/components.js:969 #, javascript-format msgid "> **Date:** %s" msgstr "> **தேதி:** %s" #: target/out/libs/prefs/components.js:970 #, javascript-format msgid "> **Git Hash:** %s" msgstr "> **Git குறியீடு:** %s" #: target/out/libs/prefs/components.js:971 #, javascript-format msgid "> **Build Number:** %d" msgstr "> **உருவாக்க எண்:** %d" #: target/out/libs/prefs/components.js:1034 msgid "Padding" msgstr "உட்புற இடைவெளி" #: target/out/libs/prefs/components.js:1038 msgid "Top" msgstr "மேல்" #: target/out/libs/prefs/components.js:1049 msgid "Bottom" msgstr "கீழ்" #: target/out/libs/prefs/components.js:1060 msgid "Left" msgstr "இடம்" #: target/out/libs/prefs/components.js:1071 msgid "Right" msgstr "வலம்" #: target/out/prefs.js:60 msgid "Stable" msgstr "நிலையான" #: target/out/prefs.js:63 msgid "Development" msgstr "வளர்ச்சி நிலை" #: target/out/prefs.js:66 msgid "Preview" msgstr "முன்னோட்டம்" #: target/out/prefs.js:69 msgid "(Github Release)" msgstr "(கிட்ஹப் வெளியீடு)" #: target/out/prefs.js:72 msgid "(Built from source)" msgstr "(மூலக் குறியீட்டில் இருந்து கட்டப்பட்டது)" #: target/out/features/widget/notifications.js:26 msgid "No Notifications" msgstr "அறிவிப்புகள் இல்லை" #: target/out/features/widget/notifications.js:58 #: target/out/features/widget/notifications.js:122 msgid "Clear" msgstr "அழி" #: target/out/features/widget/notifications.js:76 msgid "Notifications" msgstr "அறிவிப்புகள்" #: target/out/features/widget/notifications.js:105 #: target/out/features/toggle/dndQuickToggle.js:10 #: target/out/prefPages/layout.js:345 target/out/prefPages/layout.js:485 msgid "Do Not Disturb" msgstr "தொந்தரவு செய்யாதீர்" #: target/out/features/widget/media.js:118 msgid "Unknown title" msgstr "அறியப்படாத தலைப்பு" #: target/out/features/widget/media.js:888 msgid "Media" msgstr "ஊடகம்" #: target/out/features/widget/volumeMixer.js:105 msgid "Volume changed" msgstr "ஒலி அளவு மாற்றப்பட்டது" #: target/out/features/widget/volumeMixer.js:463 msgid "Open volumx mixer" msgstr "ஒலி அலவன் பெட்டியைத் திற" #: target/out/features/widget/volumeMixer.js:480 msgid "Volume Mixer" msgstr "ஒலி அலவன் பெட்டி" #: target/out/features/widget/weather.js:73 msgid "Weather" msgstr "வானிலை" #: target/out/features/widget/weather.js:192 msgid "Location has not been set" msgstr "இடம் அமைக்கப்படவில்லை" #: target/out/features/toggle/unsafeQuickToggle.js:11 #: target/out/prefPages/layout.js:346 target/out/prefPages/layout.js:496 msgid "Unsafe Mode" msgstr "பாதுகாப்பற்ற முறை" #: target/out/prefPages/widgets.js:11 msgid "Handle radius" msgstr "கைப்பிடி ஆரம்" #: target/out/prefPages/widgets.js:12 msgid "Set this to 0 to use default radius" msgstr "இயல்புநிலை ஆரத்தைப் பயன்படுத்த இதை 0 ஆக அமைக்கவும்" #: target/out/prefPages/widgets.js:18 msgid "Handle color" msgstr "கைப்பிடி வண்ணம்" #: target/out/prefPages/widgets.js:36 msgid "Slider style" msgstr "சறுக்குபட்டியின் நடை" #: target/out/prefPages/widgets.js:39 msgid "Slim" msgstr "ஒல்லி" #: target/out/prefPages/widgets.js:40 target/out/prefPages/layout.js:766 msgid "Default" msgstr "இயல்புநிலை" #: target/out/prefPages/widgets.js:48 target/out/prefPages/widgets.js:173 msgid "Background color" msgstr "பின்புல வண்ணம்" #: target/out/prefPages/widgets.js:55 msgid "Active Background color" msgstr "செயலில் உள்ள பின்புல வண்ணம்" #: target/out/prefPages/widgets.js:62 msgid "Thickness" msgstr "தடிமன்" #: target/out/prefPages/widgets.js:66 msgid "Set this to 0 to use default thickness" msgstr "இயல்புநிலை தடிமன் பயன்படுத்த இதை 0 ஆக அமைக்கவும்" #: target/out/prefPages/widgets.js:76 msgid "Widgets" msgstr "சிறுசாளரங்கள்" #: target/out/prefPages/widgets.js:83 target/out/prefPages/widgets.js:136 #: target/out/prefPages/widgets.js:162 target/out/prefPages/widgets.js:224 msgid "Media Widget" msgstr "ஊடக சிறுசாளரம்" #: target/out/prefPages/widgets.js:88 msgid "Turn on to make the media widget visible on the Quick Settings panel" msgstr "விரைவு அமைப்புகள் பலகத்தில் ஊடகச் சிறுசாளரத்தைக் காண இதை இயக்கு" #: target/out/prefPages/widgets.js:92 target/out/prefPages/widgets.js:280 #: target/out/prefPages/widgets.js:343 msgid "Compact mode" msgstr "அடக்கு முறை" #: target/out/prefPages/widgets.js:93 msgid "" "Make Media Controls widget smaller\n" "Make it more similar in size to the notification message" msgstr "" "ஊடகக் கட்டுப்பாட்டுச் சிறுசாளரத்தை சிறியதாக்குக\n" "அறிவிப்புச் செய்தியின் அளவிற்கு ஒத்ததாக மாற்றுக" #: target/out/prefPages/widgets.js:99 msgid "Control buttons opacity" msgstr "கட்டுப்பாட்டு பொத்தான்களின் ஒளிபுகாமை" #: target/out/prefPages/widgets.js:100 msgid "Set this to 255 to make opaque, and 0 to make transparent" msgstr "ஒளிபுகா செய்ய 255 ஆகவும், வெளிப்படையாக்க 0 ஆகவும் அமைக்கவும்" #: target/out/prefPages/widgets.js:108 msgid "Show next button" msgstr "அடுத்த பொத்தானைக் காட்டு" #: target/out/prefPages/widgets.js:109 msgid "Add next contorl button next to description" msgstr "விளக்கத்திற்கு அருகில் அடுத்த கட்டுப்பாட்டு பொத்தானைச் சேர்" #: target/out/prefPages/widgets.js:115 msgid "Show previous button" msgstr "முந்தைய பொத்தானைக் காட்டு" #: target/out/prefPages/widgets.js:116 msgid "Add previous contorl button next to description" msgstr "விளக்கத்திற்கு அருகில் முந்தைய கட்டுப்பாட்டு பொத்தானைச் சேர்" #: target/out/prefPages/widgets.js:122 msgid "Show pause button" msgstr "இடைநிறுத்த பொத்தானைக் காட்டு" #: target/out/prefPages/widgets.js:123 msgid "Add pause contorl button next to description" msgstr "விளக்கத்திற்கு அருகில் இடைநிறுத்த கட்டுப்பாட்டு பொத்தானைச் சேர்" #: target/out/prefPages/widgets.js:129 target/out/prefPages/widgets.js:138 msgid "Show progress bar" msgstr "முன்னேற்றப் பட்டியைக் காட்டு" #: target/out/prefPages/widgets.js:130 target/out/prefPages/widgets.js:139 msgid "Add progress bar under description" msgstr "விளக்கத்தின் கீழ் முன்னேற்றப் பட்டியைச் சேர்" #: target/out/prefPages/widgets.js:155 target/out/prefPages/widgets.js:164 msgid "Gradient background" msgstr "சாய்வு பின்புலம்" #: target/out/prefPages/widgets.js:156 target/out/prefPages/widgets.js:169 msgid "" "Use gradient background extracted from cover image\n" "May affect performance slightly" msgstr "" "அட்டைப் படத்திலிருந்து எடுக்கப்பட்ட சாய்வு பின்புலத்தைப் பயன்படுத்துக\n" "செயல்திறனை லேசாகப் பாதிக்கலாம்" #: target/out/prefPages/widgets.js:174 msgid "Base background color" msgstr "அடிப்படை பின்புல வண்ணம்" #: target/out/prefPages/widgets.js:182 msgid "Start opacity" msgstr "தொடங்கும் ஒளிபுகாமை" #: target/out/prefPages/widgets.js:183 msgid "Adjust left side transparency, Set this to 1000 to make opaque" msgstr "இடது பக்க வெளிப்படைத்தன்மையைச் சரிசெய், ஒளிபுகா செய்ய இதை 1000 ஆக அமைக்கவும்" #: target/out/prefPages/widgets.js:190 msgid "Start color" msgstr "தொடக்க வண்ணம்" #: target/out/prefPages/widgets.js:191 msgid "" "Adjust left side background color mixing, Set this to 1000 to show extracted " "color" msgstr "" "இடது பக்க பின்புல வண்ணக் கலவையைச் சரிசெய், எடுக்கப்பட்ட வண்ணத்தைக் காட்ட இதை 1000 ஆக அமைக்கவும்" #: target/out/prefPages/widgets.js:198 msgid "End opacity" msgstr "முடியும் ஒளிபுகாமை" #: target/out/prefPages/widgets.js:199 msgid "Adjust right side transparency, Set this to 1000 to make opaque" msgstr "வலது பக்க வெளிப்படைத்தன்மையைச் சரிசெய், ஒளிபுகா செய்ய இதை 1000 ஆக அமைக்கவும்" #: target/out/prefPages/widgets.js:206 msgid "End color" msgstr "முடிவு வண்ணம்" #: target/out/prefPages/widgets.js:207 msgid "" "Adjust right side background color mixing, Set this to 1000 to show " "extracted color" msgstr "" "வலது பக்க பின்புல வண்ணக் கலவையைச் சரிசெய், எடுக்கப்பட்ட வண்ணத்தைக் காட்ட இதை 1000 ஆக அமைக்கவும்" #: target/out/prefPages/widgets.js:216 target/out/prefPages/widgets.js:226 msgid "Round clip effect" msgstr "வட்ட வடிவ கிளிப் விளைவு" #: target/out/prefPages/widgets.js:217 target/out/prefPages/widgets.js:231 msgid "Use round clip effect to make transition more natural" msgstr "மாற்றத்தை இயல்பானதாக மாற்ற வட்ட வடிவ கிளிப் விளைவைப் பயன்படுத்துக" #: target/out/prefPages/widgets.js:234 msgid "Padding adjustment" msgstr "உட்புற இடைவெளி சரிசெய்தல்" #: target/out/prefPages/widgets.js:236 msgid "" "Adjust clip effect padding, edit this if your theme has a different margin " "or padding" msgstr "" "கிளிப் விளைவின் உட்புற இடைவெளியைச் சரிசெய், உங்கள் கருப்பொருளில் வேறுபட்ட விளிம்பு அல்லது உட்புற இடைவெளி இருந்தால் இதைத் திருத்து" #: target/out/prefPages/widgets.js:253 target/out/prefPages/widgets.js:318 #: target/out/prefPages/widgets.js:350 msgid "Remove shadow" msgstr "நிழலை நீக்குக" #: target/out/prefPages/widgets.js:254 msgid "" "Remove shadow from media message\n" "Use if your theme creates unnecessary shadows" msgstr "" "ஊடகச் செய்தியிலிருந்து நிழலை நீக்குக\n" "உங்கள் கருப்பொருள் தேவையற்ற நிழல்களை உருவாக்கினால் பயன்படுத்துக" #: target/out/prefPages/widgets.js:260 msgid "Smooth scroll speed" msgstr "மென்மையான சுருள் வேகம்" #: target/out/prefPages/widgets.js:261 msgid "" "Adjust trackpad and trackpoint scroll speed, negative number for invert " "direction" msgstr "" "டிராக்பேட் மற்றும் டிராக்பாயிண்ட் சுருள் வேகத்தைச் சரிசெய், தலைகீழ் திசைக்கு எதிர்மறை எண்ணைப் பயன்படுத்து" #: target/out/prefPages/widgets.js:271 msgid "Notifications Widget" msgstr "அறிவிப்புச் சிறுசாளரம்" #: target/out/prefPages/widgets.js:276 msgid "" "Turn on to make the notifications widget visible on the Quick Settings panel" msgstr "விரைவு அமைப்புகள் பலகத்தில் அறிவிப்புச் சிறுசாளரத்தைக் காண இதை இயக்கு" #: target/out/prefPages/widgets.js:281 msgid "Make notifications smaller" msgstr "அறிவிப்புகளை சிறியதாக்குக" #: target/out/prefPages/widgets.js:287 target/out/prefPages/widgets.js:418 msgid "Max height" msgstr "அதிகபட்ச உயரம்" #: target/out/prefPages/widgets.js:288 #, javascript-format msgid "" "Set maximum height of the Notifications widget, default is %d. Set this to 0 " "to disable max height" msgstr "" "அறிவிப்புச் சிறுசாளரத்தின் அதிகபட்ச உயரத்தை அமை, இயல்புநிலை %d. அதிகபட்ச உயரத்தை முடக்க இதை 0 ஆக அமைக்கவும்" #: target/out/prefPages/widgets.js:296 target/out/prefPages/widgets.js:441 msgid "Fade out offset" msgstr "மறைந்து போகும் ஆஃப்செட்" #: target/out/prefPages/widgets.js:297 target/out/prefPages/widgets.js:442 msgid "" "Set position of the fade out effect begins. Set this to 0 to disable fade " "out effect. default is 46" msgstr "" "மறைந்து போகும் விளைவு தொடங்கும் நிலையை அமை. மறைந்து போகும் விளைவை முடக்க இதை 0 ஆக அமைக்கவும். இயல்புநிலை 46" #: target/out/prefPages/widgets.js:304 msgid "Auto hide" msgstr "தானாக மறை" #: target/out/prefPages/widgets.js:305 msgid "Hide the Notifications widget when have no notifications" msgstr "அறிவிப்புகள் இல்லாதபோது அறிவிப்புச் சிறுசாளரத்தை மறை" #: target/out/prefPages/widgets.js:311 msgid "Use native controls" msgstr "சொந்தக் கட்டுப்பாடுகளைப் பயன்படுத்துக" #: target/out/prefPages/widgets.js:312 msgid "Use native dnd switch and clear button" msgstr "சொந்தமான DND மாற்றி மற்றும் அழி பொத்தானைப் பயன்படுத்துக" #: target/out/prefPages/widgets.js:319 msgid "" "Remove shadow from notification message\n" "Use if your theme creates unnecessary shadows" msgstr "" "அறிவிப்புச் செய்தியிலிருந்து நிழலை நீக்குக\n" "உங்கள் கருப்பொருள் தேவையற்ற நிழல்களை உருவாக்கினால் பயன்படுத்துக" #: target/out/prefPages/widgets.js:325 target/out/prefPages/widgets.js:427 msgid "Show scrollbar" msgstr "சுருள் பட்டியைக் காட்டு" #: target/out/prefPages/widgets.js:326 msgid "Show scrollbar on message list" msgstr "செய்தி பட்டியலில் சுருள் பட்டியைக் காட்டு" #: target/out/prefPages/widgets.js:334 msgid "Weather Widget" msgstr "வானிலை சிறுசாளரம்" #: target/out/prefPages/widgets.js:339 msgid "Turn on to make the weather widget visible on the Quick Settings panel" msgstr "விரைவு அமைப்புகள் பலகத்தில் வானிலைச் சிறுசாளரத்தைக் காண இதை இயக்கு" #: target/out/prefPages/widgets.js:344 msgid "Make weather widget smaller" msgstr "வானிலைச் சிறுசாளரத்தை சிறியதாக்குக" #: target/out/prefPages/widgets.js:351 msgid "" "Remove shadow from weather widget\n" "Use if your theme creates unnecessary shadows" msgstr "" "வானிலைச் சிறுசாளரத்திலிருந்து நிழலை நீக்குக\n" "உங்கள் கருப்பொருள் தேவையற்ற நிழல்களை உருவாக்கினால் பயன்படுத்துக" #: target/out/prefPages/widgets.js:357 msgid "Click command" msgstr "கிளிக் கட்டளை" #: target/out/prefPages/widgets.js:363 msgid "Show location" msgstr "இடத்தைக் காட்டு" #: target/out/prefPages/widgets.js:364 msgid "Show the location label on header" msgstr "தலைப்பில் இருப்பிட லேபிளைக் காட்டு" #: target/out/prefPages/widgets.js:373 msgid "Forecast interval" msgstr "முன்னறிவிப்பு இடைவெளி" #: target/out/prefPages/widgets.js:374 msgid "Adjust forecast interval in hour" msgstr "மணிநேரத்தில் முன்னறிவிப்பு இடைவெளியைச் சரிசெய்" #: target/out/prefPages/widgets.js:381 msgid "Max forecasts" msgstr "அதிகபட்ச முன்னறிவிப்புகள்" #: target/out/prefPages/widgets.js:382 msgid "Adjust max forecasts" msgstr "அதிகபட்ச முன்னறிவிப்புகளைச் சரிசெய்" #: target/out/prefPages/widgets.js:388 target/out/prefPages/widgets.js:456 msgid "Volume mixer Widget" msgstr "ஒலி அலவன் பெட்டி சிறுசாளரம்" #: target/out/prefPages/widgets.js:393 msgid "" "Turn on to make the volume mixer widget visible on the Quick Settings panel" msgstr "விரைவு அமைப்புகள் பலகத்தில் ஒலி அலவன் பெட்டி சிறுசாளரத்தைக் காண இதை இயக்கு" #: target/out/prefPages/widgets.js:397 msgid "Label text" msgstr "லேபிள் உரை" #: target/out/prefPages/widgets.js:398 msgid "Choose label above slider text source" msgstr "சறுக்குபட்டியின் மேல் உள்ள லேபிள் உரை மூலத்தைத் தேர்ந்தெடு" #: target/out/prefPages/widgets.js:400 msgid "Both" msgstr "இரண்டும்" #: target/out/prefPages/widgets.js:401 msgid "Title" msgstr "தலைப்பு" #: target/out/prefPages/widgets.js:402 msgid "Description" msgstr "விளக்கம்" #: target/out/prefPages/widgets.js:403 msgid "None" msgstr "ஏதுமில்லை" #: target/out/prefPages/widgets.js:411 msgid "Label opacity" msgstr "லேபிள் ஒளிபுகாமை" #: target/out/prefPages/widgets.js:412 msgid "" "Adjust label opacity.\n" "Set this to 255 to make opaque, and 0 to make transparent" msgstr "" "லேபிள் ஒளிபுகாமையைச் சரிசெய்.\n" "ஒளிபுகா செய்ய 255 ஆகவும், வெளிப்படையாக்க 0 ஆகவும் அமைக்கவும்" #: target/out/prefPages/widgets.js:419 #, javascript-format msgid "" "Set maximum height of the Volume mixer widget, default is %d. Set this to 0 " "to disable max height" msgstr "" "ஒலி அலவன் பெட்டி சிறுசாளரத்தின் அதிகபட்ச உயரத்தை அமை, இயல்புநிலை %d. அதிகபட்ச உயரத்தை முடக்க இதை 0 ஆக அமைக்கவும்" #: target/out/prefPages/widgets.js:428 msgid "Show scrollbar on mixer list" msgstr "அலவன் பட்டியலில் சுருள் பட்டியைக் காட்டு" #: target/out/prefPages/widgets.js:434 msgid "Show stream icon" msgstr "ஓடை ஐகானைக் காட்டு" #: target/out/prefPages/widgets.js:435 msgid "Show stream icon above mixer sliders" msgstr "அலவன் சறுக்குபட்டியின் மேலே ஓடை ஐகானைக் காட்டு" #: target/out/prefPages/widgets.js:450 target/out/prefPages/widgets.js:458 msgid "Attach to output slider" msgstr "வெளியீட்டு சறுக்குபட்டியுடன் இணை" #: target/out/prefPages/widgets.js:451 target/out/prefPages/widgets.js:459 msgid "" "Attach volume mixer menu button to output slider. Use if you prefer compact " "layout" msgstr "" "ஒலி அலவன் பெட்டியின் பட்டி பொத்தானை வெளியீட்டு சறுக்குபட்டியுடன் இணை. நீங்கள் அடக்கமான அமைப்பை விரும்பினால் பயன்படுத்துக" #: target/out/prefPages/widgets.js:468 msgid "Menu icon" msgstr "பட்டி ஐகான்" #: target/out/prefPages/about.js:12 target/out/prefPages/about.js:32 msgid "About" msgstr "பற்றி" #: target/out/prefPages/about.js:33 msgid "Common extension informations" msgstr "பொதுவான நீட்டிப்புத் தகவல்கள்" #: target/out/prefPages/about.js:36 target/out/prefPages/about.js:40 msgid "Changelogs" msgstr "மாற்றப் பதிவுகள்" #: target/out/prefPages/about.js:37 target/out/prefPages/about.js:41 msgid "View the change history for this extension" msgstr "இந்த நீட்டிப்பின் மாற்ற வரலாற்றைக் காண்க" #: target/out/prefPages/about.js:50 target/out/prefPages/about.js:57 msgid "License of codes" msgstr "குறியீடுகளின் உரிமம்" #: target/out/prefPages/about.js:63 target/out/prefPages/about.js:65 #: target/out/prefPages/about.js:69 msgid "Contributors" msgstr "பங்களிப்பாளர்கள்" #: target/out/prefPages/about.js:64 target/out/prefPages/about.js:70 msgid "The creators of this extension" msgstr "இந்த நீட்டிப்பை உருவாக்கியவர்கள்" #: target/out/prefPages/about.js:74 msgid "More contributors" msgstr "மேலும் பங்களிப்பாளர்கள்" #: target/out/prefPages/about.js:75 msgid "See more contributors on github" msgstr "கிட்ஹப்பில் மேலும் பங்களிப்பாளர்களைக் காண்க" #: target/out/prefPages/about.js:85 msgid "Link" msgstr "இணைப்பு" #: target/out/prefPages/about.js:86 msgid "External links about this extension" msgstr "இந்த நீட்டிப்பு குறித்த வெளி இணைப்புகள்" #: target/out/prefPages/about.js:90 msgid "Donate via github sponsors" msgstr "கிட்ஹப் ஸ்பான்சர்கள் மூலம் நன்கொடை அளி" #: target/out/prefPages/about.js:91 msgid "Support development!" msgstr "வளர்ச்சிக்கு ஆதரவளி!" #: target/out/prefPages/about.js:97 msgid "Rate and comment the extension!" msgstr "நீட்டிப்பை மதிப்பிட்டு கருத்துத் தெரிவிக்கவும்!" #: target/out/prefPages/about.js:102 msgid "Github Repository" msgstr "கிட்ஹப் களஞ்சியம்" #: target/out/prefPages/about.js:103 msgid "" "Add Star on Repository is helping me a lot!\n" "Please, if you found bug from this extension, you can make issue to make me " "know that!\n" "Or, you can create PR with wonderful features!" msgstr "" "களஞ்சியத்திற்கு நட்சத்திரம் சேர்ப்பது எனக்கு மிகவும் உதவுகிறது!\n" "இந்த நீட்டிப்பில் ஏதேனும் பிழையைக் கண்டால், எனக்குத் தெரியப்படுத்த ஒரு சிக்கலை உருவாக்கலாம்!\n" "அல்லது, நீங்கள் அற்புதமான அம்சங்களுடன் ஒரு PR ஐ உருவாக்கலாம்!" #: target/out/prefPages/about.js:109 msgid "Add translation to this extension!" msgstr "இந்த நீட்டிப்புக்கு மொழிபெயர்ப்பைச் சேர்!" #: target/out/prefPages/about.js:115 msgid "Debug" msgstr "பிழைநீக்கம்" #: target/out/prefPages/about.js:116 msgid "Extension debugging options" msgstr "நீட்டிப்பு பிழைநீக்க விருப்பங்கள்" #: target/out/prefPages/about.js:120 msgid "Expose environment" msgstr "சூழலை வெளிப்படுத்து" #: target/out/prefPages/about.js:121 msgid "Expose extension environment to globalThis.qst" msgstr "நீட்டிப்புச் சூழலை globalThis.qst க்கு வெளிப்படுத்து" #: target/out/prefPages/about.js:126 msgid "Show layout border" msgstr "அமைவு எல்லையைக் காட்டு" #: target/out/prefPages/about.js:127 msgid "Show layout borders on Quick Settings" msgstr "விரைவு அமைப்புகளில் அமைவு எல்லைகளைக் காட்டு" #: target/out/prefPages/about.js:132 msgid "Log level" msgstr "பதிவு நிலை" #: target/out/prefPages/about.js:135 msgid "none" msgstr "ஏதுமில்லை" #: target/out/prefPages/about.js:136 msgid "error" msgstr "பிழை" #: target/out/prefPages/about.js:137 msgid "info" msgstr "தகவல்" #: target/out/prefPages/about.js:138 msgid "debug" msgstr "பிழைநீக்கு" #: target/out/prefPages/toggles.js:12 msgid "Toggles" msgstr "நிலைமாற்றிகள்" #: target/out/prefPages/toggles.js:19 msgid "DND Quick Toggle" msgstr "DND விரைவு நிலைமாற்றி" #: target/out/prefPages/toggles.js:20 msgid "Turn on to add the DND quick toggle on the Quick Settings panel" msgstr "விரைவு அமைப்புகள் பலகத்தில் DND விரைவு நிலைமாற்றியைச் சேர்க்க இதை இயக்கு" #: target/out/prefPages/toggles.js:28 msgid "DND indicator position" msgstr "DND குறிக்காட்டியின் நிலை" #: target/out/prefPages/toggles.js:29 msgid "Set DND indicator position" msgstr "DND குறிக்காட்டியின் நிலையை அமை" #: target/out/prefPages/toggles.js:33 msgid "System Tray" msgstr "கணினி தட்டு" #: target/out/prefPages/toggles.js:34 msgid "Date Menu Button" msgstr "தேதி பட்டி பொத்தான்" #: target/out/prefPages/toggles.js:41 msgid "Unsafe Mode Quick Toggle" msgstr "பாதுகாப்பற்ற முறை விரைவு நிலைமாற்றி" #: target/out/prefPages/toggles.js:42 msgid "Turn on to add the unsafe quick toggle on the Quick Settings panel" msgstr "விரைவு அமைப்புகள் பலகத்தில் பாதுகாப்பற்ற முறை விரைவு நிலைமாற்றியைச் சேர்க்க இதை இயக்கு" #: target/out/prefPages/toggles.js:50 msgid "Save last session state" msgstr "கடைசி அமர்வு நிலையைச் சேமி" #: target/out/prefPages/toggles.js:51 msgid "Turn on to save last session unsafe state" msgstr "கடைசி அமர்வின் பாதுகாப்பற்ற நிலையைச் சேமிக்க இதை இயக்கு" #: target/out/prefPages/menu.js:9 target/out/prefPages/menu.js:141 msgid "Advanced animation style" msgstr "மேம்பட்ட அசைவூட்ட நடை" #: target/out/prefPages/menu.js:13 msgid "Open Duration" msgstr "திறக்கும் நேரம்" #: target/out/prefPages/menu.js:14 msgid "Open animation duration in microseconds" msgstr "திறக்கும் அசைவூட்டத்தின் நேரம் மைக்ரோ விநாடிகளில்" #: target/out/prefPages/menu.js:21 msgid "Close Duration" msgstr "மூடும் நேரம்" #: target/out/prefPages/menu.js:22 msgid "Close animation duration in microseconds" msgstr "மூடும் அசைவூட்டத்தின் நேரம் மைக்ரோ விநாடிகளில்" #: target/out/prefPages/menu.js:29 msgid "Grid Content Opacity" msgstr "கட்டத்தின் உள்ளடக்கம் ஒளிபுகாமை" #: target/out/prefPages/menu.js:30 msgid "" "Adjust grid content opacity.\n" "Set this to 255 to make opaque, and 0 to make transparent" msgstr "" "கட்டத்தின் உள்ளடக்கம் ஒளிபுகாமையைச் சரிசெய்.\n" "ஒளிபுகா செய்ய 255 ஆகவும், வெளிப்படையாக்க 0 ஆகவும் அமைக்கவும்" #: target/out/prefPages/menu.js:37 msgid "Background Blur Radius" msgstr "பின்புல மங்கல் ஆரம்" #: target/out/prefPages/menu.js:38 msgid "" "Adjust background blur radius.\n" "Set this to 0 to disable blur effect" msgstr "" "பின்புல மங்கல் ஆரத்தைச் சரிசெய்.\n" "மங்கல் விளைவை முடக்க இதை 0 ஆக அமைக்கவும்" #: target/out/prefPages/menu.js:45 msgid "Background Brightness" msgstr "பின்புல வெளிச்சம்" #: target/out/prefPages/menu.js:46 msgid "" "Adjust background brightness.\n" "Set this to 1000 to disable brightness control effect.\n" "Not impacts on gnome-shell's default dim effect." msgstr "" "பின்புல வெளிச்சத்தைச் சரிசெய்.\n" "வெளிச்சக் கட்டுப்பாட்டு விளைவை முடக்க இதை 1000 ஆக அமைக்கவும்.\n" "gnome-shell இன் இயல்புநிலை மங்கலான விளைவைப் பாதிக்காது." #: target/out/prefPages/menu.js:53 msgid "Background Opacity" msgstr "பின்புல ஒளிபுகாமை" #: target/out/prefPages/menu.js:54 msgid "" "Adjust background opacity.\n" "Set this to 255 to make opaque, and 0 to make transparent" msgstr "" "பின்புல ஒளிபுகாமையைச் சரிசெய்.\n" "ஒளிபுகா செய்ய 255 ஆகவும், வெளிப்படையாக்க 0 ஆகவும் அமைக்கவும்" #: target/out/prefPages/menu.js:61 msgid "Background X Scale" msgstr "பின்புல X அளவு" #: target/out/prefPages/menu.js:62 msgid "Adjust background x scale, 1000 means 1.0 scale" msgstr "பின்புல X அளவைச் சரிசெய், 1000 என்பது 1.0 அளவைக் குறிக்கிறது" #: target/out/prefPages/menu.js:69 msgid "Background Y Scale" msgstr "பின்புல Y அளவு" #: target/out/prefPages/menu.js:70 msgid "Adjust background y scale, 1000 means 1.0 scale" msgstr "பின்புல Y அளவைச் சரிசெய், 1000 என்பது 1.0 அளவைக் குறிக்கிறது" #: target/out/prefPages/menu.js:84 msgid "Menu" msgstr "பட்டி" #: target/out/prefPages/menu.js:91 msgid "Overlay Mode" msgstr "மேல்மூடு முறை" #: target/out/prefPages/menu.js:92 msgid "Display toggle, power, and sound menus as overlay" msgstr "நிலைமாற்றி, பவர் மற்றும் ஒலி பட்டிகளை மேல்மூடாகக் காட்டு" #: target/out/prefPages/menu.js:101 msgid "Overlay Width" msgstr "மேல்மூடு அகலம்" #: target/out/prefPages/menu.js:102 msgid "" "Adjust overlay menu width\n" "Set this to 0 to disable adjusting" msgstr "" "மேல்மூடு பட்டி அகலத்தைச் சரிசெய்\n" "சரிசெய்வதை முடக்க இதை 0 ஆக அமைக்கவும்" #: target/out/prefPages/menu.js:109 msgid "Overlay Animation Duration" msgstr "மேல்மூடு அசைவூட்ட நேரம்" #: target/out/prefPages/menu.js:110 msgid "" "Custom menu open animation duration in microseconds\n" "Set this to 0 to disable custom animation" msgstr "" "தனிப்பயன் பட்டி திறக்கும் அசைவூட்ட நேரம் மைக்ரோ விநாடிகளில்\n" "தனிப்பயன் அசைவூட்டத்தை முடக்க இதை 0 ஆக அமைக்கவும்" #: target/out/prefPages/menu.js:117 msgid "Overlay Animation Style" msgstr "மேல்மூடு அசைவூட்ட நடை" #: target/out/prefPages/menu.js:118 msgid "Custom menu open animation style" msgstr "தனிப்பயன் பட்டி திறக்கும் அசைவூட்ட நடை" #: target/out/prefPages/menu.js:120 msgid "Flyout" msgstr "பறந்து செல்லல்" #: target/out/prefPages/menu.js:121 msgid "Dialog" msgstr "உரையாடல்" #: target/out/prefPages/menu.js:130 target/out/prefPages/menu.js:143 msgid "Animation" msgstr "அசைவூட்டம்" #: target/out/prefPages/menu.js:131 msgid "" "Add menu animation on toggle menu opening and closing\n" "To get the best feel, turn on overlay mode" msgstr "" "நிலைமாற்றி பட்டி திறக்கும் மற்றும் மூடும்போது பட்டி அசைவூட்டத்தைச் சேர்\n" "சிறந்த உணர்வைப் பெற, மேல்மூடு முறையை இயக்கு" #: target/out/prefPages/menu.js:142 msgid "Adjust speed, blur, scale, and opacity" msgstr "வேகம், மங்கல், அளவு மற்றும் ஒளிபுகாமையைச் சரிசெய்" #: target/out/prefPages/layout.js:25 msgid "The item not found" msgstr "பொருள் காணப்படவில்லை" #: target/out/prefPages/layout.js:28 msgid "No changes" msgstr "மாற்றங்கள் இல்லை" #: target/out/prefPages/layout.js:31 msgid "The same item already exists" msgstr "அதே பொருள் ஏற்கனவே உள்ளது" #: target/out/prefPages/layout.js:40 #, javascript-format msgid "Properties of %s" msgstr "%s இன் பண்புகள்" #: target/out/prefPages/layout.js:47 msgid "Save" msgstr "சேமி" #: target/out/prefPages/layout.js:64 msgid "Toggle editor" msgstr "நிலைமாற்றி திருத்தி" #: target/out/prefPages/layout.js:84 msgid "This option requires full gnome-shell reloading" msgstr "இந்த விருப்பத்திற்கு முழுமையான gnome-shell மறுஏற்றம் தேவை" #: target/out/prefPages/layout.js:160 target/out/prefPages/layout.js:278 #: target/out/prefPages/layout.js:437 target/out/prefPages/layout.js:672 msgid "Hide" msgstr "மறை" #: target/out/prefPages/layout.js:232 #, javascript-format msgid "My item #%d" msgstr "எனது பொருள் #%d" #: target/out/prefPages/layout.js:250 msgid "New Item" msgstr "புதிய பொருள்" #: target/out/prefPages/layout.js:261 target/out/prefPages/layout.js:610 #: target/out/prefPages/layout.js:737 target/out/prefPages/layout.js:787 #: target/out/prefPages/layout.js:813 msgid "Ordering and Hiding" msgstr "வரிசைப்படுத்துதல் மற்றும் மறைத்தல்" #: target/out/prefPages/layout.js:273 target/out/prefPages/layout.js:432 msgid "Friendly Name" msgstr "பயனர் பெயர்" #: target/out/prefPages/layout.js:283 msgid "Title Regex (Javascript Regex)" msgstr "தலைப்பு ரெஜெக்ஸ் (ஜாஸ்வா ஸ்கிரிப்ட் ரெஜெக்ஸ்)" #: target/out/prefPages/layout.js:288 target/out/prefPages/layout.js:442 msgid "Constructor Name" msgstr "கட்டுநர் பெயர்" #: target/out/prefPages/layout.js:294 target/out/prefPages/layout.js:448 msgid "GType Name" msgstr "Gவகை பெயர்" #: target/out/prefPages/layout.js:302 target/out/prefPages/layout.js:456 msgid "" "This is the comment for easy identification in the settings list. It has no " "effect on the behavior of the extension" msgstr "" "இது அமைப்புகள் பட்டியலில் எளிதாக அடையாளம் காணும் கருத்து. இது நீட்டிப்பின் செயல்பாட்டில் எந்த விளைவையும் ஏற்படுத்தாது" #: target/out/prefPages/layout.js:307 target/out/prefPages/layout.js:461 msgid "Javascript constructor name" msgstr "ஜாஸ்வா ஸ்கிரிப்ட் கட்டுநர் பெயர்" #: target/out/prefPages/layout.js:312 target/out/prefPages/layout.js:466 msgid "" "GObject gtype name. You can get this value by calling " "GObject.type_name_from_instance" msgstr "" "GObject gtype பெயர். GObject.type_name_from_instance ஐ அழைப்பதன் மூலம் இந்த மதிப்பை நீங்கள் பெறலாம்" #: target/out/prefPages/layout.js:342 msgid "Keyboard Backlight" msgstr "விசைப்பலகை பின்புற ஒளி" #: target/out/prefPages/layout.js:388 target/out/prefPages/layout.js:538 msgid "Unordered items" msgstr "வரிசைப்படுத்தப்படாத பொருள்கள்" #: target/out/prefPages/layout.js:486 msgid "Remote Access Applet" msgstr "தொலைநிலை அணுகல் ஆப்லெட்" #: target/out/prefPages/layout.js:487 msgid "Camera" msgstr "புகைப்படக் கருவி" #: target/out/prefPages/layout.js:488 msgid "Volume Input" msgstr "ஒலி உள்ளீடு" #: target/out/prefPages/layout.js:489 msgid "Location" msgstr "இருப்பிடம்" #: target/out/prefPages/layout.js:490 msgid "Thunderbolt" msgstr "தண்டர்போல்ட்" #: target/out/prefPages/layout.js:492 msgid "Network" msgstr "பிணையம்" #: target/out/prefPages/layout.js:495 msgid "Volume Output" msgstr "ஒலி வெளியீடு" #: target/out/prefPages/layout.js:497 msgid "System (Battery)" msgstr "கணினி (மின்கலம்)" #: target/out/prefPages/layout.js:618 msgid "Desktop Spacer" msgstr "மேசை இடைவெளி" #: target/out/prefPages/layout.js:629 msgid "Laptop Spacer" msgstr "மடிக்கணினி இடைவெளி" #: target/out/prefPages/layout.js:641 msgid "Capture button" msgstr "பிடிப்பு பொத்தான்" #: target/out/prefPages/layout.js:647 msgid "Settings button" msgstr "அமைப்புகள் பொத்தான்" #: target/out/prefPages/layout.js:653 msgid "Lock button" msgstr "பூட்டு பொத்தான்" #: target/out/prefPages/layout.js:659 msgid "Shutdown button" msgstr "செயல்தவிர்ப்பு பொத்தான்" #: target/out/prefPages/layout.js:665 msgid "Battery button" msgstr "மின்கல பொத்தான்" #: target/out/prefPages/layout.js:711 msgid "Layout" msgstr "அமைப்பு" #: target/out/prefPages/layout.js:718 msgid "Quick Toggles Layout" msgstr "விரைவு நிலைமாற்றிகள் அமைப்பு" #: target/out/prefPages/layout.js:719 target/out/prefPages/layout.js:734 msgid "Adjust quick toggles layout" msgstr "விரைவு நிலைமாற்றிகளின் அமைப்பைச் சரிசெய்" #: target/out/prefPages/layout.js:738 msgid "Reorder and hide quick toggles" msgstr "விரைவு நிலைமாற்றிகளை மறுவரிசைப்படுத்தி மறை" #: target/out/prefPages/layout.js:745 msgid "System Indicators" msgstr "கணினி குறிக்காட்டிகள்" #: target/out/prefPages/layout.js:746 msgid "Adjust system indicators layout and style" msgstr "கணினி குறிக்காட்டிகளின் அமைப்பையும் நடையையும் சரிசெய்" #: target/out/prefPages/layout.js:751 msgid "Accent screen sharing indicator" msgstr "திரைப் பகிர்வு குறிக்காட்டிக்கு உச்சரிப்பைச் சேர்" #: target/out/prefPages/layout.js:752 msgid "Use shell accent color on screen sharing indicator" msgstr "திரைப் பகிர்வு குறிக்காட்டியில் ஷெல் உச்சரிப்பு வண்ணத்தைப் பயன்படுத்துக" #: target/out/prefPages/layout.js:757 msgid "Accent screen recording indicator" msgstr "திரைப் பதிவு குறிக்காட்டிக்கு உச்சரிப்பைச் சேர்" #: target/out/prefPages/layout.js:758 msgid "Use shell accent color on screen recording indicator" msgstr "திரைப் பதிவு குறிக்காட்டியில் ஷெல் உச்சரிப்பு வண்ணத்தைப் பயன்படுத்துக" #: target/out/prefPages/layout.js:763 msgid "Privacy indicators style" msgstr "தனியுரிமைக் குறிக்காட்டிகளின் நடை" #: target/out/prefPages/layout.js:764 msgid "Use monochrome or shell accent color on privarcy indicators" msgstr "தனியுரிமைக் குறிக்காட்டிகளில் ஒரே வண்ண அல்லது ஷெல் உச்சரிப்பு வண்ணத்தைப் பயன்படுத்துக" #: target/out/prefPages/layout.js:767 msgid "Accent" msgstr "உச்சரிப்பு" #: target/out/prefPages/layout.js:768 msgid "Monochrome" msgstr "ஒரே வண்ணம்" #: target/out/prefPages/layout.js:777 msgid "Adjust system indicators" msgstr "கணினி குறிக்காட்டிகளைச் சரிசெய்" #: target/out/prefPages/layout.js:788 msgid "Reorder and hide system indicators" msgstr "கணினி குறிக்காட்டிகளை மறுவரிசைப்படுத்தி மறை" #: target/out/prefPages/layout.js:795 msgid "System Items Layout" msgstr "கணினிப் பொருட்களின் அமைப்பு" #: target/out/prefPages/layout.js:800 target/out/prefPages/layout.js:815 msgid "Adjust system items layout" msgstr "கணினிப் பொருட்களின் அமைப்பைச் சரிசெய்" #: target/out/prefPages/layout.js:804 msgid "Hide layout box" msgstr "அமைவு பெட்டியை மறை" #: target/out/prefPages/layout.js:805 msgid "Hide all buttons and layout box" msgstr "அனைத்து பொத்தான்கள் மற்றும் அமைவு பெட்டியை மறை" #: target/out/prefPages/layout.js:814 msgid "Reorder and hide system items" msgstr "கணினிப் பொருட்களை மறுவரிசைப்படுத்தி மறை" #: target/out/prefPages/layout.js:823 msgid "Date Menu" msgstr "தேதி பட்டி" #: target/out/prefPages/layout.js:824 msgid "Adjust Date Menu layout" msgstr "தேதி பட்டியில் அமைப்பைச் சரிசெய்" #: target/out/prefPages/layout.js:828 msgid "Hide left box" msgstr "இடது பெட்டியை மறை" #: target/out/prefPages/layout.js:829 msgid "" "Hide the left box of the date menu, which contains notifications and media " "control" msgstr "" "தேதி பட்டியின் இடது பெட்டியை மறை, அதில் அறிவிப்புகள் மற்றும் ஊடகக் கட்டுப்பாடு உள்ளன" #: target/out/prefPages/layout.js:834 msgid "Hide right box" msgstr "வலது பெட்டியை மறை" #: target/out/prefPages/layout.js:835 msgid "" "Hide the right box of the date menu, which contains calendar, world clock " "and weather" msgstr "" "தேதி பட்டியின் வலது பெட்டியை மறை, அதில் நாள்காட்டி, உலக கடிகாரம் மற்றும் வானிலை உள்ளன" #: target/out/prefPages/layout.js:840 msgid "Disable menu" msgstr "பட்டியை முடக்கு" #: target/out/prefPages/layout.js:841 msgid "Do not open date menu when the date menu button clicked" msgstr "தேதி பட்டி பொத்தானைக் கிளிக் செய்யும்போது தேதி பட்டியைத் திறக்க வேண்டாம்" ================================================ FILE: po/zh_Hans.po ================================================ # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-07-20 15:34+0000\n" "PO-Revision-Date: 2024-02-06 23:38+0000\n" "Last-Translator: mechtifs \n" "Language-Team: Chinese (Simplified) \n" "Language: zh_Hans\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Weblate 5.2.1\n" #: target/out/libs/prefs/components.js:57 msgid "Details" msgstr "" #: target/out/libs/prefs/components.js:144 msgid "This feature marked as experimental" msgstr "" #: target/out/libs/prefs/components.js:274 msgid "Reset to default" msgstr "" #: target/out/libs/prefs/components.js:512 msgid "Theme default" msgstr "" #: target/out/libs/prefs/components.js:853 msgid "Homepage" msgstr "" #: target/out/libs/prefs/components.js:859 #: target/out/libs/prefs/components.js:863 target/out/prefPages/about.js:49 #: target/out/prefPages/about.js:51 target/out/prefPages/about.js:56 msgid "License" msgstr "" #: target/out/libs/prefs/components.js:860 msgid "Loading ..." msgstr "" #: target/out/libs/prefs/components.js:869 msgid "Affected Files" msgstr "" #: target/out/libs/prefs/components.js:924 msgid "Changelog" msgstr "" #: target/out/libs/prefs/components.js:938 msgid "(Current)" msgstr "" #: target/out/libs/prefs/components.js:969 #, javascript-format msgid "> **Date:** %s" msgstr "" #: target/out/libs/prefs/components.js:970 #, javascript-format msgid "> **Git Hash:** %s" msgstr "" #: target/out/libs/prefs/components.js:971 #, javascript-format msgid "> **Build Number:** %d" msgstr "" #: target/out/libs/prefs/components.js:1034 msgid "Padding" msgstr "" #: target/out/libs/prefs/components.js:1038 msgid "Top" msgstr "顶端" #: target/out/libs/prefs/components.js:1049 msgid "Bottom" msgstr "底部" #: target/out/libs/prefs/components.js:1060 msgid "Left" msgstr "" #: target/out/libs/prefs/components.js:1071 msgid "Right" msgstr "" #: target/out/prefs.js:60 msgid "Stable" msgstr "" #: target/out/prefs.js:63 msgid "Development" msgstr "" #: target/out/prefs.js:66 msgid "Preview" msgstr "" #: target/out/prefs.js:69 msgid "(Github Release)" msgstr "" #: target/out/prefs.js:72 msgid "(Built from source)" msgstr "" #: target/out/features/widget/notifications.js:26 msgid "No Notifications" msgstr "无通知" #: target/out/features/widget/notifications.js:58 #: target/out/features/widget/notifications.js:122 msgid "Clear" msgstr "清除" #: target/out/features/widget/notifications.js:76 msgid "Notifications" msgstr "通知" #: target/out/features/widget/notifications.js:105 #: target/out/features/toggle/dndQuickToggle.js:10 #: target/out/prefPages/layout.js:345 target/out/prefPages/layout.js:485 msgid "Do Not Disturb" msgstr "免打扰" #: target/out/features/widget/media.js:118 msgid "Unknown title" msgstr "" #: target/out/features/widget/media.js:888 msgid "Media" msgstr "" #: target/out/features/widget/volumeMixer.js:105 msgid "Volume changed" msgstr "音量改变" #: target/out/features/widget/volumeMixer.js:463 msgid "Open volumx mixer" msgstr "" #: target/out/features/widget/volumeMixer.js:480 msgid "Volume Mixer" msgstr "音量混合器" #: target/out/features/widget/weather.js:73 msgid "Weather" msgstr "" #: target/out/features/widget/weather.js:192 msgid "Location has not been set" msgstr "" #: target/out/features/toggle/unsafeQuickToggle.js:11 #: target/out/prefPages/layout.js:346 target/out/prefPages/layout.js:496 msgid "Unsafe Mode" msgstr "不安全模式" #: target/out/prefPages/widgets.js:11 msgid "Handle radius" msgstr "" #: target/out/prefPages/widgets.js:12 msgid "Set this to 0 to use default radius" msgstr "" #: target/out/prefPages/widgets.js:18 msgid "Handle color" msgstr "" #: target/out/prefPages/widgets.js:36 msgid "Slider style" msgstr "" #: target/out/prefPages/widgets.js:39 msgid "Slim" msgstr "" #: target/out/prefPages/widgets.js:40 target/out/prefPages/layout.js:766 msgid "Default" msgstr "" #: target/out/prefPages/widgets.js:48 target/out/prefPages/widgets.js:173 msgid "Background color" msgstr "" #: target/out/prefPages/widgets.js:55 msgid "Active Background color" msgstr "" #: target/out/prefPages/widgets.js:62 msgid "Thickness" msgstr "" #: target/out/prefPages/widgets.js:66 msgid "Set this to 0 to use default thickness" msgstr "" #: target/out/prefPages/widgets.js:76 msgid "Widgets" msgstr "" #: target/out/prefPages/widgets.js:83 target/out/prefPages/widgets.js:136 #: target/out/prefPages/widgets.js:162 target/out/prefPages/widgets.js:224 msgid "Media Widget" msgstr "" #: target/out/prefPages/widgets.js:88 msgid "Turn on to make the media widget visible on the Quick Settings panel" msgstr "" #: target/out/prefPages/widgets.js:92 target/out/prefPages/widgets.js:280 #: target/out/prefPages/widgets.js:343 msgid "Compact mode" msgstr "" #: target/out/prefPages/widgets.js:93 msgid "" "Make Media Controls widget smaller\n" "Make it more similar in size to the notification message" msgstr "" "使音频控制组件变小\n" "使其与通知组件大小相近" #: target/out/prefPages/widgets.js:99 msgid "Control buttons opacity" msgstr "" #: target/out/prefPages/widgets.js:100 msgid "Set this to 255 to make opaque, and 0 to make transparent" msgstr "" #: target/out/prefPages/widgets.js:108 msgid "Show next button" msgstr "" #: target/out/prefPages/widgets.js:109 msgid "Add next contorl button next to description" msgstr "" #: target/out/prefPages/widgets.js:115 msgid "Show previous button" msgstr "" #: target/out/prefPages/widgets.js:116 msgid "Add previous contorl button next to description" msgstr "" #: target/out/prefPages/widgets.js:122 msgid "Show pause button" msgstr "" #: target/out/prefPages/widgets.js:123 msgid "Add pause contorl button next to description" msgstr "" #: target/out/prefPages/widgets.js:129 target/out/prefPages/widgets.js:138 msgid "Show progress bar" msgstr "" #: target/out/prefPages/widgets.js:130 target/out/prefPages/widgets.js:139 msgid "Add progress bar under description" msgstr "" #: target/out/prefPages/widgets.js:155 target/out/prefPages/widgets.js:164 msgid "Gradient background" msgstr "" #: target/out/prefPages/widgets.js:156 target/out/prefPages/widgets.js:169 msgid "" "Use gradient background extracted from cover image\n" "May affect performance slightly" msgstr "" #: target/out/prefPages/widgets.js:174 msgid "Base background color" msgstr "" #: target/out/prefPages/widgets.js:182 msgid "Start opacity" msgstr "" #: target/out/prefPages/widgets.js:183 msgid "Adjust left side transparency, Set this to 1000 to make opaque" msgstr "" #: target/out/prefPages/widgets.js:190 msgid "Start color" msgstr "" #: target/out/prefPages/widgets.js:191 msgid "Adjust left side background color mixing, Set this to 1000 to show extracted color" msgstr "" #: target/out/prefPages/widgets.js:198 msgid "End opacity" msgstr "" #: target/out/prefPages/widgets.js:199 msgid "Adjust right side transparency, Set this to 1000 to make opaque" msgstr "" #: target/out/prefPages/widgets.js:206 msgid "End color" msgstr "" #: target/out/prefPages/widgets.js:207 msgid "Adjust right side background color mixing, Set this to 1000 to show extracted color" msgstr "" #: target/out/prefPages/widgets.js:216 target/out/prefPages/widgets.js:226 msgid "Round clip effect" msgstr "" #: target/out/prefPages/widgets.js:217 target/out/prefPages/widgets.js:231 msgid "Use round clip effect to make transition more natural" msgstr "" #: target/out/prefPages/widgets.js:234 msgid "Padding adjustment" msgstr "" #: target/out/prefPages/widgets.js:236 msgid "Adjust clip effect padding, edit this if your theme has a different margin or padding" msgstr "" #: target/out/prefPages/widgets.js:253 target/out/prefPages/widgets.js:318 #: target/out/prefPages/widgets.js:350 msgid "Remove shadow" msgstr "" #: target/out/prefPages/widgets.js:254 msgid "" "Remove shadow from media message\n" "Use if your theme creates unnecessary shadows" msgstr "" #: target/out/prefPages/widgets.js:260 msgid "Smooth scroll speed" msgstr "" #: target/out/prefPages/widgets.js:261 msgid "Adjust trackpad and trackpoint scroll speed, negative number for invert direction" msgstr "" #: target/out/prefPages/widgets.js:271 msgid "Notifications Widget" msgstr "" #: target/out/prefPages/widgets.js:276 msgid "Turn on to make the notifications widget visible on the Quick Settings panel" msgstr "" #: target/out/prefPages/widgets.js:281 msgid "Make notifications smaller" msgstr "" #: target/out/prefPages/widgets.js:287 target/out/prefPages/widgets.js:418 msgid "Max height" msgstr "最大高度" #: target/out/prefPages/widgets.js:288 #, javascript-format msgid "Set maximum height of the Notifications widget, default is %d. Set this to 0 to disable max height" msgstr "" #: target/out/prefPages/widgets.js:296 target/out/prefPages/widgets.js:441 msgid "Fade out offset" msgstr "" #: target/out/prefPages/widgets.js:297 target/out/prefPages/widgets.js:442 msgid "Set position of the fade out effect begins. Set this to 0 to disable fade out effect. default is 46" msgstr "" #: target/out/prefPages/widgets.js:304 msgid "Auto hide" msgstr "" #: target/out/prefPages/widgets.js:305 msgid "Hide the Notifications widget when have no notifications" msgstr "当没有通知时,隐藏通知组件" #: target/out/prefPages/widgets.js:311 msgid "Use native controls" msgstr "使用原始风格控制" #: target/out/prefPages/widgets.js:312 msgid "Use native dnd switch and clear button" msgstr "使用原始风格免打扰控制开关及清除按钮" #: target/out/prefPages/widgets.js:319 msgid "" "Remove shadow from notification message\n" "Use if your theme creates unnecessary shadows" msgstr "" #: target/out/prefPages/widgets.js:325 target/out/prefPages/widgets.js:427 msgid "Show scrollbar" msgstr "" #: target/out/prefPages/widgets.js:326 msgid "Show scrollbar on message list" msgstr "" #: target/out/prefPages/widgets.js:334 msgid "Weather Widget" msgstr "" #: target/out/prefPages/widgets.js:339 msgid "Turn on to make the weather widget visible on the Quick Settings panel" msgstr "" #: target/out/prefPages/widgets.js:344 msgid "Make weather widget smaller" msgstr "" #: target/out/prefPages/widgets.js:351 msgid "" "Remove shadow from weather widget\n" "Use if your theme creates unnecessary shadows" msgstr "" #: target/out/prefPages/widgets.js:357 msgid "Click command" msgstr "" #: target/out/prefPages/widgets.js:363 msgid "Show location" msgstr "" #: target/out/prefPages/widgets.js:364 msgid "Show the location label on header" msgstr "" #: target/out/prefPages/widgets.js:373 msgid "Forecast interval" msgstr "" #: target/out/prefPages/widgets.js:374 msgid "Adjust forecast interval in hour" msgstr "" #: target/out/prefPages/widgets.js:381 msgid "Max forecasts" msgstr "" #: target/out/prefPages/widgets.js:382 msgid "Adjust max forecasts" msgstr "" #: target/out/prefPages/widgets.js:388 target/out/prefPages/widgets.js:456 msgid "Volume mixer Widget" msgstr "" #: target/out/prefPages/widgets.js:393 msgid "Turn on to make the volume mixer widget visible on the Quick Settings panel" msgstr "" #: target/out/prefPages/widgets.js:397 msgid "Label text" msgstr "" #: target/out/prefPages/widgets.js:398 msgid "Choose label above slider text source" msgstr "" #: target/out/prefPages/widgets.js:400 msgid "Both" msgstr "" #: target/out/prefPages/widgets.js:401 msgid "Title" msgstr "" #: target/out/prefPages/widgets.js:402 msgid "Description" msgstr "" #: target/out/prefPages/widgets.js:403 msgid "None" msgstr "" #: target/out/prefPages/widgets.js:411 msgid "Label opacity" msgstr "" #: target/out/prefPages/widgets.js:412 msgid "" "Adjust label opacity.\n" "Set this to 255 to make opaque, and 0 to make transparent" msgstr "" #: target/out/prefPages/widgets.js:419 #, javascript-format msgid "Set maximum height of the Volume mixer widget, default is %d. Set this to 0 to disable max height" msgstr "" #: target/out/prefPages/widgets.js:428 msgid "Show scrollbar on mixer list" msgstr "" #: target/out/prefPages/widgets.js:434 msgid "Show stream icon" msgstr "" #: target/out/prefPages/widgets.js:435 msgid "Show stream icon above mixer sliders" msgstr "" #: target/out/prefPages/widgets.js:450 target/out/prefPages/widgets.js:458 msgid "Attach to output slider" msgstr "" #: target/out/prefPages/widgets.js:451 target/out/prefPages/widgets.js:459 msgid "Attach volume mixer menu button to output slider. Use if you prefer compact layout" msgstr "" #: target/out/prefPages/widgets.js:468 msgid "Menu icon" msgstr "" #: target/out/prefPages/about.js:12 target/out/prefPages/about.js:32 msgid "About" msgstr "关于" #: target/out/prefPages/about.js:33 msgid "Common extension informations" msgstr "" #: target/out/prefPages/about.js:36 target/out/prefPages/about.js:40 msgid "Changelogs" msgstr "" #: target/out/prefPages/about.js:37 target/out/prefPages/about.js:41 msgid "View the change history for this extension" msgstr "" #: target/out/prefPages/about.js:50 target/out/prefPages/about.js:57 msgid "License of codes" msgstr "" #: target/out/prefPages/about.js:63 target/out/prefPages/about.js:65 #: target/out/prefPages/about.js:69 msgid "Contributors" msgstr "" #: target/out/prefPages/about.js:64 target/out/prefPages/about.js:70 msgid "The creators of this extension" msgstr "本拓展的主要开发者" #: target/out/prefPages/about.js:74 msgid "More contributors" msgstr "" #: target/out/prefPages/about.js:75 msgid "See more contributors on github" msgstr "" #: target/out/prefPages/about.js:85 msgid "Link" msgstr "" #: target/out/prefPages/about.js:86 msgid "External links about this extension" msgstr "" #: target/out/prefPages/about.js:90 msgid "Donate via github sponsors" msgstr "" #: target/out/prefPages/about.js:91 msgid "Support development!" msgstr "支持开发工作!" #: target/out/prefPages/about.js:97 msgid "Rate and comment the extension!" msgstr "对本拓展进行评分及评论!" #: target/out/prefPages/about.js:102 msgid "Github Repository" msgstr "GitHub 代码仓库" #: target/out/prefPages/about.js:103 msgid "" "Add Star on Repository is helping me a lot!\n" "Please, if you found bug from this extension, you can make issue to make me know that!\n" "Or, you can create PR with wonderful features!" msgstr "" "欢迎为本代码仓库添加星标!\n" "如果你在使用本拓展的过程中发现任何问题,你可以提交 Issue 来让我了解详情!\n" "或者,你也可以提交 PR 来增加更多的功能!" #: target/out/prefPages/about.js:109 msgid "Add translation to this extension!" msgstr "将本拓展翻译为其他语言!" #: target/out/prefPages/about.js:115 msgid "Debug" msgstr "" #: target/out/prefPages/about.js:116 msgid "Extension debugging options" msgstr "" #: target/out/prefPages/about.js:120 msgid "Expose environment" msgstr "" #: target/out/prefPages/about.js:121 msgid "Expose extension environment to globalThis.qst" msgstr "" #: target/out/prefPages/about.js:126 msgid "Show layout border" msgstr "" #: target/out/prefPages/about.js:127 msgid "Show layout borders on Quick Settings" msgstr "" #: target/out/prefPages/about.js:132 msgid "Log level" msgstr "" #: target/out/prefPages/about.js:135 msgid "none" msgstr "" #: target/out/prefPages/about.js:136 msgid "error" msgstr "" #: target/out/prefPages/about.js:137 msgid "info" msgstr "" #: target/out/prefPages/about.js:138 msgid "debug" msgstr "" #: target/out/prefPages/toggles.js:12 msgid "Toggles" msgstr "" #: target/out/prefPages/toggles.js:19 msgid "DND Quick Toggle" msgstr "免打扰快捷开关" #: target/out/prefPages/toggles.js:20 msgid "Turn on to add the DND quick toggle on the Quick Settings panel" msgstr "" #: target/out/prefPages/toggles.js:28 msgid "DND indicator position" msgstr "" #: target/out/prefPages/toggles.js:29 msgid "Set DND indicator position" msgstr "" #: target/out/prefPages/toggles.js:33 msgid "System Tray" msgstr "" #: target/out/prefPages/toggles.js:34 msgid "Date Menu Button" msgstr "" #: target/out/prefPages/toggles.js:41 msgid "Unsafe Mode Quick Toggle" msgstr "不安全模式快捷开关" #: target/out/prefPages/toggles.js:42 msgid "Turn on to add the unsafe quick toggle on the Quick Settings panel" msgstr "" #: target/out/prefPages/toggles.js:50 msgid "Save last session state" msgstr "" #: target/out/prefPages/toggles.js:51 msgid "Turn on to save last session unsafe state" msgstr "" #: target/out/prefPages/menu.js:9 target/out/prefPages/menu.js:141 msgid "Advanced animation style" msgstr "" #: target/out/prefPages/menu.js:13 msgid "Open Duration" msgstr "" #: target/out/prefPages/menu.js:14 msgid "Open animation duration in microseconds" msgstr "" #: target/out/prefPages/menu.js:21 msgid "Close Duration" msgstr "" #: target/out/prefPages/menu.js:22 msgid "Close animation duration in microseconds" msgstr "" #: target/out/prefPages/menu.js:29 msgid "Grid Content Opacity" msgstr "" #: target/out/prefPages/menu.js:30 msgid "" "Adjust grid content opacity.\n" "Set this to 255 to make opaque, and 0 to make transparent" msgstr "" #: target/out/prefPages/menu.js:37 msgid "Background Blur Radius" msgstr "" #: target/out/prefPages/menu.js:38 msgid "" "Adjust background blur radius.\n" "Set this to 0 to disable blur effect" msgstr "" #: target/out/prefPages/menu.js:45 msgid "Background Brightness" msgstr "" #: target/out/prefPages/menu.js:46 msgid "" "Adjust background brightness.\n" "Set this to 1000 to disable brightness control effect.\n" "Not impacts on gnome-shell's default dim effect." msgstr "" #: target/out/prefPages/menu.js:53 msgid "Background Opacity" msgstr "" #: target/out/prefPages/menu.js:54 msgid "" "Adjust background opacity.\n" "Set this to 255 to make opaque, and 0 to make transparent" msgstr "" #: target/out/prefPages/menu.js:61 msgid "Background X Scale" msgstr "" #: target/out/prefPages/menu.js:62 msgid "Adjust background x scale, 1000 means 1.0 scale" msgstr "" #: target/out/prefPages/menu.js:69 msgid "Background Y Scale" msgstr "" #: target/out/prefPages/menu.js:70 msgid "Adjust background y scale, 1000 means 1.0 scale" msgstr "" #: target/out/prefPages/menu.js:84 msgid "Menu" msgstr "" #: target/out/prefPages/menu.js:91 msgid "Overlay Mode" msgstr "" #: target/out/prefPages/menu.js:92 msgid "Display toggle, power, and sound menus as overlay" msgstr "" #: target/out/prefPages/menu.js:101 msgid "Overlay Width" msgstr "" #: target/out/prefPages/menu.js:102 msgid "" "Adjust overlay menu width\n" "Set this to 0 to disable adjusting" msgstr "" #: target/out/prefPages/menu.js:109 msgid "Overlay Animation Duration" msgstr "" #: target/out/prefPages/menu.js:110 msgid "" "Custom menu open animation duration in microseconds\n" "Set this to 0 to disable custom animation" msgstr "" #: target/out/prefPages/menu.js:117 msgid "Overlay Animation Style" msgstr "" #: target/out/prefPages/menu.js:118 msgid "Custom menu open animation style" msgstr "" #: target/out/prefPages/menu.js:120 msgid "Flyout" msgstr "" #: target/out/prefPages/menu.js:121 msgid "Dialog" msgstr "" #: target/out/prefPages/menu.js:130 target/out/prefPages/menu.js:143 msgid "Animation" msgstr "" #: target/out/prefPages/menu.js:131 msgid "" "Add menu animation on toggle menu opening and closing\n" "To get the best feel, turn on overlay mode" msgstr "" #: target/out/prefPages/menu.js:142 msgid "Adjust speed, blur, scale, and opacity" msgstr "" #: target/out/prefPages/layout.js:25 msgid "The item not found" msgstr "" #: target/out/prefPages/layout.js:28 msgid "No changes" msgstr "" #: target/out/prefPages/layout.js:31 msgid "The same item already exists" msgstr "" #: target/out/prefPages/layout.js:40 #, javascript-format msgid "Properties of %s" msgstr "" #: target/out/prefPages/layout.js:47 msgid "Save" msgstr "" #: target/out/prefPages/layout.js:64 msgid "Toggle editor" msgstr "" #: target/out/prefPages/layout.js:84 msgid "This option requires full gnome-shell reloading" msgstr "" #: target/out/prefPages/layout.js:160 target/out/prefPages/layout.js:278 #: target/out/prefPages/layout.js:437 target/out/prefPages/layout.js:672 msgid "Hide" msgstr "" #: target/out/prefPages/layout.js:232 #, javascript-format msgid "My item #%d" msgstr "" #: target/out/prefPages/layout.js:250 msgid "New Item" msgstr "" #: target/out/prefPages/layout.js:261 target/out/prefPages/layout.js:610 #: target/out/prefPages/layout.js:737 target/out/prefPages/layout.js:787 #: target/out/prefPages/layout.js:813 msgid "Ordering and Hiding" msgstr "" #: target/out/prefPages/layout.js:273 target/out/prefPages/layout.js:432 msgid "Friendly Name" msgstr "" #: target/out/prefPages/layout.js:283 msgid "Title Regex (Javascript Regex)" msgstr "" #: target/out/prefPages/layout.js:288 target/out/prefPages/layout.js:442 msgid "Constructor Name" msgstr "" #: target/out/prefPages/layout.js:294 target/out/prefPages/layout.js:448 msgid "GType Name" msgstr "" #: target/out/prefPages/layout.js:302 target/out/prefPages/layout.js:456 msgid "This is the comment for easy identification in the settings list. It has no effect on the behavior of the extension" msgstr "" #: target/out/prefPages/layout.js:307 target/out/prefPages/layout.js:461 msgid "Javascript constructor name" msgstr "" #: target/out/prefPages/layout.js:312 target/out/prefPages/layout.js:466 msgid "GObject gtype name. You can get this value by calling GObject.type_name_from_instance" msgstr "" #: target/out/prefPages/layout.js:342 msgid "Keyboard Backlight" msgstr "" #: target/out/prefPages/layout.js:388 target/out/prefPages/layout.js:538 msgid "Unordered items" msgstr "" #: target/out/prefPages/layout.js:486 msgid "Remote Access Applet" msgstr "" #: target/out/prefPages/layout.js:487 msgid "Camera" msgstr "" #: target/out/prefPages/layout.js:488 msgid "Volume Input" msgstr "" #: target/out/prefPages/layout.js:489 msgid "Location" msgstr "" #: target/out/prefPages/layout.js:490 msgid "Thunderbolt" msgstr "" #: target/out/prefPages/layout.js:492 msgid "Network" msgstr "" #: target/out/prefPages/layout.js:495 msgid "Volume Output" msgstr "" #: target/out/prefPages/layout.js:497 msgid "System (Battery)" msgstr "" #: target/out/prefPages/layout.js:618 msgid "Desktop Spacer" msgstr "" #: target/out/prefPages/layout.js:629 msgid "Laptop Spacer" msgstr "" #: target/out/prefPages/layout.js:641 msgid "Capture button" msgstr "" #: target/out/prefPages/layout.js:647 msgid "Settings button" msgstr "" #: target/out/prefPages/layout.js:653 msgid "Lock button" msgstr "" #: target/out/prefPages/layout.js:659 msgid "Shutdown button" msgstr "" #: target/out/prefPages/layout.js:665 msgid "Battery button" msgstr "" #: target/out/prefPages/layout.js:711 msgid "Layout" msgstr "" #: target/out/prefPages/layout.js:718 msgid "Quick Toggles Layout" msgstr "" #: target/out/prefPages/layout.js:719 target/out/prefPages/layout.js:734 msgid "Adjust quick toggles layout" msgstr "" #: target/out/prefPages/layout.js:738 msgid "Reorder and hide quick toggles" msgstr "" #: target/out/prefPages/layout.js:745 msgid "System Indicators" msgstr "" #: target/out/prefPages/layout.js:746 msgid "Adjust system indicators layout and style" msgstr "" #: target/out/prefPages/layout.js:751 msgid "Accent screen sharing indicator" msgstr "" #: target/out/prefPages/layout.js:752 msgid "Use shell accent color on screen sharing indicator" msgstr "" #: target/out/prefPages/layout.js:757 msgid "Accent screen recording indicator" msgstr "" #: target/out/prefPages/layout.js:758 msgid "Use shell accent color on screen recording indicator" msgstr "" #: target/out/prefPages/layout.js:763 msgid "Privacy indicators style" msgstr "" #: target/out/prefPages/layout.js:764 msgid "Use monochrome or shell accent color on privarcy indicators" msgstr "" #: target/out/prefPages/layout.js:767 msgid "Accent" msgstr "" #: target/out/prefPages/layout.js:768 msgid "Monochrome" msgstr "" #: target/out/prefPages/layout.js:777 msgid "Adjust system indicators" msgstr "" #: target/out/prefPages/layout.js:788 msgid "Reorder and hide system indicators" msgstr "" #: target/out/prefPages/layout.js:795 msgid "System Items Layout" msgstr "" #: target/out/prefPages/layout.js:800 target/out/prefPages/layout.js:815 msgid "Adjust system items layout" msgstr "" #: target/out/prefPages/layout.js:804 msgid "Hide layout box" msgstr "" #: target/out/prefPages/layout.js:805 msgid "Hide all buttons and layout box" msgstr "" #: target/out/prefPages/layout.js:814 msgid "Reorder and hide system items" msgstr "" #: target/out/prefPages/layout.js:823 msgid "Date Menu" msgstr "" #: target/out/prefPages/layout.js:824 msgid "Adjust Date Menu layout" msgstr "" #: target/out/prefPages/layout.js:828 msgid "Hide left box" msgstr "" #: target/out/prefPages/layout.js:829 msgid "Hide the left box of the date menu, which contains notifications and media control" msgstr "" #: target/out/prefPages/layout.js:834 msgid "Hide right box" msgstr "" #: target/out/prefPages/layout.js:835 msgid "Hide the right box of the date menu, which contains calendar, world clock and weather" msgstr "" #: target/out/prefPages/layout.js:840 msgid "Disable menu" msgstr "" #: target/out/prefPages/layout.js:841 msgid "Do not open date menu when the date menu button clicked" msgstr "" #~ msgid "Donate via patreon" #~ msgstr "在 Patreon 上捐赠" #~ msgid "Set maximum height of the Notifications widget. default is 292" #~ msgstr "设置通知组件的最大高度。默认为 292" #~ msgid "Other" #~ msgstr "其他" #~ msgid "" #~ "Hide notifications on date menu.\n" #~ "*this option removes media control on date menu too*" #~ msgstr "" #~ "隐藏日期菜单中的通知组件。\n" #~ "*此选项也会移除日期菜单中的音乐控制组件*" #~ msgid "Hide media control on date menu." #~ msgstr "隐藏日期菜单中的音乐组件。" #~ msgid "Sound Settings" #~ msgstr "声音设置" #~ msgid "Notification Widget" #~ msgstr "通知组件" #~ msgid "Turn on to make the notification widget visible on the Quick Settings panel" #~ msgstr "启用以令通知组件在快捷控制面板中可见" #~ msgid "Links" #~ msgstr "链接" #~ msgid "Contributor" #~ msgstr "贡献者" #~ msgid "Add Application to filtering" #~ msgstr "添加应用至过滤" #~ msgid "Add" #~ msgstr "添加" #~ msgid "Cancel" #~ msgstr "取消" #~ msgid "Application name" #~ msgstr "应用名称" #~ msgid "General" #~ msgstr "通用" #~ msgid "Enchant input/output slider" #~ msgstr "显示输入/输出滑动控制条" #~ msgid "Show current audio output selection" #~ msgstr "显示当前音频输出选择" #~ msgid "Always show the current audio output selection above the volume slider" #~ msgstr "总是在音量滑动控制条上方显示当前音频输出选择" #~ msgid "Show current audio input selection" #~ msgstr "显示当前音频输入选择" #~ msgid "Always show the current audio input selection above the volume slider" #~ msgstr "总是在音量控制条上方显示当前音频输入选择" #~ msgid "Always show input" #~ msgstr "总是显示输入" #~ msgid "Always show the audio input volume slider, even when there is no audio input stream." #~ msgstr "即使在没有音频输入流的情况下,总是显示音频输入音量滑动控制条。" #~ msgid "Add volume mixer (PulseAudio, Pipewire)" #~ msgstr "添加音量混合器(PulseAudio、Pipewire)" #~ msgid "" #~ "Turn on to make the volume mixer visible\n" #~ "Forked from https://github.com/mymindstorm/gnome-volume-mixer" #~ msgstr "" #~ "启用以令音量混合器可见\n" #~ "Fork 自 https://github.com/mymindstorm/gnome-volume-mixer" #~ msgid "Position" #~ msgstr "位置" #~ msgid "Set volume mixer position" #~ msgstr "设置音量混合器位置" #~ msgid "Top (Below Output/Input slider)" #~ msgstr "顶端(位于输入/输出滑动控制条底部)" #~ msgid "Show stream Description" #~ msgstr "显示音频流描述" #~ msgid "Show audio stream description above the slider" #~ msgstr "在滑动控制条上方显示音频流描述" #~ msgid "Show stream Icon" #~ msgstr "显示音频流图标" #~ msgid "Show application icon in front of the slider" #~ msgstr "在滑动控制条前显示应用图标" #~ msgid "Filter applications shown in the volume mixer." #~ msgstr "过滤音量混合器中可见的应用。" #~ msgid "Filter Mode" #~ msgstr "过滤模式" #~ msgid "Blacklist" #~ msgstr "黑名单" #~ msgid "Whitelist" #~ msgstr "白名单" #~ msgid "Using Javascript Regex" #~ msgstr "使用 JavaScript 正则表达式" #~ msgid "Use Javascript RegExp for filtering app name or description" #~ msgstr "使用 JavaScript 正则表达式以过滤应用名称或描述" #~ msgid "Check Stream Description" #~ msgstr "检查音频流描述" #~ msgid "Check Description also" #~ msgstr "同时检查描述" #~ msgid "Add more buttons" #~ msgstr "增加更多按钮" #~ msgid "Turn on the buttons you want to add on Quick Settings" #~ msgstr "启用需添加至快捷控制面板的按钮" #~ msgid "Turn on to make the DND quick toggle visible on the Quick Settings panel" #~ msgstr "开启以令免打扰快捷开关在快捷控制面板中可见" #~ msgid "Turn on to make the unsafe quick toggle visible on the Quick Settings panel" #~ msgstr "开启以令不安全模式快捷开关在快捷控制面板中可见" #~ msgid "This extension is distributed with license GPL 3+" #~ msgstr "此拓展以 GPL 3+ 协议进行分发" #~ msgid "excludes Third-party. Third party codes follow their license" #~ msgstr "除第三方外。第三方代码遵循其协议" #~ msgid "Extension Version" #~ msgstr "拓展版本" #~ msgid "Unknown (Built from source)" #~ msgstr "未知(编译自源代码)" #~ msgid "Third party LICENSE" #~ msgstr "第三方协议" #~ msgid "LICENSE OF CODES WHICH USED ON THIS EXTENSION" #~ msgstr "本拓展使用的代码协议" #~ msgid "Media Controls widget" #~ msgstr "音频控制组件" #~ msgid "Turn on to make the Media Control widget visible on the Quick Settings panel" #~ msgstr "启用以令音频控制组件在快捷控制面板中可见" #~ msgid "Compact Mode" #~ msgstr "紧凑模式" #~ msgid "Auto Hide" #~ msgstr "自动隐藏" #~ msgid "Quick Toggles" #~ msgstr "快捷开关" #~ msgid "Fix Weather Widget Overflow" #~ msgstr "修复天气组件溢出" #~ msgid "Fix overflow visual bug of weather widget in datemenu" #~ msgstr "修复天气组件在日期菜单中的视觉溢出问题" #~ msgid "Remove Notifications On Date Menu" #~ msgstr "移除日期菜单中的通知组件" #~ msgid "Remove Media Control On Date Menu" #~ msgstr "移除日期菜单中的音乐控制组件" #~ msgid "Do not adjust the border radius of contents." #~ msgstr "不要调整组件的边框圆角弧度。" #~ msgid "Don't adjust the border of messages and media controls." #~ msgstr "不要调整通知与音乐控制组件的边框。" #~ msgid "Do not remove the shadow of contents." #~ msgstr "不要移除组件的阴影。" #~ msgid "Don't remove the shadow of messages and media controls." #~ msgstr "不要移除通知与音乐控制组件的阴影。" #~ msgid "Set Notifications widget position" #~ msgstr "设置通知组件位置" #~ msgid "Buttons to remove" #~ msgstr "欲移除的按钮" #~ msgid "Turn on the buttons you want to remove from Quick Settings" #~ msgstr "启用欲从快捷控制面板中移除的按钮" #~ msgid "Remove chosen buttons from quick panel" #~ msgstr "从快捷控制面板中移除所选按钮" #~ msgid "Forked from my extension https://github.com/qwreey75/gnome-quick-settings-button-remover" #~ msgstr "Fork 此拓展 https://github.com/qwreey75/gnome-quick-settings-button-remover" #~ msgid "This feature is unstable sometime" #~ msgstr "此功能可能不稳定" #~ msgid "" #~ "When lock/unlock with gnome-screensaver, unexpected behavior occurs\n" #~ "Please do not report issue about known issue, Almost duplicated\n" #~ "Known issue:\n" #~ " button doesn't remove after lockscreen\n" #~ " modal get bigger after lockscreen" #~ msgstr "" #~ "当 gnome-screensaver 启用或解锁时,会产生不可预期的行为\n" #~ "请不要报告已知或几乎重复的问题\n" #~ "已知问题:\n" #~ " 按钮在解锁后不移除\n" #~ " 组件在解锁后变大" #~ msgid "Please turn off if some bug occurred" #~ msgstr "如果发生了一些问题,请关闭计算机" #~ msgid "Unknown" #~ msgstr "未知" #~ msgid "" #~ "Do not separate Quick Settings and Notifications widgets, \byou should enable this option because separated panels can make many visual bugs\n" #~ "(such as margin or padding not matching with the theme)" #~ msgstr "" #~ "不要分离快捷控制面板与通知组件,\\b建议启用此选项,因为分离面板可能造成许多视觉问题\n" #~ "(例如边框距离与主题样式不匹配)" ================================================ FILE: schemas/org.gnome.shell.extensions.quick-settings-tweaks.gschema.xml ================================================ false false 0 true true false true true 292 46 true true true true true true true true 230 true false [ 0, 0, 0, 0 ] true 'slim' [] 0 [] [] 0 true true [127,127,127] 340 820 160 180 16 true false true true '' true 5 1 true true "both" 220 true true 0 46 , 'nameRegex': , 'description': , 'descriptionRegex': , 'applicationId': , 'applicationIdRegex': }] ]]> , 'nameRegex': , 'description': , 'descriptionRegex': , 'applicationId': , 'applicationIdRegex': }] ]]> , 'nameRegex': , 'description': , 'descriptionRegex': , 'applicationId': , 'applicationIdRegex': }] ]]> 'block' true 'open-menu-symbolic' true true false false false false false false false false false ['battery', 'laptopSpacer', 'screenshot', 'settings', 'desktopSpacer', 'lock', 'shutdown'] 'default' false false false , 'hide': }, { 'hide': , 'isSystem': , 'gtypeName': <'Gjs_toggle_dndQuickToggle_DndIndicator'> }, { 'hide': , 'isSystem': , 'gtypeName': <'Gjs_status_remoteAccess_RemoteAccessApplet'> }, { 'hide': , 'isSystem': , 'gtypeName': <'Gjs_status_camera_Indicator'> }, { 'hide': , 'isSystem': , 'gtypeName': <'Gjs_status_volume_InputIndicator'> }, { 'hide': , 'isSystem': , 'gtypeName': <'Gjs_status_location_Indicator'> }, { 'hide': , 'isSystem': , 'gtypeName': <'Gjs_status_thunderbolt_Indicator'> }, { 'hide': , 'isSystem': , 'gtypeName': <'Gjs_status_nightLight_Indicator'> }, { 'hide': , 'isSystem': , 'gtypeName': <'Gjs_status_network_Indicator'> }, { 'hide': , 'isSystem': , 'gtypeName': <'Gjs_status_bluetooth_Indicator'> }, { 'hide': , 'isSystem': , 'gtypeName': <'Gjs_status_rfkill_Indicator'> }, { 'hide': , 'isSystem': , 'gtypeName': <'Gjs_status_volume_OutputIndicator'> }, { 'hide': , 'isSystem': , 'gtypeName': <'Gjs_ui_panel_UnsafeModeIndicator'> }, { 'hide': , 'isSystem': , 'gtypeName': <'Gjs_status_system_Indicator'> } ] ]]> , constructorName: , friendlyName: , nonOrdered: , isSystem: , hide: }] ]]> false false false 'open-menu-symbolic' 'open-menu-symbolic' false , 'isSystem': , 'constructorName': <'NMWiredToggle'> }, { 'hide': , 'isSystem': , 'constructorName': <'NMWirelessToggle'> }, { 'hide': , 'isSystem': , 'constructorName': <'NMModemToggle'> }, { 'hide': , 'isSystem': , 'constructorName': <'NMBluetoothToggle'> }, { 'hide': , 'isSystem': , 'constructorName': <'NMVpnToggle'> }, { 'hide': , 'isSystem': , 'constructorName': <'BluetoothToggle'> }, { 'hide': , 'isSystem': , 'constructorName': <'PowerProfilesToggle'> }, { 'hide': , 'isSystem': , 'constructorName': <'NightLightToggle'> }, { 'hide': , 'isSystem': , 'constructorName': <'DarkModeToggle'> }, { 'hide': , 'isSystem': , 'constructorName': <'DoNotDisturbToggle'> }, { 'hide': , 'isSystem': , 'constructorName': <'KeyboardBrightnessToggle'> }, { 'hide': , 'isSystem': , 'constructorName': <'RfkillToggle'> }, { 'hide': , 'isSystem': , 'constructorName': <'RotationToggle'> }, { 'hide': , 'isSystem': , 'constructorName': <'DndQuickToggle'> }, { 'hide': , 'isSystem': , 'constructorName': <'UnsafeQuickToggle'> }, { 'nonOrdered': , 'hide': } ] ]]> , constructorName: , titleRegex: , friendlyName: , nonOrdered: , isSystem: , hide: }] ]]> false false true false 4 900 220 100 920 920 380 380 false 380 360 'dialog' { 'weather-widget': [0, 0], 'notifications-widget': [0, 0], 'media-widget': [0, 0], 'mixer-widget': [0, 0] } 'top' ================================================ FILE: scripts/contributor-labels.json ================================================ { "qwreey": "Owner", "DaPigGuy": "Gnome 45 Port", "Leleat": "Style & Code\nimprove", "kgdn": "Gnome 45 Port", "DodoLeDev": "Readme & Code\nimprove", "andia89": "Code improve", "DanGLES3": "Portuguese\ntranslation", "jcatfor": "Catalan\ntranslation", "ondra05": "Czech\ntranslation", "daudix": "Russian\ntranslation", "JohnOberhauser": "Audio\nInput/Output", "314eter": "Bug fix\nCode improve", "Tuba2": "Portuguese\ntranslation", "mechtifs": "Chinese Simplified\ntranslation", "MrXvnov": "Russian\ntranslation", "ryzendew": "Gnome 47 Port", "prapooskur": "Gnome 46 Port", "alewicki95": "Polish\ntranslation", "nulta": "Korean\ntranslation" } ================================================ FILE: scripts/reindent.js ================================================ import { promises as fs } from "fs" function getItems() { let allowed = false const items = process.argv.filter(item => { if (allowed) return true if (item == "--") allowed = true return false }) return items } async function main() { await Promise.all(getItems().map(item => fs.readFile(`./${item}`, { encoding: "utf-8" }) .then(content => content.replaceAll(/[^\n]*/g, substr => substr.replace( /^ */, indent => "\t".repeat(Math.floor(indent.length / 4)) ) )) .then(fs.writeFile.bind(fs, item)) )) } main() ================================================ FILE: scripts/version/gnome-docker-version ================================================ 1.0.3 ================================================ FILE: scripts/version/latest-build-number ================================================ 9 ================================================ FILE: scripts/version/latest-middle-version ================================================ 2 ================================================ FILE: scripts/version/latest-minor-version ================================================ 1 ================================================ FILE: scripts/version/major-version ================================================ 2 ================================================ FILE: src/ambient.d.ts ================================================ // Provide missing types declare global { export interface EasingParams { repeatCount?: number autoReverse?: boolean animationRequired?: boolean duration?: number delay?: number mode?: Clutter.AnimationMode | any } export type EasingParamsWithProps = EasingParams & { [key: string]: any } } declare module "gi://GWeather" { import GObject from "gi://GObject" class Info extends GObject.Object { static store_cache(): void constructor(location: Location) abort(): void get_apparent(): string /// Get the application ID of the application fetching the weather /** @returns { string } the application ID */ get_application_id(): string /// Some weather services require the application showing the data to include an attribution text, possibly including links to the service website. /// This must be shown prominently toghether with the data. /** @returns { string } the required attribution text, in Pango markup form, or null if not required */ get_attribution(): string get_conditions(): string /// Get the contact information of the application fetching the weather. /** @returns { string } the contact information */ get_contact_info(): string get_dew(): string /// Gets the bitmask of enabled GWeather.Provider weather providers. get_enabled_providers(): Provider /** * @returns {Info[]} * list of GWeatherInfo* objects for the forecast. * The list is owned by the 'info' object thus is alive as long as the 'info'. * The 'update' property is the date/time when the forecast info is used for. */ get_forecast_list(): Info[] get_humidity(): string get_icon_name(): string get_location(): Location get_location_name(): string get_pressure(): string get_sky(): string get_sunrise(): string get_sunset(): string get_symbolic_icon_name(): string get_temp(): string get_temp_max(): string get_temp_min(): string get_temp_summary(): string get_upcoming_moonphases(phases: number): boolean get_update(): string /** @param { TemperatureUnit } unit the desired unit, as a GWeather.TemperatureUnit */ /** * @returns {[boolean, number]} * ok - TRUE is value is valid, FALSE otherwise * * value - the apparent temperature */ get_value_apparent(unit: TemperatureUnit): [boolean, number] /// Fills out phenomenon and qualifier with current weather conditions. /** * @returns {[boolean, GWeather.ConditionPhenomenon, GWeather.ConditionQualifier]} * ok - TRUE is out arguments are valid, FALSE otherwise. * * phenomenon - a location for a GWeather.ConditionPhenomenon. * * qualifier - a location for a GWeather.ConditionQualifier. */ get_value_conditions(): [boolean, ConditionPhenomenon, ConditionQualifier] /** * @returns {[boolean, number]} * ok - TRUE is value is valid, FALSE otherwise. * * value - the dew point */ get_value_dew(unit: TemperatureUnit): [boolean, number] /** * @returns {[boolean, MoonPhase, MoonLatitude]} * ok - TRUE is value is valid, FALSE otherwise. * * value - the current moon phase * * lat - the moon declension */ get_value_moonphase(): [boolean, MoonPhase, MoonLatitude] /** @param {PressureUnit} unit the desired unit, as a GWeather.PressureUnit */ /** * @returns {[boolean, number]} * ok - TRUE if value is valid, FALSE otherwise. * * value - forecasted pressure, expressed in unit */ get_value_pressure(unit): [boolean, number] /** * @returns {[boolean, Sky]} * ok - TRUE is sky is valid, FALSE otherwise. * * sky - a location for a GWeather.Sky. */ get_value_sky(): [boolean, Sky] /** * @returns {[boolean, number]} * ok - TRUE is value is valid, FALSE otherwise. * * value - the time of sunrise */ get_value_sunrise(): [boolean, number] /** * @returns {[boolean, number]} * ok - TRUE is value is valid, FALSE otherwise. * * value - the time of sunset */ get_value_sunset(): [boolean, number] /** @param {TemperatureUnit} unit the desired unit, as a GWeather.TemperatureUnit */ /** * @returns {[boolean, number]} * ok - TRUE is value is valid, FALSE otherwise. * * value - the temperature value */ get_value_temp(unit: TemperatureUnit): [boolean, number] /** @param {GWeather.TemperatureUnit} unit the desired unit, as a GWeather.TemperatureUnit */ /** * @returns {[boolean, number]} * ok - TRUE is value is valid, FALSE otherwise. * * value - the maximum temperature value */ get_value_temp_max(unit: TemperatureUnit): [boolean, number] /** @param {GWeather.TemperatureUnit} unit the desired unit, as a GWeather.TemperatureUnit */ /** * @returns {[boolean, number]} * ok - TRUE is value is valid, FALSE otherwise. * * value - the minimum temperature value */ get_value_temp_min(unit: TemperatureUnit): [boolean, number] /// Note that value may be 0 if this has not yet been updated. /** * @returns {[boolean, number]} * ok - TRUE is value is valid, FALSE otherwise. * * value - the time this was last updated */ get_value_update(): [boolean, number] /** @param {GWeather.DistanceUnit} unit the desired unit, as a GWeather.DistanceUnit */ /** * @returns {[boolean, number]} * ok - TRUE if value is valid, FALSE otherwise. * * value - forecasted visibility, expressed in unit */ get_value_visibility(unit: DistanceUnit): [boolean, number] /** @param {GWeather.SpeedUnit} unit the desired unit, as a GWeather.SpeedUnit */ /** * @returns {[boolean, number, GWeather.WindDirection]} * ok - TRUE if speed and direction are valid, FALSE otherwise. * * speed - forecasted wind speed * * direction - forecasted wind direction */ get_value_wind(unit: SpeedUnit): [boolean, number, WindDirection] get_visibility(): string /** @returns {string} a summary for current weather conditions. */ get_weather_summary(): string get_wind(): string /** * @returns {boolean} * Whether it is daytime (that is, if the sun is visible) or not at the location and the point of time referred by this. * * This is mostly equivalent to comparing the return value of GWeather.Info.get_value_sunrise and GWeather.Info.get_value_sunset, but it accounts also for midnight sun and polar night, for locations within the Artic and Antartic circles. */ is_daytime(): boolean is_valid(): boolean network_error(): boolean next_sun_event(): number /// Sets the application ID of the application fetching the weather. /// It is a requirement for using any of the online weather providers. /// /// If the application uses Gio.Application, then the application ID will be automatically filled in. /** @param {string} application_id the application ID to set set_application_id(application_id: string): void /// Sets the contact information for the application fetching the weather. /// It is a requirement for using any of the online weather providers as it allows API providers to contact application developers in case of terms of use breaches. /// /// The contact information should be an email address, or the full URL to an online contact form which weather providers can use to contact the application developer. Avoid using bug tracker URLs which require creating accounts. /** @param {string} contact_info the contact information for the application */ set_contact_info(contact_info: string): void /// Sets the enabled providers for fetching the weather. /// Note that it is up to the application developer to make sure that the terms of use for each service are respected. /// /// Online providers will not be enabled if the application ID is not set to a valid value. /** @param {GWeather.Provider} providers a bitmask of GWeather.Provider */ set_enabled_providers(providers: Provider): void /// Changes the location of the weather report. /// /// Note that this will clear any forecast or current conditions, and you must call [method@GWeather.Info.update] to obtain the new data. /** @param {GWeather.Location} location a location for which weather is desired */ set_location(location: Location): void /// Requests a reload of weather conditions and forecast data from enabled network services. /// This call does no synchronous IO: rather, the result is delivered by emitting the GWeather.Info.updated signal. /// Note that if no network services are enabled, the signal will not be emitted. See GWeather.Info.enabled-providers for details. update(): void } /// A GWeatherLocation represents a "location" of some type known to libgweather; anything from a single weather station to the entire world. /// /// See [enum@GWeather.LocationLevel] for information about how the hierarchy of locations works. class Location extends GObject.Object { // TODO } /// The current or forecasted significant phenomenon. enum ConditionPhenomenon { DRIZZLE, DUST, DUST_WHIRLS, DUSTSTORM, FOG, FUNNEL_CLOUD, HAIL, HAZE, ICE_CRYSTALS, ICE_PELLETS, INVALID, LAST, MIST, NONE, RAIN, SAND, SANDSTORM, SMALL_HAIL, SMOKE, SNOW, SNOW_GRAINS, SPRAY, SQUALL, TORNADO, UNKNOWN_PRECIPITATION, VOLCANIC_ASH, } /// An additional modifier applied to a GWeather.ConditionPhenomenon to describe the current or forecasted weather conditions. /// /// The exact meaning of each qualifier is described at http://www.weather.com/glossary/ and http://www.crh.noaa.gov/arx/wx.tbl.php enum ConditionQualifier { BLOWING, DRIFTING, FREEZING, HEAVY, INVALID, LAST, LIGHT, MODERATE, NONE, PARTIAL, PATCHES, SHALLOW, SHOWERS, THUNDERSTORM, VICINITY, } enum DistanceUnit { DEFAULT, INVALID, KM, METERS, MILES, } /// The size/scope of a particular [class@GWeather.Location]. /// /// Locations form a hierarchy, with a GWEATHER_LOCATION_WORLD location at the top, divided into regions or countries, and so on. /// /// Countries may or may not be divided into "adm1"s, and "adm1"s may or may not be divided into "adm2"s. /// A city will have at least one, and possibly several, weather stations inside it. /// Weather stations will never appear outside of cities. /// /// Building a database with [func@GWeather.Location.get_world] will never create detached instances, but deserializing might. enum LocationLevel { ADM1, CITY, COUNTRY, DETACHED, NAMED_TIMEZONE, REGION, WEATHER_STATION, WORLD, } namespace LocationLevel { /// Returns the location level as a string, useful for debugging purposes. /** @param {GWeather.LocationLevel} level a GWeather.LocationLevel */ /** @returns {string} a string */ export function to_string(level: LocationLevel): string } /// The measure unit to use for atmospheric pressure values, when retrieved by GWeather.Info.get_value_pressure. enum PressureUnit { ATM, DEFAULT, HPA, INCH_HG, INVALID, KPA, MB, MM_HG, } enum Provider { ALL, IWIN, MET_NO, METAR, NONE, NWS, OWM, } /// The sky and cloud visibility. /// In general it is discouraged to use this value directly to compute the forecast icon: applications should instead use GWeather.Info.get_icon_name or GWeather.Info.get_symbolic_icon_name. enum Sky { BROKEN, CLEAR, FEW, INVALID, LAST, OVERCAST, SCATTERED, } namespace Sky { export function to_string(sky: Sky): string export function to_string_full(sky: Sky, options: {[key: string]: any}): string } /// The measure unit to use for wind speed values, when retrieved by GWeather.Info.get_value_wind. enum SpeedUnit { BFT, DEFAULT, INVALID, KNOTS, KPH, MPH, MS, } namespace SpeedUnit { /** @param {GWeather.SpeedUnit} unit a speed unit, or GWeather.SpeedUnit.DEFAULT */ export function to_string(unit: SpeedUnit): string } /// The measure unit to use for temperature values, when retrieved by the GWeather.Info.get_value_temp family of functions. enum TemperatureUnit { CENTIGRADE, DEFAULT, FAHRENHEIT, INVALID, KELVIN, } namespace TemperatureUnit { /** @param {GWeather.TemperatureUnit} unit a tempeature unit, or GWeather.TemperatureUnit.DEFAULT */ export function to_real(unit: TemperatureUnit): TemperatureUnit } /// The direction of the prevailing wind. /// Composite values such as north-north-east indicate a direction between the two component value (north and north-east). enum WindDirection { E, ENE, ESE, INVALID, LAST, N, NE, NNE, NNW, NW, S, SE, SSE, SSW, SW, VARIABLE, W, WNW, WSW, } namespace WindDirection { export function to_string(wind: WindDirection): string export function to_string_full(wind: WindDirection, options: {[key: string]: any}): string } } declare module "resource:///org/gnome/shell/ui/pageIndicators.js" { import St from "gi://St" import Clutter from "gi://Clutter" export class PageIndicators extends St.BoxLayout { constructor(orientation: Clutter.Orientation) connect(id: string, callback: (...args: any[]) => any): number; connect_after(id: string, callback: (...args: any[]) => any): number; connect(sigName: 'page-activated', callback: ($obj: PageIndicators, page: number) => void): number connect_after(sigName: 'page-activated', callback: ($obj: PageIndicators, page: number) => void): number setReactive(reactive: boolean): void setNPages(nPages: number): void setCurrentPosition(currentPosition: number): void readonly nPages: number } } declare module "resource:///org/gnome/shell/misc/weather.js" { import Signals from "resource:///org/gnome/shell/misc/signals.js" import GWeather from "gi://GWeather" export class WeatherClient extends Signals.EventEmitter { readonly available: boolean readonly loading: boolean readonly hasLocation: boolean readonly info: GWeather.Info activateApp(): void update(): void } } ================================================ FILE: src/config.ts ================================================ export default { isDevelopmentBuild: false, isReleaseBuild: false, isGithubBuild: false, version: "unknown", buildNumber: 0, baseGTypeName: "quick-settings-tweaks_", loggerPrefix: "[quick-settings-tweaks]", } ================================================ FILE: src/extension.ts ================================================ /** * Viewer Note: * stylesheet and javascript files are compiled from scss and typescript. * To modify this extension, please check original source-codes from repository * https://github.com/qwreey/quick-settings-tweaks */ import { Extension } from "resource:///org/gnome/shell/extensions/extension.js" import Logger from "./libs/shared/logger.js" import Global from "./global.js" import Config from "./config.js" import { type FeatureBase } from "./libs/shell/feature.js" import { UnsafeQuickToggleFeature } from "./features/toggle/unsafeQuickToggle.js" import { MediaWidgetFeature } from "./features/widget/media.js" import { WeatherWidgetFeature } from "./features/widget/weather.js" import { NotificationsWidgetFeature } from "./features/widget/notifications.js" import { TogglesLayoutFeature } from "./features/layout/toggles.js" import { SystemItemsLayoutFeature } from "./features/layout/systemItems.js" import { DateMenuLayoutFeature } from "./features/layout/dateMenu.js" import { OverlayMenu } from "./features/overlayMenu.js" import { MenuAnimation } from "./features/menuAnimation.js" import { DebugFeature } from "./features/debug.js" import { VolumeMixerWidgetFeature } from "./features/widget/volumeMixer.js" import { SystemIndicatorLayoutFeature } from "./features/layout/systemIndicator.js" export default class QstExtension extends Extension { private features: FeatureBase[] private debug: DebugFeature disable() { Logger(`Extension ${this.metadata.name} deactivation started`) let start = +Date.now() // Unload debug feature this.debug.unload() this.debug = null // Unload features for (const feature of this.features) { Logger(`Unload feature '${feature.constructor.name}'`) feature.unload() } this.features = null // Null-out all features, loaded objects, arrays should be GC'd // Unload global context Global.unload() Logger("Diabled. " + (+new Date() - start) + "ms taken") } enable() { // Load global context Global.load(this) // Create features this.features = [ new UnsafeQuickToggleFeature(), // new InputOutputFeature(), new NotificationsWidgetFeature(), new MediaWidgetFeature(), new VolumeMixerWidgetFeature(), new DateMenuLayoutFeature(), new WeatherWidgetFeature(), new OverlayMenu(), new MenuAnimation(), new SystemItemsLayoutFeature(), new TogglesLayoutFeature(), new SystemIndicatorLayoutFeature(), ] // Load debug feature this.debug = new DebugFeature() this.debug.load() Logger(`Extension activation started, version: ${Config.version}`) // Load features Logger.debug("Initializing features ...") let start = +Date.now() for (const feature of this.features) { Logger.debug(()=>`Loading feature '${feature.constructor.name}'`) feature.load() } Logger(`Extension Loaded, ${+Date.now() - start}ms taken`) } } ================================================ FILE: src/features/debug.ts ================================================ import { FeatureBase, type SettingLoader } from "../libs/shell/feature.js" import Global from "../global.js" import Logger from "../libs/shared/logger.js" import Config from "../config.js" export class DebugFeature extends FeatureBase { disableDebugMessage = true // #region settings expose: boolean showLayoutBorder: boolean logLevel: number override loadSettings(loader: SettingLoader): void { this.expose = loader.loadBoolean("debug-expose") this.showLayoutBorder = loader.loadBoolean("debug-show-layout-border") this.logLevel = loader.loadInt("debug-log-level") } // #endregion settings override onLoad() { Logger.setHeader(Config.loggerPrefix) Logger.setLogLevel(this.logLevel) Logger.debug(()=>`Logger initialized, LogLevel: ${this.logLevel}`) if (this.expose) { globalThis.qst = Global for (const feature of (Global.Extension as any).features) { Global[feature.constructor.name] = feature } this.maid.functionJob(()=>{ for (const feature of (Global.Extension as any).features) { delete Global[feature.constructor.name] } delete globalThis.qst }) Logger.debug("Extension environment expose enabled") } if (this.showLayoutBorder) { // @ts-ignore Box pointer is private Global.QuickSettingsMenu._boxPointer.style_class += " QSTWEAKS-debug-show-layout" this.maid.functionJob(()=>{ // @ts-ignore Box pointer is private Global.QuickSettingsMenu._boxPointer.style_class = // @ts-ignore Box pointer is private Global.QuickSettingsMenu._boxPointer.style_class.replace(/ QSTWEAKS-debug-show-layout/, "") }) Logger.debug("Show layout border enabled") } } override onUnload(): void {} } ================================================ FILE: src/features/layout/dateMenu.ts ================================================ import { FeatureBase, type SettingLoader } from "../../libs/shell/feature.js" import { StyleClass } from "../../libs/shared/styleClass.js" import Global from "../../global.js" import Logger from "../../libs/shared/logger.js" export class DateMenuLayoutFeature extends FeatureBase { // #region settings hideMediaControl: boolean hideNotifications: boolean hideLeftBox: boolean hideRightBox: boolean disableMenu: boolean override loadSettings(loader: SettingLoader): void { this.hideLeftBox = loader.loadBoolean("datemenu-hide-left-box") this.hideRightBox = loader.loadBoolean("datemenu-hide-right-box") this.disableMenu = loader.loadBoolean("datemenu-disable-menu") } // #endregion settings override onLoad() { const style = new StyleClass((Global.DateMenuBox as any).style_class) // Hide left box from date menu if (this.hideLeftBox) { const leftBox = Global.DateMenuHolder.get_first_child() if (leftBox) { this.maid.hideJob( leftBox, ()=>true ) } else { Logger.error("Failed to get date menu left box") } style.add("QSTWEAKS-hide-left-box") } // Hide right box from date menu if (this.hideRightBox) { const rightBox = Global.DateMenuHolder.get_last_child() if (rightBox) { this.maid.hideJob( rightBox, ()=>true ) } else { Logger.error("Failed to get date menu right box") } style.add("QSTWEAKS-hide-right-box") } // Disable menu open action if (this.disableMenu) { Global.DateMenu.reactive = false this.maid.functionJob(()=>{ Global.DateMenu.reactive = true }) } // Modify style class if (style.modified) { (Global.DateMenuBox as any).style_class = style.stringify() } } override onUnload(): void { // Remove modified styles const style = new StyleClass((Global.DateMenuBox as any).style_class) .remove("QSTWEAKS-hide-right-box") .remove("QSTWEAKS-hide-left-box") if (style.modified) { (Global.DateMenuBox as any).style_class = style.stringify() } } } ================================================ FILE: src/features/layout/sound.ts ================================================ import { FeatureBase, SettingLoader } from "../../libs/shell/feature.js" import GObject from "gi://GObject" // TODO: migration from qst 1.8 export class SoundLayoutFeature extends FeatureBase { // #region settings override loadSettings(loader: SettingLoader): void { throw GObject.NotImplementedError } // #endregion settings override onLoad(): void { throw GObject.NotImplementedError } override onUnload(): void { throw GObject.NotImplementedError } } ================================================ FILE: src/features/layout/systemIndicator.ts ================================================ import * as Main from "resource:///org/gnome/shell/ui/main.js" import { SystemIndicator } from "resource:///org/gnome/shell/ui/quickSettings.js" import { FeatureBase, type SettingLoader } from "../../libs/shell/feature.js" import { SystemIndicatorTracker } from "../../libs/shell/quickSettingsUtils.js" import { SystemIndicatorOrderItem } from "../../libs/types/systemIndicatorOrderItem.js" import { StyleClass } from "../../libs/shared/styleClass.js" import Maid from "../../libs/shared/maid.js" import Global from "../../global.js" export class SystemIndicatorLayoutFeature extends FeatureBase { // #region settings orderEnabled: boolean order: SystemIndicatorOrderItem[] unordered: SystemIndicatorOrderItem privacyIndicatorStyle: "default" | "monochrome" | "accent" accentScreenSharingIndicator: boolean accentScreenRecordingIndicator: boolean override loadSettings(loader: SettingLoader): void { this.orderEnabled = loader.loadBoolean("system-indicator-layout-enabled") this.order = loader.loadValue("system-indicator-layout-order") this.unordered = this.order.find(item => item.nonOrdered) this.privacyIndicatorStyle = loader.loadString("system-indicator-privacy-indicator-style") as SystemIndicatorLayoutFeature["privacyIndicatorStyle"] this.accentScreenSharingIndicator = loader.loadBoolean("system-indicator-screen-sharing-indicator-use-accent") this.accentScreenRecordingIndicator = loader.loadBoolean("system-indicator-screen-recording-indicator-use-accent") } // #endregion settings onIndicatorCreated(maid: Maid, indicator: SystemIndicator): void { const rule: SystemIndicatorOrderItem = this.order.find(item => SystemIndicatorOrderItem.indicatorMatch(item, indicator)) ?? this.unordered if (rule.hide) maid.hideJob(indicator) } onUpdate(): void { const children = Global.Indicators.get_children() const head: SystemIndicator[] = [] const middle: SystemIndicator[] = children.filter(child => child instanceof SystemIndicator) as any const tail: SystemIndicator[] = [] let overNonOrdered: boolean = false for (const item of this.order) { if (item.nonOrdered) { overNonOrdered = true continue } const middleIndex = middle.findIndex(toggle => SystemIndicatorOrderItem.indicatorMatch(item, toggle)) if (middleIndex == -1) continue const toggle = middle[middleIndex] middle.splice(middleIndex, 1); (overNonOrdered ? tail : head).push(toggle) } let last: SystemIndicator|null = null for (const item of [head, middle, tail].flat()) { if (last) Global.Indicators.set_child_above_sibling(item, last) last = item } } tracker: SystemIndicatorTracker override onLoad(): void { // Colored privacy indicator const privacyIndicatorStyle = new StyleClass(Global.Indicators.style_class) if (this.privacyIndicatorStyle == "accent") { privacyIndicatorStyle.add("QSTWEAKS-privacy-indicator-use-accent") } else if (this.privacyIndicatorStyle == "monochrome") { privacyIndicatorStyle.add("QSTWEAKS-privacy-indicator-use-monochrome") } if (privacyIndicatorStyle.modified) { Global.Indicators.style_class = privacyIndicatorStyle.stringify() this.maid.functionJob(()=>{ Global.Indicators.style_class = new StyleClass(Global.Indicators.style_class) .remove("QSTWEAKS-privacy-indicator-use-accent") .remove("QSTWEAKS-privacy-indicator-use-monochrome") .stringify() }) } // Colored screen sharing indicator if (this.accentScreenSharingIndicator) { Main.panel.statusArea["screenSharing"].style_class = new StyleClass(Main.panel.statusArea["screenSharing"].style_class) .add("QSTWEAKS-screen-sharing-indicator-use-accent") .stringify() this.maid.functionJob(()=>{ Main.panel.statusArea["screenSharing"].style_class = new StyleClass(Main.panel.statusArea["screenSharing"].style_class) .remove("QSTWEAKS-screen-sharing-indicator-use-accent") .stringify() }) } // Colored screen recording indicator if (this.accentScreenRecordingIndicator) { Main.panel.statusArea["screenRecording"].style_class = new StyleClass(Main.panel.statusArea["screenRecording"].style_class) .add("QSTWEAKS-screen-recording-indicator-use-accent") .stringify() this.maid.functionJob(()=>{ Main.panel.statusArea["screenRecording"].style_class = new StyleClass(Main.panel.statusArea["screenRecording"].style_class) .remove("QSTWEAKS-screen-recording-indicator-use-accent") .stringify() }) } // Ordering if (!this.orderEnabled) return this.tracker = new SystemIndicatorTracker() this.tracker.onIndicatorCreated = this.onIndicatorCreated.bind(this) this.tracker.onUpdate = this.onUpdate.bind(this) this.tracker.load() } override onUnload(): void { const tracker = this.tracker if (tracker) { this.tracker = null tracker.unload() } } } ================================================ FILE: src/features/layout/systemItems.ts ================================================ import Clutter from "gi://Clutter" import { type PowerToggle } from "resource:///org/gnome/shell/ui/status/system.js" import { type QuickSettingsItem } from "resource:///org/gnome/shell/ui/quickSettings.js" import { type SystemItem } from "resource:///org/gnome/shell/ui/status/system.js" import { FeatureBase, type SettingLoader } from "../../libs/shell/feature.js" import Logger from "../../libs/shared/logger.js" import Global from "../../global.js" export class SystemItemsLayoutFeature extends FeatureBase { // #region settings hideScreenshot: boolean hideSettings: boolean hideLock: boolean hideShutdown: boolean hideBattery: boolean hideLayout: boolean enabled: boolean order: string[] override loadSettings(loader: SettingLoader): void { this.hideScreenshot = loader.loadBoolean("system-items-layout-hide-screenshot") this.hideSettings = loader.loadBoolean("system-items-layout-hide-settings") this.hideLock = loader.loadBoolean("system-items-layout-hide-lock") this.hideShutdown = loader.loadBoolean("system-items-layout-hide-shutdown") this.hideBattery = loader.loadBoolean("system-items-layout-hide-battery") this.hideLayout = loader.loadBoolean("system-items-layout-hide") this.enabled = loader.loadBoolean("system-items-layout-enabled") this.order = loader.loadStrv("system-items-layout-order") } // #endregion settings async getItmes(): Promise<{ screenshot: QuickSettingsItem, settings: QuickSettingsItem, lock: QuickSettingsItem, shutdown: QuickSettingsItem, battery: PowerToggle, box: SystemItem, laptopSpacer: Clutter.Actor, desktopSpacer: Clutter.Actor, }> { const systemItem = await Global.QuickSettingsSystemItem const children = systemItem.child.get_children() let screenshotItem: QuickSettingsItem let settingsItem: QuickSettingsItem let lockItem: QuickSettingsItem let shutdownItem: QuickSettingsItem for (const child of children) { if (child.constructor.name == "ScreenshotItem") { screenshotItem = child as QuickSettingsItem continue } if (child.constructor.name == "SettingsItem") { settingsItem = child as QuickSettingsItem continue } if (child.constructor.name == "LockItem") { lockItem = child as QuickSettingsItem continue } if (child.constructor.name == "ShutdownItem") { shutdownItem = child as QuickSettingsItem } } return { screenshot: screenshotItem, settings: settingsItem, lock: lockItem, shutdown: shutdownItem, battery: systemItem.powerToggle, laptopSpacer: (systemItem as any)._laptopSpacer, desktopSpacer: (systemItem as any)._desktopSpacer, box: systemItem } } override onLoad() { if (!this.enabled) return this.getItmes().then(items => { if (this.hideLayout) { this.maid.hideJob(items.box, ()=>true) return } if (this.hideBattery) { this.maid.hideJob(items.battery, ()=>{ (items.battery as any)._sync() }) } if (this.hideScreenshot) { this.maid.hideJob(items.screenshot, ()=>true) } if (this.hideLock) { this.maid.hideJob(items.lock, ()=>true) } if (this.hideShutdown) { this.maid.hideJob(items.shutdown, ()=>true) } if (this.hideSettings) { this.maid.hideJob(items.settings, ()=>true) } let last: any for (const [index, item] of this.order.entries()) { const current = items[item] if (index) items.box.child.set_child_above_sibling(current, last) last = current } }).catch(Logger.error) } override onUnload(): void {} } ================================================ FILE: src/features/layout/toggles.ts ================================================ import { QuickToggle, QuickMenuToggle, } from "resource:///org/gnome/shell/ui/quickSettings.js" import { FeatureBase, type SettingLoader } from "../../libs/shell/feature.js" import { QuickSettingsToggleTracker } from "../../libs/shell/quickSettingsUtils.js" import { ToggleOrderItem } from "../../libs/types/toggleOrderItem.js" import Maid from "../../libs/shared/maid.js" import Global from "../../global.js" export class TogglesLayoutFeature extends FeatureBase { // #region settings enabled: boolean order: ToggleOrderItem[] unordered: ToggleOrderItem override loadSettings(loader: SettingLoader): void { this.enabled = loader.loadBoolean("toggles-layout-enabled") this.order = loader.loadValue("toggles-layout-order") for (const orderItem of this.order) { if (orderItem.titleRegex) { orderItem.cachedTitleRegex = new RegExp(orderItem.titleRegex) } if (orderItem.nonOrdered) { this.unordered = orderItem } } } // #endregion settings onToggleCreated(maid: Maid, toggle: QuickToggle|QuickMenuToggle): void { const rule: ToggleOrderItem = this.order.find(item => ToggleOrderItem.toggleMatch(item, toggle)) ?? this.unordered if (rule.hide) maid.hideJob(toggle) } onUpdate(): void { const children = Global.QuickSettingsGrid.get_children() const head: QuickToggle[] = [] const middle: QuickToggle[] = children.filter(child => ( (child instanceof QuickMenuToggle) || (child instanceof QuickToggle) ) && child.constructor.name != "BackgroundAppsToggle" ) as any const tail: QuickToggle[] = [] let overNonOrdered: boolean = false for (const item of this.order) { if (item.nonOrdered) { overNonOrdered = true continue } const middleIndex = middle.findIndex(toggle => ToggleOrderItem.toggleMatch(item, toggle)) if (middleIndex == -1) continue const toggle = middle[middleIndex] middle.splice(middleIndex, 1); (overNonOrdered ? tail : head).push(toggle) } let last: QuickToggle|null = null for (const item of [head, middle, tail].flat()) { if (last) Global.QuickSettingsGrid.set_child_above_sibling(item, last) last = item } } tracker: QuickSettingsToggleTracker override onLoad(): void { if (!this.enabled) return this.tracker = new QuickSettingsToggleTracker() this.tracker.onToggleCreated = this.onToggleCreated.bind(this) this.tracker.onUpdate = this.onUpdate.bind(this) this.tracker.load() } override onUnload(): void { const tracker = this.tracker if (tracker) { this.tracker = null tracker.unload() } } } ================================================ FILE: src/features/menuAnimation.ts ================================================ import Clutter from "gi://Clutter" import Shell from "gi://Shell" import { type QuickSettingsMenu } from "resource:///org/gnome/shell/ui/quickSettings.js" import { FeatureBase, type SettingLoader } from "../libs/shell/feature.js" import { QuickSettingsMenuTracker } from "../libs/shell/quickSettingsUtils.js" import Global from "../global.js" import Maid from "../libs/shared/maid.js" export class MenuAnimation extends FeatureBase { // #region settings enabled: boolean backgroundBlurRadius: number bakgroundBrightness: number backgroundOpacity: number backgroundScaleX: number backgroundScaleY: number gridContentOpacity: number openDuration: number closeDuration: number override loadSettings(loader: SettingLoader): void { this.enabled = loader.loadBoolean("menu-animation-enabled") this.backgroundBlurRadius = loader.loadInt("menu-animation-background-blur-radius") this.bakgroundBrightness = loader.loadInt("menu-animation-background-brightness") / 1000 this.backgroundOpacity = loader.loadInt("menu-animation-background-opacity") this.backgroundScaleX = loader.loadInt("menu-animation-background-scale-x") / 1000 this.backgroundScaleY = loader.loadInt("menu-animation-background-scale-y") / 1000 this.openDuration = loader.loadInt("menu-animation-open-duration") this.closeDuration = loader.loadInt("menu-animation-close-duration") this.gridContentOpacity = loader.loadInt("menu-animation-grid-content-opacity") } // #endregion settings onOpen(_maid: Maid, _menu: QuickSettingsMenu, isOpen: boolean) { if (this.blur) this.blur.enabled = isOpen if (isOpen) { Global.QuickSettingsBox.set_pivot_point(0.5, 0.5) Global.QuickSettingsBox.ease({ duration: this.openDuration, mode: Clutter.AnimationMode.EASE_OUT_QUINT, scaleX: this.backgroundScaleX, scaleY: this.backgroundScaleY, opacity: this.backgroundOpacity, }) Global.QuickSettingsGrid.ease({ duration: this.openDuration, mode: Clutter.AnimationMode.EASE_OUT_QUINT, opacity: this.gridContentOpacity, }) } else { Global.QuickSettingsBox.ease({ duration: this.closeDuration, mode: Clutter.AnimationMode.EASE_OUT_QUINT, scaleX: 1, scaleY: 1, opacity: 255, onComplete: ()=>{ Global.QuickSettingsBox.set_pivot_point(0, 0) } }) Global.QuickSettingsGrid.ease({ duration: this.openDuration, mode: Clutter.AnimationMode.EASE_OUT_QUINT, opacity: 255, }) } } blur: Shell.BlurEffect tracker: QuickSettingsMenuTracker override onLoad(): void { if (!this.enabled) return if (this.backgroundBlurRadius) { this.blur = new Shell.BlurEffect({ enabled: false, mode: Shell.BlurMode.ACTOR, radius: this.backgroundBlurRadius, brightness: this.bakgroundBrightness, }) // @ts-ignore Box pointer is private Global.QuickSettingsMenu._boxPointer.add_effect_with_name("blur", this.blur) } this.tracker = new QuickSettingsMenuTracker() this.tracker.onMenuOpen = this.onOpen.bind(this) this.tracker.load() } override onUnload(): void { const tracker = this.tracker if (!tracker) return this.tracker = null tracker.unload() if (this.blur) { // @ts-ignore Box pointer is private Global.QuickSettingsMenu._boxPointer.remove_effect(this.blur) this.blur = null } Global.QuickSettingsBox.remove_all_transitions() Global.QuickSettingsBox.scaleX = 1 Global.QuickSettingsBox.scaleY = 1 Global.QuickSettingsBox.opacity = 255 Global.QuickSettingsBox.set_pivot_point(0, 0) } } ================================================ FILE: src/features/overlayMenu.ts ================================================ import Clutter from "gi://Clutter" import { QuickSlider, type QuickSettingsMenu } from "resource:///org/gnome/shell/ui/quickSettings.js" import { FeatureBase, type SettingLoader } from "../libs/shell/feature.js" import { QuickSettingsMenuTracker } from "../libs/shell/quickSettingsUtils.js" import * as AdvAni from "../libs/shell/advani.js" import Global from "../global.js" import Maid from "../libs/shared/maid.js" export class OverlayMenu extends FeatureBase { // #region settings enabled: boolean width: number duration: number animationStyle: string overflowAnchor: string override loadSettings(loader: SettingLoader): void { this.enabled = loader.loadBoolean("overlay-menu-enabled") this.width = loader.loadInt("overlay-menu-width") this.duration = loader.loadInt("overlay-menu-animate-duration") this.animationStyle = loader.loadString("overlay-menu-animate-style") this.overflowAnchor = loader.loadString("overlay-menu-overflow-anchor") } // #endregion settings getCoords(menu: QuickSettingsMenu): { outerHeight: number, targetHeight: number, targetWidth: number, sourceX: number, sourceY: number, sourceHeight: number, sourceWidth: number, offsetY: number, offsetX: number, } { menu.actor.height = -1 let [outerHeight] = menu.actor.get_preferred_height(-1) const targetWidth = menu.actor.width - menu.box.marginLeft - menu.box.marginRight const targetHeight = outerHeight - menu.box.marginTop let offsetY: number if (Global.QuickSettingsBox.height < targetHeight && this.overflowAnchor != "center") { if (this.overflowAnchor == "top") { offsetY = 0 } else { offsetY = Global.QuickSettingsBox.height - targetHeight } } else { offsetY = Math.floor((Global.QuickSettingsBox.height - targetHeight) / 2) } const isSlider = menu.sourceActor instanceof QuickSlider const sourceHeight = Math.floor(menu.sourceActor.height + 0.5) const sourceBaseWidth = Math.floor(menu.sourceActor.width + 0.5) const sourceWidth = isSlider ? sourceHeight : sourceBaseWidth const sourceBaseX = Math.floor(Global.QuickSettingsGrid.x + menu.sourceActor.x + 0.5) const sourceY = Math.floor(Global.QuickSettingsGrid.y + menu.sourceActor.y + 0.5) const sourceX = sourceBaseX + (isSlider ? (sourceBaseWidth - sourceWidth) : 0) const offsetX = Math.floor((Global.QuickSettingsBox.width - targetWidth) / 2) return { outerHeight, targetHeight, targetWidth, sourceX, sourceY, sourceHeight, sourceWidth, offsetY, offsetX, } } onOpen(_maid: Maid, menu: QuickSettingsMenu, isOpen: boolean) { if (!isOpen || !this.duration) menu.actor.set_easing_duration(0) else menu.actor.remove_all_transitions() if (!isOpen) return const coords = this.getCoords(menu) this.yconstraint.offset = coords.offsetY if (this.duration) { menu.box.opacity = 0 menu.box.ease({ opacity: 255, duration: Math.floor(this.duration / 3), }) if (this.animationStyle == "flyout") { menu.box.translation_x = Math.floor(coords.sourceX - coords.offsetX + menu.box.marginLeft) menu.box.translation_y = Math.floor(coords.sourceY - coords.offsetY + menu.box.marginTop) menu.box.scale_x = coords.sourceWidth / coords.targetWidth menu.box.scale_y = coords.sourceHeight / coords.targetHeight AdvAni.ease(menu.box, { translation_x: 0, translation_y: 0, scale_x: 1, scale_y: 1, mode: AdvAni.AdvAnimationMode.LowBackover, // mode: Clutter.AnimationMode.EASE_OUT_EXPO, duration: this.duration, }) } else if (this.animationStyle == "dialog") { menu.box.translation_x = 0.2*coords.targetWidth*.5 menu.box.translation_y = 0.2*coords.targetHeight*.5 menu.box.scale_x = 0.8 menu.box.scale_y = 0.8 AdvAni.ease(menu.box, { translation_x: 0, translation_y: 0, scale_x: 1, scale_y: 1, mode: AdvAni.AdvAnimationMode.MiddleBackover, // mode: Clutter.AnimationMode.EASE_OUT_EXPO, duration: this.duration, }) } } } onMenuCreated(maid: Maid, menu: QuickSettingsMenu) { menu.actor.get_constraints()[0].enabled = false if (this.width) { menu.actor.width = this.width menu.actor.x_expand = false } maid.connectJob(menu.box, "notify::height", ()=>{ if (!menu.isOpen) return const coords = this.getCoords(menu) this.yconstraint.offset = coords.offsetY }) } tracker: QuickSettingsMenuTracker yconstraint: Clutter.BindConstraint override reload(changedKey?: string): void { if (changedKey == "overlay-menu-animate-duration") return if (changedKey == "overlay-menu-animate-style") return if (changedKey == "overlay-menu-overflow-anchor") return super.reload(changedKey) } override onLoad(): void { if (!this.enabled) return // Offset handle this.yconstraint = new Clutter.BindConstraint({ coordinate: Clutter.BindCoordinate.Y, // @ts-ignore Box pointer is private source: Global.QuickSettingsMenu._boxPointer, }) // Disable Y sync (overlay y offset) // @ts-ignore Overlay is private field Global.QuickSettingsMenu._overlay.get_constraints()[0].enabled = false // @ts-ignore Overlay is private field Global.QuickSettingsMenu._overlay.add_constraint(this.yconstraint) // Disable Placeholder height sync (grid height increase) // @ts-ignore Overlay is private field Global.QuickSettingsGrid.layout_manager._overlay.get_constraints()[0].enabled = false this.tracker = new QuickSettingsMenuTracker() this.tracker.onMenuCreated = this.onMenuCreated.bind(this) this.tracker.onMenuOpen = this.onOpen.bind(this) this.tracker.load() } override onUnload(): void { const tracker = this.tracker if (!tracker) return this.tracker = null for (const menu of tracker.items) { menu.actor.x_expand = true menu.actor.get_constraints()[0].enabled = true } tracker.unload() // @ts-ignore Overlay is private field Global.QuickSettingsMenu._overlay.get_constraints()[0].enabled = true // @ts-ignore Overlay is private field Global.QuickSettingsGrid.layout_manager._overlay.get_constraints()[0].enabled = true // @ts-ignore Overlay is private field Global.QuickSettingsMenu._overlay.remove_constraint(this.yconstraint) } } ================================================ FILE: src/features/toggle/unsafeQuickToggle.ts ================================================ import GObject from "gi://GObject" import { gettext as _ } from "resource:///org/gnome/shell/extensions/extension.js" import { QuickToggle, SystemIndicator } from "resource:///org/gnome/shell/ui/quickSettings.js" import { FeatureBase, type SettingLoader } from "../../libs/shell/feature.js" import Global from "../../global.js" // #region UnsafeQuickToggle class UnsafeQuickToggle extends QuickToggle { _onUpdate: (value: boolean)=>void constructor(onUpdate: UnsafeQuickToggle["_onUpdate"]) { super(onUpdate as any) } _init(onUpdate: any) { super._init({ title: _("Unsafe Mode"), iconName: "channel-insecure-symbolic", }) this._onUpdate = onUpdate // bind click this.connect("clicked", this._toggleMode.bind(this)) // Fetch global context this._sync() } _updateIcon() { this.iconName = this.checked ? "channel-insecure-symbolic" : "channel-secure-symbolic" } // Toggle context _toggleMode() { this.checked = !global.context.unsafe_mode global.context.unsafe_mode = this.checked this._updateIcon() this._onUpdate(this.checked) } // Sync context _sync() { this.checked = global.context.unsafe_mode this._updateIcon() } } GObject.registerClass(UnsafeQuickToggle) // #endregion UnsafeQuickToggle // #region UnsafeIndicator class UnsafeIndicator extends SystemIndicator { constructor(onUpdate: UnsafeQuickToggle["_onUpdate"]) { super(onUpdate as any) } // @ts-ignore _init(onUpdate: any) { super._init() this.quickSettingsItems.push(new UnsafeQuickToggle(onUpdate)) } destroy() { this.quickSettingsItems.forEach(item => item.destroy()) super.destroy() } } GObject.registerClass(UnsafeIndicator) export { UnsafeIndicator } // #endregion UnsafeIndicator // #region UnsafeQuickToggleFeature export class UnsafeQuickToggleFeature extends FeatureBase { // #region settings enabled: boolean override loadSettings(loader: SettingLoader): void { this.enabled = loader.loadBoolean("unsafe-quick-toggle-enabled") } // #endregion settings indicator: UnsafeIndicator override onLoad(): void { if (!this.enabled) return // Load last state if (Global.Settings.get_boolean("unsafe-quick-toggle-save-last-state")) { global.context.unsafe_mode = Global.Settings.get_boolean("unsafe-quick-toggle-last-state") } // Add Unsafe Quick Toggle this.maid.destroyJob( this.indicator = new UnsafeIndicator( (state) => Global.Settings.set_boolean("unsafe-quick-toggle-last-state", state) ) ) // @ts-expect-error Missing addExternalIndicator method (QuickSettings is private class) Global.QuickSettings.addExternalIndicator(this.indicator) } override onUnload(): void { global.context.unsafe_mode = false this.indicator = null } } // #endregion UnsafeQuickToggleFeature ================================================ FILE: src/features/widget/media.ts ================================================ import St from "gi://St" import Clutter from "gi://Clutter" import GObject from "gi://GObject" import GLib from "gi://GLib" import Gio from "gi://Gio" import GdkPixbuf from "gi://GdkPixbuf" import Shell from "gi://Shell" // @ts-expect-error idk why import Soup from "gi://Soup" import * as Main from "resource:///org/gnome/shell/ui/main.js" import * as MessageList from "resource:///org/gnome/shell/ui/messageList.js" import { loadInterfaceXML } from "resource:///org/gnome/shell/misc/fileUtils.js" import { Slider } from "resource:///org/gnome/shell/ui/slider.js" import { PageIndicators } from "resource:///org/gnome/shell/ui/pageIndicators.js" import { FeatureBase, type SettingLoader } from "../../libs/shell/feature.js" import { Rgb } from "../../libs/shared/colors.js" import { getImageMeanColor } from "../../libs/shared/imageUtils.js" import { lerp } from "../../libs/shared/jsUtils.js" import { Drag, Scroll } from "../../libs/shell/gesture.js" import { RoundClipEffect } from "../../libs/shell/effects.js" import { StyledSlider } from "../../libs/shell/styler.js" import Global from "../../global.js" import Logger from "../../libs/shared/logger.js" // #region Player class Player extends GObject.Object { private _playerProxy: Gio.DBusProxy private _propertiesProxy: Gio.DBusProxy private _mprisProxy: Gio.DBusProxy source: MessageList.Source canPlay: boolean canSeek: boolean constructor(busName: string) { super() this._busName = busName this.source = new MessageList.Source() // Create properties proxy for Position const propertiesIface = Global.GetDbusInterface("media/dbus.xml","org.freedesktop.DBus.Properties") const propertiesPromise = Gio.DBusProxy.new( Gio.DBus.session, Gio.DBusProxyFlags.NONE, propertiesIface, busName, "/org/mpris/MediaPlayer2", propertiesIface.name, null, ) // @ts-expect-error Missing promise type support .then((proxy: Gio.DbusProxy) => this._propertiesProxy = proxy) .catch(Logger.error) // Create proxy for seeking const playerIface = Global.GetDbusInterface("media/dbus.xml","org.mpris.MediaPlayer2.Player") const playerPromise = Gio.DBusProxy.new( Gio.DBus.session, Gio.DBusProxyFlags.NONE, playerIface, busName, "/org/mpris/MediaPlayer2", playerIface.name, null, ) // @ts-expect-error Missing promise type support .then((proxy: Gio.DbusProxy) => this._playerProxy = proxy) .catch(Logger.error) // Create proxy for mpris const mprisIface = Global.GetDbusInterface("media/dbus.xml","org.mpris.MediaPlayer2") const mprisPromise = Gio.DBusProxy.new( Gio.DBus.session, Gio.DBusProxyFlags.NONE, mprisIface, busName, "/org/mpris/MediaPlayer2", mprisIface.name, null, ) // @ts-expect-error Missing promise type support .then((proxy: Gio.DbusProxy) => this._mprisProxy = proxy) .catch(Logger.error) // Waitting for proxies Promise.all([ playerPromise, propertiesPromise, mprisPromise ]) .then(this._ready.bind(this)) .catch(Logger.error) } // Position get position(): Promise { return this._propertiesProxy.GetAsync( "org.mpris.MediaPlayer2.Player", "Position" ).then((result: any) => { return result[0].get_int64() }).catch(()=> null) } set position(value: number) { this._playerProxy.SetPositionAsync( this._trackId, Math.min(this._length, Math.max(1, value)) ).catch(Logger.error) } // States private _busName: string private _trackId: string private _length: number | null private _trackArtists: string[] | null private _trackTitle: string | null private _trackCoverUrl: string | null private _app: Shell.App | null get busName(): string { return this._busName } get trackId(): string { return this._trackId } get length(): number|null { return this._length } get trackArtists(): string[] | null { return this._trackArtists } get trackTitle(): string | null { return this._trackTitle } get trackCoverUrl(): string | null { return this._trackCoverUrl } get app(): Shell.App | null { return this._app } get canGoNext(): boolean | null { return this._playerProxy.CanGoNext } get canGoPrevious(): boolean | null { return this._playerProxy.CanGoPrevious } get status(): string | null { return this._playerProxy.PlaybackStatus } // Update states _parseMetadata(metadata: any) { if (!metadata) { this._trackId = null this._length = null this._trackArtists = null this._trackCoverUrl = null return } this._trackId = metadata["mpris:trackid"]?.get_string()[0] ?? null this._length = metadata["mpris:length"]?.deepUnpack() ?? null // Get trak artists this._trackArtists = metadata['xesam:artist']?.deepUnpack() if (typeof this._trackArtists === "string") { this._trackArtists = [this._trackArtists] } else if ( !Array.isArray(this._trackArtists) || !this._trackArtists.every(artist => typeof artist === 'string') ) { this._trackArtists = [(_)('Unknown artist')] } // Get track title this._trackTitle = metadata['xesam:title']?.deepUnpack() if (typeof this._trackTitle !== 'string') { this._trackTitle = _('Unknown title') } // Get track cover this._trackCoverUrl = metadata['mpris:artUrl']?.deepUnpack() if (typeof this._trackCoverUrl !== 'string') { this._trackCoverUrl = null } // Update desktop entry if (this._mprisProxy.DesktopEntry) { this._app = Shell.AppSystem.get_default().lookup_app( this._mprisProxy.DesktopEntry + ".desktop" ) } else { this._app = null } // Update source this.source.set({ title: this._app?.get_name() ?? this._mprisProxy.Identity, icon: this._app?.get_icon() ?? null, }) // Update can play this.canPlay = !!this._playerProxy.CanPlay this.canSeek = this._playerProxy.CanSeek } _update() { try { const metadata = (this as any)._playerProxy.Metadata this._parseMetadata(metadata) } catch {} this.emit("changed") } // Methods previous() { this._playerProxy.PreviousAsync() .catch(Logger.error) } next() { this._playerProxy.NextAsync() .catch(Logger.error) } playPause() { this._playerProxy.PlayPauseAsync() .catch(Logger.error) } raise() { if (this._app) { this._app.activate() } else if (this._mprisProxy.CanRaise) { this._mprisProxy.RaiseAsync().catch(logError) } } isPlaying(): boolean { return this.status === "Playing" } // Proxy handling _ready() { // Connect mpris proxy this._mprisProxy.connectObject('notify::g-name-owner', () => { if (!this._mprisProxy.g_name_owner) this._close() }, this ) if (!this._mprisProxy.g_name_owner) this._close() // Connect player proxy this._playerProxy.connectObject( 'g-properties-changed', this._update.bind(this), this ) this._update() } _close() { this._mprisProxy.disconnectObject(this) this._playerProxy.disconnectObject(this) this._mprisProxy = null this._playerProxy = null this._propertiesProxy = null } } GObject.registerClass({ Properties: { "can-play": GObject.ParamSpec.boolean( "can-play", null, null, GObject.ParamFlags.READWRITE, false ), "can-seek": GObject.ParamSpec.boolean( "can-seek", null, null, GObject.ParamFlags.READWRITE, false ), }, Signals: { "changed": {}, }, }, Player) // #endregion Player // #region Source // Copied from gnome source; for backward compatibility // https://github.com/GNOME/gnome-shell/blob/ef4af961bfb39911ae09cb95e1e57d374c70fe1d/js/ui/mpris.js#L189 const DBusIface = loadInterfaceXML("org.freedesktop.DBus") const DBusProxy = Gio.DBusProxy.makeProxyWrapper(DBusIface) const MPRIS_PLAYER_PREFIX = "org.mpris.MediaPlayer2." class Source extends GObject.Object { _players: Map _proxy: Gio.DBusProxy _init() { super._init() this._players = new Map() } start() { // @ts-expect-error Type error (DBusProxy is not a class) this._proxy = new DBusProxy(Gio.DBus.session, 'org.freedesktop.DBus', '/org/freedesktop/DBus', this._onProxyReady.bind(this) ) } get players(): Player[] { return [...this._players.values()] } private _addPlayer(busName: string) { if (this._players.has(busName)) return const player = new Player(busName) this._players.set(busName, player) player.connectObject("notify::can-play", () => { this.emit( player.canPlay ? "player-added" : "player-removed", player ) }, this ) } private async _onProxyReady() { const [names]: [string[]] = await this._proxy.ListNamesAsync() for (const name of names) { if (!name.startsWith(MPRIS_PLAYER_PREFIX)) continue this._addPlayer(name) } // @ts-expect-error this._proxy.connectSignal( 'NameOwnerChanged', this._onNameOwnerChanged.bind(this) ) } private _onNameOwnerChanged(proxy: any, sender: any, [name, oldOwner, newOwner]: any[]) { if (!name.startsWith(MPRIS_PLAYER_PREFIX)) return if (oldOwner) { const player = this._players.get(name) if (player) { this._players.delete(name) player.disconnectObject(this) this.emit('player-removed', player) } } if (newOwner) this._addPlayer(name) } } GObject.registerClass({ Signals: { "player-added": {param_types: [Player as any]}, "player-removed": {param_types: [Player as any]}, }, }, Source) // #endregion // #region ProgressControl class ProgressControl extends St.BoxLayout { _positionLabel: St.Label _lengthLabel: St.Label _slider: Slider _player: Player _positionTracker: number|null _dragging: boolean _shown: boolean _options: ProgressControl.Options constructor(player: Player, options: ProgressControl.Options) { super(player as any, options as any) } _init(player: Player, options: ProgressControl.Options): void { this._player = player this._positionTracker = null this._dragging = false this._shown = false this._options = options super._init({ x_expand: true, style_class: "QSTWEAKS-progress-control", }) this._createLabels() this._createSlider() this.add_child(this._positionLabel) this.add_child(this._slider) this.add_child(this._lengthLabel) this.connect("notify::mapped", this._updateTracker.bind(this)) this.connect("destroy", this._dropTracker.bind(this)) this._player.connectObject("changed", () => this._updateStatus(), this) } // Create position, length label _createLabels() { this._positionLabel = new St.Label({ y_expand: true, y_align: Clutter.ActorAlign.CENTER, style_class: "QSTWEAKS-position-label", }) this._lengthLabel = new St.Label({ y_expand: true, y_align: Clutter.ActorAlign.CENTER, style_class: "QSTWEAKS-length-label", }) } // Create slider and connect drag event _createSlider() { const oldSlider = this._slider const slider = this._slider ??= new Slider(0) // Update style slider.style = StyledSlider.getStyle(this._options.sliderStyle) if (oldSlider) return // Process Dragging slider.connectObject("drag-begin", () => { this._dragging = true return Clutter.EVENT_PROPAGATE }, this) slider.connectObject("drag-end", () => { this._player.position = (Math.floor(slider.value) * 1000000) this._dragging = false return Clutter.EVENT_PROPAGATE }, this) slider.connectObject("scroll-event", () => { return Clutter.EVENT_STOP }, this) slider.connectObject("notify::value", () => { if (this._dragging) this._updatePosition(Math.floor(slider.value) * 1000000) }, this) } // Show / Hide by playing status _updateStatus(noAnimate?: boolean) { if (!this.mapped) return this._shown = this._player.isPlaying() if (this._shown) this._trackPosition() const previousHeight = this.height this.height = -1 const height = this._shown ? this.get_preferred_height(-1)[0] : 0 this.height = previousHeight const opacity = this._shown ? 255 : 0 if (noAnimate) { this.remove_all_transitions() this.height = height this.opacity = opacity return } if (this._shown) { this.ease({ height, duration: 150, onComplete: ()=>{ this.ease({ opacity, duration: 150, }) } }) } else { this.ease({ opacity, duration: 200, onComplete: ()=>{ this.ease({ height, duration: 150, }) } }) } } // Update slider and label _updatePosition(current: number) { const currentSeconds = Math.floor(current / 1000000) const lengthSeconds = Math.floor(this._player.length / 1000000) this._positionLabel.text = this._formatSeconds(currentSeconds) this._lengthLabel.text = this._formatSeconds(lengthSeconds) this._slider.overdriveStart = this._slider.maximumValue = lengthSeconds this._slider.value = currentSeconds } // Use polling to update position when only shown _trackPosition() { this._slider.reactive = this._player.canSeek if (this._shown && !this._dragging) { this._player.position .then(this._updatePosition.bind(this)) .catch(Logger.error) } return GLib.SOURCE_CONTINUE } _dropTracker() { if (this._positionTracker === null) return GLib.source_remove(this._positionTracker) this._positionTracker = null } _createTracker() { this._positionTracker = GLib.timeout_add(GLib.PRIORITY_DEFAULT, 1000, this._trackPosition.bind(this)) GLib.source_set_name_by_id( this._positionTracker, "[quick-settings-tweaks] ProgressControl._createTracker: this._positionTracker" ) } _updateTracker() { if (this.mapped) this._createTracker() else this._dropTracker() this._updateStatus(true) } // Seconds => HH:MM:SS or MM:SS _formatSeconds(seconds: number) { const minutes = Math.floor(seconds / 60) % 60 const hours = Math.floor(seconds / 3600) % 60 seconds %= 60 const secondsPadded = seconds.toString().padStart(2, "0") const minutesPadded = minutes.toString().padStart(2, "0") if (hours > 0) return `${hours}:${minutesPadded}:${secondsPadded}` return `${minutes}:${secondsPadded}` } } GObject.registerClass(ProgressControl) namespace ProgressControl { export interface OptionsBase { sliderStyle: StyledSlider.Options } export type Options = { } & OptionsBase } // #endregion ProgressControl // #region MediaItem class MediaItem extends MessageList.Message { // Gnome 48 doesn't exports MediaMessage, so we should implement it // (i have no idea why, backward compatibility killer) _player: Player _cachedColors: Map> _options: MediaItem.Options _progressControl?: ProgressControl _prevButton: St.Button _pauseButton: St.Button _nextButton: St.Button constructor(player: Player, options: MediaItem.Options) { super(player.source) this.add_style_class_name('media-message') this._options = options this._player = player this.addEventStop((this as any)._header) // Create controls if (options.progressEnabled) { this.child.add_child( this._progressControl = new ProgressControl(player, options) ) } this._createControlButtons() // Connect player this._player.connectObject( 'changed', this._update.bind(this), this ) this._update() } // Create and update control buttons _createControlButtons() { const options = this._options if (options.showPrevButton) this._prevButton ??= this.addEventStop(this.addMediaControl( 'media-skip-backward-symbolic', () => this._player.previous() ) as unknown as St.Button) if (options.showPauseButton) this._pauseButton ??= this.addEventStop(this.addMediaControl( '', () => this._player.playPause() ) as unknown as St.Button) if (options.showNextButton) this._nextButton ??= this.addEventStop(this.addMediaControl( 'media-skip-forward-symbolic', () => this._player.next() ) as unknown as St.Button) const opacity = options.contorlOpacity if (this._nextButton) this._nextButton.opacity = opacity if (this._prevButton) this._prevButton.opacity = opacity if (this._pauseButton) this._pauseButton.opacity = opacity } // Sync to player _update() { // Get icon let icon: Gio.Icon if (this._player.trackCoverUrl) { const file = Gio.File.new_for_uri(this._player.trackCoverUrl) icon = new Gio.FileIcon({file}); } else { icon = new Gio.ThemedIcon({name: 'audio-x-generic-symbolic'}) } // Get artist string const trackArtists: string = this._player.trackArtists?.join(",") ?? "" // Update base informations this.set({ title: this._player.trackTitle, body: trackArtists, icon, }) // Update control buttons if (this._pauseButton) { let isPlaying = this._player.status === 'Playing'; let iconName = isPlaying ? 'media-playback-pause-symbolic' : 'media-playback-start-symbolic'; (this._pauseButton.child as St.Icon).icon_name = iconName } if (this._prevButton) this._prevButton.reactive = this._player.canGoPrevious if (this._nextButton) this._nextButton.reactive = this._player.canGoNext this._updateGradient() } _updateGradient(): void { // If disabled if (!this._options?.gradientEnabled) { this.style = "" return } // Push get color task, use cache if possible this._cachedColors ??= new Map() const coverUrl = this._player.trackCoverUrl let colorTask; if (!coverUrl || coverUrl.endsWith(".svg")) return if (coverUrl.startsWith("file://")) { const coverPath = decodeURIComponent(coverUrl.replace(/^file:\/\//,"")) colorTask = this._cachedColors.get(coverPath) if (!colorTask) { let pixbuf: GdkPixbuf.Pixbuf; try { pixbuf = GdkPixbuf.Pixbuf.new_from_file(coverPath) } catch (error) { return } finally { if (!pixbuf) { return } colorTask = getImageMeanColor(pixbuf) this._cachedColors.set(coverPath, colorTask) } } } else if (coverUrl.startsWith("https://") || coverUrl.startsWith("http://")) { const coverPath = decodeURIComponent(coverUrl.replace(/^https?:\/\//,"").replace(/^http?:\/\//,"")) colorTask = this._cachedColors.get(coverPath) if (!colorTask) { const session = new Soup.Session(); const uri = GLib.Uri.parse(coverUrl, GLib.UriFlags.NONE); const message = new Soup.Message({method: 'GET', uri}); colorTask = session.send_and_read_async(message, null, null) .then(img_bytes => { if (!img_bytes) throw new Error("No image data received"); const stream = Gio.MemoryInputStream.new_from_bytes(img_bytes); const pixbuf = GdkPixbuf.Pixbuf.new_from_stream(stream as any, null); return getImageMeanColor(pixbuf); }) .catch(error => { return null; }); this._cachedColors.set(coverPath, colorTask); } } // Update style colorTask.then(color=>{ if (!color) return if (!this._cachedColors) return const mixStart = this._options.gradientStartMix / 1000 const mixEnd = this._options.gradientEndMix / 1000 const [bgr, bgg, bgb] = this._options.gradientBackground const [r,g,b] = color this.style = `background-gradient-direction:horizontal;background-gradient-start:rgba(${ lerp(bgr, r, mixStart) },${ lerp(bgg, g, mixStart) },${ lerp(bgb, b, mixStart) },${ this._options.gradientStartOpaque/1000 });background-gradient-end:rgba(${ lerp(bgr, r, mixEnd) },${ lerp(bgg, g, mixEnd) },${ lerp(bgb, b, mixEnd) },${ this._options.gradientEndOpaque/1000 });` }) } // Pass all gesture actions to the parent vfunc_button_press_event(_event: Clutter.Event): boolean { return Clutter.EVENT_PROPAGATE } vfunc_button_release_event(_event: Clutter.Event): boolean { return Clutter.EVENT_PROPAGATE } vfunc_motion_event(_event: Clutter.Event): boolean { return Clutter.EVENT_PROPAGATE } vfunc_touch_event(_event: Clutter.Event): boolean { return Clutter.EVENT_PROPAGATE } addEventStop(actor: T): T { // actor.connect("button-press-event", ()=>Clutter.EVENT_STOP); return actor; } } GObject.registerClass(MediaItem) namespace MediaItem { export interface OptionsBase { progressEnabled: boolean gradientBackground: Rgb gradientStartOpaque: number gradientStartMix: number gradientEndOpaque: number gradientEndMix: number gradientEnabled: boolean contorlOpacity: number showNextButton: boolean showPrevButton: boolean showPauseButton: boolean } export type Options = { } & OptionsBase & ProgressControl.OptionsBase } // #endregion MediaItem // #region MediaList class MediaList extends St.BoxLayout { _options: MediaList.Options _current?: MediaItem _currentMaxPage: number _currentPage: number _effect?: RoundClipEffect _drag: boolean _scroll: boolean _dragTranslation?: number _items: Map _source: Source get _messages(): MediaItem[] { return this.get_children() as MediaItem[] } empty: boolean constructor(options: MediaList.Options) { // @ts-ignore super(options) } // @ts-ignore _init(options: MediaList.Options): void { super._init({ can_focus: true, reactive: true, track_hover: true, hover: false, clip_to_allocation: true, }) this._current = null this._options = options this._currentMaxPage = 0 this._currentPage = 0 this._drag = false this._items = new Map() // Round clip effect this._initEffect() this.connect("notify::height", this._updateEffect.bind(this)) this.connect("notify::width", this._updateEffect.bind(this)) // Scroll Event this.connect("scroll-event", (_: Clutter.Actor, event: Clutter.Event) => { if (this._drag) return const direction = event.get_scroll_direction() if (direction === Clutter.ScrollDirection.UP) { this._seekPage(-1) } if (direction === Clutter.ScrollDirection.DOWN) { this._seekPage(1) } }) // Connect source this._source = new Source() this._source.connectObject("player-removed", (_source: any, player: Player)=>{ const item = this._items.get(player) if (!item) return item.destroy() this._items.delete(player) this._sync() },this) this._source.connectObject("player-added", (_source: any, player: Player)=>{ if (this._items.has(player)) return const item = new MediaItem(player, this._options) this._items.set(player, item) this.add_child(item) this._sync() }, this) this._source.start() } // Round clip effect _initEffect() { // Disabled if (!this._options.roundClipEnabled) { if (this._effect) { this.remove_effect_by_name("round-clip") } this._effect = null return } // Enabled const effect = this._effect = new RoundClipEffect() effect.enabled = false this.add_effect_with_name("round-clip", effect) effect.connectObject("notify::enabled", ()=>{ if (effect !== this._effect) return if (effect.enabled) this._updateEffect() }, this) this._updateEffect() } _updateEffect() { if (!this._effect) return if (!this.get_stage()) return const themeNode = this.mapped ? this._current?.get_theme_node() : null const padding = this._options.roundClipPadding this._effect.updateUniforms(1, { border_radius: themeNode?.get_border_radius(null) ?? 16, smoothing: 0, },{ x1: padding?.[3] ?? 2, y1: padding?.[0] ?? 3, x2: this.width - (padding?.[1] ?? 2), y2: this.height - (padding?.[2] ?? 2) }) } // Handle dragging _updateDragOffset(current: MediaItem, offset: number) { const sign = Math.sign(offset) const width = current.allocation.get_width() const ratio = Math.max(Math.min(offset / width, 1), -1) const halfRatio = Math.max(Math.min(offset * 0.5 / width, 1), -1) const expoRatio = (1 - Math.pow(1 - Math.abs(halfRatio), 4)) * sign current.remove_all_transitions() this._dragTranslation = current.translationX = expoRatio * (width * 0.6) current.opacity = Math.floor(lerp(255, 80, Math.abs(ratio))) } _finalizeDragOffset(current: MediaItem, offset: number) { const width = current.allocation.get_width() const direction = -Math.sign(offset) if ( (this._currentPage == this._currentMaxPage - 1 && direction == 1) || (this._currentPage == 0 && direction == -1) || (width/4 > Math.abs(offset)) ) { current.ease({ mode: Clutter.AnimationMode.EASE_OUT_EXPO, translationX: 0, duration: 360, opacity: 255, onComplete: ()=>{ if (this._effect) this._effect.enabled = false } }) this._dragTranslation = null return } this._seekPage(direction) this._dragTranslation = null } dfunc_drag_end(event: Drag.Event): void { this._drag = false const current = this._current if (!current || this._scroll) { this._dragTranslation = null return } if (event.isClick) { Main.overview.hide() Main.panel.closeQuickSettings() current._player?.raise() } const offset = event.coords[0] - (event.moveStartCoords || event.startCoords)[0] this._finalizeDragOffset(current, offset) } dfunc_drag_start(_event: Drag.Event): void { if (this._scroll) return this._drag = true this._dragTranslation = 0 if (this._effect) this._effect.enabled = true } dfunc_drag_motion(event: Drag.Event): void { if (this._scroll) return const current = this._current if (event.isClick || !current) return const offset = event.coords[0] - event.moveStartCoords[0] this._updateDragOffset(current, offset) } // Handle smooth scrolling dfunc_scroll_start(_event: Scroll.Event): void { if (this._drag) return this._scroll = true this._dragTranslation = 0 if (this._effect) this._effect.enabled = true } dfunc_scroll_motion(event: Scroll.Event): void { if (this._drag) return const current = this._current if (!current) return this._updateDragOffset(current, -event.scrollSumX * this._options.smoothScrollSpeed) } dfunc_scroll_end(event: Scroll.Event): void { this._scroll = false const current = this._current if (!current || this._drag) { this._dragTranslation = null return } this._finalizeDragOffset(current, -event.scrollSumX * this._options.smoothScrollSpeed) } // Handle page action get page(): number { return this._currentPage } set page(page: number) { this._setPage(this._messages[page]) } get maxPage(): number { return this._currentMaxPage } _showFirstPlaying() { // Show first playing message const messages = this._messages this._setPage( messages.find(message => message?._player.isPlaying()) ?? messages[0] ) } _setPage(to: MediaItem) { const current = this._current const messages = this._messages this._current = to if (!to || to == current) return for (const message of messages) { message.remove_all_transitions() if (message == current) continue message.hide() } const toIndex = messages.findIndex(message => message == to) this._currentPage = toIndex this.emit("page-updated", toIndex) if (!current) { to.show() return } const currentIndex = messages.findIndex(message => message == current) if (this._effect) this._effect.enabled = true current.ease({ opacity: 0, translationX: (toIndex > currentIndex ? -120 : 120) + (this._dragTranslation ?? 0), duration: 100, mode: Clutter.AnimationMode.EASE_OUT_QUAD, onComplete: ()=>{ current.hide() to.opacity = 0 to.translationX = toIndex > currentIndex ? 120 : -120 to.show() to.ease({ mode: Clutter.AnimationMode.EASE_OUT_EXPO, duration: 280, translationX: 0, opacity: 255, onStopped: ()=>{ if (this._effect) this._effect.enabled = false if (!this._messages.includes(to)) return to.opacity = 255 to.translationX = 0 } }) }, onStopped: ()=>{ if (!this._messages.includes(current)) return current.opacity = 255 current.translationX = 0 } }) } _seekPage(offset: number) { const messages = this._messages if (this._current === null) return let currentIndex = messages.findIndex(message => message == this._current) if (currentIndex == -1) currentIndex = 0 const length = messages.length this._setPage(messages[((currentIndex + offset + length) % length)]) } // New message / Remove message _sync() { const messages = this._messages const empty = messages.length == 0 // Emit max page update if (this._currentMaxPage != messages.length) { this.emit("max-page-updated", this._currentMaxPage = messages.length ) } // Current message destroyed if (this._current && (empty || !messages.includes(this._current))) { this._current = null } // Hide new message for (const message of messages) { if (message == this._current) continue message.hide() } // Show first playing message if nothing shown if (!this._current) { this._showFirstPlaying() } // Update empty state this.empty = empty } } Drag.applyTo(MediaList) Scroll.applyTo(MediaList) GObject.registerClass({ Signals: { "page-updated": {param_types: [GObject.TYPE_INT]}, "max-page-updated": {param_types: [GObject.TYPE_INT]}, }, Properties: { "empty": GObject.ParamSpec.boolean( "empty", null, null, GObject.ParamFlags.READWRITE, true ), } }, MediaList) namespace MediaList { export type Options = Partial<{ roundClipEnabled: boolean, roundClipPadding: null|[number, number, number, number], smoothScrollSpeed: number, } & St.BoxLayout.ConstructorProps> & MediaItem.OptionsBase & ProgressControl.OptionsBase } // #endregion MediaList // #region Header class Header extends St.BoxLayout { _headerLabel: St.Label _pageIndicator: PageIndicators constructor(options: Header.Options) { super(options) } _init(_options: Header.Options) { super._init({ style_class: "QSTWEAKS-header" } as Partial) // Label this._headerLabel = new St.Label({ text: _("Media"), style_class: "QSTWEAKS-header-label", y_align: Clutter.ActorAlign.CENTER, x_align: Clutter.ActorAlign.START, x_expand: true }) this.add_child(this._headerLabel) this._pageIndicator = new PageIndicators(Clutter.Orientation.HORIZONTAL) this._pageIndicator.x_align = Clutter.ActorAlign.END this._pageIndicator.connectObject( "page-activated", (_: any, page: number) => this.emit("page-activated", page), this ) this._pageIndicator.y_align = Clutter.ActorAlign.CENTER this.add_child(this._pageIndicator)// as unknown as St.BoxLayout) } set maxPage(maxPage: number) { (this._pageIndicator as any).setNPages(maxPage) } get maxPage(): number { return (this._pageIndicator as any).nPages } set page(page: number) { (this._pageIndicator as any).setCurrentPosition(page) } get page(): number { return (this._pageIndicator as any)._currentPosition } } GObject.registerClass({ Signals: { "page-activated": {param_types: [GObject.TYPE_INT]}, } }, Header) namespace Header { export type Options = Partial<{ } & St.BoxLayout.ConstructorProps> } // #endregion Header // #region MediaWidget class MediaWidget extends St.BoxLayout { _options: MediaWidget.Options _scroll: St.ScrollView _list: MediaList _header: Header _sections: St.BoxLayout constructor(options: MediaWidget.Options) { super(options) } _init(options: MediaWidget.Options) { super._init({ orientation: Clutter.Orientation.VERTICAL, x_expand: true, y_expand: true, reactive: true, } as Partial) this._options = options this._updateStyleClass() // Create header this._header = new Header({}) this.add_child(this._header) // Create list this._list = new MediaList(options) this.add_child(this._list) this._list.connectObject( "notify::empty", this._syncEmpty.bind(this), this ) this._syncEmpty() // Sync page update & page indicator this._header.page = this._list.page this._header.maxPage = this._list.maxPage this._list.connectObject("page-updated", (_, page: number): void => { if (this._header.page == page) return this._header.page = page }, this) this._list.connectObject("max-page-updated", (_, maxPage: number): void => { if (this._header.maxPage == maxPage) return this._header.maxPage = maxPage }, this) this._header.connectObject("page-activated", (_, page: number) => { this._list.page = page }, this) } _syncEmpty() { this.visible = !this._list.empty } _updateStyleClass() { const options = this._options let style = "QSTWEAKS-media" if (options.compact) style += " QSTWEAKS-message-compact" if (options.removeShadow) style += " QSTWEAKS-message-remove-shadow" this.style_class = style } } GObject.registerClass(MediaWidget) namespace MediaWidget { export type Options = Partial<{ compact: boolean removeShadow: boolean } & St.BoxLayout.ConstructorProps> & MediaItem.OptionsBase & ProgressControl.OptionsBase } // #endregion MediaWidget // #region MediaWidgetFeature export class MediaWidgetFeature extends FeatureBase { // #region settings enabled: boolean header: boolean compact: boolean removeShadow: boolean progressEnabled: boolean sliderStyle: StyledSlider.Options gradientBackground: Rgb gradientStartOpaque: number gradientStartMix: number gradientEndOpaque: number gradientEndMix: number gradientEnabled: boolean contorlOpacity: number roundClipEnabled: boolean roundClipPadding: null|[number, number, number, number] smoothScrollSpeed: number showNextButton: boolean showPrevButton: boolean showPauseButton: boolean override loadSettings(loader: SettingLoader): void { this.enabled = loader.loadBoolean("media-enabled") this.header = loader.loadBoolean("media-show-header") this.compact = loader.loadBoolean("media-compact") this.removeShadow = loader.loadBoolean("media-remove-shadow") this.smoothScrollSpeed = loader.loadInt("media-smooth-scroll-speed") // Control buttons this.contorlOpacity = loader.loadInt("media-contorl-opacity") this.showNextButton = loader.loadBoolean("media-contorl-show-next-button") this.showPrevButton = loader.loadBoolean("media-contorl-show-prev-button") this.showPauseButton = loader.loadBoolean("media-contorl-show-pause-button") // Gradient this.gradientBackground = loader.loadRgb("media-gradient-background-color")! this.gradientEnabled = loader.loadBoolean("media-gradient-enabled") this.gradientStartOpaque = loader.loadInt("media-gradient-start-opaque") this.gradientStartMix = loader.loadInt("media-gradient-start-mix") this.gradientEndOpaque = loader.loadInt("media-gradient-end-opaque") this.gradientEndMix = loader.loadInt("media-gradient-end-mix") // Progress this.progressEnabled = loader.loadBoolean("media-progress-enabled") this.sliderStyle = StyledSlider.Options.fromLoader(loader, "media-progress") // Round clip this.roundClipEnabled = loader.loadBoolean("media-round-clip-enabled") const roundClipPaddingValue = loader.loadValue("media-round-clip-padding-adjustment-value") const roundClipPaddingEnabled = loader.loadBoolean("media-round-clip-padding-adjustment-enabled") this.roundClipPadding = (roundClipPaddingEnabled ? roundClipPaddingValue : null) as any } // #endregion settings mediaWidget?: MediaWidget override reload(key: string): void { // Slider style if (StyledSlider.Options.isStyleKey("media-progress", key)) { if (!this.enabled) return if (!this.progressEnabled) return for (const message of this.mediaWidget!._list._messages) { message._progressControl!._createSlider() } return } switch (key) { case "media-compact": case "media-remove-shadow": if (!this.enabled) return this.mediaWidget!._updateStyleClass() break // Round clip case "media-round-clip-enabled": if (!this.enabled) return this.mediaWidget!._list._initEffect() break // Scroll speed case "media-smooth-scroll-speed": break // Round clip padding case "media-round-clip-padding-adjustment-value": case "media-round-clip-padding-adjustment-enabled": break // Control opacity case "media-contorl-opacity": if (!this.enabled) return for (const message of this.mediaWidget!._list._messages) { message._createControlButtons() } break // Gradient case "media-gradient-background-color": case "media-gradient-enabled": case "media-gradient-start-opaque": case "media-gradient-start-mix": case "media-gradient-end-opaque": case "media-gradient-end-mix": if (!this.enabled) return for (const message of this.mediaWidget!._list._messages) { message._updateGradient() } break default: super.reload() break } } override onLoad(): void { if (!this.enabled) return this.maid.destroyJob( this.mediaWidget = new MediaWidget(this) ) Global.QuickSettingsGrid.add_child(this.mediaWidget) Global.QuickSettingsGrid.layout_manager.child_set_property( Global.QuickSettingsGrid, this.mediaWidget, "column-span", 2 ) } override onUnload(): void { this.mediaWidget = null } } // #endregion MediaWidgetFeature ================================================ FILE: src/features/widget/notifications.ts ================================================ import GObject from "gi://GObject" import St from "gi://St" import Clutter from "gi://Clutter" import * as MessageList from "resource:///org/gnome/shell/ui/messageList.js" import { gettext as _ } from "resource:///org/gnome/shell/extensions/extension.js" import { type DoNotDisturbSwitch } from "resource:///org/gnome/shell/ui/calendar.js" import { FeatureBase, type SettingLoader } from "../../libs/shell/feature.js" import { StyledScroll } from "../../libs/shell/styler.js" import Global from "../../global.js" // #region Placeholder class Placeholder extends St.BoxLayout { _icon: St.Icon _label: St.Label _init() { super._init({ orientation: Clutter.Orientation.VERTICAL, style_class: "QSTWEAKS-placeholder", x_align: Clutter.ActorAlign.CENTER, opacity: 60, x_expand: true, } as Partial) // Symbolic Icon this._icon = new St.Icon({ style_class: "QSTWEAKS-icon", icon_name: "no-notifications-symbolic" }) this.add_child(this._icon) // No Notifications Label this._label = new St.Label({ text: _("No Notifications") }) this.add_child(this._label) } } GObject.registerClass(Placeholder) // #endregion Placeholder // #region ClearButton class ClearButton extends St.Button { _icon: St.Icon _label: St.Label _container: St.BoxLayout _init() { // Child Container this._container = new St.BoxLayout({ x_expand: true, y_expand: true, }) // Button super._init({ style_class: "QSTWEAKS-clear-button", button_mask: St.ButtonMask.ONE, child: this._container, reactive: true, can_focus: true, y_align: Clutter.ActorAlign.CENTER, } as Partial) // Icon this._icon = new St.Icon({ style_class: "QSTWEAKS-icon", icon_name: "user-trash-symbolic", icon_size: 12 }) this._container.add_child(this._icon) // Label this._label = new St.Label({ text: _("Clear") }) this._container.add_child(this._label) } } GObject.registerClass(ClearButton) // #endregion ClearButton // #region Header class Header extends St.BoxLayout { _headerLabel: St.Label _clearButton: ClearButton constructor(options: Header.Options) { super(options) } _init(options: Header.Options) { super._init({ style_class: "QSTWEAKS-header" } as Partial) // Label this._headerLabel = new St.Label({ text: _("Notifications"), style_class: "QSTWEAKS-header-label", y_align: Clutter.ActorAlign.CENTER, x_align: Clutter.ActorAlign.START, x_expand: true }) this.add_child(this._headerLabel) // Clear button if (options.createClearButton) { this._clearButton = new ClearButton() this.add_child(this._clearButton) } } } GObject.registerClass(Header) namespace Header { export type Options = Partial<{ createClearButton: boolean } & St.BoxLayout.ConstructorProps> } // #endregion Header // #region NativeControl class NativeControl extends St.BoxLayout { _clearButton: St.Button _dndButton: St.Button _dndLabel: St.Label _dndSwitch: DoNotDisturbSwitch _init() { // See : https://github.com/GNOME/gnome-shell/blob/934dbe549567f87d7d6deb6f28beaceda7da1d46/js/ui/calendar.js#L979 super._init({ style_class: "QSTWEAKS-native-controls", } as Partial) // DND Switch this._dndSwitch = new (Global.MessageList._dndSwitch.constructor as any)() // Calendar.DoNotDisturbSwitch(); this._dndSwitch.style_class += " QSTWEAKS-native-dnd-switch" // DND Label this._dndLabel = new St.Label({ style_class: "QSTWEAKS-native-dnd-text", text: _("Do Not Disturb"), y_align: Clutter.ActorAlign.CENTER, }) this.add_child(this._dndLabel) this._dndButton = new St.Button({ style_class: "dnd-button", can_focus: true, toggle_mode: true, child: this._dndSwitch, label_actor: this._dndLabel, y_align: Clutter.ActorAlign.CENTER, }) this._dndSwitch.bind_property("state", this._dndButton, "checked", GObject.BindingFlags.BIDIRECTIONAL | GObject.BindingFlags.SYNC_CREATE) this.add_child(this._dndButton) // Clear Button this._clearButton = new St.Button({ style_class: "message-list-clear-button button QSTWEAKS-native-clear-button", label: _("Clear"), can_focus: true, x_expand: true, x_align: Clutter.ActorAlign.END, accessible_name: C_("action", "Clear all notifications"), }) this.add_child(this._clearButton) } } GObject.registerClass(NativeControl) // #endregion NativeControl // #region NotificationList class NotificationList extends MessageList.MessageView { constructor() { super() } // Do not setup mpris _setupMpris() {} } GObject.registerClass(NotificationList) // #endregion NotificationList // #region NotificationWidget class NotificationWidget extends St.BoxLayout { _options: NotificationWidget.Options _header: Header _placeholder: Placeholder _list: NotificationList _scroll: St.ScrollView _nativeControl: NativeControl _sections: St.BoxLayout constructor(options: NotificationWidget.Options) { super(options) } _init(options: NotificationWidget.Options) { super._init({ orientation: Clutter.Orientation.VERTICAL, } as Partial) this._options = options this._createScroll() this._createHeaderArea() this._createPlaceholder() this._createNativeControl() this.add_child(this._header) this.add_child(this._scroll) if (this._placeholder) this.add_child(this._placeholder) if (this._nativeControl) this.add_child(this._nativeControl) this._list.connectObject( "notify::empty", this._syncEmpty.bind(this), this ) this._list.connectObject( "notify::can-clear", this._syncClear.bind(this), this ) this._syncEmpty() this._syncClear() this._updateMaxHeight() this._updateStyleClass() } // Box style _updateMaxHeight() { const maxHeight = this._options.maxHeight this.style = maxHeight ? `max-height:${maxHeight}px;` : "" } _updateStyleClass() { const options = this._options let style = "QSTWEAKS-notifications" if (options.useNativeControls) style += " QSTWEAKS-use-native-controls" if (options.compact) style += " QSTWEAKS-message-compact" if (options.removeShadow) style += " QSTWEAKS-message-remove-shadow" this.style_class = style } // Scroll view _createScroll() { this._list = new NotificationList() this._scroll = new St.ScrollView({ x_expand: true, y_expand: true, child: this._list, }) this._updateScrollStyle() this._scroll.connectObject( "notify::vscrollbar-visible", this._syncScrollbarPadding.bind(this), this ) this._syncScrollbarPadding() } _updateScrollStyle() { StyledScroll.updateStyle(this._scroll, this._options.scrollStyle) } _syncScrollbarPadding() { this._scroll.style_class = this._scroll.vscrollbar_visible ? "QSTWEAKS-has-scrollbar" : "" } _createHeaderArea() { const header = this._header = new Header({ createClearButton: !this._options.useNativeControls }) if (header._clearButton) { header._clearButton.connectObject( "clicked", this._list.clear.bind(this._list), this ) } } _createPlaceholder() { if (this._options.autoHide) return this._placeholder = new Placeholder() } _createNativeControl() { if (!this._options.useNativeControls) return this._nativeControl = new NativeControl() this._nativeControl._clearButton.connectObject( "clicked", this._list.clear.bind(this._list), this ) } // See : https://github.com/GNOME/gnome-shell/blob/934dbe549567f87d7d6deb6f28beaceda7da1d46/js/ui/calendar.js#L1043 _syncClear() { // Sync clear button reactive state const canClear = this._list.canClear; // Update native control clear button if it exists if (this._nativeControl) { this._nativeControl._clearButton.reactive = canClear; this._nativeControl._clearButton.can_focus = canClear; // Update style to visually indicate if button is enabled/disabled if (canClear) { this._nativeControl._clearButton.remove_style_class_name('disabled'); } else { this._nativeControl._clearButton.add_style_class_name('disabled'); } } // Update custom clear button if it exists const clearButton = this._header._clearButton; if (clearButton) { clearButton.visible = canClear; clearButton.reactive = canClear; clearButton.can_focus = canClear; // Update style to visually indicate if button is enabled/disabled if (canClear) { clearButton.remove_style_class_name('disabled'); } else { clearButton.add_style_class_name('disabled'); } } } _syncEmpty() { // placeholder / autohide const empty = this._list.empty if (this._options.autoHide) { this.visible = !empty } else { this._scroll.visible = !empty this._placeholder.visible = empty } } } GObject.registerClass(NotificationWidget) namespace NotificationWidget { export type Options = { useNativeControls: boolean autoHide: boolean maxHeight: number compact: boolean removeShadow: boolean scrollStyle: StyledScroll.Options } & Partial } // #endregion NotificationWidget // #region NotificationsWidgetFeature export class NotificationsWidgetFeature extends FeatureBase { // #region settings enabled: boolean useNativeControls: boolean autoHide: boolean maxHeight: number compact: boolean removeShadow: boolean header: boolean scrollStyle: StyledScroll.Options override loadSettings(loader: SettingLoader): void { this.enabled = loader.loadBoolean("notifications-enabled") this.useNativeControls = loader.loadBoolean("notifications-use-native-controls") this.autoHide = loader.loadBoolean("notifications-autohide") this.maxHeight = loader.loadInt("notifications-max-height") this.compact = loader.loadBoolean("notifications-compact") this.removeShadow = loader.loadBoolean("notifications-remove-shadow") this.header = loader.loadBoolean("notifications-show-header") this.scrollStyle = StyledScroll.Options.fromLoader(loader, "notifications") } // #endregion settings notificationWidget: NotificationWidget override reload(key: string): void { switch (key) { case "notifications-max-height": if (!this.enabled) return this.notificationWidget!._updateMaxHeight() break case "notifications-compact": case "notifications-remove-shadow": if (!this.enabled) return this.notificationWidget!._updateStyleClass() break case "notifications-fade-offset": case "notifications-show-scrollbar": if (!this.enabled) return this.notificationWidget!._updateScrollStyle() break default: super.reload() break } } override onLoad(): void { if (!this.enabled) return // Create Notification Box this.maid.destroyJob( this.notificationWidget = new NotificationWidget(this) ) // Add to grid Global.QuickSettingsGrid.add_child(this.notificationWidget) Global.QuickSettingsGrid.layout_manager.child_set_property( Global.QuickSettingsGrid, this.notificationWidget, "column-span", 2 ) } override onUnload(): void { this.notificationWidget = null } } // #endregion NotificationsWidgetFeature ================================================ FILE: src/features/widget/volumeMixer.ts ================================================ /* * This code is partially licensed under the gnome-volume-mixer license. * For more details, please check the license page in the about tab of the extension settings. */ import St from "gi://St" import Gvc from "gi://Gvc" import GObject from "gi://GObject" import Gio from "gi://Gio" import GLib from "gi://GLib" import { QuickSlider } from "resource:///org/gnome/shell/ui/quickSettings.js" import * as Main from "resource:///org/gnome/shell/ui/main.js" import * as PopupMenu from "resource:///org/gnome/shell/ui/popupMenu.js" import * as Volume from "resource:///org/gnome/shell/ui/status/volume.js" import { FeatureBase, type SettingLoader } from "../../libs/shell/feature.js" import { StyledScroll } from "../../libs/shell/styler.js" import { updateMenuSeparators } from "../../libs/shell/quickSettingsUtils.js" import Maid from "../../libs/shared/maid.js" import Global from "../../global.js" import Logger from "../../libs/shared/logger.js" import Clutter from "gi://Clutter" const ALLOW_AMPLIFIED_VOLUME_KEY = "allow-volume-above-100-percent" // #region StreamSlider class StreamSlider extends QuickSlider { _maid: Maid _control: Gvc.MixerControl _inDrag: boolean _notifyVolumeChangeId: number _deviceSection: PopupMenu.PopupMenuSection _sliderChangedId: number _options: StreamSlider.Options constructor( control: Gvc.MixerControl, stream: Gvc.MixerStream, options: VolumeMixerList.Options ) { // @ts-ignore super(control, stream, options) } // @ts-ignore _init(control: Gvc.MixerControl, stream: Gvc.MixerStream|undefined, options: StreamSlider.Options) { this._options = options this._control = control this._notifyVolumeChangeId = 0 this._maid = new Maid() super._init() this._maid.connectJob(this, "destroy", this._destroy.bind(this)) // Update allow amplify this._soundSettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.sound', }) this._maid.connectJob( this._soundSettings, `changed::${ALLOW_AMPLIFIED_VOLUME_KEY}`, this._updateAllowAmplified.bind(this) ) this._updateAllowAmplified() // Update icon this.iconReactive = true this.connect("icon-clicked", ()=>{ if (!this._stream) return this._stream.set_is_muted(!this._stream.is_muted) }) // Value change connection this._inDrag = false this._sliderChangedId = this._maid.connectJob(this.slider, "notify::value", this._sliderChanged.bind(this)) this._maid.connectJob(this.slider, "drag-begin", () => { this._inDrag = true }) this._maid.connectJob(this.slider, "drag-end", () => { this._inDrag = false }) // this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()) // this.menu.addSettingsAction(_('Sound Settings'), 'gnome-sound-panel.desktop') // Update stream if (stream) { this.stream = stream } else { this._stream = null } } // Stream connection _stream: Gvc.MixerStream get stream(): Gvc.MixerStream { return this._stream } set stream(stream: Gvc.MixerStream) { if (this._stream == stream) return this._stream?.disconnectObject(this) this._stream = stream if (stream) { // Create connection stream.connectObject( 'notify::is-muted', this._updateSlider.bind(this), 'notify::volume', this._updateSlider.bind(this), this ) this._updateSlider() } else { this.emit('stream-updated') } this._sync() } _sync() { // Sync visibility this.visible = this._stream != null this.menuEnabled = false // this._deviceItems.size > 1 // Show icon if (this._options.showIcon) { // this.icon_name = stream.get_icon_name() this.gicon = this._stream.get_gicon() } } // Volume feedback sfx _volumeCancellable?: Gio.Cancellable|null _feedbackVolumeChange() { // Cancel last sound if (this._volumeCancellable) this._volumeCancellable.cancel() this._volumeCancellable = null // Feedback not necessary while playing if (this._stream.state === Gvc.MixerStreamState.RUNNING) return // Play sound feedback this._volumeCancellable = new Gio.Cancellable() global .display .get_sound_player() .play_from_theme( 'audio-volume-change', _('Volume changed'), this._volumeCancellable ) } // Update slider value (without emitting notify::value connection) _updateSlider() { this.slider.block_signal_handler(this._sliderChangedId) this.slider.value = this._stream.is_muted ? 0 : (this._stream.volume / this._control.get_vol_max_norm()) this.slider.unblock_signal_handler(this._sliderChangedId) this.emit('stream-updated') } // Slider value notify _sliderChanged() { if (!this._stream) return const volume: number = this.slider.value * this._control.get_vol_max_norm() const prevMuted: boolean = this._stream.is_muted const prevVolume: number = this._stream.volume const volumeChanged: boolean = this._stream.volume !== prevVolume if (volume < 1) { this._stream.volume = 0 if (!prevMuted) this._stream.change_is_muted(true) } else { this._stream.volume = volume if (prevMuted) this._stream.change_is_muted(false) } this._stream.push_volume() if (volumeChanged && !this._notifyVolumeChangeId && !this._inDrag) { this._notifyVolumeChangeId = GLib.timeout_add(GLib.PRIORITY_DEFAULT, 30, () => { this._feedbackVolumeChange() this._notifyVolumeChangeId = 0 return GLib.SOURCE_REMOVE }) GLib.Source.set_name_by_id( this._notifyVolumeChangeId, '[quick-settings-tweaks] StreamSlider._sliderChanged: this._notifyVolumeChangeId' ) } } // Update allow amplified from org.gnome.desktop.sound _soundSettings: Gio.Settings _allowAmplified: boolean _updateAllowAmplified() { this._allowAmplified = this._soundSettings.get_boolean(ALLOW_AMPLIFIED_VOLUME_KEY) this.slider.maximumValue = this._allowAmplified ? this.getMaxLevel() : 1 if (this._stream) this._updateSlider() } getLevel(): number|null { if (!this._stream) return null return this._stream.volume / this._control.get_vol_max_norm() } getMaxLevel(): number { const maxVolume = this._allowAmplified ? this._control.get_vol_max_amplified() : this._control.get_vol_max_norm() return maxVolume / this._control.get_vol_max_norm() } _destroy() { this._maid.destroy() this._maid = null if (this._notifyVolumeChangeId) { GLib.Source.remove(this._notifyVolumeChangeId) this._notifyVolumeChangeId = null } this._soundSettings = null if (this._volumeCancellable) { this._volumeCancellable.cancel() this._volumeCancellable = null } } // I have no idea why, slider has finite height, so we should floor it for scroll layout vfunc_get_preferred_height(for_width: number): [number, number] { return super.vfunc_get_preferred_height(for_width).map(Math.floor) as [number, number] } } GObject.registerClass({ Signals: { 'stream-updated': {}, }, }, StreamSlider) namespace StreamSlider { export interface Options { showIcon: boolean } } // #endregion StreamSlider // #region VolumeMixerItem class VolumeMixerItem extends St.BoxLayout { _control: Gvc.MixerControl _stream: Gvc.MixerStream _options: VolumeMixerItem.Options _slider: StreamSlider _label: St.Label constructor( control: Gvc.MixerControl, stream: Gvc.MixerStream|undefined, options: VolumeMixerItem.Options ) { super(control, stream, options) } _init( control: Gvc.MixerControl, stream: Gvc.MixerStream|undefined, options: VolumeMixerItem.Options ) { super._init({ orientation: Clutter.Orientation.VERTICAL, style_class: "QSTWEAKS-item", }) this._control = control this._stream = stream this._options = options // Create label const label = this._label = new St.Label({ x_expand: true, style_class: "QSTWEAKS-label", opacity: this._options.labelOpacity, }) this._updateLabel() this.add_child(label) // Create Slider const slider = this._slider = new StreamSlider(control, stream, options) this.add_child(slider) } _updateLabel() { const label = this._label const name = this._stream.get_name() const description = this._stream.get_description() switch (this._options.labelText) { case "title": if (name) label.text = name else if (description) label.text = description if (description || name) label.show() else label.hide() break case "description": if (description) label.text = description else if (name) label.text = name if (description || name) label.show() else label.hide() break case "both": if (name && description) label.text = `${name} - ${description}` else if (name) label.text = name else if (description) label.text = description if (name || description) label.show() else label.hide() break case "none": label.hide() break } } _sync() { this._updateLabel() this._slider._sync() } } GObject.registerClass(VolumeMixerItem) namespace VolumeMixerItem { export type Options = { labelText: "title"|"description"|"both"|"none", labelOpacity: number, } & StreamSlider.Options } // #endregion VolumeMixerItem // #region VolumeMixerList class VolumeMixerList extends St.BoxLayout { _control: Gvc.MixerControl _maid: Maid _options: VolumeMixerList.Options _sliders: Map shouldShow: boolean constructor(options: VolumeMixerList.Options) { super({ orientation: Clutter.Orientation.VERTICAL, style_class: "QSTWEAKS-volume-mixer", clip_to_allocation: true, x_expand: true, }) this._options = options this._maid = new Maid() this._sliders = new Map() // this._applicationMenus = new Map()//{} this._control = Volume.getMixerControl() this._maid.connectJob(this._control, "stream-added", this._streamAdded.bind(this)) this._maid.connectJob(this._control, "stream-removed", this._streamRemoved.bind(this)) this._maid.connectJob(this._control, "stream-changed", this._streamChanged.bind(this)) for (const stream of this._control.get_streams()) { this._streamAdded(this._control, stream.get_id()) } this.connect("destroy", ()=>{ this._maid.destroy() this._maid = null for (const slider of this._sliders.values()) { slider.destroy() } this._sliders = null }) // Group with application id << we need this // description regex // name regex // application regex // show as popup menu // this._filteredApps = settings["volume-mixer-filtered-apps"] // this._filterMode = settings["volume-mixer-filter-mode"] // this._showStreamDesc = settings["volume-mixer-show-description"] // this._showStreamIcon = settings["volume-mixer-show-icon"] // this._useRegex = settings["volume-mixer-use-regex"] // this._checkDescription = settings["volume-mixer-check-description"] } _streamAdded(control: Gvc.MixerControl, id: number) { if (this._sliders.has(id)) { return } const stream = control.lookup_stream_id(id) if (stream.is_event_stream || !(stream instanceof Gvc.MixerSinkInput)) { return } // const applicationId = stream.get_application_id() // const name = stream.get_name() // const description = stream.get_description() // filter here // let hasFiltered = false // for (const matchStr of this._filteredApps) { // let matchExp = this._useRegex ? new RegExp(matchStr) : matchStr // if ( // // Check name // this._checkMatch(name, matchExp) // // Check description // || this._checkDescription && this._checkMatch(description, matchExp) // ) { hasFiltered = true; break } // } // if (this._filterMode === "block" && hasFiltered) return // if (this._filterMode === "allow" && !hasFiltered) return const slider = new VolumeMixerItem( this._control, stream, this._options ) this._sliders.set(id, slider) this.add_child(slider) this._sync() } _streamChanged(control: Gvc.MixerControl, id: number) { const slider = this._sliders.get(id) const stream = control.lookup_stream_id(id) if (!slider) return // filter check here, or create new here slider._sync() } _streamRemoved(_control: Gvc.MixerControl, id: number) { const slider = this._sliders.get(id) if (!slider) return slider.destroy() this._sliders.delete(id) this._sync() } _sync() { if (!this._sliders.size) { this.shouldShow = false return } for (const slider of this._sliders.values()) { if (slider.visible) { this.shouldShow = true return } } this.shouldShow = false } } GObject.registerClass({ Properties: { 'should-show': GObject.ParamSpec.boolean( 'should-show', null, null, GObject.ParamFlags.READWRITE, false), }, }, VolumeMixerList) namespace VolumeMixerList { export type Options = { } & VolumeMixerItem.Options } // #endregion VolumeMixerList // #region VolumeMixerWidget class VolumeMixerWidget extends St.BoxLayout { _options: VolumeMixerWidget.Options // _header: Header _list: VolumeMixerList _scroll: St.ScrollView _sections: St.BoxLayout constructor(options: VolumeMixerWidget.Options) { super(options) } _init(options: VolumeMixerWidget.Options) { super._init({ orientation: Clutter.Orientation.VERTICAL, } as Partial) this._options = options this._createScroll() this.add_child(this._scroll) this._updateMaxHeight() this._updateStyleClass() this._list.connectObject( "notify::should-show", this._sync.bind(this), this ) this._sync() } // Box style _updateMaxHeight() { const maxHeight = this._options.maxHeight this.style = maxHeight ? `max-height:${maxHeight}px;` : "" } _updateStyleClass() { const options = this._options let style = "QSTWEAKS-volume-mixer" this.style_class = style } // Scroll view _createScroll() { this._sections = new St.BoxLayout({ orientation: Clutter.Orientation.VERTICAL, x_expand: true, y_expand: true, }) this._scroll = new St.ScrollView({ x_expand: true, y_expand: true, child: this._sections, }) this._updateScrollStyle() this._scroll.connectObject( "notify::vscrollbar-visible", this._syncScrollbarPadding.bind(this), this ) this._syncScrollbarPadding() this._list = new VolumeMixerList(this._options) this._sections.add_child(this._list) } _updateScrollStyle() { StyledScroll.updateStyle(this._scroll, this._options.scrollStyle) } _syncScrollbarPadding() { this._sections.style_class = this._scroll.vscrollbar_visible ? "QSTWEAKS-has-scrollbar" : "" } // Get height with avoiding unnecessary allocation vfunc_get_preferred_height(for_width: number): [number, number] { if (!this.get_stage()) return [0, 0] const contentHeight = this._list.get_preferred_height(for_width) const maxHeight = this._options.maxHeight if (!maxHeight) return contentHeight return [Math.min(maxHeight, contentHeight[0]), Math.min(maxHeight, contentHeight[1])] } _sync() { this.visible = this._list.shouldShow } } GObject.registerClass(VolumeMixerWidget) namespace VolumeMixerWidget { export type Options = { maxHeight: number, scrollStyle: StyledScroll.Options } & Partial & VolumeMixerList.Options } // #endregion VolumeMixerWidget // #region VolumeMixerWidgetFeature export class VolumeMixerWidgetFeature extends FeatureBase { // #region settings enabled: boolean showIcon: boolean maxHeight: number labelText: VolumeMixerItem.Options["labelText"] labelOpacity: number menuEnabled: boolean menuIcon: string scrollStyle: StyledScroll.Options override loadSettings(loader: SettingLoader): void { this.enabled = loader.loadBoolean("volume-mixer-enabled") this.showIcon = loader.loadBoolean("volume-mixer-show-icon") this.maxHeight = loader.loadInt("volume-mixer-max-height") this.labelText = loader.loadString("volume-mixer-label-text") as VolumeMixerItem.Options["labelText"] this.labelOpacity = loader.loadInt("volume-mixer-label-opacity") this.menuEnabled = loader.loadBoolean("volume-mixer-menu-enabled") this.menuIcon = loader.loadString("volume-mixer-menu-icon") this.scrollStyle = StyledScroll.Options.fromLoader(loader, "volume-mixer") } // #endregion settings volumeMixerWidget: VolumeMixerWidget mixerMenuButton: St.Button mixerMenuSection: PopupMenu.PopupMenuSection createMenu(slider: QuickSlider) { // Create section this.mixerMenuSection = new PopupMenu.PopupMenuSection() this.mixerMenuSection.box.add_child(this.volumeMixerWidget) this.mixerMenuSection.box.hide() this.maid.destroyJob(this.mixerMenuSection) // Create button this.mixerMenuButton = new St.Button({ child: new St.Icon({icon_name: this.menuIcon}), style_class: "icon-button flat", can_focus: true, x_expand: false, y_expand: true, visible: this.volumeMixerWidget.visible, accessible_name: _("Open volumx mixer"), }) this.volumeMixerWidget.bind_property( "visible", this.mixerMenuButton, "visible", null ) // Push to output stream slider menu slider.menu.addMenuItem(this.mixerMenuSection, 1) slider.child.add_child(this.mixerMenuButton) const revertChanges = ()=>{ slider.menu.setHeader("audio-headphones-symbolic", (_)("Sound Output")); (slider.menu as any)._setSettingsVisibility(Main.sessionMode.allowSettings); updateMenuSeparators(slider.menu); (slider as any)._deviceSection.box.show() } this.maid.connectJob(this.mixerMenuButton, "clicked", () => { this.mixerMenuSection.box.show(); (slider as any)._deviceSection.box.hide(); (slider.menu as any)._setSettingsVisibility(false) updateMenuSeparators(slider.menu) slider.menu.setHeader("audio-headphones-symbolic", _("Volume Mixer")) slider.menu.open(true) }) this.maid.destroyJob(this.mixerMenuButton) this.maid.connectJob(slider.menu, "menu-closed", ()=>{ this.mixerMenuSection.box.hide() revertChanges() }) this.maid.functionJob(revertChanges) } override reload(key: string): void { switch (key) { case "volume-mixer-max-height": if (!this.enabled) return this.volumeMixerWidget!._updateMaxHeight() break case "volume-mixer-fade-offset": case "volume-mixer-show-scrollbar": if (!this.enabled) return this.volumeMixerWidget!._updateScrollStyle() break default: super.reload() break } } override onLoad(): void { this.maid.destroyJob( this.volumeMixerWidget = new VolumeMixerWidget(this) ) if (this.menuEnabled) { Global.GetStreamSlider().then( ({ OutputStreamSlider }) => this.createMenu(OutputStreamSlider) ).catch(Logger.error) } else { (Global.QuickSettingsMenu as any).addItem(this.volumeMixerWidget, 2) Global.GetStreamSlider().then(({ InputStreamSlider }) => { Global.QuickSettingsGrid.set_child_above_sibling( this.volumeMixerWidget, InputStreamSlider ) }) } } override onUnload(): void { this.volumeMixerWidget = null } } // #endregion VolumeMixerWidgetFeature ================================================ FILE: src/features/widget/weather.ts ================================================ import Clutter from "gi://Clutter" import GObject from "gi://GObject" import GLib from "gi://GLib" import Pango from "gi://Pango" import St from "gi://St" import * as Main from "resource:///org/gnome/shell/ui/main.js" /// @ts-expect-error import {formatTime} from "resource:///org/gnome/shell/misc/dateUtils.js" import { WeatherClient } from "resource:///org/gnome/shell/misc/weather.js" import GWeather from "gi://GWeather" import { FeatureBase, type SettingLoader } from "../../libs/shell/feature.js" import Global from "../../global.js" // #region Client class Client extends WeatherClient { getInfos(maxForecasts: number, intervalHour: number): GWeather.Info[] { const infos = [] const forecasts = this.info.get_forecast_list() const now = GLib.DateTime.new_now_local() let current = GLib.DateTime.new_from_unix_local(0) for (let i = 0; i < forecasts.length; i++) { const [valid, timestamp] = forecasts[i].get_value_update() if (!valid || timestamp === 0) { continue // 0 means 'never updated' } const datetime = GLib.DateTime.new_from_unix_local(timestamp) if (now.difference(datetime) > 0) { continue // Ignore earlier forecasts } if (datetime.difference(current) < GLib.TIME_SPAN_HOUR * intervalHour) { continue // Enforce a minimum interval of 1h } if (infos.push(forecasts[i]) === maxForecasts) { break // Use a maximum of five forecasts } current = datetime } return infos } getBestCurrentLocationName(): string { return this.getBestLocationName(this.info.get_location()) } getBestLocationName(loc: GWeather.Location): string { /// @ts-expect-error const locName = loc.get_name() if ( /// @ts-expect-error loc.get_level() === GWeather.LocationLevel.CITY /// @ts-expect-error || !loc.has_coords() ) return locName /// @ts-expect-error const world = GWeather.Location.get_world() /// @ts-expect-error const city = world.find_nearest_city(...loc.get_coords()) const cityName = city.get_name() return locName.includes(cityName) ? cityName : locName } } // #endregion Client // #region Header class Header extends St.BoxLayout { _headerLabel: St.Label _locationLabel: St.Label _client: Client _options: Header.Options constructor(client: Client, options: Header.Options) { super(client as any, options as any) } _init(client: Client, options: Header.Options) { this._options = options this._client = client super._init({ style_class: "QSTWEAKS-header" } as Partial) // Labels this._headerLabel = new St.Label({ text: _("Weather"), style_class: "QSTWEAKS-header-label", y_align: Clutter.ActorAlign.CENTER, x_align: Clutter.ActorAlign.START, x_expand: true, }) this._locationLabel = new St.Label({ style_class: "QSTWEAKS-location-label", y_align: Clutter.ActorAlign.CENTER, opacity: 190, }) this.add_child(this._headerLabel) this.add_child(this._locationLabel) // Client connection client.connectObject("changed", this._sync.bind(this), this) this._sync.bind(this) } _sync() { if ( this._locationLabel.visible = this._options.showLocation && this._client.hasLocation ) { this._locationLabel.text = this._client.getBestCurrentLocationName() } } } GObject.registerClass(Header) namespace Header { export type Options = { showLocation: boolean, } } // #endregion Header // #region WeatherSection class WeatherSection extends St.Button { _client: Client _grid: St.Widget _layout: Clutter.GridLayout _options: WeatherSection.Options constructor(client: Client, options: WeatherSection.Options) { super(client as any, options as any) } _init(client: Client, options: WeatherSection.Options) { this._client = client this._options = options super._init({ style_class: "weather-button message", can_focus: true, x_expand: true, }) const box = this.child = new St.BoxLayout({ orientation: Clutter.Orientation.VERTICAL, style_class: "weather-box", x_expand: true, }) const layout = this._layout = new Clutter.GridLayout({ orientation: Clutter.Orientation.VERTICAL, }) const grid = this._grid = new St.Widget({ style_class: "weather-grid", layout_manager: layout, }) // @ts-expect-error layout.hookup_style(grid) box.add_child(grid) client.connectObject("changed", this._sync.bind(this), this) this._sync() this.connect("clicked", this._click.bind(this)) } _addForecast(forecast: GWeather.Info, col: number) { const [, timestamp] = forecast.get_value_update() const timeStr = formatTime(new Date(timestamp * 1000), { timeOnly: true, ampm: false, }) const [, tempValue] = forecast.get_value_temp(GWeather.TemperatureUnit.DEFAULT) const tempPrefix = Math.round(tempValue) >= 0 ? " " : "" const time = new St.Label({ style_class: "weather-forecast-time", text: timeStr, x_align: Clutter.ActorAlign.CENTER, }) const icon = new St.Icon({ style_class: "weather-forecast-icon", icon_name: forecast.get_symbolic_icon_name(), x_align: Clutter.ActorAlign.CENTER, x_expand: true, }) const temp = new St.Label({ style_class: "weather-forecast-temp", text: `${tempPrefix}${Math.round(tempValue)}°`, x_align: Clutter.ActorAlign.CENTER, }) temp.clutter_text.ellipsize = Pango.EllipsizeMode.NONE time.clutter_text.ellipsize = Pango.EllipsizeMode.NONE this._layout.attach(time, col, 0, 1, 1) this._layout.attach(icon, col, 1, 1, 1) this._layout.attach(temp, col, 2, 1, 1) } _updateForecasts() { const infos = this._client.getInfos( this._options.maxForecasts, this._options.intervalHour ) // RTL support if (this._grid.text_direction === Clutter.TextDirection.RTL) { infos.reverse() } let col = 0 for (const forecast of infos) { if (!forecast.is_valid()) continue this._addForecast(forecast, col) col++ } } _setStatusLabel(text: string) { let layout = this._grid.layout_manager let label = new St.Label({ text, style_class: "QSTWEAKS-status-label", }) /// @ts-expect-error layout.attach(label, 0, 0, 1, 1) } _sync() { this._grid.destroy_all_children() if (!this._client.available) { this._setStatusLabel((_)("Weather Information Unavailable")) return } if (!this._client.hasLocation) { this._setStatusLabel(_("Location has not been set")) return } if (this._client.loading) { this._setStatusLabel((_)("Loading…")) return } const info = this._client.info if (info.is_valid()) { this._updateForecasts() return } if (info.network_error()) { this._setStatusLabel((_)("Go Online for Weather Information")) } else { this._setStatusLabel((_)("Weather Information Unavailable")) } } // Show weather app _click() { const command = this._options.clickCommand if (command) { GLib.spawn_async(null, ['sh', '-c', command], null, GLib.SpawnFlags.SEARCH_PATH, null) } else { this._client.activateApp() } Main.overview.hide() Main.panel.closeCalendar() } } GObject.registerClass(WeatherSection) namespace WeatherSection { export type Options = { maxForecasts: number, intervalHour: number, clickCommand: string, } & Header.Options } // #endregion WeatherSection // #region WeatherWidget class WeatherWidget extends St.BoxLayout { _item: St.Button _header: Header _client: Client _options: WeatherWidget.Options constructor(options: WeatherWidget.Options) { super(options as any) } _init(options: WeatherWidget.Options) { this._options = options const client = this._client = new Client() super._init({ orientation: Clutter.Orientation.VERTICAL, }) this.add_child( this._header = new Header(client, options) ) this.add_child( this._item = new WeatherSection(client, options) ) // Sync changes this._client.connectObject( "changed", this._updateStyleClass.bind(this), this ) this._updateStyleClass() } _updateStyleClass(): void { const options = this._options let style = "QSTWEAKS-weather" if (options.removeShadow) style += " QSTWEAKS-weather-remove-shadow" if (options.compact) style += " QSTWEAKS-weather-compact" this.styleClass = style } // Update weather client when widget shown vfunc_map() { this._client.update() super.vfunc_map() } } GObject.registerClass(WeatherWidget) namespace WeatherWidget { export type Options = { compact: boolean removeShadow: boolean } & WeatherSection.Options } // #endregion WeatherWidget // #region WeatherWidgetFeature export class WeatherWidgetFeature extends FeatureBase { // #region settings enabled: boolean compact: boolean removeShadow: boolean clickCommand: string header: boolean maxForecasts: number intervalHour: number showLocation: boolean override loadSettings(loader: SettingLoader): void { this.enabled = loader.loadBoolean("weather-enabled") this.removeShadow = loader.loadBoolean("weather-remove-shadow") this.compact = loader.loadBoolean("weather-compact") this.clickCommand = loader.loadString("weather-click-command") this.header = loader.loadBoolean("weather-show-header") this.showLocation = loader.loadBoolean("weather-show-location") this.maxForecasts = loader.loadInt("weather-max-forecasts") this.intervalHour = loader.loadInt("weather-interval-hour") } // #endregion settings weatherWidget: WeatherWidget override reload(key: string): void { switch (key) { case "weather-compact": case "weather-remove-shadow": if (!this.enabled) return this.weatherWidget!._updateStyleClass() break case "weather-click-command": break default: super.reload() break } } override onLoad(): void { if (!this.enabled) return this.maid.destroyJob( this.weatherWidget = new WeatherWidget(this) ) Global.QuickSettingsGrid.add_child(this.weatherWidget) Global.QuickSettingsGrid.layout_manager.child_set_property( Global.QuickSettingsGrid, this.weatherWidget, "column-span", 2 ) } override onUnload(): void { this.weatherWidget = null } } // #endregion WeatherWidgetFeature ================================================ FILE: src/global.scss ================================================ $p: ".QSTWEAKS"; $v: "-QSTWEAKS"; ================================================ FILE: src/global.ts ================================================ import Clutter from "gi://Clutter" import St from "gi://St" import GLib from "gi://GLib" import Gio from "gi://Gio" import * as Main from "resource:///org/gnome/shell/ui/main.js" import { type Extension } from "resource:///org/gnome/shell/extensions/extension.js" import { type MessageTray } from "resource:///org/gnome/shell/ui/messageTray.js" import { type DateMenuButton } from "resource:///org/gnome/shell/ui/dateMenu.js" import * as PanelMenu from "resource:///org/gnome/shell/ui/panelMenu.js" import { type CalendarMessageList } from "resource:///org/gnome/shell/ui/calendar.js"; import { type SystemItem, type Indicator as SystemIndicator } from "resource:///org/gnome/shell/ui/status/system.js" import { type PopupMenu } from "resource:///org/gnome/shell/ui/popupMenu.js" import { type QuickSlider, type QuickSettingsMenu } from "resource:///org/gnome/shell/ui/quickSettings.js" import Logger from "./libs/shared/logger.js" type StreamSlider = { VolumeInput: any, InputStreamSlider: QuickSlider, OutputStreamSlider: QuickSlider, } export default class Global { static QuickSettings: PanelMenu.Button static QuickSettingsMenu: QuickSettingsMenu static QuickSettingsGrid: St.Widget static QuickSettingsBox: St.BoxLayout static QuickSettingsActor: St.Widget static get QuickSettingsSystemIndicator(): Promise { return new Promise(resolve => { let system = (this.QuickSettings as any)._system if (system) { resolve(system) return } GLib.idle_add(GLib.PRIORITY_DEFAULT_IDLE, () => { system = (this.QuickSettings as any)._system if (!system) return GLib.SOURCE_CONTINUE resolve(system) return GLib.SOURCE_REMOVE }) }) } static get QuickSettingsSystemItem(): Promise { return this.QuickSettingsSystemIndicator .then(system=>(system as any)._systemItem) .catch(Logger.error) } static Indicators: St.BoxLayout static DateMenu: DateMenuButton static DateMenuMenu: PopupMenu static DateMenuBox: Clutter.Actor static DateMenuHolder: Clutter.Actor static MessageTray: MessageTray static Extension: Extension static Settings: Gio.Settings static get MessageList(): CalendarMessageList { return (this.DateMenu as any)._messageList } static get DateMenuIndicator(): Clutter.Actor { return (this.DateMenu as any)._indicator } static GetShutdownMenuBox(): Promise { // To prevent freeze, priority should be PRIORITY_DEFAULT_IDLE instead of PRIORITY_DEFAULT return new Promise(resolve => { GLib.idle_add(GLib.PRIORITY_DEFAULT_IDLE, () => { if (!(this.QuickSettings as any)._system) return GLib.SOURCE_CONTINUE resolve((this.QuickSettings as any)._system._systemItem.menu.box) return GLib.SOURCE_REMOVE }) }) } private static StreamSliderGetter(): StreamSlider|null { if (!(this.QuickSettings as any)._volumeInput) return null return { VolumeInput: (this.QuickSettings as any)._volumeInput, InputStreamSlider: (this.QuickSettings as any)._volumeInput._input, OutputStreamSlider: (this.QuickSettings as any)._volumeOutput._output, } } static GetStreamSlider(): Promise { return new Promise(resolve => { let streamSlider = this.StreamSliderGetter() if (streamSlider) { resolve(streamSlider) return } GLib.idle_add(GLib.PRIORITY_DEFAULT_IDLE, () => { streamSlider = this.StreamSliderGetter() if (!streamSlider) return GLib.SOURCE_CONTINUE resolve(streamSlider) return GLib.SOURCE_REMOVE }) }) } private static DBusFiles: Map private static Decoder: TextDecoder static GetDbusInterface(path: string, interfaceName: string) { let cachedInfo = this.DBusFiles.get(path) if (!cachedInfo) { const DbusFile = Gio.File.new_for_path(`${this.Extension.path}/${path}`) cachedInfo = Gio.DBusNodeInfo.new_for_xml(this.Decoder.decode(DbusFile.load_contents(null)[1])) this.DBusFiles.set(path, cachedInfo) } return cachedInfo.lookup_interface(interfaceName) } private static Shaders: Map static GetShader(path: string): [string, string] { let cachedInfo = this.Shaders.get(path) if (!cachedInfo) { const shaderFile = Gio.File.new_for_path(`${this.Extension.path}/${path}`) const [declarations, main] = this.Decoder.decode(shaderFile.load_contents(null)[1]).split( /^.*?main\(\s?\)\s?/m ) as [string, string] cachedInfo = [ declarations.trim(), main.trim().replace(/^[{}]/gm, '').trim() ] this.Shaders.set(path, cachedInfo) } return cachedInfo } static unload() { this.QuickSettings = null this.QuickSettingsMenu = null this.QuickSettingsGrid = null this.QuickSettingsBox = null this.QuickSettingsActor = null this.Indicators = null this.DateMenu = null this.DateMenuMenu = null this.DateMenuBox = null this.DateMenuHolder = null this.MessageTray = null this.Extension = null this.Settings = null this.DBusFiles = null this.Shaders = null this.Decoder = null } static load(extension: Extension) { this.Extension = extension this.Settings = extension.getSettings() this.Shaders = new Map() this.DBusFiles = new Map() this.Decoder = new TextDecoder("utf-8") // Quick Settings Items const QuickSettings = this.QuickSettings = Main.panel.statusArea.quickSettings this.QuickSettingsMenu = QuickSettings.menu this.QuickSettingsGrid = QuickSettings.menu._grid this.QuickSettingsBox = QuickSettings.menu.box this.QuickSettingsActor = QuickSettings.menu.actor this.Indicators = QuickSettings._indicators // Date Menu const DateMenu = this.DateMenu = Main.panel.statusArea.dateMenu const DateMenuMenu = this.DateMenuMenu = DateMenu.menu as any this.DateMenuBox = DateMenuMenu.box this.DateMenuHolder = DateMenuMenu.box.first_child.first_child // Message this.MessageTray = Main.messageTray } } ================================================ FILE: src/libs/prefs/components.ts ================================================ import Adw from "gi://Adw" import Gio from "gi://Gio" import Gtk from "gi://Gtk" import Gdk from "gi://Gdk" import GLib from "gi://GLib" import GObject from "gi://GObject" import { gettext as _ } from "resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js" import { deepEqual } from "../shared/jsUtils.js" function addChildren(target: any, funcName: string, children?: any[]) { if (!children) return for (const item of children) { if (!item) continue target[funcName](item) } } function setLinkCursor(target: any) { target.cursor = Gdk.Cursor.new_from_name("pointer", null) } export function setScrollToFocus(target: Adw.PreferencesPage, value: boolean) { const viewport: Gtk.Viewport = target .get_first_child() // GtkScrolledWindow .get_first_child() as any // GtkViewport viewport.scrollToFocus = value } export function delayedSetScrollToFocus(target: Adw.PreferencesPage, value: boolean) { const id = GLib.timeout_add(GLib.PRIORITY_DEFAULT, 10, ()=>{ setScrollToFocus(target, value) return GLib.SOURCE_REMOVE }) GLib.source_set_name_by_id(id, "[quick-settings-tweaks] delayedSetScrollToFocus: id") } // Fix adwaita scroll flicking issue export function fixPageScrollIssue(page: Adw.PreferencesPage) { page.connect("unmap", ()=>{ setScrollToFocus(page, false) }) page.connect("map", ()=>{ delayedSetScrollToFocus(page, true) }) } export function pushButton(row_with_suffix: Adw.ActionRow, button: any): any { const suffixes = row_with_suffix .get_first_child() // GtkBox header .get_last_child() // GtkBox suffixes const first_suffix = suffixes.get_first_child() button .insert_before( suffixes, first_suffix ) return first_suffix } export function pushDetailedButton( row_with_suffix: Adw.ActionRow, onDetailed: ()=>void ): Gtk.Button { const buttonBox = Button({ action: onDetailed, iconName: "emblem-system-symbolic", hasFrame: false, tooltip: _("Details"), }) buttonBox.marginEnd = 2 const button: Gtk.Button = buttonBox.get_first_child() as any const image: Gtk.Image = button.get_first_child() as any image.pixel_size = 12 image.opacity = 0.75 row_with_suffix.activatable_widget = null row_with_suffix.connect("activated", ()=>onDetailed()) const switchWidget: Gtk.Switch|null = pushButton(row_with_suffix, buttonBox) if (switchWidget) switchWidget.canFocus = true return button } export function removeRowBottomBorder(row: Adw.EntryRow|Adw.ActionRow) { const style = new Gtk.CssProvider() style.load_from_string("row{border-bottom-width:0px;}") row.get_style_context().add_provider(style, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION) } export function removeRowMinHeight(row: Adw.EntryRow|Adw.ActionRow) { const styleRow = new Gtk.CssProvider() styleRow.load_from_string("row{min-height:0px;}") row.get_style_context().add_provider(styleRow, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION) const styleBox = new Gtk.CssProvider() styleBox.load_from_string(".header{min-height:0px; margin-bottom: 4px;}") row.get_first_child().get_style_context().add_provider(styleBox, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION) } // #region Dialog export function Dialog({ window, title, minHeight, usePopup, childrenRequest, }: Dialog.Options): Adw.PreferencesDialog { const dialog = new Dialog.PrefDialog(title, childrenRequest, usePopup ?? false) if (minHeight) dialog.height_request = minHeight dialog.present(window) return dialog } export namespace Dialog { export type ChildrenRequest = (page: Adw.PreferencesPage, dialog: Adw.PreferencesDialog)=>any export interface Options { title?: string minHeight?: number childrenRequest: ChildrenRequest window: Adw.PreferencesWindow usePopup?: boolean } export const PrefDialogPage = GObject.registerClass({ GTypeName: "qwreey-pref-components-PrefDialogPage", }, class PrefDialogPage extends Adw.PreferencesPage { constructor(childrenRequest: ChildrenRequest, dialog: Adw.PreferencesDialog, title?: string) { super({ name: "PrefDialogPage", }) if (title) { this.title = title } addChildren(this, "add", childrenRequest(this, dialog)) } }) export const PrefDialog = GObject.registerClass({ GTypeName: "qwreey-pref-components-PrefDialog", }, class PrefDialog extends Adw.PreferencesDialog { constructor(title: string, childrenRequest: ChildrenRequest, usePopup: boolean) { super({ title: title ?? "", search_enabled: true, presentation_mode: usePopup ? Adw.DialogPresentationMode.FLOATING : Adw.DialogPresentationMode.BOTTOM_SHEET, }) this.add(new PrefDialogPage(childrenRequest, this)) } }) export function StackedPage({ title, dialog, childrenRequest }: { title: string, dialog: Adw.PreferencesDialog, childrenRequest: ChildrenRequest, }): Adw.NavigationPage { const page = new Adw.NavigationPage({ title: title, can_pop: true, }) const view = page.child = new Adw.ToolbarView() view.add_top_bar(new Adw.HeaderBar()) view.content = new Dialog.PrefDialogPage(childrenRequest, dialog) dialog.push_subpage(page) return page } } // #endregion Dialog // #region ExperimentalIcon export function ExperimentalIcon(options?: ExperimentalIcon.Options): Gtk.Image { return new Gtk.Image({ css_classes: ["icon"], icon_name: "applications-science-symbolic", pixel_size: options?.pixelSize ?? 16, margin_end: options?.marginEnd ?? 4, margin_start: options?.marginStart ?? 2, opacity: 0.8, has_tooltip: true, tooltip_text: _("This feature marked as experimental"), }) } export namespace ExperimentalIcon { export interface Options { marginEnd?: number marginStart?: number pixelSize?: number } export function prependExperimentalIcon(holder: Gtk.Widget, options?: ExperimentalIcon.Options) { ExperimentalIcon(options).insert_before(holder,holder.get_first_child()) } } // #endregion ExperimentalIcon // #region Group export function Group(options: Group.Options, children?: any[]): Adw.PreferencesGroup { options.title ??= "" const { experimental, parent, onCreated, nesting } = options delete options.parent delete options.experimental delete options.onCreated delete options.nesting const target = new Adw.PreferencesGroup(options) if (nesting) target.marginTop = 14 if (experimental) ExperimentalIcon.prependExperimentalIcon( target.get_first_child().get_first_child(), { marginEnd: 18, marginStart: 4, pixelSize: 20 } ) addChildren(target, "add", children) if (parent) parent.add(target) if (onCreated) onCreated(target) return target } export namespace Group { export type Options = Partialvoid, }> } // #endregion Group // #region Row export function Row({ settings, parent, title, subtitle, uri, icon, sensitiveBind, suffix, prefix, experimental, noLinkIcon, action, onCreated, }: Row.Options): Adw.ActionRow { const row = new Adw.ActionRow({ title: title ?? null, subtitle: subtitle ?? null, activatable: (!!uri) || (!!action), }) if (parent) { parent.add(row) } if (uri) { row.connect("activated", ()=>{ Gio.AppInfo.launch_default_for_uri_async(uri, null, null, null) }) setLinkCursor(row) if (!noLinkIcon) Row.addSuffixIcon(row, "adw-external-link-symbolic") row.tooltip_text = uri row.has_tooltip = true } if (action) { row.connect("activated", ()=>action()) setLinkCursor(row) if (!noLinkIcon) Row.addSuffixIcon(row, "go-next-symbolic") } if (icon) Row.appendLinkIcon(row, icon) if (suffix) { row.add_suffix(suffix) } if (prefix) { row.add_prefix(prefix) } if (sensitiveBind) { settings.bind( sensitiveBind, row, "sensitive", Gio.SettingsBindFlags.DEFAULT ) row.sensitive = settings.get_boolean(sensitiveBind) } if (experimental) ExperimentalIcon.prependExperimentalIcon(row.child) if (onCreated) onCreated(row) return row } export namespace Row { export interface Options { parent?: any title?: string subtitle?: string uri?: string icon?: string settings?: Gio.Settings sensitiveBind?: string suffix?: Gtk.Widget prefix?: Gtk.Widget experimental?: boolean noLinkIcon?: boolean, action?: ()=>void onCreated?: (row: Adw.ActionRow)=>void } export function appendLinkIcon(row: any, name: string) { const linkText = row.child.get_first_child() linkText.margin_start = 32 const image = new Gtk.Image({ css_classes: ["icon"], icon_name: name, pixel_size: 20, margin_start: 2, margin_end: 2, halign: Gtk.Align.START, }) image.insert_before(row.child, linkText) } export function addSuffixIcon(row: Adw.ActionRow, name: string) { row.add_suffix(new Gtk.Image({ css_classes: ["icon"], icon_name: name, pixel_size: 16, margin_end: 4, valign: Gtk.Align.CENTER, })) } } // #endregion Row // #region DialogRow export function DialogRow(options: DialogRow.Options): Adw.ActionRow { return Row({ ...options, action: () => { const dialog = Dialog({ ...options, title: options.dialogTitle, }) if (options.onDialogCreated) { options.onDialogCreated(dialog) } } }) } export namespace DialogRow { export interface Options extends Dialog.Options, Row.Options { dialogTitle?: string onDialogCreated?: (dialog: Adw.PreferencesDialog)=>void } } // #endregion DialogRow // #region ResetButton export function ResetButton(options: ResetButton.Options): Gtk.Box { const { settings, bind } = options options.iconName ??= "view-refresh-symbolic" const box = Button({ ...options, onCreated: null, }) box.halign = Gtk.Align.END const button: Gtk.Button = box.get_first_child() as any button.valign = Gtk.Align.CENTER button.has_frame = false button.tooltip_text = _("Reset to default") button.connect("clicked", ()=>settings.reset(bind)) const image: Gtk.Image = button.get_first_child() as any image.pixel_size = 12 image.opacity = 0.75 const setVisible = ()=>{ const state = ResetButton.getOptionState(settings, bind) box.visible = options.dontHideWhenMatch ? state.isSet : (!state.isMatch) } const settingsConnection = settings.connect(`changed::${bind}`, setVisible) setVisible() box.connect("destroy", ()=>{ settings.disconnect(settingsConnection) }) return box } export namespace ResetButton { export interface Options extends Button.OptionsBase { bind: string, dontHideWhenMatch?: boolean } export function getOptionState(settings: Gio.Settings, key: string): { isMatch: boolean, isSet: boolean, } { const userValue = settings.get_user_value(key) const defaultValue = settings.get_default_value(key) return { isSet: userValue != null, isMatch: (userValue == null) || (userValue && defaultValue && userValue.equal(defaultValue)), } } export function pushResetButton(row_with_suffix: Adw.ActionRow, options: ResetButton.Options) { pushButton(row_with_suffix, ResetButton(options)) } } // #endregion ResetButton // #region SwitchRow export function SwitchRow({ bind, parent, value, title, subtitle, action, sensitiveBind, settings, experimental, noResetButton, onCreated, onDetailed, }: SwitchRow.Options): Adw.SwitchRow { if (bind) value ??= settings.get_boolean(bind) const row = new Adw.SwitchRow({ title: title ?? "", subtitle: subtitle ?? null, active: value, }) setLinkCursor(row) if (action) { row.connect("notify::active", () => action(row.get_active())) } if (parent) { parent.add(row) } if (onDetailed) pushDetailedButton(row, onDetailed) if (bind) { settings.bind( bind, row, "active", Gio.SettingsBindFlags.DEFAULT ) if (!noResetButton) ResetButton.pushResetButton(row, { settings, bind }) } if (sensitiveBind) { settings.bind( sensitiveBind, row, "sensitive", Gio.SettingsBindFlags.DEFAULT ) row.sensitive = settings.get_boolean(sensitiveBind) } if (experimental) ExperimentalIcon.prependExperimentalIcon(row.child) if (onCreated) onCreated(row) return row } export namespace SwitchRow { export interface Options { settings?: Gio.Settings value?: boolean bind?: string parent?: any title?: string subtitle?: string action?: (value: boolean)=>void sensitiveBind?: string experimental?: boolean noResetButton?: boolean onCreated?: (row: Adw.SwitchRow)=>void onDetailed?: ()=>void } } // #endregion SwitchRow // #region ToggleButtonRow export function ToggleButtonRow({ bind, parent, value, title, subtitle, action, sensitiveBind, settings, experimental, text, noResetButton, onCreated, }: ToggleButtonRow.Options): Adw.ActionRow { if (bind) value ??= settings.get_boolean(bind) const row = new Adw.ActionRow({ title: title ?? "", subtitle: subtitle ?? null, }) const box = new Gtk.Box({ margin_bottom: 8, margin_top: 8, }) const toggle = new Gtk.ToggleButton({ label: text, active: value, }) box.insert_child_after(toggle, null) row.add_suffix(box) setLinkCursor(row) if (action) { toggle.connect("notify::active", () => action(toggle.get_active())) } if (parent) { parent.add(row) } if (bind) { settings.bind( bind, toggle, "active", Gio.SettingsBindFlags.DEFAULT ) if (!noResetButton) ResetButton.pushResetButton(row, { settings, bind }) } if (sensitiveBind) { settings.bind( sensitiveBind, row, "sensitive", Gio.SettingsBindFlags.DEFAULT ) row.sensitive = settings.get_boolean(sensitiveBind) settings.bind( sensitiveBind, toggle, "sensitive", Gio.SettingsBindFlags.DEFAULT ) toggle.sensitive = settings.get_boolean(sensitiveBind) } if (experimental) ExperimentalIcon.prependExperimentalIcon(row.child) if (onCreated) onCreated(row) return row } export namespace ToggleButtonRow { export interface Options { settings?: Gio.Settings value?: boolean bind?: string parent?: any title?: string subtitle?: string action?: (value: boolean)=>void sensitiveBind?: string experimental?: boolean text?: string noResetButton?: boolean onCreated?: (row: Adw.ActionRow)=>void } } // #endregion ToggleButtonRow // #region Button export function Button({ parent, action, sensitiveBind, settings, text, marginTop, marginBottom, iconName, hasFrame, tooltip, onCreated, }: Button.Options): Gtk.Box { const box = new Gtk.Box({ margin_bottom: marginBottom ?? 8, margin_top: marginTop ?? 8, }) const button = new Gtk.Button({ has_frame: hasFrame ?? true, }) box.insert_child_after(button, null) setLinkCursor(button) if (iconName && !text) { button.icon_name = iconName } if (text && !iconName) { button.label = text } if (iconName && text) { const box = button.child = new Gtk.Box({}) new Gtk.Image({ icon_name: iconName, pixel_size: 12, margin_end: 6, }).insert_before(box, null) new Gtk.Label({ label: text, }).insert_before(box, null) } if (tooltip) { button.tooltip_text = tooltip button.has_tooltip = true } if (action) { button.connect("clicked", () => action()) } if (parent) { parent.add(box) } if (sensitiveBind) { settings.bind( sensitiveBind, button, "sensitive", Gio.SettingsBindFlags.DEFAULT ) button.sensitive = settings.get_boolean(sensitiveBind) } if (onCreated) onCreated(box) return box } export namespace Button { export interface Options extends OptionsBase { onCreated?: (row: Gtk.Box)=>void } export interface OptionsBase { settings?: Gio.Settings parent?: any action?: ()=>void sensitiveBind?: string text?: string marginTop?: number marginBottom?: number iconName?: string hasFrame?: boolean tooltip?: string } } // #endregion Button // #region ButtonRow export function ButtonRow(options: ButtonRow.Options): Adw.ActionRow { const { parent, title, subtitle, experimental, onCreated, } = options const row = new Adw.ActionRow({ title: title ?? "", subtitle: subtitle ?? null, }) setLinkCursor(row) row.add_suffix(Button({ ...options, onCreated: null, })) if (parent) { parent.add(row) } if (experimental) ExperimentalIcon.prependExperimentalIcon(row.child) if (onCreated) onCreated(row) return row } export namespace ButtonRow { export interface Options extends Button.OptionsBase { settings?: Gio.Settings parent?: any title?: string subtitle?: string action?: ()=>void sensitiveBind?: string experimental?: boolean text?: string marginTop?: number marginBottom?: number onCreated?: (row: Adw.ActionRow)=>void } } // #endregion ButtonRow // #region UpDownButton export function UpDownButton({ parent, action, sensitiveBind, settings, marginTop, marginBottom, spacing, onCreated, }: UpDownButton.Options): Gtk.Box { const box = new Gtk.Box({ margin_bottom: marginTop ?? 8, margin_top: marginBottom ?? 8, spacing: spacing ?? 8 }) const down = new Gtk.Button({ icon_name: "go-down-symbolic" }) const up = new Gtk.Button({ icon_name: "go-up-symbolic" }) setLinkCursor(up) setLinkCursor(down) box.insert_child_after(up, null) box.insert_child_after(down, up) if (action) { down.connect("clicked", () => action(UpDownButton.Direction.Down)) up.connect("clicked", () => action(UpDownButton.Direction.Up)) } if (parent) { parent.add(box) } if (sensitiveBind) { settings.bind( sensitiveBind, up, "sensitive", Gio.SettingsBindFlags.DEFAULT ) up.sensitive = settings.get_boolean(sensitiveBind) settings.bind( sensitiveBind, down, "sensitive", Gio.SettingsBindFlags.DEFAULT ) down.sensitive = settings.get_boolean(sensitiveBind) } if (onCreated) onCreated(box) return box } export namespace UpDownButton { export interface Options { settings?: Gio.Settings parent?: any marginTop?: number marginBottom?: number spacing?: number action?: (direction: Direction)=>void sensitiveBind?: string onCreated?: (row: Gtk.Box)=>void } export enum Direction { Up, Down, } } // #endregion UpDownButton // #region RgbColorRow export function RgbColorRow({ title, subtitle, action, sensitiveBind, settings, bind, experimental, noResetButton, onCreated, parent, value, useAlpha, }: RgbColorRow.Options): Adw.ActionRow { if (bind) value ??= settings.get_value(bind).recursiveUnpack() const row = new Adw.ActionRow({ title: title ?? "", subtitle: subtitle ?? null, activatable: true, }) const button = new Gtk.ColorButton({ margin_start: 6, margin_top: 6, margin_bottom: 6, use_alpha: useAlpha ?? false, }) row.add_suffix(button) const themeDefaultLabel = new Gtk.Label({ label: _("Theme default"), margin_start: 12, margin_end: 12, visible: false, }) const themeDefaultOverlay = new Gtk.Overlay() themeDefaultOverlay.child = themeDefaultLabel themeDefaultOverlay.insert_before( button, null ) row.connect("activated", ()=>button.activate()) setLinkCursor(row) const updateColor = ()=>{ themeDefaultLabel.visible = value.length == 0 const color = button.get_color().copy() color.red = (value[0] ?? 0) / 255 color.green = (value[1] ?? 0) / 255 color.blue = (value[2] ?? 0) / 255 if (useAlpha) color.alpha = (value[3] ?? 1000) / 1000 button.set_rgba(color) } updateColor() if (parent) { parent.add(row) } if (action || bind) button.connect("color-set", ()=>{ const color = button.get_rgba() const arr = [ Math.floor(color.red * 255 + .5), Math.floor(color.green * 255 + .5), Math.floor(color.blue * 255 + .5) ] as RgbColorRow.Color if (useAlpha) arr.push(Math.floor(color.alpha * 1000 + .5)) if (bind) settings.set_value(bind, new GLib.Variant("ai", arr)) if (action) action(arr) }) if (bind) settings.connect(`changed::${bind}`, ()=>{ const newValue = settings.get_value(bind).recursiveUnpack() if ( newValue[0] != value[0] || newValue[1] != value[1] || newValue[2] != value[2] || newValue[3] != value[3] ) { value = newValue updateColor() } }) if (sensitiveBind) { settings.bind( sensitiveBind, row, "sensitive", Gio.SettingsBindFlags.DEFAULT ) settings.bind( sensitiveBind, button, "sensitive", Gio.SettingsBindFlags.DEFAULT ) button.sensitive = row.sensitive = settings.get_boolean(sensitiveBind) } if (bind && !noResetButton) { ResetButton.pushResetButton(row, { settings, bind }) } if (experimental) ExperimentalIcon.prependExperimentalIcon(row.child) if (onCreated) onCreated(row) return row } export namespace RgbColorRow { export type Color = number[] export interface Options { title?: string subtitle?: string action?: (color: Color)=>void sensitiveBind?: string settings?: Gio.Settings bind?: string experimental?: boolean noResetButton?: boolean onCreated?: (row: Adw.ActionRow)=>void parent?: any value?: Color useAlpha?: boolean enableThemeDefault?: boolean } } // #endregion RgbColorRow // #region EntryRow export function EntryRow({ bind, parent, value, title, action, sensitiveBind, settings, experimental, noResetButton, onCreated, }: EntryRow.Options): Adw.EntryRow { if (bind) value ??= settings.get_string(bind) const row = new Adw.EntryRow({ title: title ?? "", }) if (action) { row.connect("notify::text", () => { action(row.text) }) } if (parent) { parent.add(row) } if (bind) { settings.bind( bind, row, "text", Gio.SettingsBindFlags.DEFAULT ) if (!noResetButton) row.add_suffix(ResetButton({ settings, bind })) } if (sensitiveBind) { settings.bind( sensitiveBind, row, "sensitive", Gio.SettingsBindFlags.DEFAULT ) row.sensitive = settings.get_boolean(sensitiveBind) } if (experimental) ExperimentalIcon.prependExperimentalIcon(row.child) if (onCreated) onCreated(row) return row } export namespace EntryRow { export interface Options { settings?: Gio.Settings bind?: string parent?: any value?: string title?: string action?: (value: string)=>void sensitiveBind?: string experimental?: boolean noResetButton?: boolean onCreated?: (row: Adw.EntryRow)=>void } } // #endregion EntryRow // #region AdjustmentRow export function AdjustmentRow({ max, min, stepIncrement, pageIncrement, bind, parent, value, title, subtitle, action, sensitiveBind, settings, experimental, noResetButton, onCreated, }: AdjustmentRow.Options): Adw.SpinRow { if (bind) value ??= settings.get_int(bind) const row = new Adw.SpinRow({ title: title ?? "", subtitle: subtitle ?? null, adjustment: new Gtk.Adjustment({ upper: max ?? 100, lower: min ?? 0, stepIncrement: stepIncrement ?? 1, pageIncrement: pageIncrement ?? 10, value: value }), }) setLinkCursor(row) const header = row .get_first_child() // GtkBox header const suffixes = header .get_last_child() // GtkBox suffixes const spin = suffixes .get_first_child() // GtkSpinButton spin_button spin.hexpand = false suffixes.hexpand = false new Gtk.Box({ hexpand: true }).insert_before(header, suffixes) if (action) { row.connect("notify::value", () => { action(row.get_value()) }) } if (parent) { parent.add(row) } if (bind) { settings.bind( bind, row, "value", Gio.SettingsBindFlags.DEFAULT ) if (!noResetButton) ResetButton.pushResetButton(row, { settings, bind }) } if (sensitiveBind) { settings.bind( sensitiveBind, row, "sensitive", Gio.SettingsBindFlags.DEFAULT ) row.sensitive = settings.get_boolean(sensitiveBind) } if (experimental) ExperimentalIcon.prependExperimentalIcon(row.child) if (onCreated) onCreated(row) return row } export namespace AdjustmentRow { export interface Options { settings?: Gio.Settings max?: number min?: number stepIncrement?: number pageIncrement?: number bind?: string parent?: any value?: number title?: string subtitle?: string action?: (value: number)=>void sensitiveBind?: string experimental?: boolean noResetButton?: boolean onCreated?: (row: Adw.SpinRow)=>void } } // #endregion AdjustmentRow // #region ExpanderRow export function ExpanderRow({ parent, title, subtitle, expanded, experimental, useMarkup, action, onCreated, }: ExpanderRow.Options, children?: any[]): Adw.ExpanderRow { const row = new Adw.ExpanderRow({ title: title ?? null, subtitle: subtitle ?? null, use_markup: useMarkup ?? false, }) setLinkCursor(row) if (parent) { parent.add(row) } addChildren(row, "add_row", children) if (expanded === false || expanded === true) { row.expanded = expanded } if (action) row.connect("notify::expanded", ()=>action(row.expanded)) if (experimental) ExperimentalIcon.prependExperimentalIcon(row.child) if (onCreated) onCreated(row) return row } export namespace ExpanderRow { export interface Options { parent?: any title?: string subtitle?: string expanded?: boolean experimental?: boolean useMarkup?: boolean action?: (expanded: boolean)=>void onCreated?: (row: Adw.ExpanderRow)=>void } } // #endregion ExpanderRow // #region DropdownRow export function DropdownRow({ settings, items, bind, parent, value, title, subtitle, action, sensitiveBind, experimental, noResetButton, onCreated, }: DropdownRow.Options) { let filterModeModel = new Gio.ListStore({ item_type: DropdownRow.Items as any }) let type: "number"|"string" for (const item of items) { type ??= (typeof item.value) as typeof type filterModeModel.append(new (DropdownRow.Items as any)(item.name, item.value)) } const getIndex = (value: string) => { for (let i = 0; i < filterModeModel.get_n_items(); i++) { if ((filterModeModel.get_item(i) as any).value === value) { return i } } return -1 } const getValueFromBind = (): any => { if (type == "string") { return settings.get_string(bind) } if (type == "number") { return settings.get_int(bind) } } const setValueFromBind = (value: any) => { if (type == "string") { settings.set_string(bind, value) return } if (type == "number") { settings.set_int(bind, value) return } } if (bind) value ??= getValueFromBind() let row = new Adw.ComboRow({ title: title ?? "", subtitle: subtitle ?? null, model: filterModeModel, expression: new (Gtk.PropertyExpression as any)(DropdownRow.Items, null, "name"), selected: getIndex(value), }) setLinkCursor(row) if (parent) { parent.add(row) } if (bind) { if (!noResetButton) ResetButton.pushResetButton(row, { settings, bind }) const settingsConnection = settings.connect(`changed::${bind}`, ()=>{ const selected = (row.selectedItem as any).value const changedTo = getValueFromBind() if (selected != changedTo) { row.selected = getIndex(changedTo) } }) row.connect("destroy", ()=>settings.disconnect(settingsConnection)) } if (bind || action) row.connect("notify::selected", () => { const selected = (row.selectedItem as any).value if (bind && (selected != getValueFromBind())) { setValueFromBind(selected) } if (action) { action(selected) } }) if (sensitiveBind) { settings.bind( sensitiveBind, row, "sensitive", Gio.SettingsBindFlags.DEFAULT ) row.sensitive = settings.get_boolean(sensitiveBind) } if (experimental) ExperimentalIcon.prependExperimentalIcon(row.child) if (onCreated) onCreated(row) return row } export namespace DropdownRow { export interface Options { settings?: Gio.Settings items: { name: string, value: T }[] bind?: string parent?: any value?: string title?: string subtitle?: string sensitiveBind?: string action?: (value: string)=>void experimental?: boolean noResetButton?: boolean onCreated?: (row: Adw.ComboRow)=>void } export const Items = GObject.registerClass({ Properties: { "name": GObject.ParamSpec.string( "name", "name", "name", GObject.ParamFlags.READWRITE, null), }, }, class DropdownItems extends GObject.Object { value: T _init(name: string, value: T) { super._init({ name }) this.value = value } }) } // #endregion DropdownRow // #region ContributorsRow export function ContributorsRow(row: ContributorsRow.Contributor[]): Adw.ActionRow { const target = Row({}) const box = new Gtk.Box({ baseline_position: Gtk.BaselinePosition.CENTER, homogeneous: true, orientation: Gtk.Orientation.HORIZONTAL, }) target.set_child(box) for (const item of row) { let itemButton = new Gtk.Button({ has_frame: false, }) let itemBox = new Gtk.Box({ baseline_position: Gtk.BaselinePosition.CENTER, orientation: Gtk.Orientation.VERTICAL, cursor: Gdk.Cursor.new_from_name("pointer", null), }) itemButton.child = itemBox itemButton.connect("clicked", ()=>{ Gio.AppInfo.launch_default_for_uri_async(item.link, null, null, null) }) const itemImage = new Gtk.Image({ margin_bottom: 2, margin_top: 2, icon_name: item.image, pixel_size: 38, }) itemBox.append(itemImage) const nameText = new Gtk.Label({ label: `${item.name}`, useMarkup: true, hexpand: true, }) itemBox.append(nameText) let labelBox = new Gtk.Box({ baseline_position: Gtk.BaselinePosition.CENTER, orientation: Gtk.Orientation.VERTICAL, vexpand: true, hexpand: true, margin_bottom: 2, valign: Gtk.Align.CENTER }) for (const label of item.label.split("\n")) { const labelText = new Gtk.Label({ label: `${label}`, useMarkup: true, hexpand: true, opacity: 0.7, }) labelBox.append(labelText) } itemBox.append(labelBox) box.append(itemButton) } return target } export namespace ContributorsRow { export interface Contributor { name: string label: string link: string image: string } } // #endregion ContributorsRow // #region LicenseRow export function LicenseRow(item: LicenseRow.License): Adw.ExpanderRow { let contentRow: Adw.ActionRow let loaded = false return ExpanderRow({ title: item.name + (item.author ? ` by ${item.author}` : ""), subtitle: item.description ?? "", expanded: false, useMarkup: true, action: (expanded)=>{ if (!expanded) return if (loaded) return if (item.content) item.content().then( subtitle => contentRow.subtitle = subtitle ).catch( error => { contentRow.subtitle = `ERROR: ${error}` log(error) } ) } },[ Row({ title: _("Homepage"), subtitle: item.url, uri: item.url, icon: "go-home", }), item.content ? (contentRow = Row({ title: _("License"), subtitle: _("Loading ..."), })) : null, item.licenseUri ? Row({ title: _("License"), subtitle: item.licenseUri, icon: "emblem-documents-symbolic", uri: item.licenseUri }) : null, item.affectedFiles ? Row({ title: _("Affected Files"), subtitle: item.affectedFiles.join("\n"), icon: "text-x-generic-symbolic", }) : null, ]) } export namespace LicenseRow { export interface License { url: string author: string name: string file?: string content?: ()=>Promise licenseUri?: string affectedFiles?: string[] description?: string } } // #endregion LicenseRow // #region LogoBox export function LogoBox({ icon, name, version, versionAction, }: LogoBox.Options): Gtk.Box { const logoBox = new Gtk.Box({ baseline_position: Gtk.BaselinePosition.CENTER, margin_top: 6, spacing: 20, orientation: Gtk.Orientation.VERTICAL, }) // Logo icon const logoImage = new Gtk.Image({ icon_name: icon, pixel_size: 100, }) logoBox.append(logoImage) // Extension name const logoText = new Gtk.Label({ label: name, css_classes: ["title-2"], halign: Gtk.Align.CENTER, }) logoBox.append(logoText) // Version const logoVersion = new Gtk.Button({ css_classes: ["success"], label: version, halign: Gtk.Align.CENTER, }) logoBox.append(logoVersion) if (versionAction) { logoVersion.connect("clicked", ()=>versionAction()) setLinkCursor(logoVersion) } return logoBox } export namespace LogoBox { export interface Options { name: string version: string icon: string versionAction?: ()=>void } } // #endregion LogoBox // #region LogoGroup export function LogoGroup(options: LogoGroup.Options): Adw.PreferencesGroup { return Group({ parent: options.parent, },[ LogoBox(options), ]) } export namespace LogoGroup { export interface Options extends LogoBox.Options { parent: any, } } // #endregion LogoGroup // #region ChangelogDialog export function ChangelogDialog({ content, window, currentBuildNumber, defaultPageBuildNumber, title, subtitle, }: ChangelogDialog.Options): Adw.PreferencesDialog { const dialog = Dialog({ window, title: title ?? _("Changelog"), childrenRequest: ()=>[Group({ title: title ?? "", description: subtitle ?? "", onCreated: (group: Adw.PreferencesGroup) => { content() .then(ChangelogDialog.getReleases) .then(releases => releases.map(release => Row({ title: release.version, subtitle: release.Date ?? "", action: ()=>ChangelogDialog.ChangelogPage(dialog, release), onCreated: (row)=>{ if (release.BuildNumber == currentBuildNumber) { row.add_css_class("success") row.title += " " + _("(Current)") } if (release.BuildNumber == defaultPageBuildNumber) { ChangelogDialog.ChangelogPage(dialog, release) } group.add(row) } }))) .catch(log) }, })] }) dialog.height_request = 520 return dialog } export namespace ChangelogDialog { export interface Options { window: Adw.PreferencesWindow currentBuildNumber: number content: ()=>Promise defaultPageBuildNumber?: number title?: string subtitle?: string } const BOLD = (t: string)=>`${t}` const LITEM = (t: string,lv: number)=>`${"  ".repeat(lv)} • ${t}` const TITLE = (t: string,lv: number)=>`${"#".repeat(lv)} ${t}` const QUOTE = (t: string)=>`> ${t}` export function simpleMarked(mdlike: string): string { return mdlike.split("\n").map( line => line .replaceAll( /^( *)\- *(.*)/g, (_, indent, t: string)=>LITEM(t, Math.floor(indent.length/2)) ) .replaceAll( /^ *\> *(.*)/g, (_, t: string)=>QUOTE(t) ) .replaceAll( /^ *(\#*) *(.*)/g, (_, head: string, t: string)=>TITLE(t, head.length) ) .replaceAll( /\*\*(.*?)\*\*/g, (_, t: string)=>BOLD(t) ) .replaceAll( /\<\!\-\-.*?\-\-\>/g, "" ) ).join("\n") } export interface Release { version: string content: string Includes: string[] BuildNumber: number Date: string Git: string } export function createHeader(release: Partial): string { return [ _("> **Date:** %s").format(release.Date ?? ""), _("> **Git Hash:** %s").format(release.Git ?? ""), _("> **Build Number:** %d").format(release.BuildNumber ?? 0), ].join("\n") } export function getReleases(content: string): Release[] { type Item = Partial const releases: Item[] = [] let last: Item for (const line of content.split("\n")) { const version = line.match(/^# *(.*) *$/) if (version) { releases.push(last = { version: version[1], buffer: [line], }) continue } const meta = line.match("\<\!\-\- *\@([^ ]*) *: *(.*?) *\-\-\>") if (meta) { last[meta[1]] = JSON.parse(meta[2]) continue } if (!last) continue last.buffer.push(line.replaceAll(/\{\{HEADER\}\}/g, ()=>createHeader(last))) } for (const item of releases) { item.content = item.buffer.join("\n") delete item.buffer } return releases as Release[] } export function ChangelogPage( dialog: Adw.PreferencesDialog, release: Release, ): Adw.NavigationPage { return Dialog.StackedPage({ dialog, title: release.version, childrenRequest: ()=>[ Group({},[ new Gtk.Label({ use_markup: true, label: ChangelogDialog.simpleMarked(release.content), halign: Gtk.Align.START, hexpand: true, }) ]) ] }) } } // #endregion ChangelogDialog // #region PaddingDialog export function PaddingDialog({ settings, sensitiveBind, bind, window, }: PaddingDialog.Options) { const getValue = ()=> settings.get_value(bind).recursiveUnpack() as [number, number, number, number] let current = getValue() let top: Adw.SpinRow, right: Adw.SpinRow, bottom: Adw.SpinRow, left: Adw.SpinRow const save = ()=>{ if (deepEqual(current, getValue())) return settings.set_value(bind, new GLib.Variant("ai", current)) } const dialog = Dialog({ window, title: _("Padding"), usePopup: true, childrenRequest: ()=>[Group({ },[ top = AdjustmentRow({ title: _("Top"), max: 2048, value: current[0], action: (value: number)=>{ current[0] = value save() }, settings, sensitiveBind, }), bottom = AdjustmentRow({ title: _("Bottom"), max: 2048, value: current[2], action: (value: number)=>{ current[2] = value save() }, settings, sensitiveBind, }), left = AdjustmentRow({ title: _("Left"), max: 2048, value: current[3], action: (value: number)=>{ current[3] = value save() }, settings, sensitiveBind, }), right = AdjustmentRow({ title: _("Right"), max: 2048, value: current[1], action: (value: number)=>{ current[1] = value save() }, settings, sensitiveBind, }), ])], }) const settingsConnection = settings.connect(`changed::${bind}`, ()=>{ current = getValue() top.value = current[0] right.value = current[1] bottom.value = current[2] left.value = current[3] }) dialog.connect("destroy", ()=>{ settings.disconnect(settingsConnection) }) } export namespace PaddingDialog { export interface Options { settings: Gio.Settings window: Adw.PreferencesWindow sensitiveBind?: string bind: string } } // #endregion PaddingDialog ================================================ FILE: src/libs/shared/colors.ts ================================================ export type Rgba = [number, number, number, number] export namespace Rgba { export function formatCss(color: Rgba): string { const [r,g,b,a] = color return `rgba(${r},${g},${b},${a/1000})` } } export type Rgb = [number, number, number] ================================================ FILE: src/libs/shared/imageUtils.ts ================================================ import GdkPixbuf from "gi://GdkPixbuf" import GLib from "gi://GLib" namespace ImageMeanColor { const BASE_SIZE = 128 const SKIP_RATE = 4 const MAX_DIST = 255+255+255 const CHANNEL_DIFF_MAX = 255 const CHANNEL_DIFF_MAX_DOUBLE = CHANNEL_DIFF_MAX * CHANNEL_DIFF_MAX const CHANNEL_DIFF_CUT = 32 const DIV = CHANNEL_DIFF_MAX_DOUBLE * MAX_DIST const CACHE_INDEXER_Y = BASE_SIZE const CACHE_SIZE = BASE_SIZE * BASE_SIZE export function getImageMeanColor( image: GdkPixbuf.Pixbuf ): Promise { return new Promise(resolve=>{ // const id = Math.floor(Math.random()*1000) // console.time("getImageMeanColor_"+id) const baseImage = image.scale_simple(BASE_SIZE, BASE_SIZE, GdkPixbuf.InterpType.NEAREST) const channels = baseImage.n_channels if (channels < 3) return null const rowstride = baseImage.rowstride const pixbuf = baseImage.get_pixels() let maxGravity = 0 let colorR = 0, colorG = 0, colorB = 0 const channelDiffCaches = new Array(CACHE_SIZE) let curY=0, curX=-1 GLib.idle_add(GLib.PRIORITY_LOW, ()=>{ // Move current cursor curX += SKIP_RATE if (curX >= BASE_SIZE) { curX = 0; curY += SKIP_RATE } if (curY >= BASE_SIZE) { // console.timeEnd("getImageMeanColor_"+id) resolve([colorR, colorG, colorB]) return GLib.SOURCE_REMOVE } // Get current pixel const index = curY * rowstride + curX * channels const r = pixbuf[index] const g = pixbuf[index+1] const b = pixbuf[index+2] // Get channel difference of current pixel // Note: spidermonkey js engine doesn't have fastapi like v8, so Math.abs much slower const cacheIndex1 = curY * CACHE_INDEXER_Y + curX let channelDiff1 = channelDiffCaches[cacheIndex1] if (channelDiff1 === undefined) { const da = r-g, db = r-b, dc = g-b channelDiff1 = channelDiffCaches[cacheIndex1] = Math.max(da<0?-da:da, db<0?-db:db, dc<0?-dc:dc) } if (channelDiff1 <= CHANNEL_DIFF_CUT) return GLib.SOURCE_CONTINUE // Get gravity let gravity = 0 for (let x=0; x deepEqual(value, b[index])) } if (a instanceof Object && b instanceof Object) { for (const [key, value] of Object.entries(a)) { if (!deepEqual(b[key], value)) return false } return true } return false } ================================================ FILE: src/libs/shared/logger.ts ================================================ // Prefixed, leveled logger function Logger(str: string|(()=>string)) { if (str instanceof Function) str = str() if (Logger.show_info) console.log(Logger.LOG_INFO_HEADER + str) } namespace Logger { export let LOG_HEADER_PREFIX: string = "" export let LOG_INFO_HEADER: string = "" export let LOG_DEBUG_HEADER: string = "" export let LOG_ERROR_HEADER: string = "" export let show_info: boolean = true export function setHeader(header: string) { LOG_HEADER_PREFIX = header LOG_INFO_HEADER = `${header} (info) ` LOG_DEBUG_HEADER = `${header} (debug) ` LOG_ERROR_HEADER = `${header} (error) ` } export enum LogLevel { none = -1, error = 0, info = 1, debug = 2, } const void_function = (()=>{}) as (str: string)=>void export let debug: (str: string|(()=>string))=>void function debug_internal(str: string|(()=>string)) { if (str instanceof Function) str = str() console.log(LOG_DEBUG_HEADER + str) } export let error: (str: string|(()=>string))=>void function error_internal(str: string|(()=>string)) { if (str instanceof Function) str = str() console.log(`${LOG_ERROR_HEADER}${str}\n${new Error().stack}`) } export let currentLevel: number export function setLogLevel(level: number) { debug = level >= LogLevel.debug ? debug_internal : void_function error = level >= LogLevel.error ? error_internal : void_function show_info = level >= LogLevel.info currentLevel = level } } export default Logger ================================================ FILE: src/libs/shared/maid.ts ================================================ // Connection destroyer class Maid { private records: [Maid.TaskType, number, ...any][] constructor() { this.records = [] } connectJob( signalObject: any, signalName: string, handleFunc: (...args: any)=>any, priority: number = 0 ): number { const id = signalObject.connect(signalName, handleFunc) this.getRecords().push([Maid.TaskType.Connect, priority, signalObject, id]) return id } functionJob(func: (...args: any)=>any, priority: number = 0) { this.getRecords().push([Maid.TaskType.Function, priority, func]) } disposeJobvoid }>(object: T, priority: number = 0): T { this.getRecords().push([Maid.TaskType.Dispose, priority, object]) return object } runDisposeJobvoid }>(object: any, priority: number = 0): T { this.getRecords().push([Maid.TaskType.RunDispose, priority, object]) return object } destroyJobvoid }>(object: T, priority: number = 0): T { this.getRecords().push([Maid.TaskType.Destroy, priority, object]) return object } destroy() { this.clear() this.records = null } getRecords(): Maid["records"] { if (!this.records) Error("Maid object already destroyed") return this.records } patchJob( patchObject: any, patchName: string, handleFunc: (...args: any)=>any, priority: number = 0 ) { // Check if patchObject is defined before accessing its properties if (!patchObject) { console.error('Maid.patchJob: patchObject is undefined'); return; } const original = patchObject[patchName] this.getRecords().push([Maid.TaskType.Patch, priority, patchObject, patchName, original]) patchObject[patchName] = handleFunc(original) } // [ patchObject, connection, original, undo? ] hideJob( patchObject: T, undo?: (old: boolean, patchObject: T)=>(boolean|null|void|undefined), priority: number = 0 ) { // Check if patchObject is defined if (!patchObject) { console.error('Maid.hideJob: patchObject is undefined'); return; } const original = patchObject.visible const connection = patchObject.connect("show", ()=>{ patchObject.hide() }) patchObject.hide() this.getRecords().push([Maid.TaskType.Hide, priority, patchObject, connection, original, undo]) } clear() { const records = this.getRecords() records.sort((a, b) => b[1] - a[1]) for (const record of records) { switch (record[0]) { case Maid.TaskType.Connect: record[2].disconnect(record[3]) break case Maid.TaskType.Function: record[2]() break case Maid.TaskType.Dispose: record[2].dispose() break case Maid.TaskType.RunDispose: record[2].run_dispose() break case Maid.TaskType.Destroy: record[2].destroy() break case Maid.TaskType.Patch: // Check if patchObject (record[2]) is defined if (record[2]) { record[2][record[3]] = record[4] } break case Maid.TaskType.Hide: { const patchObject = record[2] // Check if patchObject is defined before using it if (!patchObject) break; const original = record[4] const undo = record[5] patchObject.disconnect(record[3]) if (undo) { const result = undo(original, patchObject) if (result === true) { patchObject.show() } } else { if (original) patchObject.show() } } break default: throw Error("Unknown task type.") } } this.records = [] } } namespace Maid { export enum TaskType { Connect, Function, Dispose, RunDispose, Destroy, Patch, Hide, } export const Priority = { High: 2000, Default: 0, Low: -2000, } } export default Maid ================================================ FILE: src/libs/shared/styleClass.ts ================================================ // Re-layout & painting only once // We use StyleClass instead of add_style_class_name in this extension export class StyleClass { classArray: string[] modified: boolean constructor(classString: string) { this.modified = false this.classArray = classString.split(" ") } remove(className: string): StyleClass { const lastLen = this.classArray.length this.classArray = this.classArray.filter( i => i != className ) if (this.classArray.length != lastLen) { this.modified = true } return this } add(className: string): StyleClass { if (this.classArray.includes(className)) return this this.classArray.push(className) this.modified = true return this } stringify(): string { return this.classArray.join(" ") } } ================================================ FILE: src/libs/shell/advani.ts ================================================ import Clutter from "gi://Clutter" import Graphene from "gi://Graphene" // Gnome base ease function params export interface EasingParams { repeatCount?: number autoReverse?: boolean animationRequired?: boolean duration?: number delay?: number mode?: Clutter.AnimationMode | any [key: string]: any } // AdvAni ease function params export interface AdvEasingParams extends EasingParams { mode: Clutter.AnimationMode | AdvAnimationMode, } // AdvAni ease mode define type export interface ModeDefineIface { mode: Clutter.AnimationMode getCubicBezierProgress?: ()=>[Graphene.Point, Graphene.Point] cubicBezierProgress?: [Graphene.Point, Graphene.Point] } export interface ModeDefine extends ModeDefineIface {} export class ModeDefine { constructor(params: ModeDefineIface) { for (const [key, value] of Object.entries(params)) { this[key] = value } } } // Utility functions export function createBezier( x1: number, y1: number, x2: number, y2: number ):[Graphene.Point, Graphene.Point] { return [ new Graphene.Point({ x: x1, y: y1 }), new Graphene.Point({ x: x2, y: y2 }) ] } // Template AdvAni animations export enum AdvAnimationMode { LowBackover = 2000, MiddleBackover = 2001, } export const AdvAnimationModeDefines = [ new ModeDefine({ mode: Clutter.AnimationMode.CUBIC_BEZIER, getCubicBezierProgress: ()=>createBezier(.225,1.2,.45,1) }), new ModeDefine({ mode: Clutter.AnimationMode.CUBIC_BEZIER, getCubicBezierProgress: ()=>createBezier(.4,1.35,.55,1) }), ] as ModeDefine[] // Main AdvAni ease function export function ease(actor: Clutter.Actor, params: AdvEasingParams) { // Get mode defines let modeDefine: ModeDefine|null if (params.mode && params.mode > Clutter.AnimationMode.ANIMATION_LAST) { modeDefine = AdvAnimationModeDefines[params.mode - AdvAnimationMode.LowBackover] params.mode = modeDefine.mode } else if ((typeof params.mode == "object") && ((params.mode as any) instanceof ModeDefine)) { modeDefine = params.mode params.mode = modeDefine.mode } // Run gnome ease function actor.ease(params) if (!modeDefine) return // Adjust bezier progress if option exist let { getCubicBezierProgress, cubicBezierProgress } = modeDefine if (getCubicBezierProgress) cubicBezierProgress = getCubicBezierProgress() if (cubicBezierProgress) { for (const key in params) { const transition = actor.get_transition(key.replace(/_/g, '-')) if (!transition) continue transition.set_cubic_bezier_progress(...cubicBezierProgress) } } } ================================================ FILE: src/libs/shell/effects.ts ================================================ import GObject from 'gi://GObject' import Shell from 'gi://Shell' import Cogl from 'gi://Cogl' import Clutter from 'gi://Clutter' import Global from '../../global.js' // #region RoundClipEffect export class RoundClipEffect extends Shell.GLSLEffect { static uniforms: RoundClipEffect.Uniforms|null = null vfunc_build_pipeline (): void { const [declarations, code] = Global.GetShader("media/rounded_corners.frag") this.add_glsl_snippet( // FIXME: waitting for type definition update Cogl.SnippetHook.FRAGMENT as any, declarations, code, false ) } vfunc_paint_target (node: Clutter.PaintNode, ctx: Clutter.PaintContext) { // Reset to default blend string. this.get_pipeline()?.set_blend( 'RGBA = ADD(SRC_COLOR, DST_COLOR*(1-SRC_COLOR[A]))' ) super.vfunc_paint_target(node, ctx) } updateUniforms ( scale_factor: number, corners_cfg: { padding?: { left: number, right: number, top: number, bottom: number }, border_radius: number, smoothing: number, }, outer_bounds: { x1: number, x2: number, y1: number, y2: number }, border?: { width: number color: [number, number, number, number] }, pixel_step?: [number, number] ) { const border_width = (border?.width ?? 0) * scale_factor const border_color = border?.color ?? [0, 0, 0, 0] const outer_radius = corners_cfg.border_radius * scale_factor const { padding, smoothing } = corners_cfg const bounds = [ outer_bounds.x1 + (padding ? (padding.left * scale_factor) : 0), outer_bounds.y1 + (padding ? (padding.top * scale_factor) : 0), outer_bounds.x2 - (padding ? (padding.right * scale_factor) : 0), outer_bounds.y2 - (padding ? (padding.bottom * scale_factor) : 0), ] const inner_bounds = [ bounds[0] + border_width, bounds[1] + border_width, bounds[2] - border_width, bounds[3] - border_width, ] let inner_radius = outer_radius - border_width if (inner_radius < 0.001) { inner_radius = 0.0 } if (!pixel_step) { const actor = this.actor pixel_step = [1 / actor.get_width (), 1 / actor.get_height ()] } // Setup with squircle shape let exponent = smoothing * 10.0 + 2.0 let radius = outer_radius * 0.5 * exponent const max_radius = Math.min (bounds[3] - bounds[0], bounds[4] - bounds[1]) if (radius > max_radius) { exponent *= max_radius / radius radius = max_radius } inner_radius *= radius / outer_radius const location = this.getLocation() this.set_uniform_float(location.bounds, 4, bounds) this.set_uniform_float(location.inner_bounds, 4, inner_bounds) this.set_uniform_float(location.pixel_step, 2, pixel_step) this.set_uniform_float(location.border_width, 1, [border_width]) this.set_uniform_float(location.exponent, 1, [exponent]) this.set_uniform_float(location.clip_radius, 1, [radius]) this.set_uniform_float(location.border_color, 4, border_color) this.set_uniform_float(location.inner_clip_radius, 1, [inner_radius]) this.queue_repaint() } getLocation(): RoundClipEffect.Uniforms { let location = RoundClipEffect.uniforms if (!location) { location = new RoundClipEffect.Uniforms() for (const key in location) { location[key] = this.get_uniform_location(key) } RoundClipEffect.uniforms = location } return location } } GObject.registerClass(RoundClipEffect) export namespace RoundClipEffect { // Uniform location cache export class Uniforms { bounds = 0 clip_radius = 0 exponent = 0 inner_bounds = 0 inner_clip_radius = 0 pixel_step = 0 border_width = 0 border_color = 0 } } // #endregion RoundClipEffect ================================================ FILE: src/libs/shell/feature.ts ================================================ import { type Rgb, type Rgba } from "../shared/colors.js" import Maid from "../shared/maid.js"; import Global from "../../global.js"; import Logger from "../shared/logger.js"; export class SettingLoader { records: Set listeners: number[] onChange: (key: string)=>void parent: FeatureBase constructor( onChange: SettingLoader["onChange"], parent: FeatureBase, ) { this.parent = parent this.records = new Set() this.listeners = [] this.onChange = onChange } private push(key: string) { if (this.records.has(key)) return this.records.add(key) this.listeners.push( Global.Settings.connect( `changed::${key}`, () => this.onChange(key) ) ) if (!this.parent.disableDebugMessage) Logger.debug(()=>`Setting listener for key '${key}' added for feature ${this.parent.constructor.name}`) } clear() { for (const source of this.listeners) { Global.Settings.disconnect(source) } this.listeners = [] this.records.clear() if (!this.parent.disableDebugMessage) { Logger.debug(()=>`Disconnected setting listeners for feature ${this.parent.constructor.name }`) } } loadBoolean(key: string): boolean { this.push(key) return Global.Settings.get_boolean(key) } loadString(key: string): string { this.push(key) return Global.Settings.get_string(key) } loadInt(key: string): number { this.push(key) return Global.Settings.get_int(key) } loadStrv(key: string): string[] { this.push(key) return Global.Settings.get_strv(key) } loadValue(key: string): T { this.push(key) return Global.Settings.get_value(key).recursiveUnpack() } loadRgb(key: string): Rgb|null { this.push(key) const color = Global.Settings.get_value(key).recursiveUnpack() if (!color.length) return null return color } loadRgba(key: string): Rgba|null { this.push(key) const color = Global.Settings.get_value(key).recursiveUnpack() if (!color.length) return null return color } } export abstract class FeatureBase { disableDebugMessage: boolean = false loader: SettingLoader maid: Maid constructor() { this.maid = new Maid() this.loader = new SettingLoader((key: string)=>{ this.loader.clear() this.loadSettings(this.loader) this.reload(key) }, this) } load(noSettingsLoad?: boolean): void { if (!noSettingsLoad) this.loadSettings(this.loader) this.onLoad() } unload(noSettingsUnload?: boolean): void { if (!noSettingsUnload) this.loader.clear() this.onUnload() this.maid.clear() } abstract onLoad(): void abstract onUnload(): void reload(changedKey?: string): void { this.unload(true) this.load(true) } abstract loadSettings(loader: SettingLoader): void } ================================================ FILE: src/libs/shell/gesture.ts ================================================ import St from "gi://St" import Clutter from "gi://Clutter" // #region Drag export abstract class Drag extends St.Bin { _dragging: boolean _dragIsClick: boolean _dragStartCoords: Drag.Coords _dragMoveStartCoords: Drag.Coords _grab: Clutter.Grab _grabbedDevice: Clutter.InputDevice _grabbedSequence: Clutter.EventSequence dfunc_drag_end: (event: Drag.Event)=>void dfunc_drag_start: (event: Drag.Event)=>void dfunc_drag_motion: (event: Drag.Event)=>void _dragStart(event: Clutter.Event): boolean { if (this._dragging) return Clutter.EVENT_PROPAGATE this._dragging = true this._dragIsClick = true this._dragStartCoords = event.get_coords() this._grabbedDevice = event.get_device() this._grabbedSequence = event.get_event_sequence() // @ts-expect-error Types not implemented this._grab = global.stage.grab(this) const dragEvent: Drag.Event = event as Drag.Event dragEvent.isClick = true dragEvent.startCoords = this._dragStartCoords dragEvent.coords = this._dragStartCoords dragEvent.moveStartCoords = this._dragMoveStartCoords if (this.dfunc_drag_start) this.dfunc_drag_start(dragEvent) return Clutter.EVENT_STOP } _dragEnd(event: Clutter.Event): boolean { if (!this._dragging) { return Clutter.EVENT_PROPAGATE } if (this._grab) { this._grab.dismiss() this._grab = null } this._grabbedSequence = null this._grabbedDevice = null this._dragging = false const coords = event.get_coords() this._checkDragIsClick(coords) const dragEvent: Drag.Event = event as Drag.Event dragEvent.isClick = this._dragIsClick dragEvent.startCoords = this._dragStartCoords dragEvent.coords = coords dragEvent.moveStartCoords = this._dragMoveStartCoords this._dragStartCoords = this._dragMoveStartCoords = null if (this.dfunc_drag_end) this.dfunc_drag_end(dragEvent) return Clutter.EVENT_STOP } _dragMotion(event: Clutter.Event): boolean { const coords = event.get_coords() this._checkDragIsClick(coords) const dragEvent: Drag.Event = event as Drag.Event dragEvent.isClick = this._dragIsClick dragEvent.startCoords = this._dragStartCoords dragEvent.coords = coords dragEvent.moveStartCoords = this._dragMoveStartCoords if (this.dfunc_drag_motion) this.dfunc_drag_motion(dragEvent) return Clutter.EVENT_STOP } _checkDragIsClick(coords: Drag.Coords) { if (!this._dragIsClick) return if ( Drag.getCoordsDistanceSquare( coords, this._dragStartCoords ) > Drag.DragMinPixelSquare ) { this._dragMoveStartCoords = coords this._dragIsClick = false } } vfunc_button_press_event(event: Clutter.Event): boolean { return this._dragStart(event) } vfunc_button_release_event(event: Clutter.Event): boolean { return this._dragEnd(event) } vfunc_touch_event(event: Clutter.Event): boolean { const sequence = event.get_event_sequence() const slotSame = this._grabbedSequence && sequence.get_slot() === this._grabbedSequence.get_slot() switch (event.type()) { case Clutter.EventType.TOUCH_BEGIN: return this._dragStart(event) case Clutter.EventType.TOUCH_UPDATE: if (!slotSame) return Clutter.EVENT_PROPAGATE return this._dragMotion(event) case Clutter.EventType.TOUCH_END: if (!slotSame) return Clutter.EVENT_PROPAGATE return this._dragEnd(event) } return Clutter.EVENT_PROPAGATE; } vfunc_motion_event(event: Clutter.Event): boolean { if (this._dragging && !this._grabbedSequence) { return this._dragMotion(event) } return Clutter.EVENT_PROPAGATE } static applyTo(widgetClass: any) { const widgetProto = widgetClass.prototype const dragProto = Drag.prototype for (const methodName of Object.getOwnPropertyNames(dragProto)) { Object.defineProperty(widgetProto, methodName, { value: dragProto[methodName], configurable: true, writable: true, }) } } static getCoordsDistanceSquare(coordsA: Drag.Coords, coordsB: Drag.Coords): number { const [ax, ay] = coordsA const [bx, by] = coordsB const xdist = ax - bx const ydist = ay - by return xdist*xdist + ydist*ydist } } export namespace Drag { export const DragMinPixel = 6 export const DragMinPixelSquare = DragMinPixel*DragMinPixel export type Coords = [number, number] export type Event = Clutter.Event & { isClick: boolean, moveStartCoords: Coords, startCoords: Coords, coords: Coords, } } // #endregion Drag // #region Scroll export abstract class Scroll extends St.Bin { _scrollSumY: number _scrollSumX: number _scrolling: boolean dfunc_scroll_start: (event: Scroll.Event)=>void dfunc_scroll_motion: (event: Scroll.Event)=>void dfunc_scroll_end: (event: Scroll.Event)=>void vfunc_scroll_event(event: Clutter.Event): boolean { if ( event.get_scroll_direction() != Clutter.ScrollDirection.SMOOTH || event.get_scroll_source() == Clutter.ScrollSource.WHEEL ) return Clutter.EVENT_PROPAGATE const finish = event.get_scroll_finish_flags() const [dx, dy] = event.get_scroll_delta() if (!this._scrolling) { this._scrolling = true this._scrollSumX = dx this._scrollSumY = dy if (this.dfunc_scroll_start) { const scrollEvent: Scroll.Event = event as Scroll.Event scrollEvent.scrollSumX = dx scrollEvent.scrollSumY = dy scrollEvent.dx = dx scrollEvent.dy = dy this.dfunc_scroll_start(scrollEvent) } } else { this._scrollSumX += dx this._scrollSumY += dy if (this.dfunc_scroll_motion) { const scrollEvent: Scroll.Event = event as Scroll.Event scrollEvent.scrollSumX = this._scrollSumX scrollEvent.scrollSumY = this._scrollSumY scrollEvent.dx = dx scrollEvent.dy = dy this.dfunc_scroll_motion(scrollEvent) } } if (finish != Clutter.ScrollFinishFlags.NONE) { this._scrolling = false if (this.dfunc_scroll_end) { const scrollEvent: Scroll.Event = event as Scroll.Event scrollEvent.scrollSumX = this._scrollSumX scrollEvent.scrollSumY = this._scrollSumY scrollEvent.dx = dx scrollEvent.dy = dy scrollEvent.finish = finish this.dfunc_scroll_end(scrollEvent) } } } static applyTo(widgetClass: any) { const widgetProto = widgetClass.prototype const scrollProto = Scroll.prototype for (const methodName of Object.getOwnPropertyNames(scrollProto)) { Object.defineProperty(widgetProto, methodName, { value: scrollProto[methodName], configurable: true, writable: true, }) } } } export namespace Scroll { export type Event = Clutter.Event & { scrollSumX: number scrollSumY: number dx: number dy: number finish?: Clutter.ScrollFinishFlags } } // #endregion Scroll ================================================ FILE: src/libs/shell/quickSettingsUtils.ts ================================================ import { QuickMenuToggle, QuickToggle, SystemIndicator, type QuickSettingsMenu, } from "resource:///org/gnome/shell/ui/quickSettings.js" import { type PopupMenuBase, PopupSeparatorMenuItem } from "resource:///org/gnome/shell/ui/popupMenu.js" import Global from "../../global.js" import Maid from "../shared/maid.js" export abstract class ChildrenTrackerBase { appliedChild: Map addConnection: number connectTarget: any protected abstract getConnectTarget(): any protected abstract catchChild(child: any): void load(): void { const connectTarget = this.connectTarget = this.getConnectTarget() this.appliedChild = new Map() this.addConnection = connectTarget.connect("child-added", (_: any, child: any)=>{ this.catchChild(child) if (this.onUpdate) this.onUpdate() }) for (const child of connectTarget.get_children()) { this.catchChild(child) } if (this.onUpdate) this.onUpdate() } unload(): void { for (const maid of this.appliedChild.values()) { maid.destroy() } this.connectTarget.disconnect(this.addConnection) this.addConnection = null this.appliedChild = null } get items(): T[] { if (!this.appliedChild) return [] return [...this.appliedChild.keys()] } onUpdate: ()=>void } export class QuickSettingsMenuTracker extends ChildrenTrackerBase { onMenuOpen: (maid: Maid, menu: QuickSettingsMenu, isOpen: boolean)=>void onMenuCreated: (maid: Maid, menu: QuickSettingsMenu)=>void protected override catchChild(child: any): void { const menu = child.menu if (!menu) return if (this.appliedChild.has(menu)) return const menuMaid = new Maid() menuMaid.functionJob(()=>{ this.appliedChild.delete(menu) }) menuMaid.connectJob(menu, "open-state-changed", (_: any, isOpen: boolean) => { if (this.onMenuOpen) this.onMenuOpen(menuMaid, menu, isOpen) }) menuMaid.connectJob(menu, "destroy", ()=>{ menuMaid.destroy() }) if (this.onMenuCreated) this.onMenuCreated(menuMaid, menu) this.appliedChild.set(menu, menuMaid) } protected override getConnectTarget() { return Global.QuickSettingsGrid } get menus() { if (!this.appliedChild) return [] return [...this.appliedChild.keys()] } } export class QuickSettingsToggleTracker extends ChildrenTrackerBase { onToggleCreated: (maid: Maid, toggle: QuickToggle|QuickMenuToggle)=>void protected override catchChild(child: any): void { if ( !(child instanceof QuickToggle) && !(child instanceof QuickMenuToggle) ) return if (this.appliedChild.has(child)) return const toggleMaid = new Maid() toggleMaid.functionJob(()=>{ this.appliedChild.delete(child) }) toggleMaid.connectJob(child, "destroy", ()=>{ toggleMaid.destroy() }) if (this.onToggleCreated) this.onToggleCreated(toggleMaid, child) this.appliedChild.set(child, toggleMaid) } protected override getConnectTarget() { return Global.QuickSettingsGrid } } export class SystemIndicatorTracker extends ChildrenTrackerBase { onIndicatorCreated: (maid: Maid, indicator: SystemIndicator)=>void protected override catchChild(child: any): void { if ( !(child instanceof SystemIndicator) ) return if (this.appliedChild.has(child)) return const indicatorMaid = new Maid() indicatorMaid.functionJob(()=>{ this.appliedChild.delete(child) }) indicatorMaid.connectJob(child, "destroy", ()=>{ indicatorMaid.destroy() }) if (this.onIndicatorCreated) this.onIndicatorCreated(indicatorMaid, child) this.appliedChild.set(child, indicatorMaid) } protected override getConnectTarget() { return Global.Indicators } } export function updateMenuSeparators(menu: PopupMenuBase) { for (const item of (menu as any)._getMenuItems()) { if (!(item instanceof PopupSeparatorMenuItem)) { continue } (menu as any)._updateSeparatorVisibility(item) } } ================================================ FILE: src/libs/shell/styler.ts ================================================ import St from "gi://St" import { type SettingLoader } from "./feature.js" import { Rgba } from "../shared/colors.js" export namespace StyledSlider { export interface Options { style: "slim" | "default" activeBackgroundColor: Rgba | null handleRadius: number handleColor: Rgba | null backgroundColor: Rgba | null height: number } export function getStyle(options: Options): string { const { style, activeBackgroundColor, handleRadius, handleColor, backgroundColor, height, } = options const styleList = [] switch (style) { case "slim": styleList.push("-slider-handle-radius:0px") if (activeBackgroundColor) { styleList.push("color:"+Rgba.formatCss(activeBackgroundColor)) } else { styleList.push("color:-st-accent-color") } break case "default": default: if (handleRadius) { styleList.push(`-slider-handle-radius:${handleRadius}px`) } if (handleColor) { styleList.push(`color:${Rgba.formatCss(handleColor)}`) } break } if (height) styleList.push(`-barlevel-height:${height}px`) if (activeBackgroundColor) styleList.push( `-barlevel-active-background-color:${Rgba.formatCss(activeBackgroundColor)}` ) if (backgroundColor) styleList.push( `-barlevel-background-color:${Rgba.formatCss(backgroundColor)}` ) const result = styleList.join(";") return result } export namespace Options { export function fromLoader(loader: SettingLoader, prefix: string): Options { return { style: loader.loadString(prefix+"-style") as Options["style"], handleColor: loader.loadRgba(prefix+"-handle-color"), handleRadius: loader.loadInt(prefix+"-handle-radius"), backgroundColor: loader.loadRgba(prefix+"-background-color"), height: loader.loadInt(prefix+"-height"), activeBackgroundColor: loader.loadRgba(prefix+"-active-background-color"), } } export function isStyleKey(prefix: string, key: string): boolean { if (key == prefix + "-style") return true if (key == prefix + "-handle-color") return true if (key == prefix + "-handle-radius") return true if (key == prefix + "-background-color") return true if (key == prefix + "-height") return true if (key == prefix + "-active-background-color") return true return false } } } export namespace StyledScroll { export interface Options { showScrollbar: boolean fadeOffset: number } export function updateStyle(scroll: St.ScrollView, options: Options) { scroll.style_class = options.fadeOffset ? "vfade" : "" scroll.vscrollbar_policy = options.showScrollbar ? St.PolicyType.AUTOMATIC : St.PolicyType.EXTERNAL scroll.style = options.fadeOffset ? `-st-vfade-offset:${options.fadeOffset}px;` : "" } export namespace Options { export function fromLoader(loader: SettingLoader, prefix: string): Options { return { showScrollbar: loader.loadBoolean(prefix+"-show-scrollbar"), fadeOffset: loader.loadInt(prefix+"-fade-offset"), } } } } ================================================ FILE: src/libs/types/quickSettingsOrderItem.ts ================================================ export interface QuickSettingsOrderItem { id?: string lineBreak?: boolean pageBreak?: boolean hide?: boolean // not used friendlyName?: string // not used } export namespace QuickSettingsOrderItem { export function match(a: QuickSettingsOrderItem, b: QuickSettingsOrderItem) { return a.id == b.id } } ================================================ FILE: src/libs/types/systemIndicatorOrderItem.ts ================================================ import GObject from "gi://GObject" import { type SystemIndicator, } from "resource:///org/gnome/shell/ui/quickSettings.js" export interface SystemIndicatorOrderItem { gtypeName?: string constructorName?: string friendlyName?: string nonOrdered?: boolean isSystem?: boolean hide?: boolean } export namespace SystemIndicatorOrderItem { export function match(a: SystemIndicatorOrderItem, b: SystemIndicatorOrderItem) { if ( a.isSystem != b.isSystem || a.nonOrdered != b.nonOrdered || a.hide != b.hide ) return false if (a.nonOrdered) return true if (a.isSystem) return a.gtypeName == b.gtypeName return ( a.constructorName == b.constructorName && a.friendlyName == b.friendlyName && a.gtypeName == b.gtypeName ) } export function indicatorMatch(item: SystemIndicatorOrderItem, indicator: SystemIndicator): boolean { if (item.nonOrdered) return false if (item.gtypeName && GObject.type_name_from_instance(indicator as any) != item.gtypeName) return false if (item.constructorName && indicator.constructor.name != item.constructorName) return false return true } export const Default: SystemIndicatorOrderItem = { hide: false, constructorName: "", friendlyName: "", gtypeName: "", } export function create(friendlyName: string): SystemIndicatorOrderItem { return { ...Default, friendlyName, } } } ================================================ FILE: src/libs/types/toggleOrderItem.ts ================================================ import GObject from "gi://GObject" import { type QuickToggle, type QuickMenuToggle, } from "resource:///org/gnome/shell/ui/quickSettings.js" export interface ToggleOrderItem { gtypeName?: string constructorName?: string titleRegex?: string friendlyName?: string nonOrdered?: boolean isSystem?: boolean cachedTitleRegex?: RegExp hide?: boolean } export namespace ToggleOrderItem { export function match(a: ToggleOrderItem, b: ToggleOrderItem) { if ( a.isSystem != b.isSystem || a.nonOrdered != b.nonOrdered || a.hide != b.hide ) return false if (a.nonOrdered) return true if (a.isSystem) return a.constructorName == b.constructorName return ( a.constructorName == b.constructorName && a.titleRegex == b.titleRegex && a.friendlyName == b.friendlyName && a.gtypeName == b.gtypeName ) } export function toggleMatch(item: ToggleOrderItem, toggle: QuickToggle|QuickMenuToggle): boolean { if (item.nonOrdered) return false if (item.gtypeName && GObject.type_name_from_instance(toggle as any) != item.gtypeName) return false if (item.constructorName && toggle.constructor.name != item.constructorName) return false if (item.cachedTitleRegex && toggle.title.match(item.cachedTitleRegex) == null) return false if (!item.gtypeName && !item.constructorName && !item.cachedTitleRegex) return false return true } export const Default: ToggleOrderItem = { hide: false, titleRegex: "", constructorName: "", friendlyName: "", gtypeName: "", } export function create(friendlyName: string): ToggleOrderItem { return { ...Default, friendlyName, } } } ================================================ FILE: src/prefPages/about.ts ================================================ import Adw from "gi://Adw" import GObject from "gi://GObject" import Gio from "gi://Gio" import { gettext as _ } from "resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js" import type QstExtensionPreferences from "../prefs.js" import Config from "../config.js" import { Group, Row, ContributorsRow, LicenseRow, LogoGroup, DialogRow, ChangelogDialog, fixPageScrollIssue, SwitchRow, DropdownRow, } from "../libs/prefs/components.js" export const AboutPage = GObject.registerClass({ GTypeName: Config.baseGTypeName+"AboutPage", }, class AboutPage extends Adw.PreferencesPage { constructor(settings: Gio.Settings, prefs: QstExtensionPreferences, window: Adw.PreferencesWindow) { super({ name: "about", title: _("About"), iconName: "dialog-information-symbolic" }) fixPageScrollIssue(this) // Logo LogoGroup({ parent: this, name: prefs.metadata.name, icon: "qst-project-icon", version: prefs.getVersionString(), versionAction: () => ChangelogDialog({ window, content: async () => prefs.getChangelog(), currentBuildNumber: Config.buildNumber, defaultPageBuildNumber: Config.buildNumber, }) }) // About Group({ parent: this, title: _("About"), description: _("Common extension informations"), },[ Row({ title: _("Changelogs"), subtitle: _("View the change history for this extension"), action: ()=>ChangelogDialog({ window, title: _("Changelogs"), subtitle: _("View the change history for this extension"), content: async () => prefs.getChangelog(), currentBuildNumber: Config.buildNumber, }), icon: "object-rotate-right-symbolic", }), DialogRow({ window, title: _("License"), subtitle: _("License of codes"), dialogTitle: _("License"), minHeight: 520, icon: "document-open-recent-symbolic", childrenRequest: _page=>[ Group({ title: _("License"), description: _("License of codes") }, prefs.getLicenses().map(LicenseRow)), ], }), DialogRow({ window, title: _("Contributors"), subtitle: _("The creators of this extension"), dialogTitle: _("Contributors"), icon: "starred-symbolic", childrenRequest: _page=>[ Group({ title: _("Contributors"), description: _("The creators of this extension"), }, [ ...prefs.getContributorRows().map(ContributorsRow), Row({ title: _("More contributors"), subtitle: _("See more contributors on github"), uri: "https://github.com/qwreey/quick-settings-tweaks/graphs/contributors" }), ]) ] }) ]) // Links Group({ parent: this, title: _("Link"), description: _("External links about this extension") },[ Row({ uri: "https://github.com/sponsors/qwreey", title: _("Donate via github sponsors"), subtitle: _("Support development!"), icon: "emblem-favorite-symbolic", }), Row({ uri: "https://extensions.gnome.org/extension/5446/quick-settings-tweaker/", title: "Gnome Extension", subtitle: _("Rate and comment the extension!"), icon: "qst-gnome-extension-logo-symbolic", }), Row({ uri: "https://github.com/qwreey75/quick-settings-tweaks", title: _("Github Repository"), subtitle: _("Add Star on Repository is helping me a lot!\nPlease, if you found bug from this extension, you can make issue to make me know that!\nOr, you can create PR with wonderful features!"), icon: "qst-github-logo-symbolic", }), // Row({ // uri: "https://weblate.paring.moe/projects/gs-quick-settings-tweaks/", // title: "Webslate", // subtitle: _("Add translation to this extension!"), // icon: "qst-weblate-logo-symbolic", // }), ]) Group({ parent: this, title: _("Debug"), description: _("Extension debugging options"), }, [ SwitchRow({ settings, title: _("Expose environment"), subtitle: _("Expose extension environment to globalThis.qst"), bind: "debug-expose" }), SwitchRow({ settings, title: _("Show layout border"), subtitle: _("Show layout borders on Quick Settings"), bind: "debug-show-layout-border" }), DropdownRow({ settings, title: _("Log level"), bind: "debug-log-level", items: [ { name: _("none"), value: -1 }, { name: _("error"), value: 0 }, { name: _("info"), value: 1 }, { name: _("debug"), value: 2 }, ], }), ]) } }) ================================================ FILE: src/prefPages/layout.ts ================================================ import Adw from "gi://Adw" import GObject from "gi://GObject" import Gio from "gi://Gio" import GLib from "gi://GLib" import Gtk from "gi://Gtk" import { gettext as _ } from "resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js" import Config from "../config.js" import type QstExtensionPreferences from "../prefs.js" import { ToggleOrderItem } from "../libs/types/toggleOrderItem.js" import { SwitchRow, UpDownButton, Row, Group, DialogRow, ToggleButtonRow, ResetButton, setScrollToFocus, delayedSetScrollToFocus, fixPageScrollIssue, Dialog, Button, removeRowBottomBorder, removeRowMinHeight, DropdownRow, } from "../libs/prefs/components.js" import { SystemIndicatorOrderItem } from "../libs/types/systemIndicatorOrderItem.js" import { QuickSettingsOrderItem } from "../libs/types/quickSettingsOrderItem.js" // #region OrderGroup function OrderGroup({ page, dialog, bind, sensitiveBind, info }:{ page: Adw.PreferencesPage, dialog: Adw.PreferencesDialog, bind: string, sensitiveBind: string, info: OrderInfo }): Adw.PreferencesGroup { // Create group const itemRows = new Map() const header = new Gtk.Box({}) const group = Group({ title: info.getGroupTitle(), description: info.getGroupDescription(), headerSuffix: header }) // Edit functions const saveItem = (item: T, edited: T): string|null => { const list = info.getListFromSettings() const index = list.findIndex(targetItem => info.match(targetItem, item)) if (index == -1) { return _("The item not found") } if (info.match(item, edited)) { return _("No changes") } if (list.some(listItem => info.match(listItem, edited))) { return _("The same item already exists") } list[index] = edited info.setListToSettings(list) return null } const editItem = (item: T)=>{ Dialog.StackedPage({ dialog, title: _("Properties of %s").format(item.friendlyName), childrenRequest: (_page, _dialog)=>{ const editLayout = info.createEditLayout(item) const saveButton = Button({ marginBottom: 0, marginTop: 0, iconName: "document-save-symbolic", text: _("Save"), action: ()=>{ const edited = editLayout.getValue() const saved = saveItem(item, edited) if (saved == null) { item = edited } else { dialog.add_toast(new Adw.Toast({ timeout: 6, title: saved })) } } }) return [ Group({ title: _("Toggle editor"), header_suffix: saveButton, }, editLayout.layout) ] } }) } const deleteItem = (item: T)=>{ const list = info.getListFromSettings() const index = list.findIndex(targetItem => info.match(targetItem, item)) if (index == -1) return list.splice(index, 1) info.setListToSettings(list) } const hideItem = (item: T, hide: boolean)=>{ const list = info.getListFromSettings() list.find(targetItem => info.match(targetItem, item)).hide = hide info.setListToSettings(list) dialog.add_toast(new Adw.Toast({ title: _("This option requires full gnome-shell reloading"), timeout: 12, })) } const moveItem = (item: T, offset: number)=>{ const list = info.getListFromSettings() const index = list.findIndex(targetItem => info.match(targetItem, item)) if (!offset) return const sign = Math.sign(offset) let targetIndex = index for (let count = Math.abs(offset); count > 0;) { if (targetIndex <= 0 && sign == -1) break if ((targetIndex >= (list.length - 1)) && sign == 1) break if (info.moveBlocking(list, item, index, list[targetIndex], targetIndex)) break targetIndex += sign if (info.skip(list, item, index, list[targetIndex], targetIndex)) count-- } if (index == targetIndex) return list.splice(index, 1) list.splice(targetIndex, 0, item) info.setListToSettings(list) } // Control items const pruneItems = (list: T[])=>{ for (const [targetItem, row] of itemRows.entries()) { if (list.some(item => info.match(item, targetItem))) continue itemRows.delete(targetItem) group.remove(row) } } const pushItems = (list: T[])=>{ for (const newItem of list) { // Filter already exist if ([...itemRows.entries()].find(([item]) => info.match(item, newItem))) continue // Create row const row = Row({ settings: info.settings, title: info.getDisplayName(newItem), subtitle: info.getSubtitle(newItem), sensitiveBind, }) row.visible = info.shouldShow(newItem) // Update icon const systemKey = info.getSystemKey(newItem) const iconName = systemKey && info.systemIcons.get(systemKey) if (iconName) { const icon = new Gtk.Image({ icon_name: iconName, pixel_size: 18, margin_start: 8, margin_end: 2, }) row.add_prefix(icon) } // Create Up & Down button const updown = UpDownButton({ settings: info.settings, sensitiveBind: "toggles-layout-enabled", action: (direction)=>{ moveItem(newItem, direction == UpDownButton.Direction.Up ? -1 : 1) } }) row.add_prefix(updown) // Hide button if (info.canHide(newItem)) { const toggle = new Gtk.ToggleButton({ margin_bottom: 8, margin_top: 8, label: _("Hide"), active: newItem.hide ?? false, }) toggle.connect("notify::active", () => hideItem(newItem, toggle.get_active())) row.add_suffix(toggle) } // Delete & Edit button if (info.canEdit(newItem)) { const deleteButton = new Gtk.Button({ icon_name: "edit-clear-symbolic", margin_bottom: 8, margin_top: 8, }) const editButton = new Gtk.Button({ icon_name: "document-edit-symbolic", margin_bottom: 8, margin_top: 8, }) deleteButton.connect("clicked", deleteItem.bind(null, newItem)) editButton.connect("clicked", editItem.bind(null, newItem)) row.add_suffix(deleteButton) row.add_suffix(editButton) } itemRows.set(newItem, row) group.add(row) } } const orderItems = (list: T[])=>{ const rows = [...itemRows.entries()] const orderedRows = list .map( targetItem=>rows.find( ([item]) => info.match(targetItem, item) )?.[1] ?? null ) for (const row of orderedRows) { if (!row) continue group.remove(row) group.add(row) } } // Reset button const resetButton = ResetButton({ settings: info.settings, bind, marginBottom: 0, marginTop: 0 }) resetButton.insert_after(header, null) // Add button const addButton = info.createAddButton(editItem) addButton.insert_after(header, resetButton) // Sync to settings const update = ()=>{ setScrollToFocus(page, false) const list = info.getListFromSettings() pushItems(list) pruneItems(list) orderItems(list) delayedSetScrollToFocus(page, true) } const settingsConnection = info.settings.connect(`changed::${bind}`, update.bind(null)) update() page.connect("destroy", ()=>info.settings.disconnect(settingsConnection)) return group } abstract class OrderInfo { settings: Gio.Settings constructor(settings: Gio.Settings) { this.settings = settings } abstract getSystemNames(): Map abstract getSystemIcons(): Map abstract getSystemKey(item: T): string abstract getListFromSettings(): T[] abstract setListToSettings(list: T[]): void private _systemNames: Map private _systemIcons: Map get systemNames(): Map { return this._systemNames ??= this.getSystemNames() } get systemIcons(): Map { return this._systemIcons ??= this.getSystemIcons() } abstract getDisplayName(item: T): string abstract getSubtitle(item: T): string abstract canHide(item: T): boolean abstract canEdit(item: T): boolean abstract createEditLayout(item: T): OrderInfo.EditLayout getNextName(list: T[]): string { let nth = 1 let name: string while (true) { name = _("My item #%d").format(nth) if (list.findIndex(item => item.friendlyName == name) == -1) break nth += 1 } return name } abstract create(friendlyName: string): T abstract match(a: T, b: T): boolean abstract shouldShow(item: T): boolean skip(_list: T[], _moving: T, _movingIndex: number, target: T, _targetIndex: number): boolean { return this.shouldShow(target) } moveBlocking(_list: T[], _moving: T, _movingIndex: number, target: T, _targetIndex: number): boolean { return false } createAddButton(editItem: (item: T)=>void): Gtk.Widget { return Button({ marginBottom: 0, marginTop: 0, iconName: "list-add", text: _("New Item"), action: ()=>{ const list = this.getListFromSettings() const item = this.create(this.getNextName(list)) list.push(item) this.setListToSettings(list) editItem(item) } }) } getGroupTitle(): string { return _("Ordering and Hiding") } getGroupDescription(): string|null { return null } } namespace OrderInfo { export type EditLayout = { layout: any[], getValue: ()=>T, } export type Base = { hide?: boolean, friendlyName?: string, } } // #endregion OrderGroup class ToggleOrderInfo extends OrderInfo { createEditLayout(item: ToggleOrderItem): OrderInfo.EditLayout { const friendlyName = new Adw.EntryRow({ text: item.friendlyName ?? "", max_length: 2048, title: _("Friendly Name"), }) removeRowBottomBorder(friendlyName) const hideRow = new Adw.SwitchRow({ active: item.hide ?? false, title: _("Hide"), }) const titleRegex = new Adw.EntryRow({ text: item.titleRegex ?? "", max_length: 2048, title: _("Title Regex (Javascript Regex)") }) const constructorName = new Adw.EntryRow({ text: item.constructorName ?? "", max_length: 2028, title: _("Constructor Name") }) removeRowBottomBorder(constructorName) const gtypeName = new Adw.EntryRow({ text: item.gtypeName ?? "", max_length: 2028, title: _("GType Name") }) removeRowBottomBorder(gtypeName) return { layout: [ hideRow, friendlyName, Row({ subtitle: _("This is the comment for easy identification in the settings list. It has no effect on the behavior of the extension"), onCreated: removeRowMinHeight, }), constructorName, Row({ subtitle: _("Javascript constructor name"), onCreated: removeRowMinHeight, }), gtypeName, Row({ subtitle: _("GObject gtype name. You can get this value by calling GObject.type_name_from_instance"), onCreated: removeRowMinHeight, }), titleRegex, ], getValue: ()=>({ ...item, friendlyName: friendlyName.text, constructorName: constructorName.text, gtypeName: gtypeName.text, titleRegex: titleRegex.text, hide: hideRow.active, }) } } getSystemKey(item: ToggleOrderItem): string { return item.constructorName } getSystemNames(): Map { const IGNORE_XGETTEXT=_ return new Map([ [ "NMWiredToggle", IGNORE_XGETTEXT("Wired Connections") ], [ "NMWirelessToggle", IGNORE_XGETTEXT("Wi-Fi") ], [ "NMModemToggle", IGNORE_XGETTEXT("Mobile Connections") ], [ "NMBluetoothToggle", IGNORE_XGETTEXT("Bluetooth Tethers") ], [ "NMVpnToggle", IGNORE_XGETTEXT("VPN") ], [ "BluetoothToggle", IGNORE_XGETTEXT("Bluetooth") ], [ "PowerProfilesToggle", IGNORE_XGETTEXT("Power Mode") ], [ "NightLightToggle", IGNORE_XGETTEXT("Night Light") ], [ "DarkModeToggle", IGNORE_XGETTEXT("Dark Style") ], [ "KeyboardBrightnessToggle", _("Keyboard Backlight") ], [ "RfkillToggle", IGNORE_XGETTEXT("Airplane Mode") ], [ "RotationToggle", IGNORE_XGETTEXT("Auto Rotate") ], [ "DoNotDisturbToggle", _("Do Not Disturb") ], [ "UnsafeQuickToggle", _("Unsafe Mode") ], ]) } getSystemIcons(): Map { return new Map([ [ "NMWiredToggle", "network-wired-symbolic" ], [ "NMWirelessToggle", "network-wireless-signal-excellent-symbolic" ], [ "NMModemToggle", "network-cellular-symbolic" ], [ "NMBluetoothToggle", "network-cellular-symbolic" ], [ "NMVpnToggle", "network-vpn-symbolic" ], [ "BluetoothToggle", "bluetooth-active-symbolic" ], [ "PowerProfilesToggle", "power-profile-balanced-symbolic" ], [ "NightLightToggle", "night-light-symbolic" ], [ "DarkModeToggle", "weather-clear-night" ], [ "KeyboardBrightnessToggle", "preferences-desktop-keyboard" ], [ "RfkillToggle", "airplane-mode-symbolic" ], [ "RotationToggle", "object-rotate-right" ], [ "DoNotDisturbToggle", "notifications-disabled-symbolic" ], [ "UnsafeQuickToggle", "channel-secure-symbolic" ], ]) } getListFromSettings(): ToggleOrderItem[] { return this.settings.get_value("toggles-layout-order").recursiveUnpack() as ToggleOrderItem[] } setListToSettings(list: ToggleOrderItem[]): void { const mappedList = list.map(item => { const out = {} for (const [key, value] of Object.entries(item)) { switch (typeof value) { case "boolean": out[key] = GLib.Variant.new_variant( GLib.Variant.new_boolean(value) ) break case "string": out[key] = GLib.Variant.new_variant( GLib.Variant.new_string(value) ) } } return out }) this.settings.set_value("toggles-layout-order", new GLib.Variant("aa{sv}", mappedList)) } getDisplayName(item: ToggleOrderItem): string { if (item.nonOrdered) return _("Unordered items") if (item.isSystem) return this.systemNames.get(item.constructorName) ?? "Unknown" return item.friendlyName || item.constructorName || item.gtypeName || item.titleRegex || "Unknown" } getSubtitle(item: ToggleOrderItem): string { if (item.nonOrdered) return "" if (item.isSystem) return item.constructorName ?? "" if (item.friendlyName) return item.constructorName || item.gtypeName || item.titleRegex || "Unknown" return "" } canHide(item: ToggleOrderItem): boolean { if (!item.isSystem) return true return ( item.constructorName != "UnsafeQuickToggle" ) } canEdit(item: ToggleOrderItem): boolean { return !item.isSystem && !item.nonOrdered } match(a: ToggleOrderItem, b: ToggleOrderItem): boolean { return ToggleOrderItem.match(a, b) } create(friendlyName: string): ToggleOrderItem { return ToggleOrderItem.create(friendlyName) } shouldShow(item: ToggleOrderItem): boolean { if (item.constructorName == "UnsafeQuickToggle") { return this.settings.get_boolean("unsafe-quick-toggle-enabled") } return true } } class SystemIndicatorOrderInfo extends OrderInfo { createEditLayout(item: SystemIndicatorOrderItem): OrderInfo.EditLayout { const friendlyName = new Adw.EntryRow({ text: item.friendlyName ?? "", max_length: 2048, title: _("Friendly Name"), }) removeRowBottomBorder(friendlyName) const hideRow = new Adw.SwitchRow({ active: item.hide ?? false, title: _("Hide"), }) const constructorName = new Adw.EntryRow({ text: item.constructorName ?? "", max_length: 2028, title: _("Constructor Name") }) removeRowBottomBorder(constructorName) const gtypeName = new Adw.EntryRow({ text: item.gtypeName ?? "", max_length: 2028, title: _("GType Name") }) removeRowBottomBorder(gtypeName) return { layout: [ hideRow, friendlyName, Row({ subtitle: _("This is the comment for easy identification in the settings list. It has no effect on the behavior of the extension"), onCreated: removeRowMinHeight, }), constructorName, Row({ subtitle: _("Javascript constructor name"), onCreated: removeRowMinHeight, }), gtypeName, Row({ subtitle: _("GObject gtype name. You can get this value by calling GObject.type_name_from_instance"), onCreated: removeRowMinHeight, }), ], getValue: ()=>({ ...item, friendlyName: friendlyName.text, constructorName: constructorName.text, gtypeName: gtypeName.text, hide: hideRow.active, }) } } getSystemKey(item: SystemIndicatorOrderItem): string { return item.gtypeName } getSystemNames(): Map { const IGNORE_XGETTEXT=_ return new Map([ [ "Gjs_toggle_dndQuickToggle_DndIndicator", _("Do Not Disturb") ], [ "Gjs_status_remoteAccess_RemoteAccessApplet", _("Remote Access Applet") ], [ "Gjs_status_camera_Indicator", _("Camera") ], [ "Gjs_status_volume_InputIndicator", _("Volume Input") ], [ "Gjs_status_location_Indicator", _("Location") ], [ "Gjs_status_thunderbolt_Indicator", _("Thunderbolt") ], [ "Gjs_status_nightLight_Indicator", IGNORE_XGETTEXT("Night Light") ], [ "Gjs_status_network_Indicator", _("Network") ], [ "Gjs_status_bluetooth_Indicator", IGNORE_XGETTEXT("Bluetooth") ], [ "Gjs_status_rfkill_Indicator", IGNORE_XGETTEXT("Airplane Mode") ], [ "Gjs_status_volume_OutputIndicator", _("Volume Output") ], [ "Gjs_ui_panel_UnsafeModeIndicator", _("Unsafe Mode") ], [ "Gjs_status_system_Indicator", _("System (Battery)") ], ]) } getSystemIcons(): Map { return new Map([ [ "Gjs_toggle_dndQuickToggle_DndIndicator", "notifications-disabled-symbolic" ], [ "Gjs_status_remoteAccess_RemoteAccessApplet", "preferences-desktop-remote-desktop" ], [ "Gjs_status_camera_Indicator", "camera-photo-symbolic" ], [ "Gjs_status_volume_InputIndicator", "microphone-sensitivity-high-symbolic" ], [ "Gjs_status_location_Indicator", "find-location-symbolic" ], [ "Gjs_status_thunderbolt_Indicator", "system-run-symbolic" ], [ "Gjs_status_nightLight_Indicator", "night-light-symbolic" ], [ "Gjs_status_network_Indicator", "network-wireless-signal-excellent-symbolic" ], [ "Gjs_status_bluetooth_Indicator", "bluetooth-active-symbolic" ], [ "Gjs_status_rfkill_Indicator", "airplane-mode-symbolic" ], [ "Gjs_status_volume_OutputIndicator", "audio-volume-medium-symbolic" ], [ "Gjs_ui_panel_UnsafeModeIndicator", "channel-secure-symbolic" ], [ "Gjs_status_system_Indicator", "system-shutdown-symbolic" ], ]) } getListFromSettings(): SystemIndicatorOrderItem[] { return this.settings.get_value("system-indicator-layout-order").recursiveUnpack() as SystemIndicatorOrderItem[] } setListToSettings(list: SystemIndicatorOrderItem[]): void { const mappedList = list.map(item => { const out = {} for (const [key, value] of Object.entries(item)) { switch (typeof value) { case "boolean": out[key] = GLib.Variant.new_variant( GLib.Variant.new_boolean(value) ) break case "string": out[key] = GLib.Variant.new_variant( GLib.Variant.new_string(value) ) } } return out }) this.settings.set_value("system-indicator-layout-order", new GLib.Variant("aa{sv}", mappedList)) } getDisplayName(item: SystemIndicatorOrderItem): string { if (item.nonOrdered) return _("Unordered items") if (item.isSystem) return this.systemNames.get(item.gtypeName) ?? "Unknown" return item.friendlyName || item.constructorName || item.gtypeName || "Unknown" } getSubtitle(item: SystemIndicatorOrderItem): string { if (item.nonOrdered) return "" if (item.isSystem) return item.gtypeName ?? "" if (item.friendlyName) return item.constructorName || item.gtypeName || "Unknown" return "" } canHide(item: SystemIndicatorOrderItem): boolean { if (!item.isSystem) return true return item.gtypeName != "Gjs_toggle_dndQuickToggle_DndIndicator" } canEdit(item: SystemIndicatorOrderItem): boolean { return !item.isSystem && !item.nonOrdered } match(a: SystemIndicatorOrderItem, b: SystemIndicatorOrderItem): boolean { return SystemIndicatorOrderItem.match(a, b) } create(friendlyName: string): SystemIndicatorOrderItem { return SystemIndicatorOrderItem.create(friendlyName) } shouldShow(item: SystemIndicatorOrderItem): boolean { if (item.gtypeName == "Gjs_toggle_dndQuickToggle_DndIndicator") { return ( this.settings.get_string("dnd-quick-toggle-indicator-position") == "system-tray" ) } return true } } // class QuickSettingsOrderInfo extends OrderInfo { // } // #region SystemItemOrderGroup function SystemItemOrderGroup(settings: Gio.Settings, page: Adw.PreferencesPage): Adw.PreferencesGroup { let items = new Map() let group: Adw.PreferencesGroup const reorder = ()=>{ setScrollToFocus(page, false) const order = SystemItemOrderGroup.copyOrder(settings.get_strv("system-items-layout-order")) for (const name of order) { const target = items.get(name) group.remove(target) group.add(target) } delayedSetScrollToFocus(page, true) } const move = (direction: UpDownButton.Direction, name: string)=>{ const order = SystemItemOrderGroup.copyOrder(settings.get_strv("system-items-layout-order")) const index = order.indexOf(name) if (direction == UpDownButton.Direction.Up) { if (index == 0) return order[index] = order[index - 1] order[index - 1] = name } else { if (index == (SystemItemOrderGroup.DefaultOrder.length - 1)) return order[index] = order[index + 1] order[index + 1] = name } settings.set_strv("system-items-layout-order", order) } const orderConnection = settings.connect("changed::system-items-layout-order", reorder) page.connect("destroy", ()=>settings.disconnect(orderConnection)) return Group({ title: _("Ordering and Hiding"), headerSuffix: ResetButton({ settings, bind: "system-items-layout-order", marginBottom: 0, marginTop: 0 }), onCreated(row: Adw.PreferencesGroup) { group = row reorder() }, }, [ Row({ title: _("Desktop Spacer"), prefix: UpDownButton({ settings, sensitiveBind: "system-items-layout-enabled", action: (direction) => move(direction, "desktopSpacer"), }), onCreated(row) { items.set("desktopSpacer", row) }, }), Row({ title: _("Laptop Spacer"), prefix: UpDownButton({ settings, sensitiveBind: "system-items-layout-enabled", action: (direction) => move(direction, "laptopSpacer"), }), onCreated(row) { items.set("laptopSpacer", row) }, }), ...[ { title: _("Capture button"), bind: "system-items-layout-hide-screenshot", icon: "camera-photo", targetName: "screenshot", }, { title: _("Settings button"), bind: "system-items-layout-hide-settings", icon: "preferences-system-symbolic", targetName: "settings", }, { title: _("Lock button"), bind: "system-items-layout-hide-lock", icon: "system-lock-screen-symbolic", targetName: "lock", }, { title: _("Shutdown button"), bind: "system-items-layout-hide-shutdown", icon: "system-shutdown-symbolic", targetName: "shutdown", }, { title: _("Battery button"), bind: "system-items-layout-hide-battery", icon: "battery-symbolic", targetName: "battery", }, ].map(item => ToggleButtonRow({ settings, text: _("Hide"), sensitiveBind: "system-items-layout-enabled", ...item, onCreated(row: Adw.ActionRow) { items.set(item.targetName, row) row.add_prefix(new Gtk.Image({ icon_name: item.icon, pixel_size: 16, margin_start: 8 })) row.add_prefix(UpDownButton({ settings, sensitiveBind: "system-items-layout-enabled", action: (direction) => move(direction, item.targetName), })) }, })) ]) } namespace SystemItemOrderGroup { export const DefaultOrder = ["battery", "laptopSpacer", "screenshot", "settings", "desktopSpacer", "lock", "shutdown"] export function copyOrder(order: string[]): string[] { return DefaultOrder .map(item => ({ item, index: order.indexOf(item), })) .sort((a, b)=>a.index-b.index) .map(item => item.item) } } // #endregion SystemItemOrderGroup export const LayoutPage = GObject.registerClass({ GTypeName: Config.baseGTypeName+"LayoutPage", }, class LayoutPage extends Adw.PreferencesPage { constructor(settings: Gio.Settings, _prefs: QstExtensionPreferences, window: Adw.PreferencesWindow) { super({ name: "Layout", title: _("Layout"), iconName: "view-sort-descending-symbolic", }) fixPageScrollIssue(this) // Quick toggles Group({ parent: this, title: _("Quick Toggles Layout"), description: _("Adjust quick toggles layout"), },[ SwitchRow({ bind: "toggles-layout-enabled", settings, onDetailed: ()=>{ Dialog({ window, childrenRequest: (page, dialog) => [OrderGroup({ page, dialog, bind: "toggles-layout-order", sensitiveBind: "toggles-layout-enabled", info: new ToggleOrderInfo(settings), })], title: _("Adjust quick toggles layout"), }) }, title: _("Ordering and Hiding"), subtitle: _("Reorder and hide quick toggles"), experimental: true, }), ]) // System indicators Group({ parent: this, title: _("System Indicators"), description: _("Adjust system indicators layout and style"), },[ SwitchRow({ settings, bind: "system-indicator-screen-sharing-indicator-use-accent", title: _("Accent screen sharing indicator"), subtitle: _("Use shell accent color on screen sharing indicator"), }), SwitchRow({ settings, bind: "system-indicator-screen-recording-indicator-use-accent", title: _("Accent screen recording indicator"), subtitle: _("Use shell accent color on screen recording indicator"), }), DropdownRow({ settings, bind: "system-indicator-privacy-indicator-style", title: _("Privacy indicators style"), subtitle: _("Use monochrome or shell accent color on privarcy indicators"), items: [ { name: _("Default"), value: "default" }, { name: _("Accent"), value: "accent" }, { name: _("Monochrome"), value: "monochrome" }, ], }), SwitchRow({ settings, bind: "system-indicator-layout-enabled", onDetailed: ()=>{ Dialog({ window, title: _("Adjust system indicators"), childrenRequest: (page, dialog) => [OrderGroup({ page, dialog, bind: "system-indicator-layout-order", sensitiveBind: "system-indicator-layout-enabled", info: new SystemIndicatorOrderInfo(settings), })], }) }, title: _("Ordering and Hiding"), subtitle: _("Reorder and hide system indicators"), experimental: true, }), ]) // System Items Group({ parent: this, title: _("System Items Layout"), headerSuffix: SwitchRow({ settings, bind: "system-items-layout-enabled", }), description: _("Adjust system items layout"), },[ SwitchRow({ settings, title: _("Hide layout box"), subtitle: _("Hide all buttons and layout box"), bind: "system-items-layout-hide", sensitiveBind: "system-items-layout-enabled", }), DialogRow({ settings, window, sensitiveBind: "system-items-layout-enabled", title: _("Ordering and Hiding"), subtitle: _("Reorder and hide system items"), dialogTitle: _("Adjust system items layout"), experimental: true, childrenRequest: page => [SystemItemOrderGroup(settings, page)], }), ]) // DateMenu Group({ parent: this, title: _("Date Menu"), description: _("Adjust Date Menu layout"), },[ SwitchRow({ settings, title: _("Hide left box"), subtitle: _("Hide the left box of the date menu, which contains notifications and media control"), bind: "datemenu-hide-left-box", }), SwitchRow({ settings, title: _("Hide right box"), subtitle: _("Hide the right box of the date menu, which contains calendar, world clock and weather"), bind: "datemenu-hide-right-box", }), SwitchRow({ settings, title: _("Disable menu"), subtitle: _("Do not open date menu when the date menu button clicked"), bind: "datemenu-disable-menu", }), ]) } }) ================================================ FILE: src/prefPages/menu.ts ================================================ import Adw from "gi://Adw" import GObject from "gi://GObject" import Gio from "gi://Gio" import { gettext as _ } from "resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js" import Config from "../config.js" import type QstExtensionPreferences from "../prefs.js" import { SwitchRow, AdjustmentRow, DropdownRow, Group, DialogRow, fixPageScrollIssue, } from "../libs/prefs/components.js" // #region AdvancedAnimationStyleGroup function AdvancedAnimationStyleGroup(settings: Gio.Settings): Adw.PreferencesGroup { return Group({ title: _("Advanced animation style"), },[ AdjustmentRow({ settings, title: _("Open Duration"), subtitle: _("Open animation duration in microseconds"), sensitiveBind: "menu-animation-enabled", bind: "menu-animation-open-duration", max: 4000, }), AdjustmentRow({ settings, title: _("Close Duration"), subtitle: _("Close animation duration in microseconds"), sensitiveBind: "menu-animation-enabled", bind: "menu-animation-close-duration", max: 4000, }), AdjustmentRow({ settings, title: _("Grid Content Opacity"), subtitle: _("Adjust grid content opacity.\nSet this to 255 to make opaque, and 0 to make transparent"), sensitiveBind: "menu-animation-enabled", bind: "menu-animation-grid-content-opacity", max: 255, }), AdjustmentRow({ settings, title: _("Background Blur Radius"), subtitle: _("Adjust background blur radius.\nSet this to 0 to disable blur effect"), sensitiveBind: "menu-animation-enabled", bind: "menu-animation-background-blur-radius", max: 32, }), AdjustmentRow({ settings, title: _("Background Brightness"), subtitle: _("Adjust background brightness.\nSet this to 1000 to disable brightness control effect.\nNot impacts on gnome-shell's default dim effect."), sensitiveBind: "menu-animation-enabled", bind: "menu-animation-background-brightness", max: 2000, }), AdjustmentRow({ settings, title: _("Background Opacity"), subtitle: _("Adjust background opacity.\nSet this to 255 to make opaque, and 0 to make transparent"), sensitiveBind: "menu-animation-enabled", bind: "menu-animation-background-opacity", max: 255, }), AdjustmentRow({ settings, title: _("Background X Scale"), subtitle: _("Adjust background x scale, 1000 means 1.0 scale"), sensitiveBind: "menu-animation-enabled", bind: "menu-animation-background-scale-x", max: 4000, }), AdjustmentRow({ settings, title: _("Background Y Scale"), subtitle: _("Adjust background y scale, 1000 means 1.0 scale"), sensitiveBind: "menu-animation-enabled", bind: "menu-animation-background-scale-y", max: 4000, }), ]) } // #endregion AdvancedAnimationStyleGroup export const MenuPage = GObject.registerClass({ GTypeName: Config.baseGTypeName+"MenuPage", }, class MenuPage extends Adw.PreferencesPage { constructor(settings: Gio.Settings, _prefs: QstExtensionPreferences, window: Adw.PreferencesWindow) { super({ name: "Menu", title: _("Menu"), iconName: "user-available-symbolic", }) fixPageScrollIssue(this) // Overlay Group({ parent: this, title: _("Overlay Mode"), description: _("Display toggle, power, and sound menus as overlay"), headerSuffix: SwitchRow({ settings, bind: "overlay-menu-enabled", }), experimental: true, },[ AdjustmentRow({ settings, title: _("Overlay Width"), subtitle: _("Adjust overlay menu width\nSet this to 0 to disable adjusting"), sensitiveBind: "overlay-menu-enabled", bind: "overlay-menu-width", max: 2048, }), AdjustmentRow({ settings, title: _("Overlay Animation Duration"), subtitle: _("Custom menu open animation duration in microseconds\nSet this to 0 to disable custom animation"), sensitiveBind: "overlay-menu-enabled", bind: "overlay-menu-animate-duration", max: 4000, }), DropdownRow({ settings, title: _("Overlay Animation Style"), subtitle: _("Custom menu open animation style"), items: [ { "name": _("Flyout"), "value": "flyout" }, { "name": _("Dialog"), "value": "dialog" }, ], bind: "overlay-menu-animate-style", sensitiveBind: "overlay-menu-enabled" }), DropdownRow({ settings, title: _("Overlay overflow anchor"), subtitle: _("When the menu box is taller than Quick Settings, determines where in Quick Settings the menu box will be fixed"), items: [ { "name": _("Top"), "value": "top" }, { "name": _("Center"), "value": "center" }, { "name": _("Bottom"), "value": "bottom" }, ], bind: "overlay-menu-overflow-anchor", sensitiveBind: "overlay-menu-enabled" }) ]) // Animation Group({ parent: this, title: _("Animation"), description: _("Add menu animation on toggle menu opening and closing\nTo get the best feel, turn on overlay mode"), headerSuffix: SwitchRow({ settings, bind: "menu-animation-enabled", }), experimental: true, },[ DialogRow({ window, settings, title: _("Advanced animation style"), subtitle: _("Adjust speed, blur, scale, and opacity"), dialogTitle: _("Animation"), sensitiveBind: "menu-animation-enabled", childrenRequest: ()=>[AdvancedAnimationStyleGroup(settings)], }), ]) } }) ================================================ FILE: src/prefPages/toggles.ts ================================================ import Adw from "gi://Adw" import GObject from "gi://GObject" import Gio from "gi://Gio" import { gettext as _ } from "resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js" import Config from "../config.js" import type QstExtensionPreferences from "../prefs.js" import { SwitchRow, Group, fixPageScrollIssue, } from "../libs/prefs/components.js" export const TogglesPage = GObject.registerClass({ GTypeName: Config.baseGTypeName+"TogglesPage", }, class TogglesPage extends Adw.PreferencesPage { constructor(settings: Gio.Settings, _prefs: QstExtensionPreferences, window: Adw.PreferencesWindow) { super({ name: "Toggles", title: _("Toggles"), iconName: "view-grid-symbolic", }) fixPageScrollIssue(this) // Unsafe Mode Toggle Group({ parent: this, title: _("Unsafe Mode Quick Toggle"), description: _("Turn on to add the unsafe quick toggle on the Quick Settings panel"), headerSuffix: SwitchRow({ settings, bind: "unsafe-quick-toggle-enabled", }), }, [ SwitchRow({ settings, title: _("Save last session state"), subtitle: _("Turn on to save last session unsafe state"), bind: "unsafe-quick-toggle-save-last-state", sensitiveBind: "unsafe-quick-toggle-enabled", }), ]) } }) ================================================ FILE: src/prefPages/widgets.ts ================================================ import Adw from "gi://Adw" import GObject from "gi://GObject" import Gio from "gi://Gio" import { gettext as _ } from "resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js" import Config from "../config.js" import type QstExtensionPreferences from "../prefs.js" import { SwitchRow, AdjustmentRow, Group, fixPageScrollIssue, RgbColorRow, DropdownRow, EntryRow, Dialog, PaddingDialog, } from "../libs/prefs/components.js" function SliderCustomizes({ settings, baseName, sensitiveBind, }: { settings: Gio.Settings, baseName: string, sensitiveBind?: string }): any[] { // Handle color & radius const handleRadius = AdjustmentRow({ settings, max: 1000, title: _("Handle radius"), subtitle: _("Set this to 0 to use default radius"), bind: baseName+"-handle-radius", sensitiveBind, }) const handleColor = RgbColorRow({ settings, title: _("Handle color"), bind: baseName+"-handle-color", sensitiveBind, useAlpha: true, }) const updateHandleOptionVisible = ()=>{ const value = settings.get_string(baseName+"-style") handleRadius.visible = handleColor.visible = value != "slim" } const updateHandleOptionVisibleConnection = settings.connect( `changed::${baseName}-style`, updateHandleOptionVisible ) updateHandleOptionVisible() handleColor.child.connect("destroy", ()=>{ settings.disconnect(updateHandleOptionVisibleConnection) }) return [ DropdownRow({ settings, title: _("Slider style"), bind: baseName+"-style", items: [ { name: _("Slim"), value: "slim" }, { name: _("Default"), value: "default" }, ], sensitiveBind, }), handleRadius, handleColor, RgbColorRow({ settings, title: _("Background color"), bind: baseName+"-background-color", sensitiveBind, useAlpha: true, }), RgbColorRow({ settings, title: _("Active Background color"), bind: baseName+"-active-background-color", sensitiveBind, useAlpha: true, }), AdjustmentRow({ settings, title: _("Thickness"), max: 1000, bind: baseName+"-height", sensitiveBind, subtitle: _("Set this to 0 to use default thickness"), }) ] } export const WidgetsPage = GObject.registerClass({ GTypeName: Config.baseGTypeName+"WidgetsPage", }, class WidgetsPage extends Adw.PreferencesPage { constructor(settings: Gio.Settings, _prefs: QstExtensionPreferences, window: Adw.PreferencesWindow) { super({ name: "Widgets", title: _("Widgets"), iconName: "window-new-symbolic", }) fixPageScrollIssue(this) // media Group({ parent: this, title: _("Media Widget"), headerSuffix: SwitchRow({ settings, bind: "media-enabled", }), description: _("Turn on to make the media widget visible on the Quick Settings panel"), },[ SwitchRow({ settings, title: _("Compact mode"), subtitle: _("Make Media Controls widget smaller\nMake it more similar in size to the notification message"), bind: "media-compact", sensitiveBind: "media-enabled", }), AdjustmentRow({ settings, title: _("Control buttons opacity"), subtitle: _("Set this to 255 to make opaque, and 0 to make transparent"), max: 255, bind: "media-contorl-opacity", sensitiveBind: "media-enabled", }), SwitchRow({ settings, bind: "media-contorl-show-next-button", title: _("Show next button"), subtitle: _("Add next contorl button next to description"), sensitiveBind: "media-enabled", }), SwitchRow({ settings, bind: "media-contorl-show-prev-button", title: _("Show previous button"), subtitle: _("Add previous contorl button next to description"), sensitiveBind: "media-enabled", }), SwitchRow({ settings, bind: "media-contorl-show-pause-button", title: _("Show pause button"), subtitle: _("Add pause contorl button next to description"), sensitiveBind: "media-enabled", }), SwitchRow({ settings, bind: "media-progress-enabled", title: _("Show progress bar"), subtitle: _("Add progress bar under description"), experimental: true, sensitiveBind: "media-enabled", onDetailed: ()=>{Dialog({ window, title: _("Media Widget"), childrenRequest: ()=>[Group({ title: _("Show progress bar"), description: _("Add progress bar under description"), header_suffix: SwitchRow({ settings, bind: "media-progress-enabled", }), }, SliderCustomizes({ settings, baseName: "media-progress", sensitiveBind: "media-progress-enabled" }))], })} }), SwitchRow({ settings, bind: "media-gradient-enabled", title: _("Gradient background"), subtitle: _("Use gradient background extracted from cover image\nMay affect performance slightly"), sensitiveBind: "media-enabled", experimental: true, onDetailed: ()=>{Dialog({ window, title: _("Media Widget"), childrenRequest: ()=>[Group({ title: _("Gradient background"), header_suffix: SwitchRow({ settings, bind: "media-gradient-enabled", }), description: _("Use gradient background extracted from cover image\nMay affect performance slightly"), },[ RgbColorRow({ settings, title: _("Background color"), subtitle: _("Base background color"), bind: "media-gradient-background-color", sensitiveBind: "media-gradient-enabled", }), AdjustmentRow({ settings, max: 1000, sensitiveBind: "media-gradient-enabled", title: _("Start opacity"), subtitle: _("Adjust left side transparency, Set this to 1000 to make opaque"), bind: "media-gradient-start-opaque", }), AdjustmentRow({ settings, max: 1000, sensitiveBind: "media-gradient-enabled", title: _("Start color"), subtitle: _("Adjust left side background color mixing, Set this to 1000 to show extracted color"), bind: "media-gradient-start-mix", }), AdjustmentRow({ settings, max: 1000, sensitiveBind: "media-gradient-enabled", title: _("End opacity"), subtitle: _("Adjust right side transparency, Set this to 1000 to make opaque"), bind: "media-gradient-end-opaque", }), AdjustmentRow({ settings, max: 1000, sensitiveBind: "media-gradient-enabled", title: _("End color"), subtitle: _("Adjust right side background color mixing, Set this to 1000 to show extracted color"), bind: "media-gradient-end-mix", }), ])], })} }), SwitchRow({ settings, title: _("Round clip effect"), subtitle: _("Use round clip effect to make transition more natural"), bind: "media-round-clip-enabled", sensitiveBind: "media-enabled", experimental: true, onDetailed: ()=>{Dialog({ window, title: _("Media Widget"), childrenRequest: ()=>[Group({ title: _("Round clip effect"), header_suffix: SwitchRow({ settings, bind: "media-round-clip-enabled", }), description: _("Use round clip effect to make transition more natural"), },[ SwitchRow({ title: _("Padding adjustment"), settings, subtitle: _("Adjust clip effect padding, edit this if your theme has a different margin or padding"), bind: "media-round-clip-padding-adjustment-enabled", sensitiveBind: "media-round-clip-enabled", onDetailed: ()=>{ PaddingDialog({ window, settings, bind: "media-round-clip-padding-adjustment-value", }) } }) ])], })} }), SwitchRow({ settings, title: _("Remove shadow"), subtitle: _("Remove shadow from media message\nUse if your theme creates unnecessary shadows"), bind: "media-remove-shadow", sensitiveBind: "media-enabled", }), AdjustmentRow({ settings, title: _("Smooth scroll speed"), subtitle: _("Adjust trackpad and trackpoint scroll speed, negative number for invert direction"), max: 2048, min: -2048, bind: "media-smooth-scroll-speed", sensitiveBind: "media-enabled", }), ]) // notification Group({ parent: this, title: _("Notifications Widget"), headerSuffix: SwitchRow({ settings, bind: "notifications-enabled" }), description: _("Turn on to make the notifications widget visible on the Quick Settings panel"), },[ SwitchRow({ settings, title: _("Compact mode"), subtitle: _("Make notifications smaller"), bind: "notifications-compact", sensitiveBind: "notifications-enabled", }), AdjustmentRow({ settings, title: _("Max height"), subtitle: _("Set maximum height of the Notifications widget, default is %d. Set this to 0 to disable max height") .format(settings.get_default_value("notifications-max-height").unpack()), max: 2048, bind: "notifications-max-height", sensitiveBind: "notifications-enabled", }), AdjustmentRow({ settings, title: _("Fade out offset"), subtitle: _("Set position of the fade out effect begins. Set this to 0 to disable fade out effect. default is 46"), max: 2048, bind: "notifications-fade-offset", sensitiveBind: "notifications-enabled", }), SwitchRow({ settings, title: _("Auto hide"), subtitle: _("Hide the Notifications widget when have no notifications"), bind: "notifications-autohide", sensitiveBind: "notifications-enabled", }), SwitchRow({ settings, title: _("Use native controls"), subtitle: _("Use native dnd switch and clear button"), bind: "notifications-use-native-controls", sensitiveBind: "notifications-enabled", }), SwitchRow({ settings, title: _("Remove shadow"), subtitle: _("Remove shadow from notification message\nUse if your theme creates unnecessary shadows"), bind: "notifications-remove-shadow", sensitiveBind: "notifications-enabled", }), SwitchRow({ settings, title: _("Show scrollbar"), subtitle: _("Show scrollbar on message list"), bind: "notifications-show-scrollbar", sensitiveBind: "notifications-enabled", }), ]) // weather Group({ parent: this, title: _("Weather Widget"), headerSuffix: SwitchRow({ settings, bind: "weather-enabled" }), description: _("Turn on to make the weather widget visible on the Quick Settings panel"), },[ SwitchRow({ settings, title: _("Compact mode"), subtitle: _("Make weather widget smaller"), bind: "weather-compact", sensitiveBind: "weather-enabled", }), SwitchRow({ settings, title: _("Remove shadow"), subtitle: _("Remove shadow from weather widget\nUse if your theme creates unnecessary shadows"), bind: "weather-remove-shadow", sensitiveBind: "weather-enabled", }), EntryRow({ settings, title: _("Click command"), bind: "weather-click-command", sensitiveBind: "weather-enabled", }), SwitchRow({ settings, title: _("Show location"), subtitle: _("Show the location label on header"), bind: "weather-show-location", sensitiveBind: "weather-enabled", }), AdjustmentRow({ settings, max: 1024, min: 1, bind: "weather-interval-hour", title: _("Forecast interval"), subtitle: _("Adjust forecast interval in hour"), }), AdjustmentRow({ settings, max: 12, min: 0, bind: "weather-max-forecasts", title: _("Max forecasts"), subtitle: _("Adjust max forecasts"), }), ]) // volume mixer Group({ parent: this, title: _("Volume mixer Widget"), headerSuffix: SwitchRow({ settings, bind: "volume-mixer-enabled" }), description: _("Turn on to make the volume mixer widget visible on the Quick Settings panel"), },[ DropdownRow({ settings, title: _("Label text"), subtitle: _("Choose label above slider text source"), items: [ { name: _("Both"), value: "both" }, { name: _("Title"), value: "title" }, { name: _("Description"), value: "description" }, { name: _("None"), value: "none" }, ], bind: "volume-mixer-label-text", sensitiveBind: "volume-mixer-enabled", }), AdjustmentRow({ settings, max: 255, title: _("Label opacity"), subtitle: _("Adjust label opacity.\nSet this to 255 to make opaque, and 0 to make transparent"), bind: "volume-mixer-label-opacity", sensitiveBind: "volume-mixer-enabled", }), AdjustmentRow({ settings, title: _("Max height"), subtitle: _("Set maximum height of the Volume mixer widget, default is %d. Set this to 0 to disable max height") .format(settings.get_default_value("volume-mixer-max-height").unpack()), max: 2048, bind: "volume-mixer-max-height", sensitiveBind: "volume-mixer-enabled", }), SwitchRow({ settings, title: _("Show scrollbar"), subtitle: _("Show scrollbar on mixer list"), bind: "volume-mixer-show-scrollbar", sensitiveBind: "volume-mixer-enabled", }), SwitchRow({ settings, title: _("Show stream icon"), subtitle: _("Show stream icon above mixer sliders"), bind: "volume-mixer-show-icon", sensitiveBind: "volume-mixer-enabled", }), AdjustmentRow({ settings, title: _("Fade out offset"), subtitle: _("Set position of the fade out effect begins. Set this to 0 to disable fade out effect. default is 46"), max: 2048, bind: "volume-mixer-fade-offset", sensitiveBind: "volume-mixer-enabled", }), SwitchRow({ settings, bind: "volume-mixer-menu-enabled", title: _("Attach to output slider"), subtitle: _("Attach volume mixer menu button to output slider. Use if you prefer compact layout"), sensitiveBind: "volume-mixer-enabled", onDetailed: ()=>{Dialog({ window, title: _("Volume mixer Widget"), childrenRequest: ()=>[Group({ title: _("Attach to output slider"), description: _("Attach volume mixer menu button to output slider. Use if you prefer compact layout"), header_suffix: SwitchRow({ settings, bind: "volume-mixer-menu-enabled", }), },[ EntryRow({ settings, bind: "volume-mixer-menu-icon", title: _("Menu icon"), sensitiveBind: "volume-mixer-menu-enabled", }) ])], })} }), ]) } }) ================================================ FILE: src/prefs.ts ================================================ import Gtk from "gi://Gtk" import Gdk from "gi://Gdk" import Gio from "gi://Gio" import Adw from "gi://Adw" import { ExtensionPreferences } from "resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js" import { gettext as _ } from "resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js" import { WidgetsPage } from "./prefPages/widgets.js" import { TogglesPage } from "./prefPages/toggles.js" import { LayoutPage } from "./prefPages/layout.js" import { AboutPage } from "./prefPages/about.js" import { MenuPage } from "./prefPages/menu.js" import { ContributorsRow, LicenseRow } from "./libs/prefs/components.js" import Config from "./config.js" var pageList = [ WidgetsPage, TogglesPage, LayoutPage, MenuPage, AboutPage, ] export default class QstExtensionPreferences extends ExtensionPreferences { appendIconPath(path: string) { const iconTheme = Gtk.IconTheme.get_for_display(Gdk.Display.get_default()) if (!iconTheme.get_search_path().includes(path)) iconTheme.add_search_path(path) } readExtensionFile(path: string) { const decoder = new TextDecoder() const file = Gio.File.new_for_path(`${this.path}/${path}`) const content = file.load_contents(null)[1] return decoder.decode(content) } getContributorRows(): ContributorsRow.Contributor[][] { const contributors = JSON.parse( this.readExtensionFile("media/contributors/data.json") ) as ContributorsRow.Contributor[] if (!contributors.length) return [] const rows: ContributorsRow.Contributor[][] = [[]] contributors.reduce((currentRow: ContributorsRow.Contributor[], obj: ContributorsRow.Contributor)=>{ if (currentRow.length >= 4) rows.push(currentRow = []) currentRow.push(obj) return currentRow }, rows[0]) return rows } getLicenses(): LicenseRow.License[] { const licenses = JSON.parse( this.readExtensionFile("media/licenses.json") ) as LicenseRow.License[] for (const item of licenses) { if (item.file) { item.content = async () => this.readExtensionFile(item.file) } } return licenses } getVersionString(): string { let version = Config.version.toUpperCase().replace(/-.*?$/, "") if (this.metadata.version) { version += "." + this.metadata.version } version += " — " if (Config.isReleaseBuild) { version += _("Stable") } else if (Config.isDevelopmentBuild) { version += _("Development") } else { version += _("Preview") } if (Config.isGithubBuild) { version += " " + _("(Github Release)") } else if (!this.metadata.version) { version += " " + _("(Built from source)") } return version } getChangelog(): string { return this.readExtensionFile("media/Changelog.md") } async fillPreferencesWindow(window: Adw.PreferencesWindow) { let settings = this.getSettings() // Window options window.set_search_enabled(true) window.set_default_size(690, 680) // Register icon path this.appendIconPath(this.path + "/media") this.appendIconPath(this.path + "/media/contributors") for (const page of pageList) { window.add(new page(settings, this, window)) } } } ================================================ FILE: src/styles/date-menu.scss ================================================ @use "../global.scss" as *; .datemenu-popover { &#{$p}-hide-left-box { .datemenu-calendar-column { margin: 0px; } } &#{$p}-hide-right-box { .message-list { margin: 0px; border: none; min-height: 340px; } } } ================================================ FILE: src/styles/debug.scss ================================================ @use "../global.scss" as *; #{$p}-debug-show-layout * { outline: 1px solid red; } ================================================ FILE: src/styles/media-widget.scss ================================================ @use "../global.scss" as *; #{$p}-media { padding: 0px; margin: 0px 0px 0px 0px; // Message Card .message { margin: 0px; } // Message Content (Texts) .message-content { width: 0px; // Min size, texts will be expended text-overflow: ellipsis; } // Header #{$p}-header { margin-bottom: 6px; // Header Label #{$p}-header-label { font-weight: bold; font-size: 0.98em; margin-left: 4px; } .page-indicators { margin-right: 4px; spacing: 6px; .page-indicator { height: 8px; width: 8px; padding: 0px; } } } // Progress Control (Position/Length Text and Slider) #{$p}-progress-control { spacing: 8px; padding: 0px 6px; #{$p}-position-label, #{$p}-length-label { font-size: 0.92em; } } .message-list-section-list { margin: 0px; padding: 0px; spacing: 0px; } } ================================================ FILE: src/styles/message-compact.scss ================================================ @use "../global.scss" as *; #{$p}-message-compact { // Message Card .message { margin-bottom: 8px; padding: 5px 6px; &.media-message { padding: 3px 6px 8px 6px !important; // idk required for some reason .message-media-control { /* control button sizing */ padding-left: 5px; padding-right: 5px; } } // Message Content Box (Outside) .message-box { padding-top: 1px; // Header & Content spacing // Message Content (Texts) .message-content { spacing: 3px; // Title & Content spacing font-size: 0.89em; } } // Message Header (App, Button) .message-header { spacing: 3px; // close / expand button spacing // Buttons .message-expand-button, .message-close-button { padding: 2px !important; } // Title .message-header-content { padding-left: 6px; } } // Action buttons .notification-button { font-size: 0.9em; padding: 5px; margin-top: 0px; } } } ================================================ FILE: src/styles/message-remove-shadow.scss ================================================ @use "../global.scss" as *; #{$p}-message-remove-shadow .message { box-shadow: none !important; } ================================================ FILE: src/styles/notification-widget.scss ================================================ @use "../global.scss" as *; #{$p}-notifications { padding: 0px; margin: 0px 0px 0px 0px; // Message Card .message { // Message Content (Texts) .message-content { width: 0px; // Min size, texts will be expended text-overflow: ellipsis; } // Message header .message-header { margin: 0px; padding: 0px 4px 2px 6px; spacing: 4px; } } // Avoid Scrollbar .message-view { margin: 0px; } #{$p}-has-scrollbar { .message-view { padding: 0px 5px 0px 0px; } } // Header #{$p}-header { margin-bottom: 6px; // Header Label #{$p}-header-label { font-weight: bold; font-size: 0.98em; margin-left: 4px; } // Clear button #{$p}-clear-button { font-weight: bold; font-size: 0.98em; padding: 1px 4px; border-radius: 8px; margin-right: 4px; &:hover { background-color: rgba(127, 127, 127, .2); } #{$p}-icon { margin-right: 4px; } } } &#{$p}-use-native-controls #{$p}-header { margin-bottom: 8px; } // No notification placeholder #{$p}-placeholder { font-weight: bold; margin: 10px 0px; #{$p}-icon { margin-bottom: 12px; } } // Native controls #{$p}-native-controls { margin-top: 5px; padding: 0px 4px; #{$p}-native-dnd-switch { margin: 0px 0px 0px 6px; height: 24px; // 26px; width: 40px; .handle { margin: 2px; width: 20px; height: 20px; } } #{$p}-native-dnd-text { font-size: 0.92em; margin-right: 4px; margin-bottom: 0px; } #{$p}-native-clear-button { font-size: 0.92em; padding: 4px 8px; } #{$p}-native-control-box { padding: 8px 4px 0px 4px; } } } ================================================ FILE: src/styles/system-indicator.scss ================================================ @use "../global.scss" as *; #panel { #{$p}-privacy-indicator-use-accent .privacy-indicator { color: -st-accent-color; }#{$p}-privacy-indicator-use-monochrome .privacy-indicator { color: -st-accent-fg-color; } #{$p}-screen-sharing-indicator-use-accent, #{$p}-screen-recording-indicator-use-accent { box-shadow: inset 0 0 0 100px -st-accent-color; &:hover, &:focus { box-shadow: inset 0 0 0 100px st-mix(-st-accent-color, -st-accent-fg-color, 75%); } &:active { box-shadow: inset 0 0 0 100px st-mix(-st-accent-color, -st-accent-fg-color, 60%); } } } ================================================ FILE: src/styles/volume-mixer-widget.scss ================================================ @use "../global.scss" as *; /* volume mixer label */ #{$p}-volume-mixer { #{$p}-item { #{$p}-label { padding-left: 6px; font-size: 0.92em; text-overflow: ellipsis; width: 0px; } spacing: 4px; } spacing: 6px; #{$p}-has-scrollbar { padding: 0px 5px 0px 0px; } } .quick-toggle-menu-container { #{$p}-volume-mixer { #{$p}-item { #{$p}-label { font-size: 1.02em; } } } } ================================================ FILE: src/styles/weather-widget.scss ================================================ @use "../global.scss" as *; #{$p}-weather { &#{$p}-weather-remove-shadow { .weather-button { box-shadow: none !important; } } &#{$p}-weather-compact { .weather-button { padding: 8px 0px 10px 0px; .weather-forecast-time { padding-top: 4px; padding-bottom: 2px; } .weather-forecast-icon { margin-bottom: 2px; } } } .weather-button { margin: 0px; #{$p}-status-label { margin: 2px 10px 2px 10px; } } // Header #{$p}-header { margin-bottom: 6px; // Header Label #{$p}-header-label { font-weight: bold; font-size: 0.98em; margin-left: 4px; } // Location Label #{$p}-location-label { font-weight: bold; font-size: 0.98em; margin-right: 6px; margin-top: 2px; } } } ================================================ FILE: src/stylesheet.scss ================================================ @use "./global.scss" as *; @use "./styles/notification-widget.scss"; @use "./styles/media-widget.scss"; @use "./styles/weather-widget.scss"; @use "./styles/message-compact.scss"; @use "./styles/message-remove-shadow.scss"; @use "./styles/volume-mixer-widget.scss"; @use "./styles/date-menu.scss"; @use "./styles/system-indicator.scss"; @use "./styles/debug.scss"; /* input output labels */ #{$p}-input-output-label { width: auto; } ================================================ FILE: src/types.d.ts ================================================ import "@girs/gnome-shell/ambient" import "@girs/gnome-shell/extensions/global" import "@girs/gjs/dom" import "@girs/gjs" import "./ambient" // Shell environment // import Clutter from "@girs/clutter-15/clutter-15" // import GObject from "gi://GObject" // import Atk from "gi://Atk" declare module "@girs/clutter-15/clutter-15" { namespace Clutter { interface Actor { ease(params: EasingParamsWithProps): void ease_property(propName: string, target: any, params: EasingParams) } } } declare module "@girs/gobject-2.0/gobject-2.0" { import SignalTracker from "resource:///org/gnome/shell/misc/signals.js" namespace GObject { interface Object { connectObject: SignalTracker.EventEmitter["connectObject"] connect_object: SignalTracker.EventEmitter["connectObject"] disconnectObject: SignalTracker.EventEmitter["disconnectObject"] disconnect_object: SignalTracker.EventEmitter["disconnectObject"] } } } ================================================ FILE: tsconfig.json ================================================ { "compilerOptions": { "moduleResolution": "Bundler", "outDir": "target/tsc", "target": "ESNext", "module": "ESNext", "removeComments": false, "skipLibCheck": true, "lib": ["ESNext"], "allowArbitraryExtensions": true, "incremental": true, "tsBuildInfoFile": "target/.tsbuildinfo", "useDefineForClassFields": false }, "include": ["./src/**/*.ts", "src/types.d.ts", "src/contributors.js"] }