├── .gitattributes ├── .github ├── FUNDING.yml ├── ISSUE_TEMPLATE │ ├── bug_report.yml │ ├── config.yml │ └── feature_request.yml └── workflows │ └── main.yml ├── .gitignore ├── LICENSE ├── extension.js ├── helpers ├── file.js └── subprocess.js ├── howtouse.gif ├── icons ├── gnome │ ├── battery-symbolic.svg │ ├── cpu-symbolic.svg │ ├── fan-symbolic.svg │ ├── gpu-symbolic.svg │ ├── memory-symbolic.svg │ ├── network-download-symbolic.svg │ ├── network-symbolic.svg │ ├── network-upload-symbolic.svg │ ├── storage-symbolic.svg │ ├── system-symbolic.svg │ ├── temperature-symbolic.svg │ └── voltage-symbolic.svg └── original │ ├── battery-symbolic.svg │ ├── cpu-symbolic.svg │ ├── fan-symbolic.svg │ ├── gpu-symbolic.svg │ ├── memory-symbolic.svg │ ├── network-download-symbolic.svg │ ├── network-symbolic.svg │ ├── network-upload-symbolic.svg │ ├── storage-symbolic.svg │ ├── system-symbolic.svg │ ├── temperature-symbolic.svg │ └── voltage-symbolic.svg ├── locale ├── ar │ └── LC_MESSAGES │ │ ├── vitals.mo │ │ └── vitals.po ├── be │ └── LC_MESSAGES │ │ ├── vitals.mo │ │ └── vitals.po ├── ca │ └── LC_MESSAGES │ │ └── vitals.mo ├── cs │ └── LC_MESSAGES │ │ ├── vitals.mo │ │ └── vitals.po ├── de │ └── LC_MESSAGES │ │ ├── vitals.mo │ │ └── vitals.po ├── es │ └── LC_MESSAGES │ │ └── vitals.mo ├── fi_FI │ └── LC_MESSAGES │ │ └── vitals.mo ├── fr │ └── LC_MESSAGES │ │ └── vitals.mo ├── it │ └── LC_MESSAGES │ │ └── vitals.mo ├── nl │ └── LC_MESSAGES │ │ └── vitals.mo ├── oc │ └── LC_MESSAGES │ │ └── vitals.mo ├── pl │ └── LC_MESSAGES │ │ └── vitals.mo ├── pt │ └── LC_MESSAGES │ │ └── vitals.mo ├── pt_BR │ └── LC_MESSAGES │ │ └── vitals.mo ├── ru │ └── LC_MESSAGES │ │ └── vitals.mo ├── sk │ └── LC_MESSAGES │ │ └── vitals.mo ├── tr │ └── LC_MESSAGES │ │ └── vitals.mo ├── uk │ └── LC_MESSAGES │ │ ├── vitals.mo │ │ └── vitals.po └── zh_CN │ └── LC_MESSAGES │ └── vitals.mo ├── menuItem.js ├── metadata.json ├── prefs.js ├── prefs.ui ├── schemas └── gschemas.compiled ├── sensors.js ├── stylesheet.css └── values.js /.gitattributes: -------------------------------------------------------------------------------- 1 | locale/sk/LC_MESSAGES/vitals.po export-ignore 2 | locale/pl/LC_MESSAGES/vitals.po export-ignore 3 | locale/fi_FI/LC_MESSAGES/vitals.po export-ignore 4 | locale/fr/LC_MESSAGES/vitals.po export-ignore 5 | locale/pt_BR/LC_MESSAGES/vitals.po export-ignore 6 | locale/it/LC_MESSAGES/vitals.po export-ignore 7 | locale/ca/LC_MESSAGES/vitals.po export-ignore 8 | locale/ru/LC_MESSAGES/vitals.po export-ignore 9 | locale/zh_CN/LC_MESSAGES/vitals.po export-ignore 10 | locale/pt/LC_MESSAGES/vitals.po export-ignore 11 | locale/nl/LC_MESSAGES/vitals.po export-ignore 12 | locale/es/LC_MESSAGES/vitals.po export-ignore 13 | locale/tr/LC_MESSAGES/vitals.po export-ignore 14 | locale/oc/LC_MESSAGES/vitals.po export-ignore 15 | locale/vitals.pot export-ignore 16 | zip.sh export-ignore 17 | README.md export-ignore 18 | schemas/org.gnome.shell.extensions.vitals.gschema.xml export-ignore 19 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] 4 | patreon: # Replace with a single Patreon username 5 | open_collective: # Replace with a single Open Collective username 6 | ko_fi: # Replace with a single Ko-fi username 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | liberapay: # Replace with a single Liberapay username 10 | issuehunt: # Replace with a single IssueHunt username 11 | otechie: # Replace with a single Otechie username 12 | custom: ['https://corecoding.com/donate.php'] 13 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.yml: -------------------------------------------------------------------------------- 1 | name: Bug Report 2 | description: Please read Wiki before submitting! 3 | labels: ["bug"] 4 | body: 5 | - type: markdown 6 | attributes: 7 | value: | 8 | Thanks for taking the time to fill out this bug report! Please read this form carefully. 9 | - type: checkboxes 10 | attributes: 11 | label: Has this issue been covered in the Wiki? 12 | options: 13 | - label: I have read the Wiki and my issue is not covered. 14 | required: true 15 | - type: checkboxes 16 | attributes: 17 | label: Is there an existing issue reported already? 18 | options: 19 | - label: I have searched the existing issues, it does not exist. 20 | required: true 21 | - type: textarea 22 | id: what-happened 23 | attributes: 24 | label: What is the unexpected behavior? 25 | placeholder: A clear and concise description of what the bug is. 26 | validations: 27 | required: true 28 | - type: textarea 29 | id: steps-to-reproduce 30 | attributes: 31 | label: Steps to reproduce the unexpected behavior. 32 | placeholder: | 33 | 1. Go to '...' 34 | 2. Click on '....' 35 | 3. Scroll down to '....' 36 | 4. See error 37 | validations: 38 | required: true 39 | - type: textarea 40 | id: logs 41 | attributes: 42 | label: Relevant log output 43 | description: Please copy and paste any relevant log output, such as from /var/log/syslog. This will be automatically formatted into code, so no need for backticks. 44 | render: shell 45 | - type: input 46 | id: distro-type 47 | attributes: 48 | label: What distribution and version of Linux are you using? 49 | placeholder: Ubuntu 21.10, Fedora 35, etc 50 | validations: 51 | required: true 52 | - type: input 53 | id: gnome-version 54 | attributes: 55 | label: What version of Gnome are you using? 56 | placeholder: 3.38, 40, 41, etc 57 | validations: 58 | required: true 59 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: false 2 | contact_links: 3 | - name: Wiki 4 | url: https://github.com/corecoding/Vitals/wiki/ 5 | about: Please read this page before submitting a feature request or bug report! 6 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.yml: -------------------------------------------------------------------------------- 1 | name: Feature Request 2 | description: Please read Wiki before submitting! 3 | labels: ["feature"] 4 | body: 5 | - type: markdown 6 | attributes: 7 | value: | 8 | Thanks for taking the time to submit a feature request! Please read this form carefully. 9 | - type: checkboxes 10 | attributes: 11 | label: Has this issue been covered in the Wiki? 12 | options: 13 | - label: I have read the Wiki and my issue is not covered. 14 | required: true 15 | - type: checkboxes 16 | attributes: 17 | label: Is there an existing issue reported already? 18 | options: 19 | - label: I have searched the existing issues, it does not exist. 20 | required: true 21 | - type: textarea 22 | id: feature-desc 23 | attributes: 24 | label: Describe the new feature you would like 25 | placeholder: A clear and concise description of what you want to happen. 26 | validations: 27 | required: true 28 | -------------------------------------------------------------------------------- /.github/workflows/main.yml: -------------------------------------------------------------------------------- 1 | name: Build Release Asset 2 | 3 | on: 4 | push: 5 | # Sequence of patterns matched against refs/tags 6 | branches: 7 | - main 8 | 9 | jobs: 10 | build: 11 | name: Upload Release Asset 12 | runs-on: ubuntu-latest 13 | 14 | steps: 15 | - name: Checkout code 16 | uses: actions/checkout@v2 17 | 18 | - name: Fetch tags 19 | run: git fetch --tags 20 | 21 | - name: Compile schemas 22 | run: /usr/bin/glib-compile-schemas --strict schemas/ 23 | 24 | - name: Install msgfmt command 25 | run: sudo apt-get install gettext 26 | 27 | - name: Compile message catalogs 28 | run: | 29 | for i in locale/*/ 30 | do /usr/bin/msgfmt $i/LC_MESSAGES/vitals.po -o $i/LC_MESSAGES/vitals.mo 31 | done 32 | 33 | # at some point we either need to upload assets, or update arch batch script with above compile cmds 34 | # - name: Push compiled assets 35 | # run: git commit && git push 36 | 37 | - name: Build project # This would actually build your project, using zip for an example artifact 38 | run: zip vitals.zip -r * -x "README.md" -x "locale/*.po" -x "locale/vitals.pot" -x "howtouse.gif" 39 | 40 | - name: Grab version from meta data 41 | run: echo "METATAG=$(jq .version metadata.json)" >> $GITHUB_ENV 42 | 43 | - name: Get next available tag 44 | run: | 45 | # get latest tag, could also be empty 46 | tag=$(git tag --sort=v:refname | grep "v$METATAG\." | tail -n 1) 47 | 48 | # if there are none, start tags at INITIAL_VERSION which defaults to 0.0.0 49 | if [ -z "$tag" ]; then 50 | tag="v$METATAG.0.0" 51 | else 52 | array=($(echo "$tag" | tr . '\n')) 53 | array[2]=$((array[2]+1)) 54 | tag=$(IFS=.; echo "${array[*]}") 55 | fi 56 | 57 | # export env var for subsequent steps 58 | echo "TAG=$tag" >> $GITHUB_ENV 59 | 60 | - name: Create Release 61 | id: create_release 62 | uses: actions/create-release@v1 63 | env: 64 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 65 | with: 66 | tag_name: ${{ env.TAG }} 67 | release_name: Release ${{ env.TAG }} 68 | draft: false 69 | prerelease: false 70 | 71 | - name: Upload Release Asset 72 | id: upload-release-asset 73 | uses: actions/upload-release-asset@v1 74 | env: 75 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 76 | with: 77 | # This pulls from the CREATE RELEASE step above, referencing it's ID to get its outputs object, 78 | # which include a `upload_url`. See this blog post for more info: 79 | # https://jasonet.co/posts/new-features-of-github-actions/#passing-data-to-future-steps 80 | upload_url: ${{ steps.create_release.outputs.upload_url }} 81 | asset_path: ./vitals.zip 82 | asset_name: vitals.zip 83 | asset_content_type: application/zip 84 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | vitals.zip 2 | locale/en_US 3 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE 2 | Version 2, June 1991 3 | 4 | Copyright (C) 1989, 1991 Free Software Foundation, Inc., 5 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 6 | Everyone is permitted to copy and distribute verbatim copies 7 | of this license document, but changing it is not allowed. 8 | 9 | Preamble 10 | 11 | The licenses for most software are designed to take away your 12 | freedom to share and change it. By contrast, the GNU General Public 13 | License is intended to guarantee your freedom to share and change free 14 | software--to make sure the software is free for all its users. This 15 | General Public License applies to most of the Free Software 16 | Foundation's software and to any other program whose authors commit to 17 | using it. (Some other Free Software Foundation software is covered by 18 | the GNU Lesser General Public License instead.) You can apply it to 19 | your programs, too. 20 | 21 | When we speak of free software, we are referring to freedom, not 22 | price. Our General Public Licenses are designed to make sure that you 23 | have the freedom to distribute copies of free software (and charge for 24 | this service if you wish), that you receive source code or can get it 25 | if you want it, that you can change the software or use pieces of it 26 | in new free programs; and that you know you can do these things. 27 | 28 | To protect your rights, we need to make restrictions that forbid 29 | anyone to deny you these rights or to ask you to surrender the rights. 30 | These restrictions translate to certain responsibilities for you if you 31 | distribute copies of the software, or if you modify it. 32 | 33 | For example, if you distribute copies of such a program, whether 34 | gratis or for a fee, you must give the recipients all the rights that 35 | you have. You must make sure that they, too, receive or can get the 36 | source code. And you must show them these terms so they know their 37 | rights. 38 | 39 | We protect your rights with two steps: (1) copyright the software, and 40 | (2) offer you this license which gives you legal permission to copy, 41 | distribute and/or modify the software. 42 | 43 | Also, for each author's protection and ours, we want to make certain 44 | that everyone understands that there is no warranty for this free 45 | software. If the software is modified by someone else and passed on, we 46 | want its recipients to know that what they have is not the original, so 47 | that any problems introduced by others will not reflect on the original 48 | authors' reputations. 49 | 50 | Finally, any free program is threatened constantly by software 51 | patents. We wish to avoid the danger that redistributors of a free 52 | program will individually obtain patent licenses, in effect making the 53 | program proprietary. To prevent this, we have made it clear that any 54 | patent must be licensed for everyone's free use or not licensed at all. 55 | 56 | The precise terms and conditions for copying, distribution and 57 | modification follow. 58 | 59 | GNU GENERAL PUBLIC LICENSE 60 | TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 61 | 62 | 0. This License applies to any program or other work which contains 63 | a notice placed by the copyright holder saying it may be distributed 64 | under the terms of this General Public License. The "Program", below, 65 | refers to any such program or work, and a "work based on the Program" 66 | means either the Program or any derivative work under copyright law: 67 | that is to say, a work containing the Program or a portion of it, 68 | either verbatim or with modifications and/or translated into another 69 | language. (Hereinafter, translation is included without limitation in 70 | the term "modification".) Each licensee is addressed as "you". 71 | 72 | Activities other than copying, distribution and modification are not 73 | covered by this License; they are outside its scope. The act of 74 | running the Program is not restricted, and the output from the Program 75 | is covered only if its contents constitute a work based on the 76 | Program (independent of having been made by running the Program). 77 | Whether that is true depends on what the Program does. 78 | 79 | 1. You may copy and distribute verbatim copies of the Program's 80 | source code as you receive it, in any medium, provided that you 81 | conspicuously and appropriately publish on each copy an appropriate 82 | copyright notice and disclaimer of warranty; keep intact all the 83 | notices that refer to this License and to the absence of any warranty; 84 | and give any other recipients of the Program a copy of this License 85 | along with the Program. 86 | 87 | You may charge a fee for the physical act of transferring a copy, and 88 | you may at your option offer warranty protection in exchange for a fee. 89 | 90 | 2. You may modify your copy or copies of the Program or any portion 91 | of it, thus forming a work based on the Program, and copy and 92 | distribute such modifications or work under the terms of Section 1 93 | above, provided that you also meet all of these conditions: 94 | 95 | a) You must cause the modified files to carry prominent notices 96 | stating that you changed the files and the date of any change. 97 | 98 | b) You must cause any work that you distribute or publish, that in 99 | whole or in part contains or is derived from the Program or any 100 | part thereof, to be licensed as a whole at no charge to all third 101 | parties under the terms of this License. 102 | 103 | c) If the modified program normally reads commands interactively 104 | when run, you must cause it, when started running for such 105 | interactive use in the most ordinary way, to print or display an 106 | announcement including an appropriate copyright notice and a 107 | notice that there is no warranty (or else, saying that you provide 108 | a warranty) and that users may redistribute the program under 109 | these conditions, and telling the user how to view a copy of this 110 | License. (Exception: if the Program itself is interactive but 111 | does not normally print such an announcement, your work based on 112 | the Program is not required to print an announcement.) 113 | 114 | These requirements apply to the modified work as a whole. If 115 | identifiable sections of that work are not derived from the Program, 116 | and can be reasonably considered independent and separate works in 117 | themselves, then this License, and its terms, do not apply to those 118 | sections when you distribute them as separate works. But when you 119 | distribute the same sections as part of a whole which is a work based 120 | on the Program, the distribution of the whole must be on the terms of 121 | this License, whose permissions for other licensees extend to the 122 | entire whole, and thus to each and every part regardless of who wrote it. 123 | 124 | Thus, it is not the intent of this section to claim rights or contest 125 | your rights to work written entirely by you; rather, the intent is to 126 | exercise the right to control the distribution of derivative or 127 | collective works based on the Program. 128 | 129 | In addition, mere aggregation of another work not based on the Program 130 | with the Program (or with a work based on the Program) on a volume of 131 | a storage or distribution medium does not bring the other work under 132 | the scope of this License. 133 | 134 | 3. You may copy and distribute the Program (or a work based on it, 135 | under Section 2) in object code or executable form under the terms of 136 | Sections 1 and 2 above provided that you also do one of the following: 137 | 138 | a) Accompany it with the complete corresponding machine-readable 139 | source code, which must be distributed under the terms of Sections 140 | 1 and 2 above on a medium customarily used for software interchange; or, 141 | 142 | b) Accompany it with a written offer, valid for at least three 143 | years, to give any third party, for a charge no more than your 144 | cost of physically performing source distribution, a complete 145 | machine-readable copy of the corresponding source code, to be 146 | distributed under the terms of Sections 1 and 2 above on a medium 147 | customarily used for software interchange; or, 148 | 149 | c) Accompany it with the information you received as to the offer 150 | to distribute corresponding source code. (This alternative is 151 | allowed only for noncommercial distribution and only if you 152 | received the program in object code or executable form with such 153 | an offer, in accord with Subsection b above.) 154 | 155 | The source code for a work means the preferred form of the work for 156 | making modifications to it. For an executable work, complete source 157 | code means all the source code for all modules it contains, plus any 158 | associated interface definition files, plus the scripts used to 159 | control compilation and installation of the executable. However, as a 160 | special exception, the source code distributed need not include 161 | anything that is normally distributed (in either source or binary 162 | form) with the major components (compiler, kernel, and so on) of the 163 | operating system on which the executable runs, unless that component 164 | itself accompanies the executable. 165 | 166 | If distribution of executable or object code is made by offering 167 | access to copy from a designated place, then offering equivalent 168 | access to copy the source code from the same place counts as 169 | distribution of the source code, even though third parties are not 170 | compelled to copy the source along with the object code. 171 | 172 | 4. You may not copy, modify, sublicense, or distribute the Program 173 | except as expressly provided under this License. Any attempt 174 | otherwise to copy, modify, sublicense or distribute the Program is 175 | void, and will automatically terminate your rights under this License. 176 | However, parties who have received copies, or rights, from you under 177 | this License will not have their licenses terminated so long as such 178 | parties remain in full compliance. 179 | 180 | 5. You are not required to accept this License, since you have not 181 | signed it. However, nothing else grants you permission to modify or 182 | distribute the Program or its derivative works. These actions are 183 | prohibited by law if you do not accept this License. Therefore, by 184 | modifying or distributing the Program (or any work based on the 185 | Program), you indicate your acceptance of this License to do so, and 186 | all its terms and conditions for copying, distributing or modifying 187 | the Program or works based on it. 188 | 189 | 6. Each time you redistribute the Program (or any work based on the 190 | Program), the recipient automatically receives a license from the 191 | original licensor to copy, distribute or modify the Program subject to 192 | these terms and conditions. You may not impose any further 193 | restrictions on the recipients' exercise of the rights granted herein. 194 | You are not responsible for enforcing compliance by third parties to 195 | this License. 196 | 197 | 7. If, as a consequence of a court judgment or allegation of patent 198 | infringement or for any other reason (not limited to patent issues), 199 | conditions are imposed on you (whether by court order, agreement or 200 | otherwise) that contradict the conditions of this License, they do not 201 | excuse you from the conditions of this License. If you cannot 202 | distribute so as to satisfy simultaneously your obligations under this 203 | License and any other pertinent obligations, then as a consequence you 204 | may not distribute the Program at all. For example, if a patent 205 | license would not permit royalty-free redistribution of the Program by 206 | all those who receive copies directly or indirectly through you, then 207 | the only way you could satisfy both it and this License would be to 208 | refrain entirely from distribution of the Program. 209 | 210 | If any portion of this section is held invalid or unenforceable under 211 | any particular circumstance, the balance of the section is intended to 212 | apply and the section as a whole is intended to apply in other 213 | circumstances. 214 | 215 | It is not the purpose of this section to induce you to infringe any 216 | patents or other property right claims or to contest validity of any 217 | such claims; this section has the sole purpose of protecting the 218 | integrity of the free software distribution system, which is 219 | implemented by public license practices. Many people have made 220 | generous contributions to the wide range of software distributed 221 | through that system in reliance on consistent application of that 222 | system; it is up to the author/donor to decide if he or she is willing 223 | to distribute software through any other system and a licensee cannot 224 | impose that choice. 225 | 226 | This section is intended to make thoroughly clear what is believed to 227 | be a consequence of the rest of this License. 228 | 229 | 8. If the distribution and/or use of the Program is restricted in 230 | certain countries either by patents or by copyrighted interfaces, the 231 | original copyright holder who places the Program under this License 232 | may add an explicit geographical distribution limitation excluding 233 | those countries, so that distribution is permitted only in or among 234 | countries not thus excluded. In such case, this License incorporates 235 | the limitation as if written in the body of this License. 236 | 237 | 9. The Free Software Foundation may publish revised and/or new versions 238 | of the General Public License from time to time. Such new versions will 239 | be similar in spirit to the present version, but may differ in detail to 240 | address new problems or concerns. 241 | 242 | Each version is given a distinguishing version number. If the Program 243 | specifies a version number of this License which applies to it and "any 244 | later version", you have the option of following the terms and conditions 245 | either of that version or of any later version published by the Free 246 | Software Foundation. If the Program does not specify a version number of 247 | this License, you may choose any version ever published by the Free Software 248 | Foundation. 249 | 250 | 10. If you wish to incorporate parts of the Program into other free 251 | programs whose distribution conditions are different, write to the author 252 | to ask for permission. For software which is copyrighted by the Free 253 | Software Foundation, write to the Free Software Foundation; we sometimes 254 | make exceptions for this. Our decision will be guided by the two goals 255 | of preserving the free status of all derivatives of our free software and 256 | of promoting the sharing and reuse of software generally. 257 | 258 | NO WARRANTY 259 | 260 | 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY 261 | FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN 262 | OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES 263 | PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED 264 | OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 265 | MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS 266 | TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE 267 | PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, 268 | REPAIR OR CORRECTION. 269 | 270 | 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 271 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR 272 | REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, 273 | INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING 274 | OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED 275 | TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY 276 | YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER 277 | PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE 278 | POSSIBILITY OF SUCH DAMAGES. 279 | 280 | END OF TERMS AND CONDITIONS 281 | 282 | How to Apply These Terms to Your New Programs 283 | 284 | If you develop a new program, and you want it to be of the greatest 285 | possible use to the public, the best way to achieve this is to make it 286 | free software which everyone can redistribute and change under these terms. 287 | 288 | To do so, attach the following notices to the program. It is safest 289 | to attach them to the start of each source file to most effectively 290 | convey the exclusion of warranty; and each file should have at least 291 | the "copyright" line and a pointer to where the full notice is found. 292 | 293 | {description} 294 | Copyright (C) {year} {fullname} 295 | 296 | This program is free software; you can redistribute it and/or modify 297 | it under the terms of the GNU General Public License as published by 298 | the Free Software Foundation; either version 2 of the License, or 299 | (at your option) any later version. 300 | 301 | This program is distributed in the hope that it will be useful, 302 | but WITHOUT ANY WARRANTY; without even the implied warranty of 303 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 304 | GNU General Public License for more details. 305 | 306 | You should have received a copy of the GNU General Public License along 307 | with this program; if not, write to the Free Software Foundation, Inc., 308 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 309 | 310 | Also add information on how to contact you by electronic and paper mail. 311 | 312 | If the program is interactive, make it output a short notice like this 313 | when it starts in an interactive mode: 314 | 315 | Gnomovision version 69, Copyright (C) year name of author 316 | Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 317 | This is free software, and you are welcome to redistribute it 318 | under certain conditions; type `show c' for details. 319 | 320 | The hypothetical commands `show w' and `show c' should show the appropriate 321 | parts of the General Public License. Of course, the commands you use may 322 | be called something other than `show w' and `show c'; they could even be 323 | mouse-clicks or menu items--whatever suits your program. 324 | 325 | You should also get your employer (if you work as a programmer) or your 326 | school, if any, to sign a "copyright disclaimer" for the program, if 327 | necessary. Here is a sample; alter the names: 328 | 329 | Yoyodyne, Inc., hereby disclaims all copyright interest in the program 330 | `Gnomovision' (which makes passes at compilers) written by James Hacker. 331 | 332 | {signature of Ty Coon}, 1 April 1989 333 | Ty Coon, President of Vice 334 | 335 | This General Public License does not permit incorporating your program into 336 | proprietary programs. If your program is a subroutine library, you may 337 | consider it more useful to permit linking proprietary applications with the 338 | library. If this is what you want to do, use the GNU Lesser General 339 | Public License instead of this License. 340 | -------------------------------------------------------------------------------- /extension.js: -------------------------------------------------------------------------------- 1 | import Clutter from 'gi://Clutter'; 2 | import Gio from 'gi://Gio'; 3 | import GLib from 'gi://GLib'; 4 | import GObject from 'gi://GObject'; 5 | import St from 'gi://St' 6 | 7 | import * as PanelMenu from 'resource:///org/gnome/shell/ui/panelMenu.js'; 8 | import * as PopupMenu from 'resource:///org/gnome/shell/ui/popupMenu.js'; 9 | import * as Main from 'resource:///org/gnome/shell/ui/main.js'; 10 | import * as Util from 'resource:///org/gnome/shell/misc/util.js'; 11 | 12 | import * as Sensors from './sensors.js'; 13 | 14 | import {Extension, gettext as _} from 'resource:///org/gnome/shell/extensions/extension.js'; 15 | 16 | import * as MessageTray from 'resource:///org/gnome/shell/ui/messageTray.js'; 17 | import * as Values from './values.js'; 18 | import * as Config from 'resource:///org/gnome/shell/misc/config.js'; 19 | import * as MenuItem from './menuItem.js'; 20 | 21 | let vitalsMenu; 22 | 23 | var VitalsMenuButton = GObject.registerClass({ 24 | GTypeName: 'VitalsMenuButton', 25 | }, class VitalsMenuButton extends PanelMenu.Button { 26 | _init(extensionObject) { 27 | super._init(Clutter.ActorAlign.FILL); 28 | 29 | this._extensionObject = extensionObject; 30 | this._settings = extensionObject.getSettings(); 31 | 32 | this._sensorIcons = { 33 | 'temperature' : { 'icon': 'temperature-symbolic.svg' }, 34 | 'voltage' : { 'icon': 'voltage-symbolic.svg' }, 35 | 'fan' : { 'icon': 'fan-symbolic.svg' }, 36 | 'memory' : { 'icon': 'memory-symbolic.svg' }, 37 | 'processor' : { 'icon': 'cpu-symbolic.svg' }, 38 | 'system' : { 'icon': 'system-symbolic.svg' }, 39 | 'network' : { 'icon': 'network-symbolic.svg', 40 | 'icon-rx': 'network-download-symbolic.svg', 41 | 'icon-tx': 'network-upload-symbolic.svg' }, 42 | 'storage' : { 'icon': 'storage-symbolic.svg' }, 43 | 'battery' : { 'icon': 'battery-symbolic.svg' }, 44 | 'gpu' : { 'icon': 'gpu-symbolic.svg' } 45 | } 46 | 47 | // list with the prefixes for the according themes, the index of each 48 | // item must match the index on the combo box 49 | this._sensorsIconPathPrefix = ['/icons/original/', '/icons/gnome/']; 50 | 51 | this._warnings = []; 52 | this._sensorMenuItems = {}; 53 | this._hotLabels = {}; 54 | this._hotIcons = {}; 55 | this._groups = {}; 56 | this._widths = {}; 57 | this._numGpus = 1; 58 | this._newGpuDetected = false; 59 | this._newGpuDetectedCount = 0; 60 | this._last_query = new Date().getTime(); 61 | 62 | this._sensors = new Sensors.Sensors(this._settings, this._sensorIcons); 63 | this._values = new Values.Values(this._settings, this._sensorIcons); 64 | this._menuLayout = new St.BoxLayout({ 65 | vertical: false, 66 | clip_to_allocation: true, 67 | x_align: Clutter.ActorAlign.START, 68 | y_align: Clutter.ActorAlign.CENTER, 69 | reactive: true, 70 | x_expand: true 71 | }); 72 | 73 | this._drawMenu(); 74 | this.add_child(this._menuLayout); 75 | this._settingChangedSignals = []; 76 | this._refreshTimeoutId = null; 77 | 78 | this._addSettingChangedSignal('update-time', this._updateTimeChanged.bind(this)); 79 | this._addSettingChangedSignal('position-in-panel', this._positionInPanelChanged.bind(this)); 80 | this._addSettingChangedSignal('menu-centered', this._positionInPanelChanged.bind(this)); 81 | this._addSettingChangedSignal('icon-style', this._iconStyleChanged.bind(this)); 82 | 83 | let settings = [ 'use-higher-precision', 'alphabetize', 'hide-zeros', 'fixed-widths', 'hide-icons', 'unit', 'memory-measurement', 'include-public-ip', 'network-speed-format', 'storage-measurement', 'include-static-info', 'include-static-gpu-info' ]; 84 | for (let setting of Object.values(settings)) 85 | this._addSettingChangedSignal(setting, this._redrawMenu.bind(this)); 86 | 87 | // add signals for show- preference based categories 88 | for (let sensor in this._sensorIcons) 89 | this._addSettingChangedSignal('show-' + sensor, this._showHideSensorsChanged.bind(this)); 90 | 91 | this._initializeMenu(); 92 | 93 | // start off with fresh sensors 94 | this._querySensors(); 95 | 96 | // start monitoring sensors 97 | this._initializeTimer(); 98 | } 99 | 100 | _initializeMenu() { 101 | // display sensor categories 102 | for (let sensor in this._sensorIcons) { 103 | // groups associated sensors under accordion menu 104 | if (sensor in this._groups) continue; 105 | 106 | //handle gpus separately. 107 | if (sensor === 'gpu') continue; 108 | 109 | this._initializeMenuGroup(sensor, sensor); 110 | } 111 | 112 | for (let i = 1; i <= this._numGpus; i++) 113 | this._initializeMenuGroup('gpu#' + i, 'gpu', (this._numGpus > 1 ? ' ' + i : '')); 114 | 115 | // add separator 116 | this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); 117 | 118 | let item = new PopupMenu.PopupBaseMenuItem({ 119 | reactive: false, 120 | style_class: 'vitals-menu-button-container' 121 | }); 122 | 123 | let customButtonBox = new St.BoxLayout({ 124 | style_class: 'vitals-button-box', 125 | vertical: false, 126 | clip_to_allocation: true, 127 | x_align: Clutter.ActorAlign.CENTER, 128 | y_align: Clutter.ActorAlign.CENTER, 129 | reactive: true, 130 | x_expand: true 131 | }); 132 | 133 | // custom round refresh button 134 | let refreshButton = this._createRoundButton('view-refresh-symbolic', _('Refresh')); 135 | refreshButton.connect('clicked', (self) => { 136 | // force refresh by clearing history 137 | this._sensors.resetHistory(); 138 | this._values.resetHistory(this._numGpus); 139 | 140 | // make sure timer fires at next full interval 141 | this._updateTimeChanged(); 142 | 143 | // refresh sensors now 144 | this._querySensors(); 145 | }); 146 | customButtonBox.add_child(refreshButton); 147 | 148 | // custom round monitor button 149 | let monitorButton = this._createRoundButton('org.gnome.SystemMonitor-symbolic', _('System Monitor')); 150 | monitorButton.connect('clicked', (self) => { 151 | this.menu._getTopMenu().close(); 152 | Util.spawn(this._settings.get_string('monitor-cmd').split(" ")); 153 | }); 154 | customButtonBox.add_child(monitorButton); 155 | 156 | // custom round preferences button 157 | let prefsButton = this._createRoundButton('preferences-system-symbolic', _('Preferences')); 158 | prefsButton.connect('clicked', (self) => { 159 | this.menu._getTopMenu().close(); 160 | this._extensionObject.openPreferences(); 161 | }); 162 | customButtonBox.add_child(prefsButton); 163 | 164 | // now add the buttons to the top bar 165 | item.actor.add_child(customButtonBox); 166 | 167 | // add buttons 168 | this.menu.addMenuItem(item); 169 | 170 | // query sensors on menu open 171 | this._menuStateChangeId = this.menu.connect('open-state-changed', (self, isMenuOpen) => { 172 | if (isMenuOpen) { 173 | // make sure timer fires at next full interval 174 | this._updateTimeChanged(); 175 | 176 | // refresh sensors now 177 | this._querySensors(); 178 | } 179 | }); 180 | } 181 | 182 | _initializeMenuGroup(groupName, optionName, menuSuffix = '', position = -1) { 183 | this._groups[groupName] = new PopupMenu.PopupSubMenuMenuItem(_(this._ucFirst(groupName) + menuSuffix), true); 184 | this._groups[groupName].icon.gicon = Gio.icon_new_for_string(this._sensorIconPath(groupName)); 185 | 186 | // hide menu items that user has requested to not include 187 | if (!this._settings.get_boolean('show-' + optionName)) 188 | this._groups[groupName].actor.hide(); 189 | 190 | if (!this._groups[groupName].status) { 191 | this._groups[groupName].status = this._defaultLabel(); 192 | this._groups[groupName].actor.insert_child_at_index(this._groups[groupName].status, 4); 193 | this._groups[groupName].status.text = _('No Data'); 194 | } 195 | 196 | if(position == -1) this.menu.addMenuItem(this._groups[groupName]); 197 | else this.menu.addMenuItem(this._groups[groupName], position); 198 | } 199 | 200 | _createRoundButton(iconName) { 201 | let button = new St.Button({ 202 | style_class: 'message-list-clear-button button vitals-button-action' 203 | }); 204 | 205 | button.child = new St.Icon({ 206 | icon_name: iconName 207 | }); 208 | 209 | return button; 210 | } 211 | 212 | _removeMissingHotSensors(hotSensors) { 213 | for (let i = hotSensors.length - 1; i >= 0; i--) { 214 | let sensor = hotSensors[i]; 215 | 216 | // make sure default icon (if any) stays visible 217 | if (sensor == '_default_icon_') continue; 218 | 219 | // removes sensors that are no longer available 220 | if (!this._sensorMenuItems[sensor]) { 221 | hotSensors.splice(i, 1); 222 | this._removeHotLabel(sensor); 223 | this._removeHotIcon(sensor); 224 | } 225 | } 226 | 227 | return hotSensors; 228 | } 229 | 230 | _saveHotSensors(hotSensors) { 231 | // removes any sensors that may not currently be available 232 | hotSensors = this._removeMissingHotSensors(hotSensors); 233 | 234 | this._settings.set_strv('hot-sensors', hotSensors.filter( 235 | function(item, pos) { 236 | return hotSensors.indexOf(item) == pos; 237 | } 238 | )); 239 | } 240 | 241 | _initializeTimer() { 242 | // used to query sensors and update display 243 | let update_time = this._settings.get_int('update-time'); 244 | this._refreshTimeoutId = GLib.timeout_add_seconds( 245 | GLib.PRIORITY_DEFAULT, 246 | update_time, 247 | (self) => { 248 | // only update menu if we have hot sensors 249 | if (Object.values(this._hotLabels).length > 0) 250 | this._querySensors(); 251 | // keep the timer running 252 | return GLib.SOURCE_CONTINUE; 253 | } 254 | ); 255 | } 256 | 257 | _createHotItem(key, value) { 258 | let icon = this._defaultIcon(key); 259 | this._hotIcons[key] = icon; 260 | this._menuLayout.add_child(icon) 261 | 262 | // don't add a label when no sensors are in the panel 263 | if (key == '_default_icon_') return; 264 | 265 | let label = new St.Label({ 266 | style_class: 'vitals-panel-label', 267 | text: (value)?value:'\u2026', // ... 268 | y_expand: true, 269 | y_align: Clutter.ActorAlign.CENTER 270 | }); 271 | 272 | // attempt to prevent ellipsizes 273 | label.get_clutter_text().ellipsize = 0; 274 | 275 | // keep track of label for removal later 276 | this._hotLabels[key] = label; 277 | 278 | // prevent "called on the widget" "which is not in the stage" errors by adding before width below 279 | this._menuLayout.add_child(label); 280 | 281 | // support for fixed widths #55, save label (text) width 282 | this._widths[key] = label.width; 283 | } 284 | 285 | _showHideSensorsChanged(self, sensor) { 286 | this._sensors.resetHistory(); 287 | 288 | const sensorName = sensor.substr(5); 289 | if(sensorName === 'gpu') { 290 | for(let i = 1; i <= this._numGpus; i++) 291 | this._groups[sensorName + '#' + i].visible = this._settings.get_boolean(sensor); 292 | } else 293 | this._groups[sensorName].visible = this._settings.get_boolean(sensor); 294 | } 295 | 296 | _positionInPanelChanged() { 297 | this.container.get_parent().remove_child(this.container); 298 | let position = this._positionInPanel(); 299 | 300 | // allows easily addressable boxes 301 | let boxes = { 302 | left: Main.panel._leftBox, 303 | center: Main.panel._centerBox, 304 | right: Main.panel._rightBox 305 | }; 306 | 307 | // update position when changed from preferences 308 | boxes[position[0]].insert_child_at_index(this.container, position[1]); 309 | } 310 | 311 | _redrawDetailsMenuIcons() { 312 | // updates the icons on the 'details' menu, the one 313 | // you have to click to appear 314 | this._sensors.resetHistory(); 315 | for (const sensor in this._sensorIcons) { 316 | if (sensor == "gpu") continue; 317 | this._groups[sensor].icon.gicon = Gio.icon_new_for_string(this._sensorIconPath(sensor)); 318 | } 319 | 320 | // gpu's are indexed differently, handle them here 321 | const gpuKeys = Object.keys(this._groups).filter(key => key.startsWith("gpu#")); 322 | gpuKeys.forEach((gpuKey) => { 323 | this._groups[gpuKey].icon.gicon = Gio.icon_new_for_string(this._sensorIconPath("gpu")); 324 | }); 325 | } 326 | 327 | _iconStyleChanged() { 328 | this._redrawDetailsMenuIcons(); 329 | this._redrawMenu(); 330 | } 331 | 332 | _removeHotLabel(key) { 333 | if (key in this._hotLabels) { 334 | let label = this._hotLabels[key]; 335 | delete this._hotLabels[key]; 336 | // make sure set_label is not called on non existent actor 337 | label.destroy(); 338 | } 339 | } 340 | 341 | _removeHotLabels() { 342 | for (let key in this._hotLabels) 343 | this._removeHotLabel(key); 344 | } 345 | 346 | _removeHotIcon(key) { 347 | if (key in this._hotIcons) { 348 | this._hotIcons[key].destroy(); 349 | delete this._hotIcons[key]; 350 | } 351 | } 352 | 353 | _removeHotIcons() { 354 | for (let key in this._hotIcons) 355 | this._removeHotIcon(key); 356 | } 357 | 358 | _redrawMenu() { 359 | this._removeHotIcons(); 360 | this._removeHotLabels(); 361 | 362 | for (let key in this._sensorMenuItems) { 363 | if (key.includes('-group')) continue; 364 | this._sensorMenuItems[key].destroy(); 365 | delete this._sensorMenuItems[key]; 366 | } 367 | 368 | this._drawMenu(); 369 | this._sensors.resetHistory(); 370 | this._values.resetHistory(this._numGpus); 371 | this._querySensors(); 372 | } 373 | 374 | _drawMenu() { 375 | // grab list of selected menubar icons 376 | let hotSensors = this._settings.get_strv('hot-sensors'); 377 | for (let key of Object.values(hotSensors)) { 378 | // fixes issue #225 which started when _max_ was moved to the end 379 | if (key == '__max_network-download__') key = '__network-rx_max__'; 380 | if (key == '__max_network-upload__') key = '__network-tx_max__'; 381 | 382 | this._createHotItem(key); 383 | } 384 | } 385 | 386 | _destroyTimer() { 387 | // invalidate and reinitialize timer 388 | if (this._refreshTimeoutId != null) { 389 | GLib.Source.remove(this._refreshTimeoutId); 390 | this._refreshTimeoutId = null; 391 | } 392 | } 393 | 394 | _updateTimeChanged() { 395 | this._destroyTimer(); 396 | this._initializeTimer(); 397 | } 398 | 399 | _addSettingChangedSignal(key, callback) { 400 | this._settingChangedSignals.push(this._settings.connect('changed::' + key, callback)); 401 | } 402 | 403 | _updateDisplay(label, value, type, key) { 404 | // update sensor value in menubar 405 | if (this._hotLabels[key]) { 406 | this._hotLabels[key].set_text(value); 407 | 408 | // support for fixed widths #55 409 | if (this._settings.get_boolean('fixed-widths')) { 410 | // grab text box width and see if new text is wider than old text 411 | let width2 = this._hotLabels[key].get_clutter_text().width; 412 | if (width2 > this._widths[key]) { 413 | this._hotLabels[key].set_width(width2); 414 | this._widths[key] = width2; 415 | } 416 | } 417 | } 418 | 419 | // have we added this sensor before? 420 | let item = this._sensorMenuItems[key]; 421 | if (item) { 422 | // update sensor value in the group 423 | item.value = value; 424 | } else if (type.includes('-group')) { 425 | // update text next to group header 426 | let group = type.split('-')[0]; 427 | if (this._groups[group]) { 428 | this._groups[group].status.text = value; 429 | this._sensorMenuItems[type] = this._groups[group]; 430 | } 431 | } else { 432 | // add item to group for the first time 433 | let sensor = { 'label': label, 'value': value, 'type': type } 434 | this._appendMenuItem(sensor, key); 435 | } 436 | } 437 | 438 | _appendMenuItem(sensor, key) { 439 | let split = sensor.type.split('-'); 440 | let type = split[0]; 441 | let icon = (split.length == 2)?'icon-' + split[1]:'icon'; 442 | let gicon = Gio.icon_new_for_string(this._sensorIconPath(type, icon)); 443 | 444 | let item = new MenuItem.MenuItem(gicon, key, sensor.label, sensor.value, this._hotLabels[key]); 445 | item.connect('toggle', (self) => { 446 | let hotSensors = this._settings.get_strv('hot-sensors'); 447 | 448 | if (self.checked) { 449 | // add selected sensor to panel 450 | hotSensors.push(self.key); 451 | this._createHotItem(self.key, self.value); 452 | } else { 453 | // remove selected sensor from panel 454 | hotSensors.splice(hotSensors.indexOf(self.key), 1); 455 | this._removeHotLabel(self.key); 456 | this._removeHotIcon(self.key); 457 | } 458 | 459 | if (hotSensors.length <= 0) { 460 | // add generic icon to panel when no sensors are selected 461 | hotSensors.push('_default_icon_'); 462 | this._createHotItem('_default_icon_'); 463 | } else { 464 | let defIconPos = hotSensors.indexOf('_default_icon_'); 465 | if (defIconPos >= 0) { 466 | // remove generic icon from panel when sensors are selected 467 | hotSensors.splice(defIconPos, 1); 468 | this._removeHotIcon('_default_icon_'); 469 | } 470 | } 471 | 472 | // this code is called asynchronously - make sure to save it for next round 473 | this._saveHotSensors(hotSensors); 474 | }); 475 | 476 | this._sensorMenuItems[key] = item; 477 | let i = Object.keys(this._sensorMenuItems[key]).length; 478 | 479 | // alphabetize the sensors for these categories 480 | if (this._settings.get_boolean('alphabetize')) { 481 | let menuItems = this._groups[type].menu._getMenuItems(); 482 | for (i = 0; i < menuItems.length; i++) 483 | // use natural sort order for system load, etc 484 | if (menuItems[i].label.localeCompare(item.label, undefined, { numeric: true, sensitivity: 'base' }) > 0) 485 | break; 486 | } 487 | 488 | this._groups[type].menu.addMenuItem(item, i); 489 | } 490 | 491 | _defaultLabel() { 492 | return new St.Label({ 493 | y_expand: true, 494 | y_align: Clutter.ActorAlign.CENTER 495 | }); 496 | } 497 | 498 | _defaultIcon(key) { 499 | let split = key.replaceAll('_', ' ').trim().split(' ')[0].split('-'); 500 | let type = split[0]; 501 | 502 | let icon = new St.Icon({ 503 | style_class: 'system-status-icon vitals-panel-icon-' + type, 504 | reactive: true 505 | }); 506 | 507 | // second condition prevents crash due to issue #225, which started when _max_ was moved to the end 508 | // don't use the default system icon if the type is a gpu; use the universal gpu icon instead 509 | if (type == 'default' || (!(type in this._sensorIcons) && !type.startsWith('gpu'))) { 510 | icon.gicon = Gio.icon_new_for_string(this._sensorIconPath('system')); 511 | } else if (!this._settings.get_boolean('hide-icons')) { // support for hide icons #80 512 | let iconObj = (split.length == 2)?'icon-' + split[1]:'icon'; 513 | icon.gicon = Gio.icon_new_for_string(this._sensorIconPath(type, iconObj)); 514 | } 515 | 516 | return icon; 517 | } 518 | 519 | _sensorIconPath(sensor, icon = 'icon') { 520 | // If the sensor is a numbered gpu, use the gpu icon. Otherwise use whatever icon associated with the sensor name. 521 | let sensorKey = sensor; 522 | if(sensor.startsWith('gpu')) sensorKey = 'gpu'; 523 | 524 | const iconPathPrefixIndex = this._settings.get_int('icon-style'); 525 | return this._extensionObject.path + this._sensorsIconPathPrefix[iconPathPrefixIndex] + this._sensorIcons[sensorKey][icon]; 526 | } 527 | 528 | _ucFirst(string) { 529 | if(string.startsWith('gpu')) return 'Graphics'; 530 | return string.charAt(0).toUpperCase() + string.slice(1); 531 | } 532 | 533 | _positionInPanel() { 534 | let alignment = ''; 535 | let gravity = 0; 536 | let arrow_pos = 0; 537 | 538 | switch (this._settings.get_int('position-in-panel')) { 539 | case 0: // left 540 | alignment = 'left'; 541 | gravity = -1; 542 | arrow_pos = 1; 543 | break; 544 | case 1: // center 545 | alignment = 'center'; 546 | gravity = -1; 547 | arrow_pos = 0.5; 548 | break; 549 | case 2: // right 550 | alignment = 'right'; 551 | gravity = 0; 552 | arrow_pos = 0; 553 | break; 554 | case 3: // far left 555 | alignment = 'left'; 556 | gravity = 0; 557 | arrow_pos = 1; 558 | break; 559 | case 4: // far right 560 | alignment = 'right'; 561 | gravity = -1; 562 | arrow_pos = 0; 563 | break; 564 | } 565 | 566 | let centered = this._settings.get_boolean('menu-centered') 567 | if (centered) arrow_pos = 0.5; 568 | 569 | // set arrow position when initializing and moving vitals 570 | this.menu._arrowAlignment = arrow_pos; 571 | 572 | return [alignment, gravity]; 573 | } 574 | 575 | _querySensors() { 576 | // figure out last run time 577 | let now = new Date().getTime(); 578 | let dwell = (now - this._last_query) / 1000; 579 | this._last_query = now; 580 | 581 | this._sensors.query((label, value, type, format) => { 582 | const typeKey = type.replace('-group', ''); 583 | let key = '_' + typeKey + '_' + label.replace(' ', '_').toLowerCase() + '_'; 584 | 585 | // if a sensor is disabled, gray it out 586 | if (key in this._sensorMenuItems) { 587 | this._sensorMenuItems[key].setSensitive((value!='disabled')); 588 | 589 | // don't continue below, last known value is shown 590 | if (value == 'disabled') return; 591 | } 592 | 593 | // add/initialize any gpu groups that we haven't added yet 594 | if(typeKey.startsWith('gpu') && typeKey !== 'gpu#1') { 595 | const split = typeKey.split('#'); 596 | if(split.length == 2 && this._numGpus < parseInt(split[1])) { 597 | // occasionally two lines from nvidia-smi will be read at once 598 | // so we only actually update the number of gpus if we have recieved multiple lines at least 3 times in a row 599 | // i.e. we make sure that mutiple queries have detected a new gpu back-to-back 600 | if(this._newGpuDetectedCount < 2) { 601 | this._newGpuDetected = true; 602 | return; 603 | } 604 | 605 | this._numGpus = parseInt(split[1]); 606 | this._newGpuDetectedCount = 0; 607 | this._newGpuDetected = false; 608 | // change label for gpu 1 from "Graphics" to "Graphics 1" since we have multiple gpus now 609 | this._groups['gpu#1'].label.text = this._ucFirst('gpu#1') + ' 1'; 610 | for(let i = 2; i <= this._numGpus; i++) 611 | if(!('gpu#' + i in this._groups)) 612 | this._initializeMenuGroup('gpu#' + i, 'gpu', ' ' + i, Object.keys(this._groups).length); 613 | } 614 | } 615 | 616 | let items = this._values.returnIfDifferent(dwell, label, value, type, format, key); 617 | for (let item of Object.values(items)) 618 | this._updateDisplay(_(item[0]), item[1], item[2], item[3]); 619 | }, dwell); 620 | 621 | //if a new gpu has been detected during the last query, then increment the amount of times we've detected a new gpu 622 | if(this._newGpuDetected) this._newGpuDetectedCount++; 623 | else this._newGpuDetectedCount = 0; 624 | this._newGpuDetected = false; 625 | 626 | if (this._warnings.length > 0) { 627 | this._notify('Vitals', this._warnings.join("\n"), 'folder-symbolic'); 628 | this._warnings = []; 629 | } 630 | } 631 | 632 | _notify(msg, details, icon) { 633 | let source = new MessageTray.Source('MyApp Information', icon); 634 | Main.messageTray.add(source); 635 | let notification = new MessageTray.Notification(source, msg, details); 636 | notification.setTransient(true); 637 | source.notify(notification); 638 | } 639 | 640 | destroy() { 641 | this._destroyTimer(); 642 | this._sensors.destroy(); 643 | 644 | for (let signal of Object.values(this._settingChangedSignals)) 645 | this._settings.disconnect(signal); 646 | 647 | super.destroy(); 648 | } 649 | }); 650 | 651 | export default class VitalsExtension extends Extension { 652 | enable() { 653 | vitalsMenu = new VitalsMenuButton(this); 654 | let position = vitalsMenu._positionInPanel(); 655 | Main.panel.addToStatusArea('vitalsMenu', vitalsMenu, position[1], position[0]); 656 | } 657 | 658 | disable() { 659 | vitalsMenu.destroy(); 660 | vitalsMenu = null; 661 | } 662 | } 663 | -------------------------------------------------------------------------------- /helpers/file.js: -------------------------------------------------------------------------------- 1 | import Gio from 'gi://Gio'; 2 | import GLib from 'gi://GLib' 3 | 4 | // convert Uint8Array into a literal string 5 | function convertUint8ArrayToString(contents) { 6 | const decoder = new TextDecoder('utf-8'); 7 | return decoder.decode(contents).trim(); 8 | } 9 | 10 | export function File(path) { 11 | if (path.indexOf('https://') == -1) 12 | this.file = Gio.File.new_for_path(path); 13 | else 14 | this.file = Gio.File.new_for_uri(path); 15 | } 16 | 17 | File.prototype.read = function(delimiter = '', strip_header = false) { 18 | return new Promise((resolve, reject) => { 19 | try { 20 | this.file.load_contents_async(null, function(file, res) { 21 | try { 22 | // grab contents of file or website 23 | let contents = file.load_contents_finish(res)[1]; 24 | 25 | // convert contents to string 26 | contents = convertUint8ArrayToString(contents); 27 | 28 | // split contents by delimiter if passed in 29 | if (delimiter) contents = contents.split(delimiter); 30 | 31 | // optionally strip header when converting to a list 32 | if (strip_header) contents.shift(); 33 | 34 | // return results 35 | resolve(contents); 36 | } catch (e) { 37 | reject(e.message); 38 | } 39 | }); 40 | } catch (e) { 41 | reject(e.message); 42 | } 43 | }); 44 | }; 45 | 46 | File.prototype.list = function() { 47 | return new Promise((resolve, reject) => { 48 | let max_items = 125, results = []; 49 | 50 | try { 51 | this.file.enumerate_children_async(Gio.FILE_ATTRIBUTE_STANDARD_NAME, Gio.FileQueryInfoFlags.NONE, GLib.PRIORITY_LOW, null, function(file, res) { 52 | try { 53 | let enumerator = file.enumerate_children_finish(res); 54 | 55 | let callback = function(enumerator, res) { 56 | try { 57 | let files = enumerator.next_files_finish(res); 58 | for (let i = 0; i < files.length; i++) { 59 | results.push(files[i].get_attribute_as_string(Gio.FILE_ATTRIBUTE_STANDARD_NAME)); 60 | } 61 | 62 | if (files.length == 0) { 63 | enumerator.close_async(GLib.PRIORITY_LOW, null, function(){}); 64 | resolve(results); 65 | } else { 66 | enumerator.next_files_async(max_items, GLib.PRIORITY_LOW, null, callback); 67 | } 68 | } catch (e) { 69 | reject(e.message); 70 | } 71 | }; 72 | 73 | enumerator.next_files_async(max_items, GLib.PRIORITY_LOW, null, callback); 74 | } catch (e) { 75 | reject(e.message); 76 | } 77 | }); 78 | } catch (e) { 79 | reject(e.message); 80 | } 81 | }); 82 | }; 83 | -------------------------------------------------------------------------------- /helpers/subprocess.js: -------------------------------------------------------------------------------- 1 | import GLib from 'gi://GLib'; 2 | import Gio from 'gi://Gio'; 3 | 4 | // convert Uint8Array into a literal string 5 | function convertUint8ArrayToString(contents) { 6 | const decoder = new TextDecoder('utf-8'); 7 | return decoder.decode(contents).trim(); 8 | } 9 | 10 | export function SubProcess(command) { 11 | this.sub_process = Gio.Subprocess.new(command, Gio.SubprocessFlags.STDOUT_PIPE); 12 | this.stdout = this.sub_process.get_stdout_pipe(); 13 | } 14 | 15 | SubProcess.prototype.read = function(delimiter = '') { 16 | return new Promise((resolve, reject) => { 17 | this.stdout.read_bytes_async(512, GLib.PRIORITY_LOW, null, function(stdout, res) { 18 | try { 19 | let read_bytes = stdout.read_bytes_finish(res).get_data(); 20 | 21 | // convert contents to string 22 | let read_str = convertUint8ArrayToString(read_bytes); 23 | 24 | // split read_str by delimiter if passed in 25 | if (delimiter) { 26 | if (read_str == '') 27 | read_str = []; // EOF, ''.split(delimiter) would return [''] 28 | else 29 | read_str = read_str.split(delimiter); 30 | } 31 | 32 | // return results 33 | resolve(read_str); 34 | } catch (e) { 35 | if (e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.PENDING)) { 36 | // previous read attempt is still waiting for something from stdout 37 | // ignore second attempt, return empty data (like EOF) 38 | if (delimiter) resolve([]); 39 | else resolve(''); 40 | } else { 41 | reject(e.message); 42 | } 43 | } 44 | }); 45 | }); 46 | }; 47 | 48 | SubProcess.prototype.terminate = function() { 49 | const SIGINT = 2; 50 | this.sub_process.send_signal(SIGINT); 51 | this.sub_process = null; 52 | this.stdout.close_async(GLib.PRIORITY_LOW, null, null); 53 | this.stdout = null; 54 | }; 55 | -------------------------------------------------------------------------------- /howtouse.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/corecoding/Vitals/66b99a7bcc010b18f76438265a2a6744f392e35e/howtouse.gif -------------------------------------------------------------------------------- /icons/gnome/battery-symbolic.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /icons/gnome/cpu-symbolic.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /icons/gnome/fan-symbolic.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /icons/gnome/gpu-symbolic.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /icons/gnome/memory-symbolic.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /icons/gnome/network-download-symbolic.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /icons/gnome/network-symbolic.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /icons/gnome/network-upload-symbolic.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /icons/gnome/storage-symbolic.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /icons/gnome/system-symbolic.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /icons/gnome/temperature-symbolic.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /icons/gnome/voltage-symbolic.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /icons/original/battery-symbolic.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /icons/original/cpu-symbolic.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /icons/original/fan-symbolic.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 18 | 20 | 21 | 23 | image/svg+xml 24 | 26 | Gnome Symbolic Icon Theme 27 | 28 | 29 | 30 | 62 | 71 | 72 | Gnome Symbolic Icon Theme 74 | 76 | 82 | 87 | 92 | 97 | 102 | 107 | 113 | 119 | 123 | 133 | 134 | -------------------------------------------------------------------------------- /icons/original/gpu-symbolic.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /icons/original/memory-symbolic.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /icons/original/network-download-symbolic.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /icons/original/network-symbolic.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /icons/original/network-upload-symbolic.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /icons/original/storage-symbolic.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /icons/original/system-symbolic.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /icons/original/temperature-symbolic.svg: -------------------------------------------------------------------------------- 1 | 2 | image/svg+xml -------------------------------------------------------------------------------- /icons/original/voltage-symbolic.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 18 | 20 | 21 | 23 | image/svg+xml 24 | 26 | Gnome Symbolic Icon Theme 27 | 28 | 29 | 30 | 62 | 71 | 72 | Gnome Symbolic Icon Theme 74 | 76 | 82 | 87 | 92 | 97 | 102 | 107 | 113 | 119 | 125 | 126 | -------------------------------------------------------------------------------- /locale/ar/LC_MESSAGES/vitals.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/corecoding/Vitals/66b99a7bcc010b18f76438265a2a6744f392e35e/locale/ar/LC_MESSAGES/vitals.mo -------------------------------------------------------------------------------- /locale/ar/LC_MESSAGES/vitals.po: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2024 Abdalrahim G. Fakhouri 2 | msgid "" 3 | msgstr "" 4 | "Project-Id-Version: \n" 5 | "POT-Creation-Date: 2023-10-22 21:04+0200\n" 6 | "PO-Revision-Date: 2024-06-12 12:15+0300\n" 7 | "Last-Translator: Abdalrahim G. Fakhouri \n" 8 | "Language-Team: ar\n" 9 | "Language: ar\n" 10 | "MIME-Version: 1.0\n" 11 | "Content-Type: text/plain; charset=UTF-8\n" 12 | "Content-Transfer-Encoding: 8bit\n" 13 | "Plural-Forms: nplurals=6; plural= n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 &" 14 | "& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" 15 | "POT-Revision-Date: 2018-12-29 10:26+0100\n" 16 | "X-Generator: Lokalize 24.05.0\n" 17 | "X-Poedit-Basepath: ..\n" 18 | "X-Poedit-KeywordsList: _returnValue:2\n" 19 | "X-Poedit-SearchPath-0: values.js\n" 20 | "X-Poedit-SearchPath-1: sensors.js\n" 21 | "X-Poedit-SearchPath-2: prefs.js\n" 22 | "X-Poedit-SearchPath-3: menuItem.js\n" 23 | "X-Poedit-SearchPath-4: extension.js\n" 24 | "X-Poedit-SearchPath-5: schemas/org.gnome.shell.extensions.vitals.gschema.xml\n" 25 | "X-Poedit-SearchPath-6: prefs.ui\n" 26 | 27 | #: extension.js:109 28 | msgid "Batteries" 29 | msgstr "البطاريات" 30 | 31 | #: extension.js:133 32 | msgid "No Data" 33 | msgstr "لا توجد بيانات" 34 | 35 | #: extension.js:159 36 | msgid "Refresh" 37 | msgstr "تحديث" 38 | 39 | #: extension.js:174 40 | msgid "System Monitor" 41 | msgstr "مراقب النظام" 42 | 43 | #: extension.js:182 prefs.js:106 44 | msgid "Preferences" 45 | msgstr "التفضيلات" 46 | 47 | #: prefs.ui:42 48 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:81 49 | msgid "Include public IP address" 50 | msgstr "ضمِّن عنوان IP الخارجي" 51 | 52 | #: prefs.ui:70 53 | msgid "Format" 54 | msgstr "الصيغة" 55 | 56 | #: prefs.ui:78 57 | msgid "Bytes" 58 | msgstr "بايت" 59 | 60 | #: prefs.ui:79 61 | msgid "Bits" 62 | msgstr "بِت" 63 | 64 | #: prefs.ui:121 65 | msgid "General" 66 | msgstr "عامّ" 67 | 68 | #: prefs.ui:149 69 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:11 70 | msgid "Seconds between updates" 71 | msgstr "الثواني بين التحديثات" 72 | 73 | #: prefs.ui:184 74 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:16 75 | msgid "Position in panel" 76 | msgstr "المكان في الشريط العلوي" 77 | 78 | #: prefs.ui:193 79 | msgid "Left" 80 | msgstr "اليسار" 81 | 82 | #: prefs.ui:194 83 | msgid "Center" 84 | msgstr "الوسط" 85 | 86 | #: prefs.ui:195 87 | msgid "Right" 88 | msgstr "اليمين" 89 | 90 | #: prefs.ui:196 91 | msgid "Far Left" 92 | msgstr "أقصى اليسار" 93 | 94 | #: prefs.ui:197 95 | msgid "Far Right" 96 | msgstr "أقصى اليمين" 97 | 98 | #: prefs.ui:220 99 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:21 100 | msgid "Use higher precision" 101 | msgstr "استخدم دقّة أعلى" 102 | 103 | #: prefs.ui:247 104 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:26 105 | msgid "Alphabetize sensors" 106 | msgstr "رتب الحساسات أبجديًّا" 107 | 108 | #: prefs.ui:274 109 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:31 110 | msgid "Hide zero values" 111 | msgstr "اخفِ القيم الصفرية" 112 | 113 | #: prefs.ui:301 114 | msgid "Use fixed widths" 115 | msgstr "استخدم مقاسات ثابتة" 116 | 117 | #: prefs.ui:328 118 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:171 119 | msgid "Hide icons in top bar" 120 | msgstr "اخفِ الأيقونات في الشريط العلوي" 121 | 122 | #: prefs.ui:355 123 | msgid "Menu always centered" 124 | msgstr "القائمة متوسطة دائمًا" 125 | 126 | #: prefs.ui:379 127 | msgid "About" 128 | msgstr "عَن التطبيق" 129 | 130 | #: prefs.ui:394 131 | msgid "" 132 | "Feature requests or bugs? Please visit GitHub. No warranty, " 134 | "expressed or implied. Donate if you found this useful." 136 | msgstr "" 137 | "أترغب بطلب ميزة أو الإبلاغ عن عِلَّة؟ نرجو زيارة GitHub. لا ضمانات صريحة أوضمنيّة. تبرّع إذا وجدت هذا التطبيق مفيدًا." 141 | 142 | #: prefs.ui:421 143 | msgid "Sensors" 144 | msgstr "الحساسات" 145 | 146 | #: prefs.ui:449 147 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:36 148 | msgid "Monitor temperature" 149 | msgstr "راقب الحرارة" 150 | 151 | #: prefs.ui:500 152 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:46 153 | msgid "Monitor voltage" 154 | msgstr "راقب الجهد الكهربائيّ" 155 | 156 | #: prefs.ui:528 157 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:51 158 | msgid "Monitor fan" 159 | msgstr "راقب المراوح" 160 | 161 | #: prefs.ui:556 162 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:56 163 | msgid "Monitor memory" 164 | msgstr "راقب حالة الذاكرة" 165 | 166 | #: prefs.ui:607 167 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:61 168 | msgid "Monitor processor" 169 | msgstr "راقب حالة المعالج" 170 | 171 | #: prefs.ui:658 172 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:66 173 | msgid "Monitor system" 174 | msgstr "راقب حالة النظام" 175 | 176 | #: prefs.ui:709 177 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:76 178 | msgid "Monitor network" 179 | msgstr "راقب حالة الشبكة" 180 | 181 | #: prefs.ui:760 182 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:71 183 | msgid "Monitor storage" 184 | msgstr "راقب حالة التخزين" 185 | 186 | #: prefs.ui:811 187 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:96 188 | msgid "Monitor battery" 189 | msgstr "راقب حالة البطارية" 190 | 191 | #: prefs.ui:890 192 | msgid "Path" 193 | msgstr "المسار" 194 | 195 | #: prefs.ui:922 prefs.ui:1031 196 | msgid "Measurement" 197 | msgstr "وحدة القياس" 198 | 199 | #: prefs.ui:930 prefs.ui:1039 200 | msgid "Binary" 201 | msgstr "ثنائيّ" 202 | 203 | #: prefs.ui:931 prefs.ui:1040 204 | msgid "Decimal" 205 | msgstr "عشريّ" 206 | 207 | #: prefs.ui:976 208 | msgid "Unit" 209 | msgstr "الوِحدة" 210 | 211 | #: prefs.ui:985 212 | msgid "°C" 213 | msgstr "ْم " 214 | 215 | #: prefs.ui:986 216 | msgid "°F" 217 | msgstr "ْف" 218 | 219 | #: prefs.ui:1086 220 | msgid "Monitor BAT0" 221 | msgstr "راقب البطارية BAT0" 222 | 223 | #: prefs.ui:1116 224 | msgid "Monitor BAT1" 225 | msgstr "راقب البطارية BAT1" 226 | 227 | #: prefs.ui:1146 228 | msgid "Monitor BAT2" 229 | msgstr "راقب البطارية BAT2" 230 | 231 | #: prefs.ui:1176 232 | msgid "Monitor CMB0" 233 | msgstr "راقب البطارية CMB0" 234 | 235 | #: prefs.ui:1206 236 | msgid "Monitor macsmc-battery" 237 | msgstr "راقب بطارية macsmc" 238 | 239 | #: prefs.ui:1247 240 | msgid "Calculate Combined Values" 241 | msgstr "احسِب القيم المُجمّعة" 242 | 243 | #: prefs.ui:1277 244 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:141 245 | msgid "Include BAT0" 246 | msgstr "ضمِّن البطارية BAT0" 247 | 248 | #: prefs.ui:1307 249 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:146 250 | msgid "Include BAT1" 251 | msgstr "ضمِّن البطارية BAT1" 252 | 253 | #: prefs.ui:1337 254 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:151 255 | msgid "Include BAT2" 256 | msgstr "ضمِّن البطارية BAT2" 257 | 258 | #: prefs.ui:1367 259 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:156 260 | msgid "Include CMB0" 261 | msgstr "ضمِّن البطارية CMB0" 262 | 263 | #: prefs.ui:1397 264 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:161 265 | msgid "Include macsmc-battery" 266 | msgstr "ضمِّن بطارية macsmc" 267 | 268 | #: prefs.ui:1446 269 | msgid "Monitor command" 270 | msgstr "أمر المراقِب" 271 | 272 | #: prefs.ui:1498 273 | msgid "Include static info" 274 | msgstr "ضمِّن المعلومات الثابتة" 275 | 276 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:6 277 | msgid "Sensors to show in panel" 278 | msgstr "الحساسات التي ستظهر في الشريط" 279 | 280 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:7 281 | msgid "List of sensors to be shown in the panel" 282 | msgstr "لائحة الحساسات التي ستظهر في الشريط" 283 | 284 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:12 285 | msgid "Delay between sensor polling" 286 | msgstr "الانتظار بين قراءات الحساسات" 287 | 288 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:17 289 | msgid "Position in Panel ('left', 'center', 'right')" 290 | msgstr "المكان في الشريط (\"يمين\"، \"وسط\"، \"يسار\")" 291 | 292 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:22 293 | msgid "Show one extra digit after decimal" 294 | msgstr "أظهِر منزلة عشرية واحدة إضافية بعد الفاصلة العشريّة" 295 | 296 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:27 297 | msgid "Display sensors in alphabetical order" 298 | msgstr "اعرض الحساسات مرتبة هجائيًّا" 299 | 300 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:32 301 | msgid "Hide data from sensors that are invalid" 302 | msgstr "اخفِ بيانات الحساسات غير الصالحة" 303 | 304 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:37 305 | msgid "Display temperature of various components" 306 | msgstr "اعرض حرارة المكونات المختلفة" 307 | 308 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:41 309 | msgid "Temperature unit" 310 | msgstr "وحدة قياس درجة الحرارة" 311 | 312 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:42 313 | msgid "" 314 | "The unit ('centigrade' or 'fahrenheit') the extension should " 315 | "display the temperature in" 316 | msgstr "" 317 | "الوِحدة (\"مئوية\" أو \"فهرنهايت\") التي تريد أن تُستخدَم في عرض درجة الحرارة" 318 | 319 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:47 320 | msgid "Display voltage of various components" 321 | msgstr "اعرض الجهد الكهربائيّ للمكونات المختلفة" 322 | 323 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:52 324 | msgid "Display fan rotation per minute" 325 | msgstr "اعرض سرعة دوران المروحة (كم دورة في الدقيقة)" 326 | 327 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:57 328 | msgid "Display memory information" 329 | msgstr "اعرض معلومات الذاكرة" 330 | 331 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:62 332 | msgid "Display processor information" 333 | msgstr "اعرض معلومات المعالج" 334 | 335 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:67 336 | msgid "Display system information" 337 | msgstr "اعرض معلومات النظام" 338 | 339 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:72 340 | msgid "Display storage information" 341 | msgstr "اعرض معلومات التخزين" 342 | 343 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:77 344 | msgid "Display network information" 345 | msgstr "اعرض معلومات الشبكة" 346 | 347 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:82 348 | msgid "Display public IP address of internet connection" 349 | msgstr "اعرض عنوان IP الخارجي لاتصال الإنترنت" 350 | 351 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:86 352 | msgid "Network speed format" 353 | msgstr "صيغة سرعة الشبكة" 354 | 355 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:87 356 | msgid "Should speed display in bits or bytes?" 357 | msgstr "هل تريد عرض السرعة بوحدة الـ\"بِت\" أم الـ\"بايت\" ؟" 358 | 359 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:91 360 | msgid "Storage path" 361 | msgstr "مسار التخزين" 362 | 363 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:92 364 | msgid "Storage path for monitoring" 365 | msgstr "مسار التخزين الذي تريد مراقبته" 366 | 367 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:97 368 | msgid "Monitor battery health" 369 | msgstr "" 370 | 371 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:101 372 | msgid "Memory measurement" 373 | msgstr "قياس الذاكرة" 374 | 375 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:102 376 | msgid "Can use gigabyte or gibibyte for memory" 377 | msgstr "" 378 | 379 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:106 380 | msgid "Storage measurement" 381 | msgstr "وحدة قياس سعة التخزين" 382 | 383 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:107 384 | msgid "Can use gigabyte or gibibyte for storage" 385 | msgstr "" 386 | 387 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:111 388 | msgid "Display battery BAT0" 389 | msgstr "اعرض البطارية BAT0" 390 | 391 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:112 392 | msgid "Should battery 'BAT0' be displayed?" 393 | msgstr "هل تريد عرض معلومات البطارية BAT0 ؟" 394 | 395 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:116 396 | msgid "Display battery BAT1" 397 | msgstr "اعرض البطارية BAT1" 398 | 399 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:117 400 | msgid "Should battery 'BAT1' be displayed?" 401 | msgstr "هل تريد عرض معلومات البطارية BAT1 ؟" 402 | 403 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:121 404 | msgid "Display battery BAT2" 405 | msgstr "اعرض البطارية BAT2" 406 | 407 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:122 408 | msgid "Should battery 'BAT2' be displayed?" 409 | msgstr "هل تريد عرض معلومات البطارية BAT2 ؟" 410 | 411 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:126 412 | msgid "Display battery CMB0" 413 | msgstr "اعرض البطارية CMB0" 414 | 415 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:127 416 | msgid "Should battery 'CMB0' be displayed?" 417 | msgstr "هل تريد عرض معلومات البطارية CMB0 ؟" 418 | 419 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:131 420 | msgid "Display battery macsmc-battery" 421 | msgstr "اعرض البطارية macsmc" 422 | 423 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:132 424 | msgid "Should battery 'macsmc-battery' be displayed?" 425 | msgstr "هل تريد عرض معلومات البطارية macsmc ؟" 426 | 427 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:136 428 | msgid "Display combined battery data" 429 | msgstr "اعرض معلومات البطاريات مجتمعة" 430 | 431 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:137 432 | msgid "Display combined values for selected batteries" 433 | msgstr "اعرض محصلة القيم للبطاريات المختارة" 434 | 435 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:142 436 | msgid "Include 'BAT0' when calculating combined Battery" 437 | msgstr "اشمل القيم من BAT0 عند احتساب القيم من البطاريات مجتمعة" 438 | 439 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:147 440 | msgid "Include 'BAT1' when calculating combined Battery" 441 | msgstr "اشمل القيم من BAT1 عند احتساب القيم من البطاريات مجتمعة" 442 | 443 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:152 444 | msgid "Include 'BAT2' when calculating combined Battery" 445 | msgstr "اشمل القيم من BAT2 عند احتساب القيم من البطاريات مجتمعة" 446 | 447 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:157 448 | msgid "Include 'CMB0' when calculating combined Battery" 449 | msgstr "اشمل القيم من CMB0 عند احتساب القيم من البطاريات مجتمعة" 450 | 451 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:162 452 | msgid "Include 'macsmc-battery' when calculating combined Battery" 453 | msgstr "اشمل القيم من macsmc عند احتساب القيم من البطاريات مجتمعة" 454 | 455 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:166 456 | msgid "Use fixed widths in top bar" 457 | msgstr "استخدم مقاسات ثابتة في الشريط العُلوي" 458 | 459 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:167 460 | msgid "Keep sensors in top bar from jumping around" 461 | msgstr "امنع الحساسات في الشريط العلوي من تغيير أماكنها" 462 | 463 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:172 464 | msgid "Keep top bar clean by only showing sensor values" 465 | msgstr "أبق الشريط العلوي بسيطًا بعرض قيم الحساسات فقط" 466 | 467 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:176 468 | msgid "Make the menu centered" 469 | msgstr "وَسِّط القائمة" 470 | 471 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:177 472 | msgid "" 473 | "Center the menu to the icon regardless of the position in the " 474 | "panel" 475 | msgstr "وسِّط القائمة تبعاً للأيقونة بغض النظر عن مكانها في الشريط" 476 | 477 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:181 478 | msgid "System Monitor command" 479 | msgstr "أمر مراقب النظام" 480 | 481 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:182 482 | msgid "The command run when system monitor button is clicked" 483 | msgstr "الأمر الذي سيُنفَّذ عند النقر على زر مراقب النظام" 484 | 485 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:186 486 | msgid "Include processor static information" 487 | msgstr "اعرِض معلومات المعالج الثابتة" 488 | 489 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:187 490 | msgid "Display processor static information that doesn't change" 491 | msgstr "أظهر معلومات المعالج ذات القيم الثابتة التي لا تتغير" 492 | 493 | #: sensors.js:65 494 | msgid "Public IP" 495 | msgstr "عنوان IP الخارجي" 496 | 497 | #: sensors.js:133 sensors.js:181 498 | msgid "Usage" 499 | msgstr "الاستخدام" 500 | 501 | #: sensors.js:134 502 | msgid "memory" 503 | msgstr "الذاكرة" 504 | 505 | #: sensors.js:135 506 | msgid "Physical" 507 | msgstr "الحقيقية" 508 | 509 | #: sensors.js:136 510 | msgid "Available" 511 | msgstr "المتاحة" 512 | 513 | #: sensors.js:137 514 | msgid "Allocated" 515 | msgstr "المحجوزة" 516 | 517 | #: sensors.js:138 518 | msgid "Cached" 519 | msgstr "الخبيئة (cache)" 520 | 521 | #: sensors.js:139 sensors.js:355 522 | msgid "Free" 523 | msgstr "الخالية" 524 | 525 | #: sensors.js:140 526 | msgid "Swap" 527 | msgstr "مساحة التبديل (Swap)" 528 | 529 | #: sensors.js:248 530 | msgid "Average" 531 | msgstr "المعدّل" 532 | 533 | #: sensors.js:180 534 | msgid "processor" 535 | msgstr "المعالج" 536 | 537 | #: sensors.js:183 538 | #, javascript-format 539 | msgid "Core %d" 540 | msgstr "النواة %d" 541 | 542 | #: sensors.js:213 sensors.js:222 543 | msgid "Frequency" 544 | msgstr "التردّد" 545 | 546 | #: sensors.js:231 547 | msgid "Open Files" 548 | msgstr "الملفّات المفتوحة" 549 | 550 | #: sensors.js:238 551 | msgid "Load 1m" 552 | msgstr "الحِمْل (1 د)" 553 | 554 | #: sensors.js:239 555 | msgid "system" 556 | msgstr "النظام" 557 | 558 | #: sensors.js:240 559 | msgid "Load 5m" 560 | msgstr "الحِمْل (5 د)" 561 | 562 | #: sensors.js:241 563 | msgid "Load 15m" 564 | msgstr "الحِمْل (15 د)" 565 | 566 | #: sensors.js:242 567 | msgid "Threads Active" 568 | msgstr "الخطوط النشطة" 569 | 570 | #: sensors.js:243 571 | msgid "Threads Total" 572 | msgstr "الخطوط الكلية" 573 | 574 | #: sensors.js:248 575 | msgid "Uptime" 576 | msgstr "زمن التشغيل" 577 | 578 | #: sensors.js:252 579 | msgid "Process Time" 580 | msgstr "وقت العمليات" 581 | 582 | #: sensors.js:302 583 | msgid "WiFi Link Quality" 584 | msgstr "جودة اتصال الشبكة اللاسلكية WiFi" 585 | 586 | #: sensors.js:303 587 | msgid "WiFi Signal Level" 588 | msgstr "مستوى إشارة الشبكة اللاسلكية WiFi" 589 | 590 | #: sensors.js:318 591 | msgid "ARC Target" 592 | msgstr "" 593 | 594 | #: sensors.js:319 595 | msgid "ARC Maximum" 596 | msgstr "" 597 | 598 | #: sensors.js:320 599 | msgid "ARC Current" 600 | msgstr "" 601 | 602 | #: sensors.js:330 603 | msgid "Read total" 604 | msgstr "إجمالي القراءة" 605 | 606 | #: sensors.js:331 607 | msgid "Write total" 608 | msgstr "إجمالي الكتابة" 609 | 610 | #: sensors.js:332 611 | msgid "Read rate" 612 | msgstr "معدل القراءة" 613 | 614 | #: sensors.js:333 615 | msgid "Write rate" 616 | msgstr "معدل الكتابة" 617 | 618 | #: sensors.js:352 619 | msgid "Total" 620 | msgstr "الإجمالي" 621 | 622 | #: sensors.js:353 623 | msgid "Used" 624 | msgstr "مُستخدَم" 625 | 626 | #: sensors.js:354 627 | msgid "Reserved" 628 | msgstr "محجوز" 629 | 630 | #: sensors.js:356 631 | msgid "storage" 632 | msgstr "التخزين" 633 | 634 | #: sensors.js:393 635 | msgid "Label" 636 | msgstr "" 637 | 638 | #: sensors.js:404 sensors.js:529 639 | msgid "State" 640 | msgstr "الحالة" 641 | 642 | #: sensors.js:409 sensors.js:519 643 | msgid "Cycles" 644 | msgstr "الدورات" 645 | 646 | #: sensors.js:414 647 | msgid "Voltage" 648 | msgstr "الجهد الكهربائي" 649 | 650 | #: sensors.js:418 651 | msgid "Level" 652 | msgstr "المستوى" 653 | 654 | #: sensors.js:422 sensors.js:553 655 | msgid "Percentage" 656 | msgstr "النسبة" 657 | 658 | #: sensors.js:432 sensors.js:527 659 | msgid "Rate" 660 | msgstr "المعدل" 661 | 662 | #: sensors.js:442 sensors.js:535 663 | msgid "Energy (full)" 664 | msgstr "الطاقة (ممتلئة)" 665 | 666 | #: sensors.js:451 sensors.js:541 667 | msgid "Energy (design)" 668 | msgstr "الطاقة (التصميم)" 669 | 670 | #: sensors.js:455 671 | msgid "Capacity" 672 | msgstr "السعة" 673 | 674 | #: sensors.js:464 sensors.js:547 675 | msgid "Energy (now)" 676 | msgstr "الطاقة (الآن)" 677 | 678 | #: sensors.js:501 sensors.js:504 sensors.js:588 sensors.js:591 679 | msgid "Time left" 680 | msgstr "الوقت المتبقي" 681 | 682 | #: sensors.js:677 683 | msgid "Vendor" 684 | msgstr "المُنتِج" 685 | 686 | #: sensors.js:678 687 | msgid "Bogomips" 688 | msgstr "" 689 | 690 | #: sensors.js:679 691 | msgid "Sockets" 692 | msgstr "المقابس" 693 | 694 | #: sensors.js:680 695 | msgid "Cache" 696 | msgstr "الخبيئة" 697 | 698 | #: sensors.js:685 699 | msgid "Kernel" 700 | msgstr "النواة" 701 | 702 | #: prefs.js:98 703 | msgid "Temperature" 704 | msgstr "درجة الحرارة" 705 | 706 | #: prefs.js:98 707 | msgid "Network" 708 | msgstr "الشبكة" 709 | 710 | #: prefs.js:98 711 | msgid "Storage" 712 | msgstr "التخزين" 713 | 714 | #: prefs.js:98 715 | msgid "Memory" 716 | msgstr "الذاكرة" 717 | 718 | #: prefs.js:98 719 | msgid "Battery" 720 | msgstr "البطارية" 721 | 722 | #: extension.js:112 723 | msgid "Battery 1" 724 | msgstr "البطارية 1" 725 | 726 | #: extension.js:112 727 | msgid "Battery 2" 728 | msgstr "البطارية 2" 729 | 730 | #: extension.js:112 731 | msgid "Battery 3" 732 | msgstr "البطارية 3" 733 | 734 | #: extension.js:112 735 | msgid "Battery 4" 736 | msgstr "البطارية 4" 737 | 738 | #: extension.js:112 739 | msgid "Battery 5" 740 | msgstr "البطارية 5" 741 | 742 | #: extension.js:115 743 | msgid "Battery (hidden)" 744 | msgstr "البطارية (مخفي)" 745 | 746 | #: prefs.js:98 747 | msgid "System" 748 | msgstr "النظام" 749 | 750 | #: prefs.js:98 751 | msgid "Processor" 752 | msgstr "المعالج" 753 | 754 | #: sensors.js:759 755 | msgid "Fan" 756 | msgstr "المروحة" 757 | 758 | 759 | -------------------------------------------------------------------------------- /locale/be/LC_MESSAGES/vitals.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/corecoding/Vitals/66b99a7bcc010b18f76438265a2a6744f392e35e/locale/be/LC_MESSAGES/vitals.mo -------------------------------------------------------------------------------- /locale/be/LC_MESSAGES/vitals.po: -------------------------------------------------------------------------------- 1 | msgid "" 2 | msgstr "" 3 | "Project-Id-Version: \n" 4 | "POT-Creation-Date: 2022-04-10 21:29+0200\n" 5 | "PO-Revision-Date: \n" 6 | "Last-Translator: \n" 7 | "Language-Team: \n" 8 | "Language: be\n" 9 | "MIME-Version: 1.0\n" 10 | "Content-Type: text/plain; charset=UTF-8\n" 11 | "Content-Transfer-Encoding: 8bit\n" 12 | "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " 13 | "n%10<=4 && (n%100<12 || n%100>14) ? 1 : 2);\n" 14 | "POT-Revision-Date: 2018-12-29 10:26+0100\n" 15 | "X-Generator: Poedit 3.4\n" 16 | "X-Poedit-Basepath: ..\n" 17 | "X-Poedit-SearchPath-0: values.js\n" 18 | "X-Poedit-SearchPath-1: sensors.js\n" 19 | "X-Poedit-SearchPath-2: prefs.js\n" 20 | "X-Poedit-SearchPath-3: menuItem.js\n" 21 | "X-Poedit-SearchPath-4: extension.js\n" 22 | "X-Poedit-SearchPath-5: schemas/org.gnome.shell.extensions.vitals.gschema." 23 | "xml\n" 24 | "X-Poedit-SearchPath-6: prefs.ui\n" 25 | 26 | #: extension.js:102 27 | msgid "No Data" 28 | msgstr "Няма даных" 29 | 30 | #: extension.js:129 31 | msgid "Refresh" 32 | msgstr "Абнавіць" 33 | 34 | #: extension.js:147 35 | msgid "System Monitor" 36 | msgstr "Сістэмны манітор" 37 | 38 | #: extension.js:155 39 | msgid "Preferences" 40 | msgstr "Параметры" 41 | 42 | #: prefs.ui:42 schemas/org.gnome.shell.extensions.vitals.gschema.xml:81 43 | msgid "Include public IP address" 44 | msgstr "Уключыць публічны IP-адрас" 45 | 46 | #: prefs.ui:70 47 | msgid "Format" 48 | msgstr "Фармат" 49 | 50 | #: prefs.ui:78 51 | msgid "Bytes" 52 | msgstr "Байты" 53 | 54 | #: prefs.ui:79 55 | msgid "Bits" 56 | msgstr "Біты" 57 | 58 | #: prefs.ui:121 59 | msgid "General" 60 | msgstr "Агульныя" 61 | 62 | #: prefs.ui:149 schemas/org.gnome.shell.extensions.vitals.gschema.xml:11 63 | msgid "Seconds between updates" 64 | msgstr "Секунд паміж абнаўленнямі" 65 | 66 | #: prefs.ui:184 schemas/org.gnome.shell.extensions.vitals.gschema.xml:16 67 | msgid "Position in panel" 68 | msgstr "Пазіцыя на панэлі" 69 | 70 | #: prefs.ui:193 71 | msgid "Left" 72 | msgstr "Злева" 73 | 74 | #: prefs.ui:194 75 | msgid "Center" 76 | msgstr "Па цэнтры" 77 | 78 | #: prefs.ui:195 79 | msgid "Right" 80 | msgstr "Справа" 81 | 82 | #: prefs.ui:196 83 | msgid "Far Left" 84 | msgstr "Далёка злева" 85 | 86 | #: prefs.ui:197 87 | msgid "Far Right" 88 | msgstr "Далёка справа" 89 | 90 | #: prefs.ui:220 schemas/org.gnome.shell.extensions.vitals.gschema.xml:21 91 | msgid "Use higher precision" 92 | msgstr "Выкарыстоўваць большую дакладнасць" 93 | 94 | #: prefs.ui:247 schemas/org.gnome.shell.extensions.vitals.gschema.xml:26 95 | msgid "Alphabetize sensors" 96 | msgstr "Сэнсары у алфавітным парадку" 97 | 98 | #: prefs.ui:274 schemas/org.gnome.shell.extensions.vitals.gschema.xml:31 99 | msgid "Hide zero values" 100 | msgstr "Хаваць нулявыя значэнні" 101 | 102 | #: prefs.ui:301 103 | msgid "Use fixed widths" 104 | msgstr "Выкарыстоўваць фіксаваную шырыню" 105 | 106 | #: prefs.ui:328 schemas/org.gnome.shell.extensions.vitals.gschema.xml:121 107 | msgid "Hide icons in top bar" 108 | msgstr "Хаваць значкі ў верхняй панэлі" 109 | 110 | #: prefs.ui:352 111 | msgid "About" 112 | msgstr "Аб праграме" 113 | 114 | #: prefs.ui:367 115 | msgid "" 116 | "Feature requests or bugs? Please visit GitHub. No warranty, expressed or implied. Donate if you found this " 119 | "useful." 120 | msgstr "" 121 | "Запыты на функцыі або памылкі? Наведайце GitHub. Няма гарантый, відавочных або пэўных. " 123 | "Ахвяруйце, калі вы знайшлі " 124 | "гэта карысным." 125 | 126 | #: prefs.ui:394 127 | msgid "Sensors" 128 | msgstr "Датчыкі" 129 | 130 | #: prefs.ui:422 schemas/org.gnome.shell.extensions.vitals.gschema.xml:36 131 | msgid "Monitor temperature" 132 | msgstr "Маніторынг тэмпературы" 133 | 134 | #: prefs.ui:473 schemas/org.gnome.shell.extensions.vitals.gschema.xml:46 135 | msgid "Monitor voltage" 136 | msgstr "Маніторынг напружання" 137 | 138 | #: prefs.ui:501 schemas/org.gnome.shell.extensions.vitals.gschema.xml:51 139 | msgid "Monitor fan" 140 | msgstr "Маніторынг вентылятара" 141 | 142 | #: prefs.ui:529 schemas/org.gnome.shell.extensions.vitals.gschema.xml:56 143 | msgid "Monitor memory" 144 | msgstr "Маніторынг памяці" 145 | 146 | #: prefs.ui:580 schemas/org.gnome.shell.extensions.vitals.gschema.xml:61 147 | msgid "Monitor processor" 148 | msgstr "Маніторынг працэсара" 149 | 150 | #: prefs.ui:631 schemas/org.gnome.shell.extensions.vitals.gschema.xml:66 151 | msgid "Monitor system" 152 | msgstr "Маніторынг сістэмы" 153 | 154 | #: prefs.ui:682 schemas/org.gnome.shell.extensions.vitals.gschema.xml:76 155 | msgid "Monitor network" 156 | msgstr "Маніторынг сеткі" 157 | 158 | #: prefs.ui:733 schemas/org.gnome.shell.extensions.vitals.gschema.xml:71 159 | msgid "Monitor storage" 160 | msgstr "Маніторынг сховішча" 161 | 162 | #: prefs.ui:784 schemas/org.gnome.shell.extensions.vitals.gschema.xml:96 163 | msgid "Monitor battery" 164 | msgstr "Маніторынг батарэі" 165 | 166 | #: prefs.ui:863 167 | msgid "Path" 168 | msgstr "Шлях" 169 | 170 | #: prefs.ui:895 prefs.ui:1004 171 | msgid "Measurement" 172 | msgstr "Вымярэнне" 173 | 174 | #: prefs.ui:903 prefs.ui:1012 175 | msgid "Binary" 176 | msgstr "Двайковы" 177 | 178 | #: prefs.ui:904 prefs.ui:1013 179 | msgid "Decimal" 180 | msgstr "Дзесятковы" 181 | 182 | #: prefs.ui:949 183 | msgid "Unit" 184 | msgstr "Адзінка" 185 | 186 | #: prefs.ui:1058 187 | msgid "Display Battery" 188 | msgstr "Паказваць батарэю" 189 | 190 | #: prefs.ui:1066 191 | msgid "BAT0" 192 | msgstr "BAT0" 193 | 194 | #: prefs.ui:1067 195 | msgid "BAT1" 196 | msgstr "BAT1" 197 | 198 | #: prefs.ui:1068 199 | msgid "BAT2" 200 | msgstr "BAT2" 201 | 202 | #: prefs.ui:1069 203 | msgid "CMB0" 204 | msgstr "CMB0" 205 | 206 | #: prefs.ui:1070 207 | msgid "macsmc-battery" 208 | msgstr "macsmc-battery" 209 | 210 | #: prefs.ui:1115 211 | msgid "Monitor command" 212 | msgstr "Каманда запуску маніторынга" 213 | 214 | #: prefs.ui:1167 215 | msgid "Include static info" 216 | msgstr "Уключыць статычную інфармацыю" 217 | 218 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:6 219 | msgid "Sensors to show in panel" 220 | msgstr "Датчыкі для паказу на панэлі" 221 | 222 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:7 223 | msgid "List of sensors to be shown in the panel" 224 | msgstr "Спіс датчыкаў, якія будуць паказвацца на панэлі" 225 | 226 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:12 227 | msgid "Delay between sensor polling" 228 | msgstr "Затрымка паміж апытаннем датчыка" 229 | 230 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:17 231 | msgid "Position in Panel ('left', 'center', 'right')" 232 | msgstr "Размяшчэнне на панэлі (\"злева\", \"у цэнтры\", \"справа\")" 233 | 234 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:22 235 | msgid "Show one extra digit after decimal" 236 | msgstr "Паказваць адну лічбу пасля коскі" 237 | 238 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:27 239 | msgid "Display sensors in alphabetical order" 240 | msgstr "Паказаць датчыкі ў алфавітным парадку" 241 | 242 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:32 243 | msgid "Hide data from sensors that are invalid" 244 | msgstr "Схаваць даныя з датчыкаў, якія несапраўдныя" 245 | 246 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:37 247 | msgid "Display temperature of various components" 248 | msgstr "Паказваць тэмпературу розных кампанентаў" 249 | 250 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:41 251 | msgid "Temperature unit" 252 | msgstr "Адзінка вымярэння тэмпературы" 253 | 254 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:42 255 | msgid "" 256 | "The unit ('centigrade' or 'fahrenheit') the extension should display the " 257 | "temperature in" 258 | msgstr "" 259 | "Адзінка (\"градус па Цэльсіі\" або \"фарэнгейт\"), у якой пашырэнне павінна " 260 | "адлюстроўваць тэмпературу" 261 | 262 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:47 263 | msgid "Display voltage of various components" 264 | msgstr "Паказваць напружанне розных кампанентаў" 265 | 266 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:52 267 | msgid "Display fan rotation per minute" 268 | msgstr "Паказваць абароты вентылятара ў хвіліну" 269 | 270 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:57 271 | msgid "Display memory information" 272 | msgstr "Паказваць і аб памяці" 273 | 274 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:62 275 | msgid "Display processor information" 276 | msgstr "Паказваць звесткі аб працэсары" 277 | 278 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:67 279 | msgid "Display system information" 280 | msgstr "Паказваць звесткі аб сістэме" 281 | 282 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:72 283 | msgid "Display storage information" 284 | msgstr "Паказваць звесткі аб сховішчы" 285 | 286 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:77 287 | msgid "Display network information" 288 | msgstr "Паказваць звесткі аб сетцы" 289 | 290 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:82 291 | msgid "Display public IP address of internet connection" 292 | msgstr "Паказваць публічны IP-адрас падлучэння да Інтэрнэту" 293 | 294 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:86 295 | msgid "Network speed format" 296 | msgstr "Фармат хуткасці сеткі" 297 | 298 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:87 299 | msgid "Should speed display in bits or bytes?" 300 | msgstr "Ці павінна хуткасць паказвацца ў бітах або байтах?" 301 | 302 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:91 303 | msgid "Storage path" 304 | msgstr "Шлях да сховішча" 305 | 306 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:92 307 | msgid "Storage path for monitoring" 308 | msgstr "Шлях да сховішча для маніторынгу" 309 | 310 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:97 311 | msgid "Monitor battery health" 312 | msgstr "Маніторынг здароўя батарэі" 313 | 314 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:101 315 | msgid "Memory measurement" 316 | msgstr "Вымярэнне памяці" 317 | 318 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:102 319 | msgid "Can use gigabyte or gibibyte for memory" 320 | msgstr "Можа выкарыстоўваць гігабайт або гібібіт для памяці" 321 | 322 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:106 323 | msgid "Storage measurement" 324 | msgstr "Вымярэнне сховішча" 325 | 326 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:107 327 | msgid "Can use gigabyte or gibibyte for storage" 328 | msgstr "Можа выкарыстоўваць гігабайт або гібібіт для сховішча" 329 | 330 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:111 331 | msgid "Battery slot to monitor" 332 | msgstr "Слот батарэі для маніторынгу" 333 | 334 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:112 335 | msgid "Which numerical battery slot should vitals monitor" 336 | msgstr "Які лічбавы слот батарэі трэба маніторыць vitals" 337 | 338 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:116 339 | msgid "Use fixed widths in top bar" 340 | msgstr "Выкарыстоўваць фіксаваную шырыню ў верхняй панэлі" 341 | 342 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:117 343 | msgid "Keep sensors in top bar from jumping around" 344 | msgstr "Не дазваляць датчыкам у верхняй панэлі скакаць" 345 | 346 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:122 347 | msgid "Keep top bar clean by only showing sensor values" 348 | msgstr "Трымаць верхнюю панэль чыстай, паказваючы толькі значэння датчыкаў" 349 | 350 | #: sensors.js:42 351 | msgid "Temperature" 352 | msgstr "Тэмпература" 353 | 354 | #: sensors.js:43 sensors.js:307 sensors.js:337 355 | msgid "Voltage" 356 | msgstr "Напружанне" 357 | 358 | #: sensors.js:44 359 | msgid "Fan" 360 | msgstr "Вентылятар" 361 | 362 | #: sensors.js:45 363 | msgid "Memory" 364 | msgstr "Памяць" 365 | 366 | #: sensors.js:46 367 | msgid "Processor" 368 | msgstr "Працэсар" 369 | 370 | #: sensors.js:47 371 | msgid "System" 372 | msgstr "Сістэма" 373 | 374 | #: sensors.js:48 375 | msgid "Network" 376 | msgstr "Сетка" 377 | 378 | #: sensors.js:49 379 | msgid "Storage" 380 | msgstr "Сховішча" 381 | 382 | #: sensors.js:76 383 | msgid "Public IP" 384 | msgstr "Публічны IP" 385 | 386 | #: sensors.js:144 387 | msgid "Usage" 388 | msgstr "Выкарыстанне" 389 | 390 | #: sensors.js:145 391 | msgid "memory" 392 | msgstr "памяць" 393 | 394 | #: sensors.js:146 395 | msgid "Physical" 396 | msgstr "Фізычная" 397 | 398 | #: sensors.js:147 399 | msgid "Available" 400 | msgstr "Даступна" 401 | 402 | #: sensors.js:148 403 | msgid "Allocated" 404 | msgstr "Выдзелена" 405 | 406 | #: sensors.js:149 407 | msgid "Swap" 408 | msgstr "Своп" 409 | 410 | #: sensors.js:189 411 | msgid "Average" 412 | msgstr "У сярэднім" 413 | 414 | #: sensors.js:190 415 | msgid "processor" 416 | msgstr "працэсар" 417 | 418 | #: sensors.js:192 419 | #, javascript-format 420 | msgid "Core %d" 421 | msgstr "Ядро %d" 422 | 423 | #: sensors.js:236 424 | msgid "Frequency" 425 | msgstr "Частата" 426 | 427 | #: sensors.js:237 428 | msgid "Boost" 429 | msgstr "Разгон" 430 | 431 | #: sensors.js:238 432 | msgid "Vendor" 433 | msgstr "Вытворца" 434 | 435 | #: sensors.js:239 436 | msgid "Bogomips" 437 | msgstr "Bogomips" 438 | 439 | #: sensors.js:240 440 | msgid "Sockets" 441 | msgstr "Сокетаў" 442 | 443 | #: sensors.js:241 444 | msgid "Cache" 445 | msgstr "Кэш" 446 | 447 | #: sensors.js:250 448 | msgid "Open Files" 449 | msgstr "Адкрыць файлы" 450 | 451 | #: sensors.js:258 452 | msgid "Load 1m" 453 | msgstr "Нагрузка 1хв" 454 | 455 | #: sensors.js:259 456 | msgid "system" 457 | msgstr "сістэма" 458 | 459 | #: sensors.js:260 460 | msgid "Load 5m" 461 | msgstr "Нагрузка 5хв" 462 | 463 | #: sensors.js:261 464 | msgid "Load 15m" 465 | msgstr "Нагрузка 15хв" 466 | 467 | #: sensors.js:262 468 | msgid "Threads Active" 469 | msgstr "Актыўныя патокі" 470 | 471 | #: sensors.js:263 472 | msgid "Threads Total" 473 | msgstr "Усяго патокаў" 474 | 475 | #: sensors.js:269 476 | msgid "Uptime" 477 | msgstr "Час працы" 478 | 479 | #: sensors.js:273 480 | msgid "Process Time" 481 | msgstr "Час працэса" 482 | 483 | #: sensors.js:290 484 | msgid "State" 485 | msgstr "Стан" 486 | 487 | #: sensors.js:295 488 | msgid "Cycles" 489 | msgstr "Цыклы" 490 | 491 | #: sensors.js:300 sensors.js:330 492 | msgid "Energy (full)" 493 | msgstr "Энергія (100%)" 494 | 495 | #: sensors.js:302 sensors.js:332 496 | msgid "Capacity" 497 | msgstr "Ёмістасць" 498 | 499 | #: sensors.js:303 sensors.js:333 500 | msgid "Energy (design)" 501 | msgstr "Энергія (з заводу)" 502 | 503 | #: sensors.js:311 sensors.js:340 504 | msgid "Rate" 505 | msgstr "Паказчык" 506 | 507 | #: sensors.js:312 sensors.js:341 508 | msgid "battery" 509 | msgstr "батарэя" 510 | 511 | #: sensors.js:316 sensors.js:344 512 | msgid "Energy (now)" 513 | msgstr "Энергія(зараз)" 514 | 515 | #: sensors.js:322 sensors.js:350 516 | msgid "Percentage" 517 | msgstr "Працэнт" 518 | 519 | #: sensors.js:411 520 | msgid "WiFi Link Quality" 521 | msgstr "Якасць сувязі WiFi" 522 | 523 | #: sensors.js:412 524 | msgid "WiFi Signal Level" 525 | msgstr "Узровень сігналу WiFi" 526 | 527 | #: sensors.js:432 528 | msgid "ARC Target" 529 | msgstr "Мэта ARC" 530 | 531 | #: sensors.js:433 532 | msgid "ARC Maximum" 533 | msgstr "ARC Максімум" 534 | 535 | #: sensors.js:434 536 | msgid "ARC Current" 537 | msgstr "Бягучы ARC" 538 | 539 | #: sensors.js:445 540 | msgid "Read total" 541 | msgstr "Чытанне ўсяго" 542 | 543 | #: sensors.js:446 544 | msgid "Write total" 545 | msgstr "Запіс усяго" 546 | 547 | #: sensors.js:447 548 | msgid "Read rate" 549 | msgstr "Паказчык чытання" 550 | 551 | #: sensors.js:448 552 | msgid "Write rate" 553 | msgstr "Паказчык запісу" 554 | 555 | #: sensors.js:467 556 | msgid "Total" 557 | msgstr "Усяго" 558 | 559 | #: sensors.js:468 560 | msgid "Used" 561 | msgstr "Выкарыстана" 562 | 563 | #: sensors.js:469 564 | msgid "Reserved" 565 | msgstr "Зарэзервавана" 566 | 567 | #: sensors.js:470 568 | msgid "Free" 569 | msgstr "Свабодна" 570 | 571 | #: sensors.js:471 572 | msgid "storage" 573 | msgstr "сховішча" 574 | -------------------------------------------------------------------------------- /locale/ca/LC_MESSAGES/vitals.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/corecoding/Vitals/66b99a7bcc010b18f76438265a2a6744f392e35e/locale/ca/LC_MESSAGES/vitals.mo -------------------------------------------------------------------------------- /locale/cs/LC_MESSAGES/vitals.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/corecoding/Vitals/66b99a7bcc010b18f76438265a2a6744f392e35e/locale/cs/LC_MESSAGES/vitals.mo -------------------------------------------------------------------------------- /locale/cs/LC_MESSAGES/vitals.po: -------------------------------------------------------------------------------- 1 | # Czech translation for gnome-shell-extension-vitals. 2 | # 3 | # This file is distributed under the same license as the 4 | # gnome-shell-extension-vitals package. 5 | # 6 | # Ludek Vydra < lvtran@u.k2.cz >, 2022. 7 | # 8 | msgid "" 9 | msgstr "" 10 | "Project-Id-Version: \n" 11 | "POT-Creation-Date: 2023-10-22 21:04+0200\n" 12 | "PO-Revision-Date: \n" 13 | "Last-Translator: Ludek Vydra \n" 14 | "Language-Team: \n" 15 | "Language: cs\n" 16 | "MIME-Version: 1.0\n" 17 | "Content-Type: text/plain; charset=UTF-8\n" 18 | "Content-Transfer-Encoding: 8bit\n" 19 | "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n>=2 && n<=4 ? 1 : 2);\n" 20 | "POT-Revision-Date: 2018-12-29 10:26+0100\n" 21 | "X-Generator: Poedit 3.4.4\n" 22 | "X-Poedit-Basepath: ..\n" 23 | "X-Poedit-SearchPath-0: values.js\n" 24 | "X-Poedit-SearchPath-1: sensors.js\n" 25 | "X-Poedit-SearchPath-2: prefs.js\n" 26 | "X-Poedit-SearchPath-3: menuItem.js\n" 27 | "X-Poedit-SearchPath-4: extension.js\n" 28 | "X-Poedit-SearchPath-5: schemas/org.gnome.shell.extensions.vitals.gschema." 29 | "xml\n" 30 | "X-Poedit-SearchPath-6: prefs.ui\n" 31 | 32 | #: extension.js:109 33 | msgid "Batteries" 34 | msgstr "Baterie" 35 | 36 | #: extension.js:133 37 | msgid "No Data" 38 | msgstr "Nejsou data" 39 | 40 | #: extension.js:159 41 | msgid "Refresh" 42 | msgstr "Obnovit" 43 | 44 | #: extension.js:174 45 | msgid "System Monitor" 46 | msgstr "Sledování systému" 47 | 48 | #: extension.js:182 prefs.js:106 49 | msgid "Preferences" 50 | msgstr "Předvolby" 51 | 52 | #: prefs.ui:42 schemas/org.gnome.shell.extensions.vitals.gschema.xml:81 53 | msgid "Include public IP address" 54 | msgstr "Zahrnout veřejnou adresu" 55 | 56 | #: prefs.ui:70 57 | msgid "Format" 58 | msgstr "Formát" 59 | 60 | #: prefs.ui:78 61 | msgid "Bytes" 62 | msgstr "Bajty" 63 | 64 | #: prefs.ui:79 65 | msgid "Bits" 66 | msgstr "Bity" 67 | 68 | #: prefs.ui:121 69 | msgid "General" 70 | msgstr "Všeobecné" 71 | 72 | #: prefs.ui:149 schemas/org.gnome.shell.extensions.vitals.gschema.xml:11 73 | msgid "Seconds between updates" 74 | msgstr "Sekund mezi měřeními" 75 | 76 | #: prefs.ui:184 schemas/org.gnome.shell.extensions.vitals.gschema.xml:16 77 | msgid "Position in panel" 78 | msgstr "Umístění na panelu" 79 | 80 | #: prefs.ui:193 81 | msgid "Left" 82 | msgstr "Vlevo" 83 | 84 | #: prefs.ui:194 85 | msgid "Center" 86 | msgstr "Uprostřed" 87 | 88 | #: prefs.ui:195 89 | msgid "Right" 90 | msgstr "Vpravo" 91 | 92 | #: prefs.ui:196 93 | msgid "Far Left" 94 | msgstr "Úplně vlevo" 95 | 96 | #: prefs.ui:197 97 | msgid "Far Right" 98 | msgstr "Úplně vpravo" 99 | 100 | #: prefs.ui:220 schemas/org.gnome.shell.extensions.vitals.gschema.xml:21 101 | msgid "Use higher precision" 102 | msgstr "Použij vyšší přesnost" 103 | 104 | #: prefs.ui:247 schemas/org.gnome.shell.extensions.vitals.gschema.xml:26 105 | msgid "Alphabetize sensors" 106 | msgstr "Seřaď senzory abecedně" 107 | 108 | #: prefs.ui:274 schemas/org.gnome.shell.extensions.vitals.gschema.xml:31 109 | msgid "Hide zero values" 110 | msgstr "Skryj nulové hodnoty" 111 | 112 | #: prefs.ui:301 113 | msgid "Use fixed widths" 114 | msgstr "Použij pevné rozestupy" 115 | 116 | #: prefs.ui:328 schemas/org.gnome.shell.extensions.vitals.gschema.xml:171 117 | msgid "Hide icons in top bar" 118 | msgstr "Skryj ikony v horní liště" 119 | 120 | #: prefs.ui:355 121 | msgid "Menu always centered" 122 | msgstr "Menu vždy centrovené" 123 | 124 | #: prefs.ui:379 125 | msgid "About" 126 | msgstr "O programu" 127 | 128 | #: prefs.ui:394 129 | msgid "" 130 | "Feature requests or bugs? Please visit GitHub. No warranty, expressed or implied. Donate if you found this " 133 | "useful." 134 | msgstr "" 135 | "Návrhy nebo jste našli chybu? Navštivte, prosím, GitHub. Bez záruk vyjádřených anebo " 137 | "předpokládaných. Přispějte " 138 | "pokud to tak cítíte." 139 | 140 | #: prefs.ui:421 141 | msgid "Sensors" 142 | msgstr "Senzory" 143 | 144 | #: prefs.ui:449 schemas/org.gnome.shell.extensions.vitals.gschema.xml:36 145 | msgid "Monitor temperature" 146 | msgstr "Sledovat teplotu" 147 | 148 | #: prefs.ui:500 schemas/org.gnome.shell.extensions.vitals.gschema.xml:46 149 | msgid "Monitor voltage" 150 | msgstr "Sledovat napětí" 151 | 152 | #: prefs.ui:528 schemas/org.gnome.shell.extensions.vitals.gschema.xml:51 153 | msgid "Monitor fan" 154 | msgstr "Sledovat ventilátory" 155 | 156 | #: prefs.ui:556 schemas/org.gnome.shell.extensions.vitals.gschema.xml:56 157 | msgid "Monitor memory" 158 | msgstr "Sledovat paměť" 159 | 160 | #: prefs.ui:607 schemas/org.gnome.shell.extensions.vitals.gschema.xml:61 161 | msgid "Monitor processor" 162 | msgstr "Sledovat procesor" 163 | 164 | #: prefs.ui:658 schemas/org.gnome.shell.extensions.vitals.gschema.xml:66 165 | msgid "Monitor system" 166 | msgstr "Sledovat systém" 167 | 168 | #: prefs.ui:709 schemas/org.gnome.shell.extensions.vitals.gschema.xml:76 169 | msgid "Monitor network" 170 | msgstr "Sledovat síť" 171 | 172 | #: prefs.ui:760 schemas/org.gnome.shell.extensions.vitals.gschema.xml:71 173 | msgid "Monitor storage" 174 | msgstr "Sledovat úložiště" 175 | 176 | #: prefs.ui:811 schemas/org.gnome.shell.extensions.vitals.gschema.xml:96 177 | msgid "Monitor battery" 178 | msgstr "Sledovat baterii" 179 | 180 | #: prefs.ui:890 181 | msgid "Path" 182 | msgstr "Cesta" 183 | 184 | #: prefs.ui:922 prefs.ui:1031 185 | msgid "Measurement" 186 | msgstr "Měření" 187 | 188 | #: prefs.ui:930 prefs.ui:1039 189 | msgid "Binary" 190 | msgstr "Binárně" 191 | 192 | #: prefs.ui:931 prefs.ui:1040 193 | msgid "Decimal" 194 | msgstr "Decimálně" 195 | 196 | #: prefs.ui:976 197 | msgid "Unit" 198 | msgstr "Jednotka" 199 | 200 | #: prefs.ui:985 201 | msgid "°C" 202 | msgstr "°C" 203 | 204 | #: prefs.ui:986 205 | msgid "°F" 206 | msgstr "°F" 207 | 208 | #: prefs.ui:1086 209 | msgid "Monitor BAT0" 210 | msgstr "Sleduj BAT0" 211 | 212 | #: prefs.ui:1116 213 | msgid "Monitor BAT1" 214 | msgstr "Sleduj BAT1" 215 | 216 | #: prefs.ui:1146 217 | msgid "Monitor BAT2" 218 | msgstr "Sleduj BAT2" 219 | 220 | #: prefs.ui:1176 221 | msgid "Monitor CMB0" 222 | msgstr "Sleduj CMB0" 223 | 224 | #: prefs.ui:1206 225 | msgid "Monitor macsmc-battery" 226 | msgstr "Sleduj macsmc-battery" 227 | 228 | #: prefs.ui:1247 229 | msgid "Calculate Combined Values" 230 | msgstr "Výpočet kombinovaných hodnot" 231 | 232 | #: prefs.ui:1277 schemas/org.gnome.shell.extensions.vitals.gschema.xml:141 233 | msgid "Include BAT0" 234 | msgstr "Včetně BAT0" 235 | 236 | #: prefs.ui:1307 schemas/org.gnome.shell.extensions.vitals.gschema.xml:146 237 | msgid "Include BAT1" 238 | msgstr "Včetně BAT1" 239 | 240 | #: prefs.ui:1337 schemas/org.gnome.shell.extensions.vitals.gschema.xml:151 241 | msgid "Include BAT2" 242 | msgstr "Včetně BAT2" 243 | 244 | #: prefs.ui:1367 schemas/org.gnome.shell.extensions.vitals.gschema.xml:156 245 | msgid "Include CMB0" 246 | msgstr "Včetně CMB0" 247 | 248 | #: prefs.ui:1397 schemas/org.gnome.shell.extensions.vitals.gschema.xml:161 249 | msgid "Include macsmc-battery" 250 | msgstr "Včetně macsmc-battery" 251 | 252 | #: prefs.ui:1446 253 | msgid "Monitor command" 254 | msgstr "Sleduj command" 255 | 256 | #: prefs.ui:1498 257 | msgid "Include static info" 258 | msgstr "Včetně statických informací" 259 | 260 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:6 261 | msgid "Sensors to show in panel" 262 | msgstr "Senzory na panelu" 263 | 264 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:7 265 | msgid "List of sensors to be shown in the panel" 266 | msgstr "Seznam senzorů na panelu" 267 | 268 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:12 269 | msgid "Delay between sensor polling" 270 | msgstr "Čas mezi měřeními senzorů" 271 | 272 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:17 273 | msgid "Position in Panel ('left', 'center', 'right')" 274 | msgstr "Pozice na panelu ('Vlevo', 'Střed', 'Vpravo')" 275 | 276 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:22 277 | msgid "Show one extra digit after decimal" 278 | msgstr "Zobraz jedno číslo za desetinnou čárkou" 279 | 280 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:27 281 | msgid "Display sensors in alphabetical order" 282 | msgstr "Zobraz senzory v abecedním seřazení" 283 | 284 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:32 285 | msgid "Hide data from sensors that are invalid" 286 | msgstr "Skryj data ze senzorů, která jsou neplatná" 287 | 288 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:37 289 | msgid "Display temperature of various components" 290 | msgstr "Zobraz teplotu různých komponent" 291 | 292 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:41 293 | msgid "Temperature unit" 294 | msgstr "Jednotka teploty" 295 | 296 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:42 297 | msgid "" 298 | "The unit ('centigrade' or 'fahrenheit') the extension should display the " 299 | "temperature in" 300 | msgstr "Jednotka (°C, °F) pro zobrazení teploty" 301 | 302 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:47 303 | msgid "Display voltage of various components" 304 | msgstr "Zobraz teplotu různých komponent" 305 | 306 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:52 307 | msgid "Display fan rotation per minute" 308 | msgstr "Zobraz otáčky ventilátoru za minutu" 309 | 310 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:57 311 | msgid "Display memory information" 312 | msgstr "Zobraz informace o paměti" 313 | 314 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:62 315 | msgid "Display processor information" 316 | msgstr "Zobraz informace o procesoru" 317 | 318 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:67 319 | msgid "Display system information" 320 | msgstr "Zobraz systémové informace" 321 | 322 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:72 323 | msgid "Display storage information" 324 | msgstr "Zobraz informace o úložišti" 325 | 326 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:77 327 | msgid "Display network information" 328 | msgstr "Zobraz informace o síti" 329 | 330 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:82 331 | msgid "Display public IP address of internet connection" 332 | msgstr "Zobraz veřejnou IP adresu internetového připojení" 333 | 334 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:86 335 | msgid "Network speed format" 336 | msgstr "Formát rychlosti sítě" 337 | 338 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:87 339 | msgid "Should speed display in bits or bytes?" 340 | msgstr "Zobrazení rychlosti v bitech nebo bajtech?" 341 | 342 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:91 343 | msgid "Storage path" 344 | msgstr "Cesta k úložišti" 345 | 346 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:92 347 | msgid "Storage path for monitoring" 348 | msgstr "Sledovaná cesta k úložišti" 349 | 350 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:97 351 | msgid "Monitor battery health" 352 | msgstr "Sleduj zdraví baterie" 353 | 354 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:101 355 | msgid "Memory measurement" 356 | msgstr "Měření paměti" 357 | 358 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:102 359 | msgid "Can use gigabyte or gibibyte for memory" 360 | msgstr "Pro jednotku velikosti paměti můžete použít gigabyte nebo gibibyte" 361 | 362 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:106 363 | msgid "Storage measurement" 364 | msgstr "Měření úložiště" 365 | 366 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:107 367 | msgid "Can use gigabyte or gibibyte for storage" 368 | msgstr "Pro jednotku velikosti úložiště můžete použít gigabyte nebo gibibyte" 369 | 370 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:111 371 | msgid "Display battery BAT0" 372 | msgstr "Zobraz baterii BAT0" 373 | 374 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:112 375 | msgid "Should battery 'BAT0' be displayed?" 376 | msgstr "Má se zobrazit 'BAT0'?" 377 | 378 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:116 379 | msgid "Display battery BAT1" 380 | msgstr "Zobraz baterii BAT1" 381 | 382 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:117 383 | msgid "Should battery 'BAT1' be displayed?" 384 | msgstr "Má se zobrazit 'BAT1'?" 385 | 386 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:121 387 | msgid "Display battery BAT2" 388 | msgstr "Zobraz baterii BAT2" 389 | 390 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:122 391 | msgid "Should battery 'BAT2' be displayed?" 392 | msgstr "Má se zobrazit 'BAT2'?" 393 | 394 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:126 395 | msgid "Display battery CMB0" 396 | msgstr "Zobraz baterii CMB0" 397 | 398 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:127 399 | msgid "Should battery 'CMB0' be displayed?" 400 | msgstr "Má se zobrazit 'CMB0'?" 401 | 402 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:131 403 | msgid "Display battery macsmc-battery" 404 | msgstr "Zobraz baterii macsmc-battery" 405 | 406 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:132 407 | msgid "Should battery 'macsmc-battery' be displayed?" 408 | msgstr "Má se zobrazit 'macsmc-battery'?" 409 | 410 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:136 411 | msgid "Display combined battery data" 412 | msgstr "Zobraz kombinované údaje baterií" 413 | 414 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:137 415 | msgid "Display combined values for selected batteries" 416 | msgstr "Zobraz kombinované hodnoty pro vybrané baterie" 417 | 418 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:142 419 | msgid "Include 'BAT0' when calculating combined Battery" 420 | msgstr "Při výpočtu kombinované baterie zahrň \"BAT0\"" 421 | 422 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:147 423 | msgid "Include 'BAT1' when calculating combined Battery" 424 | msgstr "Při výpočtu kombinované baterie zahrň \"BAT1\"" 425 | 426 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:152 427 | msgid "Include 'BAT2' when calculating combined Battery" 428 | msgstr "Při výpočtu kombinované baterie zahrň \"BAT1\"" 429 | 430 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:157 431 | msgid "Include 'CMB0' when calculating combined Battery" 432 | msgstr "Při výpočtu kombinované baterie zahrň \"CMB0\"" 433 | 434 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:162 435 | msgid "Include 'macsmc-battery' when calculating combined Battery" 436 | msgstr "Při výpočtu kombinované baterie zahrň \"macsmc-battery\"" 437 | 438 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:166 439 | msgid "Use fixed widths in top bar" 440 | msgstr "Použij pevné rozestupy v horní liště" 441 | 442 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:167 443 | msgid "Keep sensors in top bar from jumping around" 444 | msgstr "Zabraň náhodnému měnění pořadí senzorů v horní liště" 445 | 446 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:172 447 | msgid "Keep top bar clean by only showing sensor values" 448 | msgstr "Zachovej čistou horní lištu tak, že senzory budou ukazovat jen hodnoty" 449 | 450 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:176 451 | msgid "Make the menu centered" 452 | msgstr "Centruj menu" 453 | 454 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:177 455 | msgid "Center the menu to the icon regardless of the position in the panel" 456 | msgstr "Vycentrování nabídky na ikonu bez ohledu na pozici na panelu" 457 | 458 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:181 459 | msgid "System Monitor command" 460 | msgstr "Příkaz Sledování systému" 461 | 462 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:182 463 | msgid "The command run when system monitor button is clicked" 464 | msgstr "Příkaz spuštěný po kliknutí na tlačítko monitoru systému" 465 | 466 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:186 467 | msgid "Include processor static information" 468 | msgstr "Zobraz statické informace procesoru" 469 | 470 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:187 471 | msgid "Display processor static information that doesn't change" 472 | msgstr "Zobrazení statických (neměnných) informací procesoru" 473 | 474 | #: sensors.js:65 475 | msgid "Public IP" 476 | msgstr "Veřejná IP" 477 | 478 | #: sensors.js:133 sensors.js:181 479 | msgid "Usage" 480 | msgstr "Použito" 481 | 482 | #: sensors.js:134 483 | msgid "memory" 484 | msgstr "paměť" 485 | 486 | #: sensors.js:135 487 | msgid "Physical" 488 | msgstr "Fyzická" 489 | 490 | #: sensors.js:136 491 | msgid "Available" 492 | msgstr "Dostupná" 493 | 494 | #: sensors.js:137 495 | msgid "Allocated" 496 | msgstr "Obsazeno" 497 | 498 | #: sensors.js:138 499 | msgid "Cached" 500 | msgstr "Cache" 501 | 502 | #: sensors.js:139 sensors.js:355 503 | msgid "Free" 504 | msgstr "Volno" 505 | 506 | #: sensors.js:154 507 | msgid "Swap Total" 508 | msgstr "Swap Dostupná" 509 | 510 | #: sensors.js:155 511 | msgid "Swap Free" 512 | msgstr "Swap Volno" 513 | 514 | #: sensors.js:156 515 | msgid "Swap Used" 516 | msgstr "Swap Obsazeno" 517 | 518 | #: sensors.js:157 519 | msgid "Swap Usage" 520 | msgstr "Swap Použito" 521 | 522 | #: sensors.js:248 523 | msgid "Average" 524 | msgstr "Průměr" 525 | 526 | #: sensors.js:180 527 | msgid "processor" 528 | msgstr "procesor" 529 | 530 | #: sensors.js:183 531 | #, javascript-format 532 | msgid "Core %d" 533 | msgstr "Jádro %d" 534 | 535 | #: sensors.js:213 sensors.js:222 536 | msgid "Frequency" 537 | msgstr "Frekvence" 538 | 539 | #: sensors.js:231 540 | msgid "Open Files" 541 | msgstr "Otevřené soubory" 542 | 543 | #: sensors.js:238 544 | msgid "Load 1m" 545 | msgstr "Zátěž za poslední minutu" 546 | 547 | #: sensors.js:239 548 | msgid "system" 549 | msgstr "systém" 550 | 551 | #: sensors.js:240 552 | msgid "Load 5m" 553 | msgstr "Zátěž za posledních 5 minut" 554 | 555 | #: sensors.js:241 556 | msgid "Load 15m" 557 | msgstr "Zátěž za posledních 15 minut" 558 | 559 | #: sensors.js:242 560 | msgid "Threads Active" 561 | msgstr "Aktivní vlákna" 562 | 563 | #: sensors.js:243 564 | msgid "Threads Total" 565 | msgstr "Vláken celkem" 566 | 567 | #: sensors.js:248 568 | msgid "Uptime" 569 | msgstr "Délka zapnutí" 570 | 571 | #: sensors.js:252 572 | msgid "Process Time" 573 | msgstr "Procesorový čas" 574 | 575 | #: sensors.js:302 576 | msgid "WiFi Link Quality" 577 | msgstr "Kvalita WiFi signálu" 578 | 579 | #: sensors.js:303 580 | msgid "WiFi Signal Level" 581 | msgstr "Úroveň WiFi signálu" 582 | 583 | #: sensors.js:318 584 | msgid "ARC Target" 585 | msgstr "ARC cíl" 586 | 587 | #: sensors.js:319 588 | msgid "ARC Maximum" 589 | msgstr "ARC maximum" 590 | 591 | #: sensors.js:320 592 | msgid "ARC Current" 593 | msgstr "ARC aktuálně" 594 | 595 | #: sensors.js:330 596 | msgid "Read total" 597 | msgstr "Přečteno celkem" 598 | 599 | #: sensors.js:331 600 | msgid "Write total" 601 | msgstr "Zapsáno celkem" 602 | 603 | #: sensors.js:332 604 | msgid "Read rate" 605 | msgstr "Rychlost čtení" 606 | 607 | #: sensors.js:333 608 | msgid "Write rate" 609 | msgstr "Rychlost zápisu" 610 | 611 | #: sensors.js:352 612 | msgid "Total" 613 | msgstr "Celkem" 614 | 615 | #: sensors.js:353 616 | msgid "Used" 617 | msgstr "Použito" 618 | 619 | #: sensors.js:354 620 | msgid "Reserved" 621 | msgstr "Vyhrazeno" 622 | 623 | #: sensors.js:356 624 | msgid "storage" 625 | msgstr "úložiště" 626 | 627 | #: sensors.js:393 628 | msgid "Label" 629 | msgstr "Štítek" 630 | 631 | #: sensors.js:404 sensors.js:529 632 | msgid "State" 633 | msgstr "Stav" 634 | 635 | #: sensors.js:409 sensors.js:519 636 | msgid "Cycles" 637 | msgstr "Ccykly" 638 | 639 | #: sensors.js:414 640 | msgid "Voltage" 641 | msgstr "Napětí" 642 | 643 | #: sensors.js:418 644 | msgid "Level" 645 | msgstr "Úroveň" 646 | 647 | #: sensors.js:422 sensors.js:553 648 | msgid "Percentage" 649 | msgstr "Procenta" 650 | 651 | #: sensors.js:432 sensors.js:527 652 | msgid "Rate" 653 | msgstr "Rychlost" 654 | 655 | #: sensors.js:442 sensors.js:535 656 | msgid "Energy (full)" 657 | msgstr "Energie (plná)" 658 | 659 | #: sensors.js:451 sensors.js:541 660 | msgid "Energy (design)" 661 | msgstr "Energie (design)" 662 | 663 | #: sensors.js:455 664 | msgid "Capacity" 665 | msgstr "Kapacita" 666 | 667 | #: sensors.js:464 sensors.js:547 668 | msgid "Energy (now)" 669 | msgstr "Energie (nyní)" 670 | 671 | #: sensors.js:501 sensors.js:504 sensors.js:588 sensors.js:591 672 | msgid "Time left" 673 | msgstr "Zbývající čas" 674 | 675 | #: sensors.js:677 676 | msgid "Vendor" 677 | msgstr "Výrobce" 678 | 679 | #: sensors.js:678 680 | msgid "Bogomips" 681 | msgstr "Bogomipsy" 682 | 683 | #: sensors.js:679 684 | msgid "Sockets" 685 | msgstr "Sokety" 686 | 687 | #: sensors.js:680 688 | msgid "Cache" 689 | msgstr "Cache" 690 | 691 | #: sensors.js:685 692 | msgid "Kernel" 693 | msgstr "Kernel" 694 | 695 | #: prefs.js:98 696 | msgid "Temperature" 697 | msgstr "Teplota" 698 | 699 | #: prefs.js:98 700 | msgid "Network" 701 | msgstr "Síť" 702 | 703 | #: prefs.js:98 704 | msgid "Storage" 705 | msgstr "Úložiště" 706 | 707 | #: prefs.js:98 708 | msgid "Memory" 709 | msgstr "Paměť" 710 | 711 | #: prefs.js:98 712 | msgid "Battery" 713 | msgstr "Baterie" 714 | 715 | #: extension.js:112 716 | msgid "Battery 1" 717 | msgstr "Baterie 1" 718 | 719 | #: extension.js:112 720 | msgid "Battery 2" 721 | msgstr "Baterie 2" 722 | 723 | #: extension.js:112 724 | msgid "Battery 3" 725 | msgstr "Baterie 3" 726 | 727 | #: extension.js:112 728 | msgid "Battery 4" 729 | msgstr "Baterie 4" 730 | 731 | #: extension.js:112 732 | msgid "Battery 5" 733 | msgstr "Baterie 5" 734 | 735 | #: extension.js:115 736 | msgid "Battery (hidden)" 737 | msgstr "Baterie (skryto)" 738 | 739 | #: prefs.js:98 740 | msgid "System" 741 | msgstr "Systém" 742 | 743 | #: prefs.js:98 744 | msgid "Processor" 745 | msgstr "Procesor" 746 | 747 | #: sensors.js:759 748 | msgid "Fan" 749 | msgstr "Ventilátor" 750 | 751 | #~ msgid "Battery slot to monitor" 752 | #~ msgstr "Slot baterie, která se má monitorovat" 753 | 754 | #~ msgid "Which numerical battery slot should vitals monitor" 755 | #~ msgstr "Které číslo slotu má Vitals sledovat" 756 | 757 | #~ msgid "Boost" 758 | #~ msgstr "Boost" 759 | 760 | #: sensors.js:589, sensors.js:648, sensors.js:674 761 | msgid "Graphics" 762 | msgstr "Graf. karta" 763 | 764 | #: sensors.js:603, sensors.js:655 765 | msgid "Memory Used" 766 | msgstr "Paměť Obsazeno" 767 | 768 | #: sensors.js:602, sensors.js:660 769 | msgid "Memory Total" 770 | msgstr "Paměť Celkem" 771 | 772 | #: prefs.ui:901 773 | msgid "Monitor GPU (beta)" 774 | msgstr "Sledování GPU (beta)" 775 | 776 | #: prefs.ui:1378 777 | msgid "Include static GPU info" 778 | msgstr "Včetně statických informací" 779 | 780 | -------------------------------------------------------------------------------- /locale/de/LC_MESSAGES/vitals.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/corecoding/Vitals/66b99a7bcc010b18f76438265a2a6744f392e35e/locale/de/LC_MESSAGES/vitals.mo -------------------------------------------------------------------------------- /locale/de/LC_MESSAGES/vitals.po: -------------------------------------------------------------------------------- 1 | msgid "" 2 | msgstr "" 3 | "Project-Id-Version: \n" 4 | "POT-Creation-Date: 2023-10-22 21:04+0200\n" 5 | "PO-Revision-Date: \n" 6 | "Last-Translator: Andreas Rohr \n" 7 | "Language-Team: \n" 8 | "Language: de_DE\n" 9 | "MIME-Version: 1.0\n" 10 | "Content-Type: text/plain; charset=UTF-8\n" 11 | "Content-Transfer-Encoding: 8bit\n" 12 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" 13 | "POT-Revision-Date: 2018-12-29 10:26+0100\n" 14 | "X-Generator: Poedit 3.4\n" 15 | "X-Poedit-Basepath: ..\n" 16 | "X-Poedit-SearchPath-0: values.js\n" 17 | "X-Poedit-SearchPath-1: sensors.js\n" 18 | "X-Poedit-SearchPath-2: prefs.js\n" 19 | "X-Poedit-SearchPath-3: menuItem.js\n" 20 | "X-Poedit-SearchPath-4: extension.js\n" 21 | "X-Poedit-SearchPath-5: schemas/org.gnome.shell.extensions.vitals.gschema." 22 | "xml\n" 23 | "X-Poedit-SearchPath-6: prefs.ui\n" 24 | 25 | #: extension.js:109 26 | msgid "Batteries" 27 | msgstr "Akkus" 28 | 29 | #: extension.js:133 30 | msgid "No Data" 31 | msgstr "Keine Daten" 32 | 33 | #: extension.js:159 34 | msgid "Refresh" 35 | msgstr "Aktualisieren" 36 | 37 | #: extension.js:174 38 | msgid "System Monitor" 39 | msgstr "Systemmonitor" 40 | 41 | #: extension.js:182 prefs.js:106 42 | msgid "Preferences" 43 | msgstr "Einstellungen" 44 | 45 | #: prefs.ui:42 schemas/org.gnome.shell.extensions.vitals.gschema.xml:81 46 | msgid "Include public IP address" 47 | msgstr "Öffentliche IP anzeigen" 48 | 49 | #: prefs.ui:70 50 | msgid "Format" 51 | msgstr "Format" 52 | 53 | #: prefs.ui:78 54 | msgid "Bytes" 55 | msgstr "Bytes" 56 | 57 | #: prefs.ui:79 58 | msgid "Bits" 59 | msgstr "Bits" 60 | 61 | #: prefs.ui:121 62 | msgid "General" 63 | msgstr "Allgemein" 64 | 65 | #: prefs.ui:149 schemas/org.gnome.shell.extensions.vitals.gschema.xml:11 66 | msgid "Seconds between updates" 67 | msgstr "Sekunden zwischen den Updates" 68 | 69 | #: prefs.ui:184 schemas/org.gnome.shell.extensions.vitals.gschema.xml:16 70 | msgid "Position in panel" 71 | msgstr "Position im Panel" 72 | 73 | #: prefs.ui:193 74 | msgid "Left" 75 | msgstr "Links" 76 | 77 | #: prefs.ui:194 78 | msgid "Center" 79 | msgstr "Mitte" 80 | 81 | #: prefs.ui:195 82 | msgid "Right" 83 | msgstr "Rechts" 84 | 85 | #: prefs.ui:196 86 | msgid "Far Left" 87 | msgstr "Ganz links" 88 | 89 | #: prefs.ui:197 90 | msgid "Far Right" 91 | msgstr "Ganz rechts" 92 | 93 | #: prefs.ui:220 schemas/org.gnome.shell.extensions.vitals.gschema.xml:21 94 | msgid "Use higher precision" 95 | msgstr "Höhere Präzision nutzen" 96 | 97 | #: prefs.ui:247 schemas/org.gnome.shell.extensions.vitals.gschema.xml:26 98 | msgid "Alphabetize sensors" 99 | msgstr "Alphabetische Sensoren" 100 | 101 | #: prefs.ui:274 schemas/org.gnome.shell.extensions.vitals.gschema.xml:31 102 | msgid "Hide zero values" 103 | msgstr "0-Werte verstecken" 104 | 105 | #: prefs.ui:301 106 | msgid "Use fixed widths" 107 | msgstr "Feste Breite nutzen" 108 | 109 | #: prefs.ui:328 schemas/org.gnome.shell.extensions.vitals.gschema.xml:171 110 | msgid "Hide icons in top bar" 111 | msgstr "Icons in oberer Leiste verstecken" 112 | 113 | #: prefs.ui:355 114 | msgid "Menu always centered" 115 | msgstr "Menü immer zentrieren" 116 | 117 | #: prefs.ui:379 118 | msgid "About" 119 | msgstr "Über" 120 | 121 | # Added a \n so "Donate" will be in a new line 122 | #: prefs.ui:394 123 | msgid "" 124 | "Feature requests or bugs? Please visit GitHub. No warranty, expressed or implied. Donate if you found this " 127 | "useful." 128 | msgstr "" 129 | "Funktionsanfrage oder Bugs? Besuche: GitHub. Keine Garantie, weder ausdrücklich noch " 131 | "stillschweigend.\n" 132 | " Spenden, wenn es dir " 133 | "gefällt." 134 | 135 | #: prefs.ui:421 136 | msgid "Sensors" 137 | msgstr "Sensoren" 138 | 139 | #: prefs.ui:449 schemas/org.gnome.shell.extensions.vitals.gschema.xml:36 140 | msgid "Monitor temperature" 141 | msgstr "Temperatur überwachen" 142 | 143 | #: prefs.ui:500 schemas/org.gnome.shell.extensions.vitals.gschema.xml:46 144 | msgid "Monitor voltage" 145 | msgstr "Spannungen überwachen" 146 | 147 | #: prefs.ui:528 schemas/org.gnome.shell.extensions.vitals.gschema.xml:51 148 | msgid "Monitor fan" 149 | msgstr "Lüfter überwachen" 150 | 151 | #: prefs.ui:556 schemas/org.gnome.shell.extensions.vitals.gschema.xml:56 152 | msgid "Monitor memory" 153 | msgstr "Speicher überwachen" 154 | 155 | #: prefs.ui:607 schemas/org.gnome.shell.extensions.vitals.gschema.xml:61 156 | msgid "Monitor processor" 157 | msgstr "CPU überwachen" 158 | 159 | #: prefs.ui:658 schemas/org.gnome.shell.extensions.vitals.gschema.xml:66 160 | msgid "Monitor system" 161 | msgstr "System überwachen" 162 | 163 | #: prefs.ui:709 schemas/org.gnome.shell.extensions.vitals.gschema.xml:76 164 | msgid "Monitor network" 165 | msgstr "Netzwerk überwachen" 166 | 167 | #: prefs.ui:760 schemas/org.gnome.shell.extensions.vitals.gschema.xml:71 168 | msgid "Monitor storage" 169 | msgstr "Speicher überwachen" 170 | 171 | #: prefs.ui:811 schemas/org.gnome.shell.extensions.vitals.gschema.xml:96 172 | msgid "Monitor battery" 173 | msgstr "Akku überwachen" 174 | 175 | #: prefs.ui:890 176 | msgid "Path" 177 | msgstr "Pfad" 178 | 179 | #: prefs.ui:922 prefs.ui:1031 180 | msgid "Measurement" 181 | msgstr "Messwert" 182 | 183 | #: prefs.ui:930 prefs.ui:1039 184 | msgid "Binary" 185 | msgstr "Binär" 186 | 187 | #: prefs.ui:931 prefs.ui:1040 188 | msgid "Decimal" 189 | msgstr "Dezimal" 190 | 191 | #: prefs.ui:976 192 | msgid "Unit" 193 | msgstr "Einheit" 194 | 195 | #: prefs.ui:985 196 | msgid "°C" 197 | msgstr "" 198 | 199 | #: prefs.ui:986 200 | msgid "°F" 201 | msgstr "" 202 | 203 | #: prefs.ui:1086 204 | msgid "Monitor BAT0" 205 | msgstr "Akku „BAT0“ anzeigen" 206 | 207 | #: prefs.ui:1116 208 | msgid "Monitor BAT1" 209 | msgstr "Akku „BAT1“ anzeigen" 210 | 211 | #: prefs.ui:1146 212 | msgid "Monitor BAT2" 213 | msgstr "Akku „BAT2“ anzeigen" 214 | 215 | #: prefs.ui:1176 216 | msgid "Monitor CMB0" 217 | msgstr "Akku „CMB0“ anzeigen" 218 | 219 | #: prefs.ui:1206 220 | msgid "Monitor macsmc-battery" 221 | msgstr "Akku „macsmc-battery“ anzeigen" 222 | 223 | #: prefs.ui:1247 224 | msgid "Calculate Combined Values" 225 | msgstr "Kombinierte Werte berechnen" 226 | 227 | #: prefs.ui:1277 schemas/org.gnome.shell.extensions.vitals.gschema.xml:141 228 | msgid "Include BAT0" 229 | msgstr "„BAT0“ einbeziehen" 230 | 231 | #: prefs.ui:1307 schemas/org.gnome.shell.extensions.vitals.gschema.xml:146 232 | msgid "Include BAT1" 233 | msgstr "„BAT1“ einbeziehen" 234 | 235 | #: prefs.ui:1337 schemas/org.gnome.shell.extensions.vitals.gschema.xml:151 236 | msgid "Include BAT2" 237 | msgstr "„BAT2“ einbeziehen" 238 | 239 | #: prefs.ui:1367 schemas/org.gnome.shell.extensions.vitals.gschema.xml:156 240 | msgid "Include CMB0" 241 | msgstr "„CMB0“ einbeziehen" 242 | 243 | #: prefs.ui:1397 schemas/org.gnome.shell.extensions.vitals.gschema.xml:161 244 | msgid "Include macsmc-battery" 245 | msgstr "„macsmc-battery“ einbeziehen" 246 | 247 | #: prefs.ui:1446 248 | msgid "Monitor command" 249 | msgstr "Monitoring Befehl" 250 | 251 | #: prefs.ui:1498 252 | msgid "Include static info" 253 | msgstr "Statische Infos einbeziehen" 254 | 255 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:6 256 | msgid "Sensors to show in panel" 257 | msgstr "In Panel anzuzeigende Sensoren" 258 | 259 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:7 260 | msgid "List of sensors to be shown in the panel" 261 | msgstr "Liste der Sensoren, die im Panel angezeigt werden" 262 | 263 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:12 264 | msgid "Delay between sensor polling" 265 | msgstr "Verzögerung zwischen Sensorabfragen" 266 | 267 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:17 268 | msgid "Position in Panel ('left', 'center', 'right')" 269 | msgstr "Position im Panel ('Links', 'Mitte', 'Rechts')" 270 | 271 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:22 272 | msgid "Show one extra digit after decimal" 273 | msgstr "Zusätzliche Ziffer nach dem Komma anzeigen" 274 | 275 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:27 276 | msgid "Display sensors in alphabetical order" 277 | msgstr "Sensoren in alphabetischer Reihenfolge anzeigen" 278 | 279 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:32 280 | msgid "Hide data from sensors that are invalid" 281 | msgstr "Invalide Sensoren ausblenden" 282 | 283 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:37 284 | msgid "Display temperature of various components" 285 | msgstr "Zeige Temperaturen verschiedener Komponenten" 286 | 287 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:41 288 | msgid "Temperature unit" 289 | msgstr "Temperatureinheit" 290 | 291 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:42 292 | msgid "" 293 | "The unit ('centigrade' or 'fahrenheit') the extension should display the " 294 | "temperature in" 295 | msgstr "" 296 | "Die Einheit (\"Celsius\" oder \"Fahrenheit\"), in der die Erweiterung die " 297 | "Temperatur anzeigen soll" 298 | 299 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:47 300 | msgid "Display voltage of various components" 301 | msgstr "Zeige Spannungen verschiedener Komponenten" 302 | 303 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:52 304 | msgid "Display fan rotation per minute" 305 | msgstr "Zeige Lüfterumdrehungen (rpm)" 306 | 307 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:57 308 | msgid "Display memory information" 309 | msgstr "Zeige Speicherinformationen (RAM)" 310 | 311 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:62 312 | msgid "Display processor information" 313 | msgstr "Zeige CPU-Informationen" 314 | 315 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:67 316 | msgid "Display system information" 317 | msgstr "Zeige Systeminformationen" 318 | 319 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:72 320 | msgid "Display storage information" 321 | msgstr "Zeige Speicherinformationen" 322 | 323 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:77 324 | msgid "Display network information" 325 | msgstr "Zeige Netzwerkinformationen" 326 | 327 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:82 328 | msgid "Display public IP address of internet connection" 329 | msgstr "Zeige öffentliche IP-Adresse der Internetverbindung" 330 | 331 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:86 332 | msgid "Network speed format" 333 | msgstr "Format Netzwerkgeschwindigkeit" 334 | 335 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:87 336 | msgid "Should speed display in bits or bytes?" 337 | msgstr "Geschwindigkeitsanzeige in Bytes oder Bits?" 338 | 339 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:91 340 | msgid "Storage path" 341 | msgstr "Speicherpfad" 342 | 343 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:92 344 | msgid "Storage path for monitoring" 345 | msgstr "Speicherpfad für Überwachung" 346 | 347 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:97 348 | msgid "Monitor battery health" 349 | msgstr "Überwache Akkuzustand" 350 | 351 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:101 352 | msgid "Memory measurement" 353 | msgstr "Speichermessung (RAM)" 354 | 355 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:102 356 | msgid "Can use gigabyte or gibibyte for memory" 357 | msgstr "Arbeitsspeicher in Gigabyte oder Gibibyte?" 358 | 359 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:106 360 | msgid "Storage measurement" 361 | msgstr "Speichermessung (Disk)" 362 | 363 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:107 364 | msgid "Can use gigabyte or gibibyte for storage" 365 | msgstr "Speicherplatz in Gigabyte oder Gibibyte?" 366 | 367 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:111 368 | msgid "Display battery BAT0" 369 | msgstr "Akku „BAT0“ anzeigen" 370 | 371 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:112 372 | msgid "Should battery 'BAT0' be displayed?" 373 | msgstr "Soll der Akku „BAT0“ anzgezeigt werden?" 374 | 375 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:116 376 | msgid "Display battery BAT1" 377 | msgstr "Akku „BAT1“ anzeigen" 378 | 379 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:117 380 | msgid "Should battery 'BAT1' be displayed?" 381 | msgstr "Soll der Akku „BAT1“ anzgezeigt werden?" 382 | 383 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:121 384 | msgid "Display battery BAT2" 385 | msgstr "Akku „BAT2“ anzeigen" 386 | 387 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:122 388 | msgid "Should battery 'BAT2' be displayed?" 389 | msgstr "Soll der Akku „BAT2“ anzgezeigt werden?" 390 | 391 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:126 392 | msgid "Display battery CMB0" 393 | msgstr "Akku „CMB0“ anzeigen" 394 | 395 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:127 396 | msgid "Should battery 'CMB0' be displayed?" 397 | msgstr "Soll der Akku „CMB0“ anzgezeigt werden?" 398 | 399 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:131 400 | msgid "Display battery macsmc-battery" 401 | msgstr "Akku „macsmc-battery“ anzeigen" 402 | 403 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:132 404 | msgid "Should battery 'macsmc-battery' be displayed?" 405 | msgstr "Soll der Akku „macsmc-battery“ anzgezeigt werden?" 406 | 407 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:136 408 | msgid "Display combined battery data" 409 | msgstr "Kombinierte Akku Werte anzeigen" 410 | 411 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:137 412 | msgid "Display combined values for selected batteries" 413 | msgstr "Kombinierte Werte für ausgewählte Akkus anzeigen" 414 | 415 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:142 416 | msgid "Include 'BAT0' when calculating combined Battery" 417 | msgstr "Akku „BAT0“ einbeziehen, wenn kombinierte Werte berechnet werden" 418 | 419 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:147 420 | msgid "Include 'BAT1' when calculating combined Battery" 421 | msgstr "Akku „BAT1“ einbeziehen, wenn kombinierte Werte berechnet werden" 422 | 423 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:152 424 | msgid "Include 'BAT2' when calculating combined Battery" 425 | msgstr "Akku „BAT2“ einbeziehen, wenn kombinierte Werte berechnet werden" 426 | 427 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:157 428 | msgid "Include 'CMB0' when calculating combined Battery" 429 | msgstr "Akku „CMB0“ einbeziehen, wenn kombinierte Werte berechnet werden" 430 | 431 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:162 432 | msgid "Include 'macsmc-battery' when calculating combined Battery" 433 | msgstr "" 434 | "Akku „macsmc-battery“ einbeziehen, wenn kombinierte Werte berechnet werden" 435 | 436 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:166 437 | msgid "Use fixed widths in top bar" 438 | msgstr "Verwende feste Breit im Panel" 439 | 440 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:167 441 | msgid "Keep sensors in top bar from jumping around" 442 | msgstr "Sensorenposition im Panel fixieren" 443 | 444 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:172 445 | msgid "Keep top bar clean by only showing sensor values" 446 | msgstr "Topbar sauber halten und nur Sensorenwerte anzeigen" 447 | 448 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:176 449 | msgid "Make the menu centered" 450 | msgstr "Menü zentrieren" 451 | 452 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:177 453 | msgid "Center the menu to the icon regardless of the position in the panel" 454 | msgstr "" 455 | "Zentriert das Menü auf das Symbol, unabhängig von der Position im Panel" 456 | 457 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:181 458 | msgid "System Monitor command" 459 | msgstr "Systemmonitor Befehl" 460 | 461 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:182 462 | msgid "The command run when system monitor button is clicked" 463 | msgstr "" 464 | "Der Befehl der ausgeführt wird, wenn den System Monitor Button geklickt wird" 465 | 466 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:186 467 | msgid "Include processor static information" 468 | msgstr "Zeige statische CPU-Informationen" 469 | 470 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:187 471 | msgid "Display processor static information that doesn't change" 472 | msgstr "Zeigt statische CPU-Informationen, welche sich nicht verändern" 473 | 474 | #: sensors.js:65 475 | msgid "Public IP" 476 | msgstr "Öffentliche IP" 477 | 478 | #: sensors.js:133 sensors.js:181 479 | msgid "Usage" 480 | msgstr "Belegt" 481 | 482 | #: sensors.js:134 483 | msgid "memory" 484 | msgstr "RAM" 485 | 486 | #: sensors.js:135 487 | msgid "Physical" 488 | msgstr "Physikalisch" 489 | 490 | #: sensors.js:136 491 | msgid "Available" 492 | msgstr "Verfügbar" 493 | 494 | #: sensors.js:137 495 | msgid "Allocated" 496 | msgstr "Zugeteilt" 497 | 498 | #: sensors.js:138 499 | msgid "Cached" 500 | msgstr "Gecached" 501 | 502 | #: sensors.js:139 sensors.js:355 503 | msgid "Free" 504 | msgstr "Frei" 505 | 506 | #: sensors.js:140 507 | msgid "Swap" 508 | msgstr "Swap" 509 | 510 | #: sensors.js:248 511 | msgid "Average" 512 | msgstr "Durchschnitt" 513 | 514 | #: sensors.js:180 515 | msgid "processor" 516 | msgstr "CPU" 517 | 518 | #: sensors.js:183 519 | #, javascript-format 520 | msgid "Core %d" 521 | msgstr "Kern %d" 522 | 523 | #: sensors.js:213 sensors.js:222 524 | msgid "Frequency" 525 | msgstr "Frequenz" 526 | 527 | #: sensors.js:231 528 | msgid "Open Files" 529 | msgstr "Geöffnete Dateien" 530 | 531 | #: sensors.js:238 532 | msgid "Load 1m" 533 | msgstr "Last 1min" 534 | 535 | #: sensors.js:239 536 | msgid "system" 537 | msgstr "System" 538 | 539 | #: sensors.js:240 540 | msgid "Load 5m" 541 | msgstr "Last 5min" 542 | 543 | #: sensors.js:241 544 | msgid "Load 15m" 545 | msgstr "Last 15min" 546 | 547 | #: sensors.js:242 548 | msgid "Threads Active" 549 | msgstr "Threads aktiv" 550 | 551 | #: sensors.js:243 552 | msgid "Threads Total" 553 | msgstr "Threads insgesamt" 554 | 555 | #: sensors.js:248 556 | msgid "Uptime" 557 | msgstr "Uptime" 558 | 559 | #: sensors.js:252 560 | msgid "Process Time" 561 | msgstr "Prozesszeit" 562 | 563 | #: sensors.js:302 564 | msgid "WiFi Link Quality" 565 | msgstr "WiFi Verbindungsqualität" 566 | 567 | #: sensors.js:303 568 | msgid "WiFi Signal Level" 569 | msgstr "WiFi Signalstärke" 570 | 571 | #: sensors.js:318 572 | msgid "ARC Target" 573 | msgstr "ARC-Ziel" 574 | 575 | #: sensors.js:319 576 | msgid "ARC Maximum" 577 | msgstr "ARC-Maximum" 578 | 579 | #: sensors.js:320 580 | msgid "ARC Current" 581 | msgstr "ARC-Strom" 582 | 583 | #: sensors.js:330 584 | msgid "Read total" 585 | msgstr "Gelesen (total)" 586 | 587 | #: sensors.js:331 588 | msgid "Write total" 589 | msgstr "Geschrieben (total)" 590 | 591 | #: sensors.js:332 592 | msgid "Read rate" 593 | msgstr "Leserate" 594 | 595 | #: sensors.js:333 596 | msgid "Write rate" 597 | msgstr "Schreibrate" 598 | 599 | #: sensors.js:352 600 | msgid "Total" 601 | msgstr "Total" 602 | 603 | #: sensors.js:353 604 | msgid "Used" 605 | msgstr "Benutzt" 606 | 607 | #: sensors.js:354 608 | msgid "Reserved" 609 | msgstr "Reserviert" 610 | 611 | #: sensors.js:356 612 | msgid "storage" 613 | msgstr "Speicher" 614 | 615 | #: sensors.js:393 616 | msgid "Label" 617 | msgstr "" 618 | 619 | #: sensors.js:404 sensors.js:529 620 | msgid "State" 621 | msgstr "Status" 622 | 623 | #: sensors.js:409 sensors.js:519 624 | msgid "Cycles" 625 | msgstr "Zyklus" 626 | 627 | #: sensors.js:414 628 | msgid "Voltage" 629 | msgstr "Spannung" 630 | 631 | #: sensors.js:418 632 | msgid "Level" 633 | msgstr "Level" 634 | 635 | #: sensors.js:422 sensors.js:553 636 | msgid "Percentage" 637 | msgstr "Prozent" 638 | 639 | #: sensors.js:432 sensors.js:527 640 | msgid "Rate" 641 | msgstr "Rate" 642 | 643 | #: sensors.js:442 sensors.js:535 644 | msgid "Energy (full)" 645 | msgstr "Kapazität (voll)" 646 | 647 | #: sensors.js:451 sensors.js:541 648 | msgid "Energy (design)" 649 | msgstr "Kapazität (typisch)" 650 | 651 | #: sensors.js:455 652 | msgid "Capacity" 653 | msgstr "Kapazität" 654 | 655 | #: sensors.js:464 sensors.js:547 656 | msgid "Energy (now)" 657 | msgstr "Kapazität (aktuell)" 658 | 659 | #: sensors.js:501 sensors.js:504 sensors.js:588 sensors.js:591 660 | msgid "Time left" 661 | msgstr "Zeit verbleibend" 662 | 663 | #: sensors.js:677 664 | msgid "Vendor" 665 | msgstr "Hersteller" 666 | 667 | #: sensors.js:678 668 | msgid "Bogomips" 669 | msgstr "BogoMips" 670 | 671 | #: sensors.js:679 672 | msgid "Sockets" 673 | msgstr "Sockel" 674 | 675 | #: sensors.js:680 676 | msgid "Cache" 677 | msgstr "Cache" 678 | 679 | #: sensors.js:685 680 | msgid "Kernel" 681 | msgstr "" 682 | 683 | #: prefs.js:98 684 | msgid "Temperature" 685 | msgstr "Temperatur" 686 | 687 | #: prefs.js:98 688 | msgid "Network" 689 | msgstr "Netzwerk" 690 | 691 | #: prefs.js:98 692 | msgid "Storage" 693 | msgstr "Speicher" 694 | 695 | #: prefs.js:98 696 | msgid "Memory" 697 | msgstr "RAM" 698 | 699 | #: prefs.js:98 700 | msgid "Battery" 701 | msgstr "Akku" 702 | 703 | #: extension.js:112 704 | msgid "Battery 1" 705 | msgstr "Akku 1" 706 | 707 | #: extension.js:112 708 | msgid "Battery 2" 709 | msgstr "Akku 2" 710 | 711 | #: extension.js:112 712 | msgid "Battery 3" 713 | msgstr "Akku 3" 714 | 715 | #: extension.js:112 716 | msgid "Battery 4" 717 | msgstr "Akku 4" 718 | 719 | #: extension.js:112 720 | msgid "Battery 5" 721 | msgstr "Akku 5" 722 | 723 | #: extension.js:115 724 | msgid "Battery (hidden)" 725 | msgstr "Akku (ausgeblendet)" 726 | 727 | #: prefs.js:98 728 | msgid "System" 729 | msgstr "System" 730 | 731 | #: prefs.js:98 732 | msgid "Processor" 733 | msgstr "CPU" 734 | 735 | #: sensors.js:759 736 | msgid "Fan" 737 | msgstr "Lüfter" 738 | 739 | #~ msgid "Display Battery" 740 | #~ msgstr "Batterie anzeigen" 741 | 742 | #~ msgid "Battery slot to monitor" 743 | #~ msgstr "Akkuschacht zur Überwachung" 744 | 745 | #~ msgid "Which numerical battery slot should vitals monitor" 746 | #~ msgstr "Welchen Akkuschacht soll Vitals überwachen?" 747 | 748 | #~ msgid "Boost" 749 | #~ msgstr "Boost" 750 | 751 | #~ msgid "battery" 752 | #~ msgstr "Akku" 753 | -------------------------------------------------------------------------------- /locale/es/LC_MESSAGES/vitals.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/corecoding/Vitals/66b99a7bcc010b18f76438265a2a6744f392e35e/locale/es/LC_MESSAGES/vitals.mo -------------------------------------------------------------------------------- /locale/fi_FI/LC_MESSAGES/vitals.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/corecoding/Vitals/66b99a7bcc010b18f76438265a2a6744f392e35e/locale/fi_FI/LC_MESSAGES/vitals.mo -------------------------------------------------------------------------------- /locale/fr/LC_MESSAGES/vitals.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/corecoding/Vitals/66b99a7bcc010b18f76438265a2a6744f392e35e/locale/fr/LC_MESSAGES/vitals.mo -------------------------------------------------------------------------------- /locale/it/LC_MESSAGES/vitals.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/corecoding/Vitals/66b99a7bcc010b18f76438265a2a6744f392e35e/locale/it/LC_MESSAGES/vitals.mo -------------------------------------------------------------------------------- /locale/nl/LC_MESSAGES/vitals.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/corecoding/Vitals/66b99a7bcc010b18f76438265a2a6744f392e35e/locale/nl/LC_MESSAGES/vitals.mo -------------------------------------------------------------------------------- /locale/oc/LC_MESSAGES/vitals.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/corecoding/Vitals/66b99a7bcc010b18f76438265a2a6744f392e35e/locale/oc/LC_MESSAGES/vitals.mo -------------------------------------------------------------------------------- /locale/pl/LC_MESSAGES/vitals.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/corecoding/Vitals/66b99a7bcc010b18f76438265a2a6744f392e35e/locale/pl/LC_MESSAGES/vitals.mo -------------------------------------------------------------------------------- /locale/pt/LC_MESSAGES/vitals.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/corecoding/Vitals/66b99a7bcc010b18f76438265a2a6744f392e35e/locale/pt/LC_MESSAGES/vitals.mo -------------------------------------------------------------------------------- /locale/pt_BR/LC_MESSAGES/vitals.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/corecoding/Vitals/66b99a7bcc010b18f76438265a2a6744f392e35e/locale/pt_BR/LC_MESSAGES/vitals.mo -------------------------------------------------------------------------------- /locale/ru/LC_MESSAGES/vitals.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/corecoding/Vitals/66b99a7bcc010b18f76438265a2a6744f392e35e/locale/ru/LC_MESSAGES/vitals.mo -------------------------------------------------------------------------------- /locale/sk/LC_MESSAGES/vitals.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/corecoding/Vitals/66b99a7bcc010b18f76438265a2a6744f392e35e/locale/sk/LC_MESSAGES/vitals.mo -------------------------------------------------------------------------------- /locale/tr/LC_MESSAGES/vitals.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/corecoding/Vitals/66b99a7bcc010b18f76438265a2a6744f392e35e/locale/tr/LC_MESSAGES/vitals.mo -------------------------------------------------------------------------------- /locale/uk/LC_MESSAGES/vitals.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/corecoding/Vitals/66b99a7bcc010b18f76438265a2a6744f392e35e/locale/uk/LC_MESSAGES/vitals.mo -------------------------------------------------------------------------------- /locale/uk/LC_MESSAGES/vitals.po: -------------------------------------------------------------------------------- 1 | # 2 | # Alex Volha , 2022. 3 | # 4 | msgid "" 5 | msgstr "" 6 | "Project-Id-Version: unnamed project\n" 7 | "POT-Creation-Date: 2023-10-22 21:04+0200\n" 8 | "PO-Revision-Date: 2024-05-11 14:22+0300\n" 9 | "Last-Translator: Alex Volha \n" 10 | "Language-Team: Ukrainian \n" 11 | "Language: uk\n" 12 | "MIME-Version: 1.0\n" 13 | "Content-Type: text/plain; charset=UTF-8\n" 14 | "Content-Transfer-Encoding: 8bit\n" 15 | "Plural-Forms: nplurals=4; plural=n==1 ? 3 : n%10==1 && n%100!=11 ? 0 : " 16 | "n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" 17 | "POT-Revision-Date: 2018-12-29 10:26+0100\n" 18 | "X-Generator: Poedit 3.4.2\n" 19 | "X-Poedit-Basepath: ..\n" 20 | "X-Poedit-SearchPath-0: values.js\n" 21 | "X-Poedit-SearchPath-1: sensors.js\n" 22 | "X-Poedit-SearchPath-2: prefs.js\n" 23 | "X-Poedit-SearchPath-3: menuItem.js\n" 24 | "X-Poedit-SearchPath-4: extension.js\n" 25 | "X-Poedit-SearchPath-5: schemas/org.gnome.shell.extensions.vitals.gschema." 26 | "xml\n" 27 | "X-Poedit-SearchPath-6: prefs.ui\n" 28 | 29 | #: extension.js:109 30 | msgid "Batteries" 31 | msgstr "Акумулятори" 32 | 33 | #: extension.js:133 34 | msgid "No Data" 35 | msgstr "Немає даних" 36 | 37 | #: extension.js:159 38 | msgid "Refresh" 39 | msgstr "Оновити" 40 | 41 | #: extension.js:174 42 | msgid "System Monitor" 43 | msgstr "Системний монітор" 44 | 45 | #: extension.js:182 prefs.js:106 46 | msgid "Preferences" 47 | msgstr "Налаштування" 48 | 49 | #: prefs.ui:42 schemas/org.gnome.shell.extensions.vitals.gschema.xml:81 50 | msgid "Include public IP address" 51 | msgstr "Включити загальнодоступну IP-адресу" 52 | 53 | #: prefs.ui:70 54 | msgid "Format" 55 | msgstr "Формат" 56 | 57 | #: prefs.ui:78 58 | msgid "Bytes" 59 | msgstr "Байтів" 60 | 61 | #: prefs.ui:79 62 | msgid "Bits" 63 | msgstr "Бітів" 64 | 65 | #: prefs.ui:121 66 | msgid "General" 67 | msgstr "Загальні" 68 | 69 | #: prefs.ui:149 schemas/org.gnome.shell.extensions.vitals.gschema.xml:11 70 | msgid "Seconds between updates" 71 | msgstr "Секунд між оновленнями" 72 | 73 | #: prefs.ui:184 schemas/org.gnome.shell.extensions.vitals.gschema.xml:16 74 | msgid "Position in panel" 75 | msgstr "Розташування на панелі" 76 | 77 | #: prefs.ui:193 78 | msgid "Left" 79 | msgstr "Ліворуч" 80 | 81 | #: prefs.ui:194 82 | msgid "Center" 83 | msgstr "По центр" 84 | 85 | #: prefs.ui:195 86 | msgid "Right" 87 | msgstr "Праворуч" 88 | 89 | #: prefs.ui:196 90 | msgid "Far Left" 91 | msgstr "Крайне ліворуч" 92 | 93 | #: prefs.ui:197 94 | msgid "Far Right" 95 | msgstr "Крайне праворуч" 96 | 97 | #: prefs.ui:220 schemas/org.gnome.shell.extensions.vitals.gschema.xml:21 98 | msgid "Use higher precision" 99 | msgstr "Використовувати вищу точність" 100 | 101 | #: prefs.ui:247 schemas/org.gnome.shell.extensions.vitals.gschema.xml:26 102 | msgid "Alphabetize sensors" 103 | msgstr "Розташувати сенсори за алфавітом" 104 | 105 | #: prefs.ui:274 schemas/org.gnome.shell.extensions.vitals.gschema.xml:31 106 | msgid "Hide zero values" 107 | msgstr "Приховати нульові значення" 108 | 109 | #: prefs.ui:301 110 | msgid "Use fixed widths" 111 | msgstr "Використовувати фіксовану ширину" 112 | 113 | #: prefs.ui:328 schemas/org.gnome.shell.extensions.vitals.gschema.xml:171 114 | msgid "Hide icons in top bar" 115 | msgstr "Приховати значки у верхній панелі" 116 | 117 | #: prefs.ui:355 118 | msgid "Menu always centered" 119 | msgstr "Меню завжди по центру" 120 | 121 | #: prefs.ui:379 122 | msgid "About" 123 | msgstr "Про розширення" 124 | 125 | #: prefs.ui:394 126 | msgid "" 127 | "Feature requests or bugs? Please visit GitHub. No warranty, expressed or implied. Donate if you found this " 130 | "useful." 131 | msgstr "" 132 | "Запити щодо функцій чи помилки? Будь ласка, відвідайте GitHub. Жодних гарантій, явних або " 134 | "неявних. Зробіть пожертву, " 135 | "якщо ви вважаєте це корисним." 136 | 137 | #: prefs.ui:421 138 | msgid "Sensors" 139 | msgstr "Сенсори" 140 | 141 | #: prefs.ui:449 schemas/org.gnome.shell.extensions.vitals.gschema.xml:36 142 | msgid "Monitor temperature" 143 | msgstr "Монітор температури" 144 | 145 | #: prefs.ui:500 schemas/org.gnome.shell.extensions.vitals.gschema.xml:46 146 | msgid "Monitor voltage" 147 | msgstr "Монітор напруги" 148 | 149 | #: prefs.ui:528 schemas/org.gnome.shell.extensions.vitals.gschema.xml:51 150 | msgid "Monitor fan" 151 | msgstr "Монітор вентилятора" 152 | 153 | #: prefs.ui:556 schemas/org.gnome.shell.extensions.vitals.gschema.xml:56 154 | msgid "Monitor memory" 155 | msgstr "Монітор пам'яті" 156 | 157 | #: prefs.ui:607 schemas/org.gnome.shell.extensions.vitals.gschema.xml:61 158 | msgid "Monitor processor" 159 | msgstr "Монітор процесора" 160 | 161 | #: prefs.ui:658 schemas/org.gnome.shell.extensions.vitals.gschema.xml:66 162 | msgid "Monitor system" 163 | msgstr "Монітор системи" 164 | 165 | #: prefs.ui:709 schemas/org.gnome.shell.extensions.vitals.gschema.xml:76 166 | msgid "Monitor network" 167 | msgstr "Монітор мережі" 168 | 169 | #: prefs.ui:760 schemas/org.gnome.shell.extensions.vitals.gschema.xml:71 170 | msgid "Monitor storage" 171 | msgstr "Монітор накопичувача" 172 | 173 | #: prefs.ui:811 schemas/org.gnome.shell.extensions.vitals.gschema.xml:96 174 | msgid "Monitor battery" 175 | msgstr "Монітор акумулятора" 176 | 177 | #: prefs.ui:890 178 | msgid "Path" 179 | msgstr "Путь" 180 | 181 | #: prefs.ui:922 prefs.ui:1031 182 | msgid "Measurement" 183 | msgstr "Система мір" 184 | 185 | #: prefs.ui:930 prefs.ui:1039 186 | msgid "Binary" 187 | msgstr "Бінарний" 188 | 189 | #: prefs.ui:931 prefs.ui:1040 190 | msgid "Decimal" 191 | msgstr "Десятковий" 192 | 193 | #: prefs.ui:976 194 | msgid "Unit" 195 | msgstr "Одиниця" 196 | 197 | #: prefs.ui:985 198 | msgid "°C" 199 | msgstr "°C" 200 | 201 | #: prefs.ui:986 202 | msgid "°F" 203 | msgstr "°F" 204 | 205 | #: prefs.ui:1086 206 | msgid "Monitor BAT0" 207 | msgstr "Монітор BAT0" 208 | 209 | #: prefs.ui:1116 210 | msgid "Monitor BAT1" 211 | msgstr "Монітор BAT1" 212 | 213 | #: prefs.ui:1146 214 | msgid "Monitor BAT2" 215 | msgstr "Монітор BAT2" 216 | 217 | #: prefs.ui:1176 218 | msgid "Monitor CMB0" 219 | msgstr "Монітор CMB0" 220 | 221 | #: prefs.ui:1206 222 | msgid "Monitor macsmc-battery" 223 | msgstr "Монітор macsmc-battery" 224 | 225 | #: prefs.ui:1247 226 | msgid "Calculate Combined Values" 227 | msgstr "Обчислювати комбіновані значення" 228 | 229 | #: prefs.ui:1277 schemas/org.gnome.shell.extensions.vitals.gschema.xml:141 230 | msgid "Include BAT0" 231 | msgstr "Включити BAT0" 232 | 233 | #: prefs.ui:1307 schemas/org.gnome.shell.extensions.vitals.gschema.xml:146 234 | msgid "Include BAT1" 235 | msgstr "Включити BAT1" 236 | 237 | #: prefs.ui:1337 schemas/org.gnome.shell.extensions.vitals.gschema.xml:151 238 | msgid "Include BAT2" 239 | msgstr "Включити BAT2" 240 | 241 | #: prefs.ui:1367 schemas/org.gnome.shell.extensions.vitals.gschema.xml:156 242 | msgid "Include CMB0" 243 | msgstr "Включити CMB0" 244 | 245 | #: prefs.ui:1397 schemas/org.gnome.shell.extensions.vitals.gschema.xml:161 246 | msgid "Include macsmc-battery" 247 | msgstr "Включити macsmc-battery" 248 | 249 | #: prefs.ui:1446 250 | msgid "Monitor command" 251 | msgstr "Команда мониторинга" 252 | 253 | #: prefs.ui:1498 254 | msgid "Include static info" 255 | msgstr "Включити статичну інформацію" 256 | 257 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:6 258 | msgid "Sensors to show in panel" 259 | msgstr "Сенсори для відображення на панелі" 260 | 261 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:7 262 | msgid "List of sensors to be shown in the panel" 263 | msgstr "Список сенсорів, які будуть відображені на панелі" 264 | 265 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:12 266 | msgid "Delay between sensor polling" 267 | msgstr "Затримка між опитуванням сенсора" 268 | 269 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:17 270 | msgid "Position in Panel ('left', 'center', 'right')" 271 | msgstr "Розташування на панелі ('ліворуч', 'по центру', 'праворуч')" 272 | 273 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:22 274 | msgid "Show one extra digit after decimal" 275 | msgstr "Показати одну додаткову цифру після коми" 276 | 277 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:27 278 | msgid "Display sensors in alphabetical order" 279 | msgstr "Відображення сенсорів в алфавітному порядку" 280 | 281 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:32 282 | msgid "Hide data from sensors that are invalid" 283 | msgstr "Приховати дані з недійсних сенсорів" 284 | 285 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:37 286 | msgid "Display temperature of various components" 287 | msgstr "Відображати температуру різних компонентів" 288 | 289 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:41 290 | msgid "Temperature unit" 291 | msgstr "Одиниця вимірювання температури" 292 | 293 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:42 294 | msgid "" 295 | "The unit ('centigrade' or 'fahrenheit') the extension should display the " 296 | "temperature in" 297 | msgstr "" 298 | "Одиниця ('градуси за Цельсієм' або 'фаренгейтом'), у якій розширення має " 299 | "відображати температуру" 300 | 301 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:47 302 | msgid "Display voltage of various components" 303 | msgstr "Відображати напругу різних компонентів" 304 | 305 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:52 306 | msgid "Display fan rotation per minute" 307 | msgstr "Відображати оберті вентилятора за хвилину" 308 | 309 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:57 310 | msgid "Display memory information" 311 | msgstr "Відображати інформацію про пам'ять" 312 | 313 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:62 314 | msgid "Display processor information" 315 | msgstr "Відображати інформацію про процесор" 316 | 317 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:67 318 | msgid "Display system information" 319 | msgstr "Відображати системну інформацію" 320 | 321 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:72 322 | msgid "Display storage information" 323 | msgstr "Відображати інформацію про накопичувач" 324 | 325 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:77 326 | msgid "Display network information" 327 | msgstr "Відображати інформацію про мережу" 328 | 329 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:82 330 | msgid "Display public IP address of internet connection" 331 | msgstr "Відображати публічну IP-адресу підключення до Інтернету" 332 | 333 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:86 334 | msgid "Network speed format" 335 | msgstr "Формат швидкості мережі" 336 | 337 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:87 338 | msgid "Should speed display in bits or bytes?" 339 | msgstr "Швидкість має відображатися в бітах чи байтах?" 340 | 341 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:91 342 | msgid "Storage path" 343 | msgstr "Шлях зберігання" 344 | 345 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:92 346 | msgid "Storage path for monitoring" 347 | msgstr "Шлях зберігання для моніторингу" 348 | 349 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:97 350 | msgid "Monitor battery health" 351 | msgstr "Монітор стану акумулятора" 352 | 353 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:101 354 | msgid "Memory measurement" 355 | msgstr "Одиниця вимірювання пам'яті" 356 | 357 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:102 358 | msgid "Can use gigabyte or gibibyte for memory" 359 | msgstr "Можна використовувати гігабайт або гібібайт для пам'яті" 360 | 361 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:106 362 | msgid "Storage measurement" 363 | msgstr "Одиниця вимірювання накопичувача" 364 | 365 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:107 366 | msgid "Can use gigabyte or gibibyte for storage" 367 | msgstr "Для накопичувача можна використовувати гігабайт або гібібайт" 368 | 369 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:111 370 | msgid "Display battery BAT0" 371 | msgstr "Відображати акумулятор BAT0" 372 | 373 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:112 374 | msgid "Should battery 'BAT0' be displayed?" 375 | msgstr "Чи має відображатися акумулятор 'BAT0'?" 376 | 377 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:116 378 | msgid "Display battery BAT1" 379 | msgstr "Відображати акумулятор BAT1" 380 | 381 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:117 382 | msgid "Should battery 'BAT1' be displayed?" 383 | msgstr "Чи має відображатися акумулятор 'BAT1'?" 384 | 385 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:121 386 | msgid "Display battery BAT2" 387 | msgstr "Відображати акумулятор BAT2" 388 | 389 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:122 390 | msgid "Should battery 'BAT2' be displayed?" 391 | msgstr "Чи має відображатися акумулятор 'BAT2'?" 392 | 393 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:126 394 | msgid "Display battery CMB0" 395 | msgstr "Відображати акумулятор CMB0" 396 | 397 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:127 398 | msgid "Should battery 'CMB0' be displayed?" 399 | msgstr "Чи має відображатися акумулятор 'CMB0'?" 400 | 401 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:131 402 | msgid "Display battery macsmc-battery" 403 | msgstr "Відображати акумулятор macsmc-battery" 404 | 405 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:132 406 | msgid "Should battery 'macsmc-battery' be displayed?" 407 | msgstr "Чи має відображатися акумулятор 'macsmc-battery'?" 408 | 409 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:136 410 | msgid "Display combined battery data" 411 | msgstr "Відображати комбіновані данні батареї" 412 | 413 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:137 414 | msgid "Display combined values for selected batteries" 415 | msgstr "Відображати сумарні значення для вибраних батарей" 416 | 417 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:142 418 | msgid "Include 'BAT0' when calculating combined Battery" 419 | msgstr "Включити 'BAT0' під час розрахунку комбінованої батареї" 420 | 421 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:147 422 | msgid "Include 'BAT1' when calculating combined Battery" 423 | msgstr "Включити 'BAT1' під час розрахунку комбінованої батареї" 424 | 425 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:152 426 | msgid "Include 'BAT2' when calculating combined Battery" 427 | msgstr "Включити 'BAT2' під час розрахунку комбінованої батареї" 428 | 429 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:157 430 | msgid "Include 'CMB0' when calculating combined Battery" 431 | msgstr "Включити 'CMB0' під час розрахунку комбінованої батареї" 432 | 433 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:162 434 | msgid "Include 'macsmc-battery' when calculating combined Battery" 435 | msgstr "Включити 'macsmc-battery' під час розрахунку комбінованої батареї" 436 | 437 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:166 438 | msgid "Use fixed widths in top bar" 439 | msgstr "Використовувати фіксовану ширину у верхній панелі" 440 | 441 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:167 442 | msgid "Keep sensors in top bar from jumping around" 443 | msgstr "Не давайти сенсорам у верхній панелі стрибати" 444 | 445 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:172 446 | msgid "Keep top bar clean by only showing sensor values" 447 | msgstr "Тримайте верхню панель чистою, показуючи лише значення сенсорів" 448 | 449 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:176 450 | msgid "Make the menu centered" 451 | msgstr "Зробити меню по центру" 452 | 453 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:177 454 | msgid "Center the menu to the icon regardless of the position in the panel" 455 | msgstr "Розмістити меню по центру піктограми незалежно від положення на панелі" 456 | 457 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:181 458 | msgid "System Monitor command" 459 | msgstr "Команда Системного Монітора" 460 | 461 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:182 462 | msgid "The command run when system monitor button is clicked" 463 | msgstr "Команда запускається після натискання кнопки системного монітора" 464 | 465 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:186 466 | msgid "Include processor static information" 467 | msgstr "Включати статичну інформацію про процесор" 468 | 469 | #: schemas/org.gnome.shell.extensions.vitals.gschema.xml:187 470 | msgid "Display processor static information that doesn't change" 471 | msgstr "Відображати статичну інформацію про процесор, яка не змінюється" 472 | 473 | #: sensors.js:65 474 | msgid "Public IP" 475 | msgstr "Публічний IP" 476 | 477 | #: sensors.js:133 sensors.js:181 478 | msgid "Usage" 479 | msgstr "Використано" 480 | 481 | #: sensors.js:134 482 | msgid "memory" 483 | msgstr "пам'ть" 484 | 485 | #: sensors.js:135 486 | msgid "Physical" 487 | msgstr "Фізична" 488 | 489 | #: sensors.js:136 490 | msgid "Available" 491 | msgstr "Доступно" 492 | 493 | #: sensors.js:137 494 | msgid "Allocated" 495 | msgstr "Виділено" 496 | 497 | #: sensors.js:138 498 | msgid "Cached" 499 | msgstr "Кешовано" 500 | 501 | #: sensors.js:139 sensors.js:355 502 | msgid "Free" 503 | msgstr "Вільно" 504 | 505 | #: sensors.js:140 506 | msgid "Swap" 507 | msgstr "Swap" 508 | 509 | #: sensors.js:248 510 | msgid "Average" 511 | msgstr "Середне" 512 | 513 | #: sensors.js:180 514 | msgid "processor" 515 | msgstr "процесор" 516 | 517 | #: sensors.js:183 518 | #, javascript-format 519 | msgid "Core %d" 520 | msgstr "Ядро %d" 521 | 522 | #: sensors.js:213 sensors.js:222 523 | msgid "Frequency" 524 | msgstr "Частота" 525 | 526 | #: sensors.js:231 527 | msgid "Open Files" 528 | msgstr "Відкритих файлів" 529 | 530 | #: sensors.js:238 531 | msgid "Load 1m" 532 | msgstr "Навантаження 1х" 533 | 534 | #: sensors.js:239 535 | msgid "system" 536 | msgstr "система" 537 | 538 | #: sensors.js:240 539 | msgid "Load 5m" 540 | msgstr "Навантаження 5х" 541 | 542 | #: sensors.js:241 543 | msgid "Load 15m" 544 | msgstr "Навантаження 15х" 545 | 546 | #: sensors.js:242 547 | msgid "Threads Active" 548 | msgstr "Активних потоків" 549 | 550 | #: sensors.js:243 551 | msgid "Threads Total" 552 | msgstr "Усьго потоків" 553 | 554 | #: sensors.js:248 555 | msgid "Uptime" 556 | msgstr "Час роботи" 557 | 558 | #: sensors.js:252 559 | msgid "Process Time" 560 | msgstr "Тривалість процесу" 561 | 562 | #: sensors.js:302 563 | msgid "WiFi Link Quality" 564 | msgstr "Якість WiFi зв'язку" 565 | 566 | #: sensors.js:303 567 | msgid "WiFi Signal Level" 568 | msgstr "Рівень сигналу WiFi" 569 | 570 | #: sensors.js:318 571 | msgid "ARC Target" 572 | msgstr "ARC Ціль" 573 | 574 | #: sensors.js:319 575 | msgid "ARC Maximum" 576 | msgstr "ARC Максимум" 577 | 578 | #: sensors.js:320 579 | msgid "ARC Current" 580 | msgstr "ARC Зараз" 581 | 582 | #: sensors.js:330 583 | msgid "Read total" 584 | msgstr "Прочитано всього" 585 | 586 | #: sensors.js:331 587 | msgid "Write total" 588 | msgstr "Записано всього" 589 | 590 | #: sensors.js:332 591 | msgid "Read rate" 592 | msgstr "Швидкість читання" 593 | 594 | #: sensors.js:333 595 | msgid "Write rate" 596 | msgstr "Швидкість запису" 597 | 598 | #: sensors.js:352 599 | msgid "Total" 600 | msgstr "Всього" 601 | 602 | #: sensors.js:353 603 | msgid "Used" 604 | msgstr "Використано" 605 | 606 | #: sensors.js:354 607 | msgid "Reserved" 608 | msgstr "Зарезервовано" 609 | 610 | #: sensors.js:356 611 | msgid "storage" 612 | msgstr "сховище" 613 | 614 | #: sensors.js:393 615 | msgid "Label" 616 | msgstr "Мітка" 617 | 618 | #: sensors.js:404 sensors.js:529 619 | msgid "State" 620 | msgstr "Стан" 621 | 622 | #: sensors.js:409 sensors.js:519 623 | msgid "Cycles" 624 | msgstr "Циклів" 625 | 626 | #: sensors.js:414 627 | msgid "Voltage" 628 | msgstr "Напруга" 629 | 630 | #: sensors.js:418 631 | msgid "Level" 632 | msgstr "Рівень" 633 | 634 | #: sensors.js:422 sensors.js:553 635 | msgid "Percentage" 636 | msgstr "Відсоток" 637 | 638 | #: sensors.js:432 sensors.js:527 639 | msgid "Rate" 640 | msgstr "Оцінка" 641 | 642 | #: sensors.js:442 sensors.js:535 643 | msgid "Energy (full)" 644 | msgstr "Енергія (повна)" 645 | 646 | #: sensors.js:451 sensors.js:541 647 | msgid "Energy (design)" 648 | msgstr "Енергія (спроектована)" 649 | 650 | #: sensors.js:455 651 | msgid "Capacity" 652 | msgstr "Ємність" 653 | 654 | #: sensors.js:464 sensors.js:547 655 | msgid "Energy (now)" 656 | msgstr "Енергія (зараз)" 657 | 658 | #: sensors.js:501 sensors.js:504 sensors.js:588 sensors.js:591 659 | msgid "Time left" 660 | msgstr "Залишилося часу" 661 | 662 | #: sensors.js:677 663 | msgid "Vendor" 664 | msgstr "Вендор" 665 | 666 | #: sensors.js:678 667 | msgid "Bogomips" 668 | msgstr "Bogomips" 669 | 670 | #: sensors.js:679 671 | msgid "Sockets" 672 | msgstr "Сокетів" 673 | 674 | #: sensors.js:680 675 | msgid "Cache" 676 | msgstr "Кеш" 677 | 678 | #: sensors.js:685 679 | msgid "Kernel" 680 | msgstr "Ядро" 681 | 682 | #: prefs.js:98 683 | msgid "Temperature" 684 | msgstr "Температура" 685 | 686 | #: prefs.js:98 687 | msgid "Network" 688 | msgstr "Мережа" 689 | 690 | #: prefs.js:98 691 | msgid "Storage" 692 | msgstr "Накопичувач" 693 | 694 | #: prefs.js:98 695 | msgid "Memory" 696 | msgstr "Пам'ять" 697 | 698 | #: prefs.js:98 699 | msgid "Battery" 700 | msgstr "Акумулятор" 701 | 702 | #: extension.js:112 703 | msgid "Battery 1" 704 | msgstr "Акумулятор 1" 705 | 706 | #: extension.js:112 707 | msgid "Battery 2" 708 | msgstr "Акумулятор 2" 709 | 710 | #: extension.js:112 711 | msgid "Battery 3" 712 | msgstr "Акумулятор 3" 713 | 714 | #: extension.js:112 715 | msgid "Battery 4" 716 | msgstr "Акумулятор 4" 717 | 718 | #: extension.js:112 719 | msgid "Battery 5" 720 | msgstr "Акумулятор 5" 721 | 722 | #: extension.js:115 723 | msgid "Battery (hidden)" 724 | msgstr "Акумулятор (схований)" 725 | 726 | #: prefs.js:98 727 | msgid "System" 728 | msgstr "Система" 729 | 730 | #: prefs.js:98 731 | msgid "Processor" 732 | msgstr "Процесор" 733 | 734 | #: sensors.js:759 735 | msgid "Fan" 736 | msgstr "Вентилятор" 737 | 738 | #~ msgid "Battery slot to monitor" 739 | #~ msgstr "Акумуляторний слот для моніторингу" 740 | 741 | #~ msgid "Which numerical battery slot should vitals monitor" 742 | #~ msgstr "" 743 | #~ "Яке числове гніздо батареї має контролювати життєво важливі показники" 744 | 745 | #~ msgid "Boost" 746 | #~ msgstr "Підвищення" 747 | -------------------------------------------------------------------------------- /locale/zh_CN/LC_MESSAGES/vitals.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/corecoding/Vitals/66b99a7bcc010b18f76438265a2a6744f392e35e/locale/zh_CN/LC_MESSAGES/vitals.mo -------------------------------------------------------------------------------- /menuItem.js: -------------------------------------------------------------------------------- 1 | import Clutter from 'gi://Clutter'; 2 | import GObject from 'gi://GObject'; 3 | import St from 'gi://St' 4 | import * as PopupMenu from 'resource:///org/gnome/shell/ui/popupMenu.js'; 5 | 6 | export const MenuItem = GObject.registerClass({ 7 | 8 | Signals: { 9 | 'toggle': { param_types: [Clutter.Event.$gtype] }, 10 | }, 11 | 12 | }, class MenuItem extends PopupMenu.PopupBaseMenuItem { 13 | 14 | _init(icon, key, label, value, checked) { 15 | super._init({ reactive: true }); 16 | 17 | this._checked = checked; 18 | this._updateOrnament(); 19 | 20 | this._key = key; 21 | this._gIcon = icon; 22 | 23 | // add icon 24 | this.add_child(new St.Icon({ style_class: 'popup-menu-icon', gicon : this._gIcon })); 25 | 26 | // add label 27 | this._labelActor = new St.Label({ text: label }); 28 | this.add_child(this._labelActor); 29 | 30 | // add value 31 | this._valueLabel = new St.Label({ text: value }); 32 | this._valueLabel.set_x_align(Clutter.ActorAlign.END); 33 | this._valueLabel.set_x_expand(true); 34 | this._valueLabel.set_y_expand(true); 35 | this.add_child(this._valueLabel); 36 | 37 | this.actor._delegate = this; 38 | } 39 | 40 | get checked() { 41 | return this._checked; 42 | } 43 | 44 | get key() { 45 | return this._key; 46 | } 47 | 48 | get gicon() { 49 | return this._gIcon; 50 | } 51 | 52 | set value(value) { 53 | this._valueLabel.text = value; 54 | } 55 | 56 | get value() { 57 | return this._valueLabel.text; 58 | } 59 | 60 | // prevents menu from being closed 61 | activate(event) { 62 | this._checked = !this._checked; 63 | this._updateOrnament(); 64 | this.emit('toggle', event); 65 | } 66 | 67 | _updateOrnament() { 68 | if (this._checked) 69 | this.setOrnament(PopupMenu.Ornament.CHECK); 70 | else 71 | this.setOrnament(PopupMenu.Ornament.NONE); 72 | } 73 | 74 | get label() { 75 | return this._labelActor.text; 76 | } 77 | }); 78 | -------------------------------------------------------------------------------- /metadata.json: -------------------------------------------------------------------------------- 1 | { 2 | "description": "A glimpse into your computer's temperature, voltage, fan speed, memory usage, processor load, system resources, network speed and storage stats. This is a one stop shop to monitor all of your vital sensors. Uses asynchronous polling to provide a smooth user experience. Feature requests or bugs? Please use GitHub.", 3 | "gettext-domain": "vitals", 4 | "name": "Vitals", 5 | "settings-schema": "org.gnome.shell.extensions.vitals", 6 | "shell-version": [ 7 | "45", "46", "47", "48" 8 | ], 9 | "url": "https://github.com/corecoding/Vitals", 10 | "uuid": "Vitals@CoreCoding.com", 11 | "version": 71, 12 | "donations": { 13 | "paypal": "corecoding" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /prefs.js: -------------------------------------------------------------------------------- 1 | import Adw from 'gi://Adw'; 2 | import Gio from 'gi://Gio'; 3 | import GObject from 'gi://GObject'; 4 | import Gtk from 'gi://Gtk'; 5 | import {ExtensionPreferences, gettext as _} from 'resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js'; 6 | 7 | /* 8 | if (sensor == 'show-storage' && this._settings.get_boolean(sensor)) { 9 | 10 | let val = true; 11 | 12 | try { 13 | let GTop = imports.gi.GTop; 14 | } catch (e) { 15 | val = false; 16 | } 17 | 18 | let now = new Date().getTime(); 19 | this._notify("Vitals", "Please run sudo apt install gir1.2-gtop-2.0", 'folder-symbolic'); 20 | 21 | } 22 | */ 23 | 24 | const Settings = new GObject.Class({ 25 | Name: 'Vitals.Settings', 26 | 27 | _init: function(extensionObject, params) { 28 | this._extensionObject = extensionObject 29 | this.parent(params); 30 | 31 | this._settings = extensionObject.getSettings(); 32 | 33 | this.builder = new Gtk.Builder(); 34 | this.builder.set_translation_domain(this._extensionObject.metadata['gettext-domain']); 35 | this.builder.add_from_file(this._extensionObject.path + '/prefs.ui'); 36 | this.widget = this.builder.get_object('prefs-container'); 37 | 38 | this._bind_settings(); 39 | }, 40 | 41 | // Bind the gtk window to the schema settings 42 | _bind_settings: function() { 43 | let widget; 44 | 45 | // process sensor toggles 46 | let sensors = [ 'show-temperature', 'show-voltage', 'show-fan', 47 | 'show-memory', 'show-processor', 'show-system', 48 | 'show-network', 'show-storage', 'use-higher-precision', 49 | 'alphabetize', 'hide-zeros', 'include-public-ip', 50 | 'show-battery', 'fixed-widths', 'hide-icons', 51 | 'menu-centered', 'include-static-info', 52 | 'show-gpu', 'include-static-gpu-info' ]; 53 | 54 | for (let key in sensors) { 55 | let sensor = sensors[key]; 56 | 57 | widget = this.builder.get_object(sensor); 58 | widget.set_active(this._settings.get_boolean(sensor)); 59 | widget.connect('state-set', (_, val) => { 60 | this._settings.set_boolean(sensor, val); 61 | }); 62 | } 63 | 64 | // process individual drop down sensor preferences 65 | sensors = [ 'position-in-panel', 'unit', 'network-speed-format', 'memory-measurement', 'storage-measurement', 'battery-slot', 'icon-style' ]; 66 | for (let key in sensors) { 67 | let sensor = sensors[key]; 68 | 69 | widget = this.builder.get_object(sensor); 70 | widget.set_active(this._settings.get_int(sensor)); 71 | widget.connect('changed', (widget) => { 72 | this._settings.set_int(sensor, widget.get_active()); 73 | }); 74 | } 75 | 76 | this._settings.bind('update-time', this.builder.get_object('update-time'), 'value', Gio.SettingsBindFlags.DEFAULT); 77 | 78 | // process individual text entry sensor preferences 79 | sensors = [ 'storage-path', 'monitor-cmd' ]; 80 | for (let key in sensors) { 81 | let sensor = sensors[key]; 82 | 83 | widget = this.builder.get_object(sensor); 84 | widget.set_text(this._settings.get_string(sensor)); 85 | 86 | widget.connect('changed', (widget) => { 87 | let text = widget.get_text(); 88 | if (!text) text = widget.get_placeholder_text(); 89 | this._settings.set_string(sensor, text); 90 | }); 91 | } 92 | 93 | // makes individual sensor preference boxes appear 94 | sensors = [ 'temperature', 'network', 'storage', 'memory', 'battery', 'system', 'processor', 'gpu' ]; 95 | for (let key in sensors) { 96 | let sensor = sensors[key]; 97 | 98 | // create dialog for intelligent autohide advanced settings 99 | this.builder.get_object(sensor + '-prefs').connect('clicked', () => { 100 | let transientObj = this.widget.get_root(); 101 | let title = sensor.charAt(0).toUpperCase() + sensor.slice(1); 102 | let dialog = new Gtk.Dialog({ title: _(title) + ' ' + _('Preferences'), 103 | transient_for: transientObj, 104 | use_header_bar: false, 105 | modal: true }); 106 | 107 | let box = this.builder.get_object(sensor + '_prefs'); 108 | dialog.get_content_area().append(box); 109 | dialog.connect('response', (dialog, id) => { 110 | // remove the settings box so it doesn't get destroyed; 111 | dialog.get_content_area().remove(box); 112 | dialog.destroy(); 113 | return; 114 | }); 115 | 116 | dialog.show(); 117 | }); 118 | } 119 | } 120 | }); 121 | 122 | 123 | export default class VitalsPrefs extends ExtensionPreferences { 124 | fillPreferencesWindow(window) { 125 | window._settings = this.getSettings(); 126 | 127 | let settings = new Settings(this); 128 | let widget = settings.widget; 129 | 130 | const page = new Adw.PreferencesPage(); 131 | const group = new Adw.PreferencesGroup({}); 132 | group.add(widget); 133 | page.add(group); 134 | window.add(page); 135 | window.set_default_size(widget.width, widget.height); 136 | widget.show(); 137 | } 138 | } 139 | -------------------------------------------------------------------------------- /schemas/gschemas.compiled: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/corecoding/Vitals/66b99a7bcc010b18f76438265a2a6744f392e35e/schemas/gschemas.compiled -------------------------------------------------------------------------------- /stylesheet.css: -------------------------------------------------------------------------------- 1 | .vitals-icon { icon-size: 16px; } 2 | .vitals-menu-button-container {} 3 | .vitals-panel-icon-temperature { margin: 0 1px 0 8px; padding: 0; } 4 | .vitals-panel-icon-voltage { margin: 0 0 0 8px; padding: 0; } 5 | .vitals-panel-icon-fan { margin: 0 4px 0 8px; padding: 0; } 6 | .vitals-panel-icon-memory { margin: 0 2px 0 8px; padding: 0; } 7 | .vitals-panel-icon-processor { margin: 0 3px 0 8px; padding: 0; } 8 | .vitals-panel-icon-system { margin: 0 3px 0 8px; padding: 0; } 9 | .vitals-panel-icon-network { margin: 0 3px 0 8px; padding: 0; } 10 | .vitals-panel-icon-storage { margin: 0 2px 0 8px; padding: 0; } 11 | .vitals-panel-icon-battery { margin: 0 4px 0 8px; padding: 0; } 12 | .vitals-panel-label { margin: 0 3px 0 0; padding: 0; } 13 | .vitals-button-action { -st-icon-style: symbolic; border-radius: 32px; margin: 0px; min-height: 22px; min-width: 22px; padding: 10px; font-size: 100%; border: 1px solid transparent; } 14 | .vitals-button-action:hover, .vitals-button-action:focus { border-color: #777; } 15 | .vitals-button-action > StIcon { icon-size: 16px; } 16 | .vitals-button-box { padding: 0px; spacing: 22px; } 17 | -------------------------------------------------------------------------------- /values.js: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (c) 2018, Chris Monahan 3 | 4 | Redistribution and use in source and binary forms, with or without 5 | modification, are permitted provided that the following conditions are met: 6 | * Redistributions of source code must retain the above copyright 7 | notice, this list of conditions and the following disclaimer. 8 | * Redistributions in binary form must reproduce the above copyright 9 | notice, this list of conditions and the following disclaimer in the 10 | documentation and/or other materials provided with the distribution. 11 | * Neither the name of the GNOME nor the names of its contributors may be 12 | used to endorse or promote products derived from this software without 13 | specific prior written permission. 14 | 15 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 16 | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 17 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 18 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY 19 | DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 20 | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 21 | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 22 | ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 24 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 | */ 26 | 27 | import GObject from 'gi://GObject'; 28 | 29 | const cbFun = (d, c) => { 30 | let bb = d[1] % c[0], 31 | aa = (d[1] - bb) / c[0]; 32 | aa = aa > 0 ? aa + c[1] : ''; 33 | 34 | return [d[0] + aa, bb]; 35 | }; 36 | 37 | export const Values = GObject.registerClass({ 38 | GTypeName: 'Values', 39 | }, class Values extends GObject.Object { 40 | 41 | _init(settings, sensorIcons) { 42 | this._settings = settings; 43 | this._sensorIcons = sensorIcons; 44 | 45 | this._networkSpeedOffset = {}; 46 | this._networkSpeeds = {}; 47 | 48 | this._history = {}; 49 | //this._history2 = {}; 50 | this.resetHistory(); 51 | } 52 | 53 | _legible(value, sensorClass) { 54 | let unit = 1000; 55 | if (value === null) return 'N/A'; 56 | let use_higher_precision = this._settings.get_boolean('use-higher-precision'); 57 | let memory_measurement = this._settings.get_int('memory-measurement') 58 | let storage_measurement = this._settings.get_int('storage-measurement') 59 | let use_bps = (this._settings.get_int('network-speed-format') == 1); 60 | 61 | let format = ''; 62 | let ending = ''; 63 | let exp = 0; 64 | 65 | var decimal = [ 'B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB' ]; 66 | var binary = [ 'B', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB' ]; 67 | var hertz = [ 'Hz', 'KHz', 'MHz', 'GHz', 'THz', 'PHz', 'EHz', 'ZHz' ]; 68 | 69 | switch (sensorClass) { 70 | case 'percent': 71 | format = (use_higher_precision)?'%.1f%s':'%d%s'; 72 | value = value * 100; 73 | if (value > 100) value = 100; 74 | ending = '%'; 75 | break; 76 | case 'temp': 77 | value = value / 1000; 78 | ending = '°C'; 79 | 80 | // are we converting to fahrenheit? 81 | if (this._settings.get_int('unit') == 1) { 82 | value = ((9 / 5) * value + 32); 83 | ending = '°F'; 84 | } 85 | 86 | format = (use_higher_precision)?'%.1f%s':'%d%s'; 87 | break; 88 | case 'fan': 89 | format = '%d %s'; 90 | ending = 'RPM'; 91 | break; 92 | case 'in': // voltage 93 | value = value / 1000; 94 | format = ((value >= 0) ? '+' : '-') + ((use_higher_precision)?'%.2f %s':'%.1f %s'); 95 | ending = 'V'; 96 | break; 97 | case 'hertz': 98 | if (value > 0) { 99 | exp = Math.floor(Math.log(value) / Math.log(unit)); 100 | if (value >= Math.pow(unit, exp) * (unit - 0.05)) exp++; 101 | value = parseFloat((value / Math.pow(unit, exp))); 102 | } 103 | 104 | format = (use_higher_precision)?'%.2f %s':'%.1f %s'; 105 | ending = hertz[exp]; 106 | break; 107 | case 'memory': 108 | unit = (memory_measurement)?1000:1024; 109 | 110 | if (value > 0) { 111 | value *= unit; 112 | exp = Math.floor(Math.log(value) / Math.log(unit)); 113 | if (value >= Math.pow(unit, exp) * (unit - 0.05)) exp++; 114 | value = parseFloat((value / Math.pow(unit, exp))); 115 | } 116 | 117 | format = (use_higher_precision)?'%.2f %s':'%.1f %s'; 118 | 119 | if (memory_measurement) 120 | ending = decimal[exp]; 121 | else 122 | ending = binary[exp]; 123 | 124 | break; 125 | case 'storage': 126 | unit = (storage_measurement)?1000:1024; 127 | 128 | if (value > 0) { 129 | exp = Math.floor(Math.log(value) / Math.log(unit)); 130 | if (value >= Math.pow(unit, exp) * (unit - 0.05)) exp++; 131 | value = parseFloat((value / Math.pow(unit, exp))); 132 | } 133 | 134 | format = (use_higher_precision)?'%.2f %s':'%.1f %s'; 135 | 136 | if (storage_measurement) 137 | ending = decimal[exp]; 138 | else 139 | ending = binary[exp]; 140 | 141 | break; 142 | case 'speed': 143 | if (value > 0) { 144 | if (use_bps) value *= 8; 145 | exp = Math.floor(Math.log(value) / Math.log(unit)); 146 | if (value >= Math.pow(unit, exp) * (unit - 0.05)) exp++; 147 | value = parseFloat((value / Math.pow(unit, exp))); 148 | } 149 | 150 | format = (use_higher_precision)?'%.1f %s':'%.0f %s'; 151 | 152 | if (use_bps) { 153 | ending = decimal[exp].replace('B', 'bps'); 154 | } else { 155 | ending = decimal[exp] + '/s'; 156 | } 157 | 158 | break; 159 | case 'runtime': 160 | case 'uptime': 161 | let scale = [24, 60, 60]; 162 | let units = ['d ', 'h ', 'm ']; 163 | 164 | // show seconds on higher precision or if value under a minute 165 | if (sensorClass != 'runtime' && (use_higher_precision || value < 60)) { 166 | scale.push(1); 167 | units.push('s '); 168 | } 169 | 170 | let rslt = scale.map((d, i, a) => a.slice(i).reduce((d, c) => d * c)) 171 | .map((d, i) => ([d, units[i]])) 172 | .reduce(cbFun, ['', value]); 173 | 174 | value = rslt[0].trim(); 175 | 176 | format = '%s'; 177 | break; 178 | case 'milliamp': 179 | format = (use_higher_precision)?'%.1f %s':'%d %s'; 180 | value = value / 1000; 181 | ending = 'mA'; 182 | break; 183 | case 'milliamp-hour': 184 | format = (use_higher_precision)?'%.1f %s':'%d %s'; 185 | value = value / 1000; 186 | ending = 'mAh'; 187 | break; 188 | case 'watt': 189 | format = (use_higher_precision)?'%.2f %s':'%.1f %s'; 190 | value = value / 1000000; 191 | ending = 'W'; 192 | break; 193 | case 'watt-gpu': 194 | format = (use_higher_precision)?'%.2f %s':'%.1f %s'; 195 | ending = 'W'; 196 | break; 197 | case 'watt-hour': 198 | format = (use_higher_precision)?'%.2f %s':'%.1f %s'; 199 | value = value / 1000000; 200 | ending = 'Wh'; 201 | break; 202 | case 'load': 203 | format = (use_higher_precision)?'%.2f %s':'%.1f %s'; 204 | break; 205 | case 'pcie': 206 | let split = value.split('x'); 207 | value = 'PCIe ' + parseInt(split[0]) + (split.length > 1 ? ' x' + parseInt(split[1]) : ''); 208 | format = '%s'; 209 | break; 210 | default: 211 | format = '%s'; 212 | break; 213 | } 214 | 215 | return format.format(value, ending); 216 | } 217 | 218 | returnIfDifferent(dwell, label, value, type, format, key) { 219 | let output = []; 220 | 221 | // make sure the keys exist 222 | if (!(type in this._history)) this._history[type] = {}; 223 | 224 | // no sense in continuing when the raw value has not changed 225 | if (type != 'network-rx' && type != 'network-tx' && 226 | key in this._history[type] && this._history[type][key][1] == value) 227 | return output; 228 | 229 | // is the value different from last time? 230 | let legible = this._legible(value, format); 231 | 232 | // don't return early when dealing with network traffic 233 | if (type != 'network-rx' && type != 'network-tx') { 234 | // only update when we are coming through for the first time, or if a value has changed 235 | if (key in this._history[type] && this._history[type][key][0] == legible) 236 | return output; 237 | 238 | // add label as it was sent from sensors class 239 | output.push([label, legible, type, key]); 240 | } 241 | 242 | // save previous values to update screen on changes only 243 | let previousValue = this._history[type][key]; 244 | this._history[type][key] = [legible, value]; 245 | 246 | // process average, min and max values 247 | if (type == 'temperature' || type == 'voltage' || type == 'fan') { 248 | let vals = Object.values(this._history[type]).map(x => parseFloat(x[1])); 249 | 250 | // show value in group even if there is one value present 251 | let sum = vals.reduce((a, b) => a + b); 252 | let avg = this._legible(sum / vals.length, format); 253 | output.push([type, avg, type + '-group', '']); 254 | 255 | // If only one value is present, don't display avg, min and max 256 | if (vals.length > 1) { 257 | output.push(['Average', avg, type, '__' + type + '_avg__']); 258 | 259 | // calculate Minimum value 260 | let min = Math.min(...vals); 261 | min = this._legible(min, format); 262 | output.push(['Minimum', min, type, '__' + type + '_min__']); 263 | 264 | // calculate Maximum value 265 | let max = Math.max(...vals); 266 | max = this._legible(max, format); 267 | output.push(['Maximum', max, type, '__' + type + '_max__']); 268 | } 269 | } else if (type == 'network-rx' || type == 'network-tx') { 270 | let direction = type.split('-')[1]; 271 | 272 | // appends total upload and download for all interfaces for #216 273 | let vals = Object.values(this._history[type]).map(x => parseFloat(x[1])); 274 | let sum = vals.reduce((partialSum, a) => partialSum + a, 0); 275 | output.push(['Boot ' + direction, this._legible(sum, format), type, '__' + type + '_boot__']); 276 | 277 | // keeps track of session start point 278 | if (!(key in this._networkSpeedOffset) || this._networkSpeedOffset[key] <= 0) 279 | this._networkSpeedOffset[key] = sum; 280 | 281 | // outputs session upload and download for all interfaces for #234 282 | output.push(['Session ' + direction, this._legible(sum - this._networkSpeedOffset[key], format), type, '__' + type + '_ses__']); 283 | 284 | // calculate speed for this interface 285 | let speed = (value - previousValue[1]) / dwell; 286 | output.push([label, this._legible(speed, 'speed'), type, key]); 287 | 288 | // store speed for Device report 289 | if (!(direction in this._networkSpeeds)) this._networkSpeeds[direction] = {}; 290 | if (!(label in this._networkSpeeds[direction])) this._networkSpeeds[direction][label] = 0; 291 | 292 | // store value for next go around 293 | if (value > 0 || (value == 0 && !this._settings.get_boolean('hide-zeros'))) 294 | this._networkSpeeds[direction][label] = speed; 295 | 296 | // calculate total upload and download device speed 297 | for (let direction in this._networkSpeeds) { 298 | let sum = 0; 299 | for (let iface in this._networkSpeeds[direction]) 300 | sum += parseFloat(this._networkSpeeds[direction][iface]); 301 | 302 | sum = this._legible(sum, 'speed'); 303 | output.push(['Device ' + direction, sum, 'network-' + direction, '__network-' + direction + '_max__']); 304 | // append download speed to group itself 305 | if (direction == 'rx') output.push([type, sum, type + '-group', '']); 306 | } 307 | } 308 | 309 | /* 310 | global.log('before', JSON.stringify(output)); 311 | for (let i = output.length - 1; i >= 0; i--) { 312 | let sensor = output[i]; 313 | // sensor[0]=label, sensor[1]=value, sensor[2]=type, sensor[3]=key) 314 | 315 | //["CPU Core 5","46°C","temperature","_temperature_hwmon8temp7_"] 316 | 317 | // make sure the keys exist 318 | if (!(sensor[2] in this._history2)) this._history2[sensor[2]] = {}; 319 | 320 | if (sensor[3] in this._history2[sensor[2]]) { 321 | if (this._history2[sensor[2]][sensor[3]] == sensor[1]) { 322 | output.splice(i, 1); 323 | } 324 | } 325 | 326 | this._history2[sensor[2]][sensor[3]] = sensor[1]; 327 | } 328 | 329 | global.log(' after', JSON.stringify(output)); 330 | global.log('***************************'); 331 | */ 332 | 333 | return output; 334 | } 335 | 336 | resetHistory(numGpus) { 337 | // don't call this._history = {}, as we want to keep network-rx and network-tx 338 | // otherwise network history statistics will start over 339 | for (let sensor in this._sensorIcons) { 340 | //each gpu has it's own sensor name and thus must be handled separately 341 | if(sensor === 'gpu') continue; 342 | 343 | this._history[sensor] = {}; 344 | this._history[sensor + '-group'] = {}; 345 | //this._history2[sensor] = {}; 346 | //this._history2[sensor + '-group'] = {}; 347 | } 348 | 349 | for(let i = 1; i <= numGpus; i++){ 350 | this._history['gpu#' + i] = {}; 351 | this._history['gpu#' + i + '-group'] = {}; 352 | } 353 | } 354 | }); 355 | --------------------------------------------------------------------------------